<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Developer-Tools on Omar H.Ajmi | Python, Java, Terraform &amp; DevOps TILs</title>
    <link>https://omar-ajmi.de5.net/tags/developer-tools/</link>
    <description>Recent content in Developer-Tools on Omar H.Ajmi | Python, Java, Terraform &amp; DevOps TILs</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 29 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://omar-ajmi.de5.net/tags/developer-tools/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>🐍 Python 3.15: Lazy Imports Without Hiding Them Inside Functions</title>
      <link>https://omar-ajmi.de5.net/posts/en/python-315-lazy-imports/</link>
      <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/python-315-lazy-imports/</guid>
      <description>&lt;h1&gt;🐍 Python 3.15: Lazy Imports Without Hiding Them Inside Functions&lt;/h1&gt;

&lt;p&gt;Ever opened a Python CLI tool that takes several seconds to start, even though you only want to display its help message?&lt;/p&gt;
&lt;p&gt;Sometimes, the application is busy loading modules it won&amp;rsquo;t actually use.&lt;/p&gt;
&lt;p&gt;Python 3.15 introduces a new option: &lt;strong&gt;explicit lazy imports&lt;/strong&gt;. Instead of loading a module immediately, Python can wait until you first use the imported name.&lt;/p&gt;
&lt;p&gt;The interesting part? Your imports can stay at the top of the file.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🧠 You Think a Good Idea Is Enough? Think Again.</title>
      <link>https://omar-ajmi.de5.net/posts/en/you-think-a-good-idea-is-enough/</link>
      <pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/you-think-a-good-idea-is-enough/</guid>
      <description>&lt;h1&gt;🧠 You Think a Good Idea Is Enough? Think Again.&lt;/h1&gt;

&lt;p&gt;Some engineering lessons arrive as a production bug. Others arrive when you join a project, look at how the work gets done, and start seeing ways you think it could be better.&lt;/p&gt;
&lt;p&gt;I joined a project well into its development. As I got familiar with it, I noticed practices that felt outdated or inconsistent to me. I wanted to help make the workflow more reproducible and maintainable.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🧳 Git stash: I said everything!</title>
      <link>https://omar-ajmi.de5.net/posts/en/git-stash/</link>
      <pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/git-stash/</guid>
      <description>&lt;h1 id=&#34;-git-stash-i-said-everything&#34; class=&#34;header-anchor-wrapper&#34;&gt;🧳 Git stash: &amp;ldquo;I said everything!&amp;rdquo;
  &lt;a href=&#34;#-git-stash-i-said-everything&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You have to switch branches. You run &lt;code&gt;git stash&lt;/code&gt;, expecting a pristine working tree.&lt;/p&gt;
&lt;p&gt;Your edited files disappear. Your brand-new file stays right where it is, staring at you.&lt;/p&gt;
&lt;p&gt;Git isn&amp;rsquo;t being passive-aggressive. You just didn&amp;rsquo;t ask it to stash untracked files.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🛠️ Agents in the Terminal Are Here. Now Let&#39;s Talk About Permissions.</title>
      <link>https://omar-ajmi.de5.net/posts/en/terminal-coding-agents-and-mcp/</link>
      <pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/terminal-coding-agents-and-mcp/</guid>
      <description>&lt;h1 id=&#34;-agents-in-the-terminal-are-here-now-lets-talk-about-permissions&#34; class=&#34;header-anchor-wrapper&#34;&gt;🛠️ Agents in the Terminal Are Here. Now Let&amp;rsquo;s Talk About Permissions.
  &lt;a href=&#34;#-agents-in-the-terminal-are-here-now-lets-talk-about-permissions&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;In 2023, I wrote that I wanted &lt;a href=&#34;https://omar-ajmi.de5.net/posts/en/ai-coding-assistants-beyond-autocomplete/&#34;&gt;more than autocomplete&lt;/a&gt;: a tool that could inspect files, make edits, run tests, read the errors and try again.&lt;/p&gt;
&lt;p&gt;Two things since then make that wish look less hypothetical. And they raise a question I care about more than the demos.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>🔐 Git: Force-Push With a Lease, Not a Crowbar</title>
      <link>https://omar-ajmi.de5.net/posts/en/git-force-with-lease/</link>
      <pubDate>Tue, 13 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/git-force-with-lease/</guid>
      <description>&lt;h1 id=&#34;-git-force-push-with-a-lease-not-a-crowbar&#34; class=&#34;header-anchor-wrapper&#34;&gt;🔐 Git: Force-Push With a Lease, Not a Crowbar
  &lt;a href=&#34;#-git-force-push-with-a-lease-not-a-crowbar&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;You rebased your feature branch. Git refuses your push because history diverged. So you type &lt;code&gt;git push --force&lt;/code&gt;, close your eyes and hope.&lt;/p&gt;
&lt;p&gt;If a teammate pushed to that branch in the meantime, their commit is gone. Git has a politer option.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>⚡ I Don&#39;t Want a Chatbot. I Want a Superpower.</title>
      <link>https://omar-ajmi.de5.net/posts/en/ai-coding-assistants-beyond-autocomplete/</link>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://omar-ajmi.de5.net/posts/en/ai-coding-assistants-beyond-autocomplete/</guid>
      <description>&lt;h1 id=&#34;-i-dont-want-a-chatbot-i-want-a-superpower&#34; class=&#34;header-anchor-wrapper&#34;&gt;⚡ I Don&amp;rsquo;t Want a Chatbot. I Want a Superpower.
  &lt;a href=&#34;#-i-dont-want-a-chatbot-i-want-a-superpower&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h1&gt;


&lt;h2 id=&#34;-beyond-autocomplete&#34; class=&#34;header-anchor-wrapper&#34;&gt;⚡ Beyond autocomplete
  &lt;a href=&#34;#-beyond-autocomplete&#34; class=&#34;header-anchor-link&#34;&gt;
    &lt;svg width=&#34;16px&#34; height=&#34;16px&#34; viewBox=&#34;0 0 24 24&#34;&gt;
&lt;svg
    xmlns=&#34;http://www.w3.org/2000/svg&#34;
    width=&#34;24&#34; height=&#34;24&#34; viewBox=&#34;0 0 24 24&#34; fill=&#34;none&#34;
    stroke=&#34;currentColor&#34; stroke-width=&#34;2&#34; stroke-linecap=&#34;round&#34;
    stroke-linejoin=&#34;round&#34;&gt;
    &lt;line x1=&#34;4&#34; y1=&#34;9&#34; x2=&#34;20&#34; y2=&#34;9&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;4&#34; y1=&#34;15&#34; x2=&#34;20&#34; y2=&#34;15&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;10&#34; y1=&#34;3&#34; x2=&#34;8&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;&lt;line x1=&#34;16&#34; y1=&#34;3&#34; x2=&#34;14&#34; y2=&#34;21&#34;&gt;&lt;/line&gt;
&lt;/svg&gt;

&lt;/svg&gt;
  &lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;AI autocomplete is cool. Asking a chatbot to explain a regular expression is useful. Getting a quick example of an unfamiliar API saves me a search.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>