<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sergey Zhekpisov</title>
    <description>The latest articles on DEV Community by Sergey Zhekpisov (@zhekpisov).</description>
    <link>https://dev.to/zhekpisov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1307739%2Fc929564a-bca8-4221-9ba9-f01d19d4963b.jpeg</url>
      <title>DEV Community: Sergey Zhekpisov</title>
      <link>https://dev.to/zhekpisov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zhekpisov"/>
    <language>en</language>
    <item>
      <title>diffyml: a faster, leaner YAML diff tool</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Tue, 17 Mar 2026 10:21:17 +0000</pubDate>
      <link>https://dev.to/zhekpisov/diffyml-a-faster-leaner-yaml-diff-tool-39ml</link>
      <guid>https://dev.to/zhekpisov/diffyml-a-faster-leaner-yaml-diff-tool-39ml</guid>
      <description>&lt;p&gt;I love "dyff". I really do. For a long time, it was the best CLI tool for comparing YAML files for me.&lt;/p&gt;

&lt;p&gt;But I was tired of typing "dyff between " every time. Every time thinking: why "between"? A diff tool should just... diff.&lt;/p&gt;

&lt;p&gt;That small friction was the start. Then I submitted a PR and waited five months with no response. The project seemed to have stalled.&lt;/p&gt;

&lt;p&gt;dyff is a well-built tool that popularised structural YAML diffing, and I have a lot of respect for it. Maintaining open source is hard, and I don't blame anyone for stepping back. But I needed a tool I could rely on and evolve — so I built one.&lt;/p&gt;

&lt;p&gt;Meet diffyml.&lt;/p&gt;

&lt;p&gt;→ "diffyml file1.yaml file2.yaml". No subcommands, no ceremony.&lt;br&gt;
→ Faster than dyff at every file size tested.&lt;br&gt;
→ 1 runtime dependency vs dyff's 14 — just yaml.v3 and the Go stdlib. Fewer deps = smaller attack surface.&lt;br&gt;
→ Lowest memory footprint at every file size tested (18.4 MB at 5K lines vs 21–326 MB for alternatives).&lt;br&gt;
→ Kubernetes-aware — auto-detects resources by apiVersion/kind/metadata and tracks renames as moves, not remove + add.&lt;br&gt;
→ Git-native — works as GIT_EXTERNAL_DIFF and KUBECTL_EXTERNAL_DIFF drop-in replacement. &lt;br&gt;
 → CI/CD annotations — GitHub Actions, GitLab CI, and Gitea output formats built in. &lt;br&gt;
 → Directory comparison — compares entire directories, matching files by name.&lt;/p&gt;

&lt;p&gt;But what about code quality?&lt;/p&gt;

&lt;p&gt;→ 1,400+ tests — unit, end-to-end, property-based, and fuzz.&lt;br&gt;
→ 99.9% code coverage on core logic, with mutation testing on every PR.&lt;br&gt;
→ CI runs govulncheck, golangci-lint, CodeQL, and OpenSSF Scorecard.&lt;/p&gt;

&lt;p&gt;It's out now, MIT-licensed. Install via Homebrew tap or go install.&lt;/p&gt;

