<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Robservations]]></title><description><![CDATA[Robservations]]></description><link>https://blog.robheckel.tech</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1744808257729/c3ae7bee-90d4-400f-b10c-bbe329c56191.png</url><title>Robservations</title><link>https://blog.robheckel.tech</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 07:17:38 GMT</lastBuildDate><atom:link href="https://blog.robheckel.tech/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[DIY Repair: Lincoln Mark III Door Hinge Spring Replacement]]></title><description><![CDATA[I have a 1971 Lincoln Mark III. I had a difficult time finding some springs for the door hinges. One spring on the drive side was missing, so the door would swing closed and wipe out just about anyone in it’s way. I couldn’t find anyone really well d...]]></description><link>https://blog.robheckel.tech/diy-repair-lincoln-mark-iii-door-hinge-spring-replacement</link><guid isPermaLink="true">https://blog.robheckel.tech/diy-repair-lincoln-mark-iii-door-hinge-spring-replacement</guid><category><![CDATA[Lincoln]]></category><category><![CDATA[classic cars]]></category><dc:creator><![CDATA[Rob Heckel]]></dc:creator><pubDate>Tue, 26 Aug 2025 00:15:05 GMT</pubDate><content:encoded><![CDATA[<p>I have a 1971 Lincoln Mark III. I had a difficult time finding some springs for the door hinges. One spring on the drive side was missing, so the door would swing closed and wipe out just about anyone in it’s way. I couldn’t find anyone really well documenting this so I figured I would. Let it be known that the spring that is on the Thunderbird of the same year, does work. I went with Ecklers on this - their part number is <a target="_blank" href="https://www.ecklers.com/1967-1971-ford-thunderbird-door-hinge-spring-66-70328-1.html">EK-66-70328-1</a> which coincidentally was sticker over one MAC’s Antique Auto Parts. Same parent company or something - you can dig around and you can take my measurements and buy a kit of 6+ from McMaster Carr or you can just give Ecklers the business. I did go with Ecklers. Here are the measurements of what I received.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756165954933/70bf3710-931b-4fc0-a4b5-693f8eb4c0f8.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756166037232/1394a9dd-5e0c-495e-a7a2-85ad6232b230.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756165996598/de69a581-f057-467e-bcbf-5c5dfe0c5740.jpeg" alt class="image--center mx-auto" /></p>
<p>You’ll note a couple of things. First, with your door open you’ll see panel in the door hinge area obstructing your access to the springs and such. I recall my grandmother mashing my fingers ones upon a time, so these are probably in that general area for that general reason. Pop the 2 screws off and you’ll get a better view of what you’re working with.</p>
<p>Next, you’ll notice that the spring is much longer than where you plan on putting it. Take 2 zip ties of decent girth and put them on opposite sides of each other - inside of the spring you’re about to install. Before you move forward - time to put safety goggles on. B-) Now put your spring in a vice and squeeze it down - tighten it until you get to a point where you think this will fit. No vice? No problem. You can probably get away with vice grips, but please be careful. The spring is strong.</p>
<p>Now you should tighten up the zip ties and very gingerly make your way to the car. You will be getting the spring into position for the spring such that when you let the zip ties loose, the spring will spring into it’s forever home. I recommend using a tool to hold this and if you have a small pair of snips, or a razor, cut the zip ties and get excited for some boing!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756166414161/6331d880-016b-447b-a7d2-51784a4e5cd1.jpeg" alt class="image--center mx-auto" /></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1756166433746/35d3a4bd-e479-49ea-bf96-e7c720b2e947.jpeg" alt class="image--center mx-auto" /></p>
<p>I greased mine up with the grease that I had - probably less than ideal, but this is good now!</p>
<p>I hope this helps someone out there. I’ll try to keep these up just for the record - I know how difficult it is to cross reference parts for this car. Next up, suspension coils - since rockauto looks like they’ll be out indefinitely…</p>
<p><a target="_blank" href="https://buymeacoffee.com/billabongrob">Buy Me a Coffee!</a></p>
]]></content:encoded></item><item><title><![CDATA[S3 Object Versioning Responsibly]]></title><description><![CDATA[I’ll start off with what I’m not saying - I’m not saying to disable replication of your objects in your storage provider. As with any other service in $cloud_of_choice, there are a lot of knobs to be turned - and there’s a time and a place for each o...]]></description><link>https://blog.robheckel.tech/s3-object-versioning-responsibly</link><guid isPermaLink="true">https://blog.robheckel.tech/s3-object-versioning-responsibly</guid><category><![CDATA[AWS]]></category><category><![CDATA[finops]]></category><dc:creator><![CDATA[Rob Heckel]]></dc:creator><pubDate>Wed, 16 Apr 2025 12:56:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/stock/unsplash/uLBJ1T8R8GY/upload/c02188492358bea8cc0d4685046b1e62.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I’ll start off with what I’m not saying - I’m not saying to disable replication of your objects in your storage provider. As with any other service in $cloud_of_choice, there are a lot of knobs to be turned - and there’s a time and a place for each of them. In this segment, I’ll talk about s3 versioning - and it’s responsible implementation. I will be primarily speaking in AWS terms - as that’s the flavor of the month - but these features are widespread and shouldn’t vary wildly.</p>
<h1 id="heading-the-what">The What</h1>
<p>S3 versioning is a feature used to keep copies of objects as they change. Any time an object is uploaded, overwritten, or deleted a new “version” is created. This is usually enabled at the bucket level. It’s helpful for backup scenarios, keeping copies of changing files, and as a CYA in <code>oops</code> moments. Other clouds have this feature as well. Azure considers this blob versioning and GCP calls it object versioning in Google Cloud Storage (GCS).</p>
<h1 id="heading-the-how">The How</h1>
<p>In order to enable object versioning in AWS, here’s the basic steps in the console:</p>
<ol>
<li><p>Sign in to the AWS Management Console and open the Amazon S3 console at <a target="_blank" href="https://console.aws.amazon.com/s3/">https://console.aws.amazon.com/s3/</a>.</p>
</li>
<li><p>In the left navigation pane, choose <strong>General purpose buckets</strong>.</p>
</li>
<li><p>In the buckets list, choose the name of the bucket that you want to enable versioning for.</p>
</li>
<li><p>Choose <strong>Properties</strong>.</p>
</li>
<li><p>Under <strong>Bucket Versioning</strong>, choose <strong>Edit</strong>.</p>
</li>
<li><p>Choose <strong>Suspend</strong> or <strong>Enable</strong>, and then choose <strong>Save changes</strong>.</p>
</li>
</ol>
<p>If you’re using <s>Terraform</s> OpenTofu this is a code example:</p>
<pre><code class="lang-plaintext">resource "aws_s3_bucket" "example" {
  bucket = "example-bucket"
}