&lt;p&gt;Try it, and if you like it, leave it a star, so other fellow YAML developers can discover it too!&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/szhekpisov" rel="noopener noreferrer"&gt;
        szhekpisov
      &lt;/a&gt; / &lt;a href="https://github.com/szhekpisov/diffyml" rel="noopener noreferrer"&gt;
        diffyml
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A fast, structural YAML diff tool — in a single-dependency binary
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;diffyml&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A fast, structural YAML diff tool with built-in Kubernetes intelligence. One dependency, minimal attack surface, native CI annotations for GitHub, GitLab, and Gitea.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://scorecard.dev/viewer/?uri=github.com/szhekpisov/diffyml" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/1ed475583e7c33720bbaffb5bf71d74d62ccd61b9784a28ca1377771a2dc6456/68747470733a2f2f6170692e73636f7265636172642e6465762f70726f6a656374732f6769746875622e636f6d2f737a68656b7069736f762f64696666796d6c2f6261646765" alt="OpenSSF Scorecard"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/szhekpisov/diffyml" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ff233e349f7699e97a0a28643f0ce362345c8c018060a9ebd2fa90cd38723eda/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f737a68656b7069736f762f64696666796d6c" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/szhekpisov/diffyml" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bbd1d37d8594a588164281c352b39bfff004c0fabb2323bbd374493d8636e93c/68747470733a2f2f706b672e676f2e6465762f62616467652f6769746875622e636f6d2f737a68656b7069736f762f64696666796d6c2e737667" alt="Go Reference"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/szhekpisov/diffyml" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/4fdda9577c0bd99228244d3892934bb9129f8118fb109f6548f439d136a241ca/68747470733a2f2f636f6465636f762e696f2f67682f737a68656b7069736f762f64696666796d6c2f6272616e63682f6d61696e2f67726170682f62616467652e737667" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://github.com/szhekpisov/diffyml/releases/latest" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a25c47374e7247965b7aa8e08097943bbf5ccee1754425a0a092cb5149a84fc6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f737a68656b7069736f762f64696666796d6c" alt="Release"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/szhekpisov/diffyml/actions/workflows/test.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/szhekpisov/diffyml/actions/workflows/test.yml/badge.svg?branch=main" alt="Tests"&gt;&lt;/a&gt;
&lt;a href="https://github.com/szhekpisov/diffyml/actions/workflows/security.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/szhekpisov/diffyml/actions/workflows/security.yml/badge.svg?branch=main" alt="Security &amp;amp; Static Analysis"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/szhekpisov/diffyml/doc/demo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fszhekpisov%2Fdiffyml%2Fdoc%2Fdemo.png" alt="diffyml output" width="600"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;diffyml compares YAML files and shows meaningful, structured differences — not line-by-line text diffs.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why diffyml?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Fastest at scale.&lt;/strong&gt; 7x faster than &lt;a href="https://github.com/homeport/dyff" rel="noopener noreferrer"&gt;dyff&lt;/a&gt; on 78 KB files, 9.5x faster on 780 KB files, with the lowest memory footprint among YAML-aware tools at scale. Near-linear scaling. See &lt;a href="https://github.com/szhekpisov/diffyml/doc/PERFORMANCE.md" rel="noopener noreferrer"&gt;PERFORMANCE.md&lt;/a&gt; for methodology and results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One dependency, zero surprises.&lt;/strong&gt; A single runtime dependency (&lt;a href="https://github.com/yaml/go-yaml" rel="noopener noreferrer"&gt;yaml.v3&lt;/a&gt;) and pure Go stdlib. Minimal attack surface, auditable in minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gets YAML right.&lt;/strong&gt; Dotted keys, type preservation, mixed-type lists, nil values — concrete edge cases other tools get wrong. diffyml treats YAML semantics as first-class, not an afterthought.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;How It Compares&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;diffyml&lt;/th&gt;
&lt;th&gt;dyff&lt;/th&gt;
&lt;th&gt;plain &lt;code&gt;diff&lt;/code&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;YAML-aware (structural diff)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (line-based)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes resource matching&lt;/td&gt;
&lt;td&gt;By apiVersion + kind + name (or generateName)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/szhekpisov/diffyml" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>go</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Honest impression about Amazon Q</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Sat, 09 Aug 2025 13:27:27 +0000</pubDate>
      <link>https://dev.to/zhekpisov/honest-impression-about-amazon-q-2on6</link>
      <guid>https://dev.to/zhekpisov/honest-impression-about-amazon-q-2on6</guid>
      <description>&lt;p&gt;I know, you're tired of AI noise, I get it. No worries, me too! But listen, here is the story I want to tell you - no propaganda, just pure experience.&lt;/p&gt;

&lt;p&gt;For the record, I was not paying for any AI subscription - no ChatGPT, no Claude, no Cursor, and for sure no Perplexity. I didn't see the value! However, I must admit that I used it occasionally - to research the best robot vacuum on the market, to check my English grammar, and to create a travel plan for the weekend. Life was simple, and the free tier of every model was more than enough.&lt;/p&gt;

&lt;p&gt;However, more than one month ago, I came across an article stating that AWS had released MCP (Model Context Protocol) for EKS (Elastic Kubernetes Service, managed Kubernetes service in AWS), which you can connect to Amazon Q - Generative AI Assistant from Amazon.&lt;/p&gt;

&lt;p&gt;I never heard of Amazon Q. There was always a button in the console that never did anything useful, so I was successfully ignoring it.&lt;/p&gt;

&lt;p&gt;But as a long-time practitioner of EKS, I was curious. "Why don't I give it a shot?"&lt;/p&gt;

&lt;p&gt;Oh boy, I wasn't ready for the outcome. Amazon Q is mighty. Here is the list of scenarios it helped me with:&lt;/p&gt;

&lt;p&gt;Create NACL (Network Access Control List) using VPC flow logs from the last 24 hours. You don't need to combine complex rules anymore - ask in the chat.&lt;br&gt;
Identify issues with the ELK (Elastic, Logstash, Kibana) stack deployed in EKS.&lt;br&gt;
Troubleshoot faulty pods and suggest solutions for the problems that require attention.&lt;br&gt;
Troubleshoot network connectivity and provide suggestions on the cause of the issue.&lt;br&gt;
Identify access issues and recommend a policy to resolve them.&lt;br&gt;
Find a security group where I deleted a rule during the last 30 minutes&lt;br&gt;
...and many, many more!&lt;/p&gt;

&lt;p&gt;Let's examine one of the scenarios: the pod is restarting. What would you do? Usually, it means that the pod is out of memory, or the liveness probe has not passed. Therefore, you should check the logs, the monitoring tool, and verify resource usage, limits, and requests of the pod. Based on the data, you can then make a decision.&lt;/p&gt;

&lt;p&gt;And this is where Agentic AI is doing its best - working with data! It collects information from multiple sources and creates a summary of what is going on. And now, instead of spending time on all that analysis, you can ask AI and verify its conclusion, which is, in most cases (but not always), right.&lt;/p&gt;

&lt;p&gt;And here the cherry on the top: I was struggling with my Terraform code. The AWS Config configuration that worked in one region didn't work in another. It drove me crazy - the region was the only difference, and I couldn't figure out why it was not working. I checked everything and double-checked my access - nothing.&lt;/p&gt;

&lt;p&gt;As a last resort, I went to ask Amazon Q what was wrong. It went through access and suggested using the service config principal instead of the service role, which will have access to the bucket for the delivery channel.&lt;/p&gt;

&lt;p&gt;"It does not make sense", were my thoughts, "service role should be fine, it's Security Hub recommendation, it works already". But I had nothing to lose, so I agreed to try that.&lt;/p&gt;

&lt;p&gt;And it worked.&lt;/p&gt;

&lt;p&gt;It turns out that AWS has undocumented regional discrepancies in its configuration (and their support confirmed it). And Amazon Q helped me to discover it.&lt;/p&gt;

&lt;p&gt;I find it quite entertaining that one product from the company helped to find flaws in another product of the same company.&lt;/p&gt;

&lt;p&gt;However, it's not a silver bullet. Of course, if the context is limited, its conclusions will be faulty. Additionally, Amazon Q offers Claude-Sonnet-3.7 and Claude-Sonnet-4; however, in reality, only the latest version is capable of producing meaningful results. And sometimes it uses incorrect parameters for the AWS CLI and fails to consider the entire context until it is pointed out, making it less than ideal.&lt;/p&gt;

&lt;p&gt;But it's capable, I can assure you. With MCP for EKS and Terraform, it has become a daily tool for me now. Luckily, there is a free version available, allowing you to try it out for yourself.&lt;/p&gt;

&lt;p&gt;At Katanox, we, as a "tech-first" company, are always looking for opportunities to improve our processes, and Amazon Q has already helped me to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduce troubleshooting time by 50%&lt;/li&gt;
&lt;li&gt;Reduce time-to-enable by 65%&lt;/li&gt;
&lt;li&gt;Generate tests to cover the code and critical cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Did I tell you that I don't pay for any AI subscription? Now it's changed.&lt;/p&gt;

&lt;p&gt;If you tried Amazon Q already, what is your impression? Which MCPs are you using in addition? Please let me know in the comments below; I am curious.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bottlerocket OS and ECS</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Fri, 30 May 2025 09:47:55 +0000</pubDate>
      <link>https://dev.to/zhekpisov/bottlerocket-os-and-ecs-3obb</link>
      <guid>https://dev.to/zhekpisov/bottlerocket-os-and-ecs-3obb</guid>
      <description>&lt;p&gt;When you run your ECS on Bottlerocket OS images, make sure that your user data is configured correctly.&lt;/p&gt;