resource "aws_s3_bucket_acl" "example" {
  bucket = aws_s3_bucket.example.id
  acl    = "private"
}

resource "aws_s3_bucket_versioning" "versioning_example" {
  bucket = aws_s3_bucket.example.id
  versioning_configuration {
    status = "Enabled"
  }
}
</code></pre>
<p>Now if you’re using a <s>terraform</s> tofu module for the implementation - it could look something like this:</p>
<pre><code class="lang-plaintext">module "s3_bucket" {
  source  = "terraform-aws-modules/s3-bucket/aws"
  version = "4.6.1"

  bucket = local.bucket_name

  tags = {
    Owner = "Robservations"
  }

  versioning = {
    status     = true
    mfa_delete = false
  }
}
</code></pre>
<p>So at this point, you have a bucket, you’ve enabled versioning, you’re safe and sound.</p>
<h1 id="heading-the-why-tf-is-it-so-expensive">The Why (tf is it so expensive)</h1>
<p>Like many things in AWS, if you implement what you’d like without some sort of clean up mechanism, things will get costly. When it’s on paper, it seems trivial - if you keep copies of everything it’s going to get expensive. Let’s step through a hypothetical situation:</p>
<h2 id="heading-artifacts-and-expirations-a-purely-fictional-story">Artifacts and Expirations (a purely fictional story)</h2>
<p>You’re the operator of a self-hosted tool that runs CI/CD jobs (on a large scale) and stores all of it’s items in S3. So we’ll say we’re just looking at an “artifacts” bucket:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Stored Item</strong></td><td><strong>Source</strong></td><td><strong>Notes</strong></td></tr>
</thead>
<tbody>
<tr>
<td><code>.zip</code> or <code>.gz</code> files</td><td>From <code>artifacts:</code> in <code>.gitlab-ci.yml</code></td><td>These are the output of <code>artifacts:paths</code> from jobs</td></tr>
<tr>
<td>Test Reports</td><td><code>artifacts:reports</code> in pipeline jobs</td><td>JUnit, code quality, coverage, accessibility, etc.</td></tr>
<tr>
<td>Manual Uploads</td><td>Jobs that explicitly store something</td><td>Eg: binaries, docker images (rare but happens)</td></tr>
<tr>
<td>Pipeline Metadata</td><td>Metadata files alongside artifacts</td><td>Pipeline refs, trace data (sometimes)</td></tr>
</tbody>
</table>
</div><p>So you watch this bucket grow. It becomes unruly. You realize that you have 2 issues you’re up against</p>
<ol>
<li><p>The bucket is growing, and appears to be forever growing.</p>
</li>
<li><p>You don’t have a backup strat.</p>
</li>
</ol>
<p>So you, being the devops wizard that you are, decide to look into the application to solve part one of this problem. You’ve identified there’s a setting for expiring the artifacts in $x number of days - this is a great option to stop the bleeding. You set this to 30 days and therefore the bucket should have a predictable size and growth pattern (FinOps teams love this). So #1 is done. 🎉</p>
<p>Now for some backups - because <code>just in case</code>. There’s a lot of ways to skin this, but lets say that you’ve settled on versioning and there are guardrails to protect bucket deletion, etc. So at this point, you’ve verified that your objects have versioning installed. Issue #2 is solved! 🎉🎉</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744802736912/ef6ad376-5043-440c-8685-9a1e4c1eab83.png" alt="versioning enabled on a single object" class="image--center mx-auto" /></p>
<p>The following shows what happens when a version of an object is uploaded or modified in place, a few times.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744803848634/9f4f6b7d-055f-475c-93dd-9f70ce4ba35c.png" alt class="image--center mx-auto" /></p>
<p>The important piece to note here are the versions and their size. In this case, the original file size was 5.8MB, the in between object <code>tAO…</code> is 8.7 KB, and the active object is 42.8 KB. It should as no surprise that the total storage for this is the combination of all three, and that’s how she goes.</p>
<h1 id="heading-where-it-gets-tricky">Where It Gets Tricky</h1>
<p>The versioning we’ve seen is doing what it’s intended to do. Now, I’ve decided that the files are too big and this <code>car.jpg</code> has tipped the scaled on my bill. Time to nuke the file - inside of AWS or programmatically. Once it’s gone, you get the warm and fuzzy - job is safe, no more 💸 - but the bill doesn’t change. The bleeding continues. Bucket states <code>Objects (0)</code> and bill says 📈</p>
<p>Even though you’ve deleted the objects, the objects remain. The versioning that was enabled to protect us is doing its job - keeping versions of the objects. While this seems obvious, it’s an easy item to overlook when analyzing your cloud spend. So in order to really, really delete the file - now you must also delete the <strong>delete marker.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744805365230/f6d7e4a4-6a2e-40c7-b313-81119d365bc8.png" alt="So that's what that toggle is for!" class="image--center mx-auto" /></p>
<h2 id="heading-some-tools-to-help-identify-these">Some tools to help identify these</h2>
<p>If you’re in AWS CLI and a small bucket, you can evaluate the objects as such:</p>
<p><code>aws s3api list-object-versions --bucket $BUCKET_NAME</code></p>
<p>This will cause your screen to turn to text salad, eyes will glaze over, and while the data is great, this won’t be useful unless used programmatically.</p>
<p>A more reasonable option for a bucket with more data would be creating an <strong>S3 Inventory Report</strong>.</p>
<p>Enabling <strong>S3 Inventory</strong> on your bucket will give you daily or weekly CSV/ORC/Parquet reports of all objects including:</p>
<ul>
<li><p>Object key</p>
</li>
<li><p>Size</p>
</li>
<li><p>Last modified</p>
</li>
<li><p>Is latest version</p>
</li>
<li><p>Storage class</p>
</li>
<li><p>Non-current flag (if versioned)</p>
</li>
</ul>
<p><strong>Steps:</strong></p>
<ol>
<li><p>Go to your bucket → Management tab</p>
</li>
<li><p>Click <strong>"Create Inventory"</strong></p>
</li>
<li><p>Choose destination bucket and file format</p>
</li>
<li><p>Enable versioning metadata</p>
</li>
<li><p>Wait for the report (can be daily/weekly)</p>
</li>
</ol>
<h2 id="heading-fixing-this">Fixing This</h2>
<p>What you’ll want to do is look are lifecycle rules.</p>
<h3 id="heading-create-a-lifecycle-rule-in-aws-console">Create a Lifecycle Rule in AWS Console</h3>
<h4 id="heading-1-go-to-the-s3-console">1. <strong>Go to the S3 Console</strong></h4>
<ul>
<li><p>Navigate to: <a target="_blank" href="https://s3.console.aws.amazon.com/s3/">https://s3.console.aws.amazon.com/s3/</a></p>
</li>
<li><p>Choose the <strong>bucket</strong> where you want to apply the lifecycle rule.</p>
</li>
</ul>
<h4 id="heading-2-open-the-management-tab">2. <strong>Open the “Management” Tab</strong></h4>
<ul>
<li><p>Once in the bucket view, click on the <strong>“Management”</strong> tab.</p>
</li>
<li><p>Scroll down to <strong>"Lifecycle rules"</strong>.</p>
</li>
<li><p>Click <strong>“Create lifecycle rule”</strong>.</p>
</li>
</ul>
<h4 id="heading-3-name-your-rule">3. <strong>Name Your Rule</strong></h4>
<ul>
<li><p>Give it a descriptive name like: <code>Expire-NonCurrent-Versions</code>.</p>
</li>
<li><p>Optionally, add a tag filter or prefix if you want the rule to apply only to a subset of objects (e.g., all objects under <code>logs/</code>).</p>
</li>
</ul>
<h4 id="heading-4-choose-rule-scope">4. Choose Rule Scope</h4>
<ul>
<li>Choose “Apply to all objects in the bucket” unless you're targeting a specific prefix or tag<a target="_blank" href="https://s3.console.aws.amazon.com/s3/">.</a></li>
</ul>
<h4 id="heading-5-set-lifecycle-rule-actions">5. <strong>Set Lifecycle Rule Actions</strong></h4>
<p>Here’s where you define what happens to <strong>non-current versions</strong>:</p>
<ul>
<li><p>✅ Check <strong>“Expire noncurrent versions of objects”</strong></p>
</li>
<li><p>Set <strong>“Days after objects become noncurrent”</strong> — a good default is <strong>30</strong> <a target="_blank" href="https://s3.console.aws.amazon.com/s3/"><strong>days</strong>.</a></p>
</li>
<li><p>(Optional) Check “Permanently delete previous versions” after more days for added cleanup.</p>
</li>
</ul>
<p><em>Example:</em></p>
<ul>
<li><p><strong>Expire noncurrent versions after:</strong> 30 days</p>
</li>
<li><p><strong>Delete expired object delete markers</strong> (optional if you want to remove delete markers)</p>
</li>
</ul>
<h4 id="heading-6-review-and-create">6. <strong>Review and Create</strong></h4>
<ul>
<li><p>Review the rule summary.</p>
</li>
<li><p>Click <strong>“Create rule”</strong>.</p>
</li>
</ul>
<h3 id="heading-fixing-this-as-code">Fixing This as Code</h3>
<p>If you’re using the S3 module - the following terraform will help you manage these versions from spiraling into a financial burden. This example will keep noncurrent versions for only 30 days. You can, and should, adjust this to meet your applications needs and service levels.</p>
<pre><code class="lang-plaintext">  lifecycle_rule = [
    {
      id      = "remove old-versions"
      enabled = true

      noncurrent_version_expiration = {
        days = 30
      }
    }
  ]