&lt;p&gt;❌ Wrong way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module "autoscaling" {
  source  = "terraform-aws-modules/autoscaling/aws"
  version = "8.3.0"

  for_each = {
    # On-demand instances
    ex_1 = {
      instance_type              = t3.micro
      user_data                  = &amp;lt;&amp;lt;-EOT
        #!/bin/bash
        cat &amp;lt;&amp;lt;'EOF' &amp;gt;&amp;gt; user-data.toml
        [settings.ecs]
        cluster = "ecs-cluster"
        EOF
      EOT
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Right way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module "autoscaling" {
  source  = "terraform-aws-modules/autoscaling/aws"
  version = "8.3.0"

  for_each = {
    # On-demand instances
    ex_1 = {
      instance_type              = t3.micro
      user_data                  = &amp;lt;&amp;lt;-EOT
      [settings.ecs]
      cluster = "ecs-cluster"
      EOT
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>AWS Config and S3 Delivery Channel issue</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Fri, 16 May 2025 12:21:49 +0000</pubDate>
      <link>https://dev.to/zhekpisov/aws-config-and-s3-delivery-channel-issue-18g3</link>
      <guid>https://dev.to/zhekpisov/aws-config-and-s3-delivery-channel-issue-18g3</guid>
      <description>&lt;p&gt;Today, I was fighting the  enablement of a delivery channel for AWS Config, and every time I received an error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;InsufficientDeliveryPolicyException: Insufficient delivery policy to s3 bucket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It took half a day to figure out a small but essential nuance — it turns out that &lt;a href="https://docs.aws.amazon.com/config/latest/developerguide/manage-delivery-channel.html" rel="noopener noreferrer"&gt;AWS Config does not support the delivery channel to an Amazon S3 bucket where object lock is enabled with default retention enabled&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, if you face the same issue, check if your bucket's object lock is disabled.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudcomputing</category>
      <category>debugging</category>
      <category>devops</category>
    </item>
    <item>
      <title>Brightness control for Samsung Odyssey G7</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Wed, 31 Jul 2024 14:56:24 +0000</pubDate>
      <link>https://dev.to/zhekpisov/brightness-control-for-samsung-odyssey-g7-1d69</link>
      <guid>https://dev.to/zhekpisov/brightness-control-for-samsung-odyssey-g7-1d69</guid>
      <description>&lt;p&gt;I have a Samsung Odyssey G7 connected to my MacBook Pro (M1 Pro) as a second display. I dislike adjusting the brightness using the hardware button and on-screen display (OSD), so I looked for software tools to control it.&lt;/p&gt;

&lt;p&gt;Fortunately, I found one: &lt;a href="https://github.com/MonitorControl/MonitorControl" rel="noopener noreferrer"&gt;MonitorControl.&lt;/a&gt; It works like a charm!&lt;/p&gt;

&lt;p&gt;You can install via Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;brew install MonitorControl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Memorious Prometheus</title>
      <dc:creator>Sergey Zhekpisov</dc:creator>
      <pubDate>Tue, 27 Feb 2024 18:21:43 +0000</pubDate>
      <link>https://dev.to/zhekpisov/memorious-prometheus-5051</link>
      <guid>https://dev.to/zhekpisov/memorious-prometheus-5051</guid>
      <description>&lt;p&gt;Recently, we received alerts in Alertmanager, deployed with a kube-stack-prometheus Helm chart. The alert stated that 50% of the EKS endpoints for "apiserver/kubernetes" were down.&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;50% of the apiserver/kubernetes targets in the default namespace are down.&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;A brief look at Prometheus revealed that there were four(!) targets for the &lt;code&gt;serviceMonitor/monitoring/prometheus-operator-monito-apiserver/0&lt;/code&gt; endpoint - two were down, and two were up. Upon examining other clusters, it became clear that there are normally only two targets for each cluster.&lt;/p&gt;

&lt;p&gt;So, it turns out that the EKS Control Plane was updated during the night, and the &lt;code&gt;apiserver&lt;/code&gt; endpoints received new IP addresses. However, the Prometheus scraper retained old IP addresses in its database.&lt;/p&gt;

&lt;p&gt;Solution was simple:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl rollout restart statefulset prometheus-prometheus-operator-monito-prometheus -n monitoring&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;...and the old targets that were "down" disappeared, and the alert was resolved.&lt;/p&gt;

</description>
      <category>eks</category>
      <category>prometheus</category>
    </item>
  </channel>
</rss>