</code></pre>
<h1 id="heading-in-a-sentence">In a Sentence</h1>
<p>Object versioning is a good way to protect the objects in your bucket; however, gone unchecked, buckets can grow exponentially over time, and with that growth, significant cost.</p>
]]></content:encoded></item><item><title><![CDATA[ChatGPT Privacy Policy]]></title><description><![CDATA[Introduction I, Rob Heckel, am committed to protecting your privacy. This privacy policy explains how I handle your information when you use my ChatGPT application.
Information Collection I do not collect any personal information from users.
Use of I...]]></description><link>https://blog.robheckel.tech/chatgpt-privacy-policy</link><guid isPermaLink="true">https://blog.robheckel.tech/chatgpt-privacy-policy</guid><dc:creator><![CDATA[Rob Heckel]]></dc:creator><pubDate>Wed, 12 Jun 2024 16:26:00 GMT</pubDate><content:encoded><![CDATA[<p><strong>Introduction</strong> I, Rob Heckel, am committed to protecting your privacy. This privacy policy explains how I handle your information when you use my ChatGPT application.</p>
<p><strong>Information Collection</strong> I do not collect any personal information from users.</p>
<p><strong>Use of Information</strong> Since I do not collect any personal information, I do not use any personal information for any purposes.</p>
<p><strong>Sharing of Information</strong> I do not share any personal information with third parties because no personal information is collected.</p>
<p><strong>Data Protection</strong> Data protection is handled by OpenAI, the provider of the ChatGPT technology. For more information on how OpenAI handles data, please refer to OpenAI's privacy policy.</p>
<p><strong>User Rights</strong> Since no personal information is collected, there are no additional user rights concerning personal data within this application.</p>
<p><strong>Cookies and Tracking Technologies</strong> This application does not use cookies or any other tracking technologies.</p>
<p><strong>Changes to the Privacy Policy</strong> I may update this privacy policy from time to time. Changes will be posted on this page, and the date of the last update will be indicated.</p>
<p><strong>Contact Information</strong> If you have any questions or concerns about this privacy policy, please contact me at billabongrob@gmail.com.</p>
<p><strong>Last Updated:</strong> 06/12/2024</p>
]]></content:encoded></item></channel></rss>