<?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>Tamir Bahar</title>
    <link>https://tamir.dev/</link>
    <description>Recent content on Tamir Bahar</description>
    <image>
      <url>https://tamir.dev/images/profilepic.jpg</url>
      <link>https://tamir.dev/images/profilepic.jpg</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Fri, 17 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tamir.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Single Abstract Method (SAM) Interfaces in Python</title>
      <link>https://tamir.dev/posts/2026-04-python-sam/</link>
      <pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/2026-04-python-sam/</guid>
      <description>There&amp;rsquo;s a pattern I often see in Python code that feels woefully un-Pythonic.
1 2 3 4 5 6 7 8 9 10 class ConcreteBuilder(AbstractBuilder): def __init__(self, context): self._context = context def build(self): return do_something_with_context(context) def uses_builder(builder: AbstractBuilder): builder.build() It&amp;rsquo;s effectively defining a function the long way. The cause for this, of course, is &amp;ldquo;abstraction&amp;rdquo;. This might make sense in Java or C#, where you cannot define free-standing functions, but in Python it makes no sense.</description>
    </item>
    
    <item>
      <title>20-20-20 Timers</title>
      <link>https://tamir.dev/posts/2026-04-easy-eyes/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/2026-04-easy-eyes/</guid>
      <description>A few weeks ago I saw some people chatting about the benefits of 20-20-20 timers. The idea is that to reduce eye strain (as we tend to stare at screens all day&amp;hellip;) you set a timer so that every 20 minutes you spend 20 seconds looking at something that&amp;rsquo;s 20 feet away.
So I looked for an existing timer, and there are quite a lot of them, but they all have their issues.</description>
    </item>
    
    <item>
      <title>Signing out, for now</title>
      <link>https://tamir.dev/posts/2026-04-signing-out-for-now/</link>
      <pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/2026-04-signing-out-for-now/</guid>
      <description>I&amp;rsquo;m signing out from Mastodon.
I love the platform, and I&amp;rsquo;ve had many good interactions on it. But it no longer feels like a safe space for me. There is only so much that content filters can do to fend off hostility. And while that hostility is not directed at me, and the views behind it may sometimes align with my own, it is still smothering. We could all do with a bit more nuance and empathy.</description>
    </item>
    
    <item>
      <title>Embedding HTML in Graphviz Graphs</title>
      <link>https://tamir.dev/posts/graphviz-embed-html/</link>
      <pubDate>Wed, 28 Jan 2026 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/graphviz-embed-html/</guid>
      <description>Embedding HTML in Graphviz graphs</description>
    </item>
    
    <item>
      <title>AI Coding Vibe Check</title>
      <link>https://tamir.dev/posts/ai-vibe-check-2025/</link>
      <pubDate>Tue, 18 Nov 2025 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/ai-vibe-check-2025/</guid>
      <description>Thoughts and feelings after reviewing a fully LLM-made PR</description>
    </item>
    
    <item>
      <title>New Tools I&#39;m Using (May 2025)</title>
      <link>https://tamir.dev/posts/new-tools-remote-git/</link>
      <pubDate>Wed, 14 May 2025 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/new-tools-remote-git/</guid>
      <description>A few cool CLI tools I started using</description>
    </item>
    
    <item>
      <title>Graphviz DOT &amp; SVG Transforms</title>
      <link>https://tamir.dev/posts/graphviz-dot-svg-transforms/</link>
      <pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/graphviz-dot-svg-transforms/</guid>
      <description>Adventures in manipulating Graphviz SVG outputs.</description>
    </item>
    
    <item>
      <title>Hello CFGBot 🤖</title>
      <link>https://tamir.dev/posts/hello-cfgbot/</link>
      <pubDate>Wed, 01 Jan 2025 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/hello-cfgbot/</guid>
      <description>A few days ago I created CFGBot - a small Bluesky bot that publishes hourly control-flow-graphs.
While technically simple, this bot is something I wanted to create for a few years now. Originally, I wanted to write one that publishes IDA Pro graphs of random functions in system binaries. But due to logistical issues (how to run a bot that uses software I&amp;rsquo;m only allowed to run on my own PC) and my concerns about copyright (can I freely post the disassembly of copyrighted software?</description>
    </item>
    
    <item>
      <title>Invisible Codegen in Go</title>
      <link>https://tamir.dev/posts/invisible-codegen-go/</link>
      <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/invisible-codegen-go/</guid>
      <description>Go, sorting, and hiding code-generation.</description>
    </item>
    
    <item>
      <title>Beautiful Sorting in Python</title>
      <link>https://tamir.dev/posts/python-beautiful-sorting/</link>
      <pubDate>Wed, 04 Dec 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/python-beautiful-sorting/</guid>
      <description>Python has what is probably the most elegant way of sorting a collection of objects by their attribute values:
1 sorted(people, key=attrgetter(&amp;#34;age&amp;#34;, &amp;#34;name&amp;#34;)) Let&amp;rsquo;s break it down.
sorted() We start with the sorted() function. It returns a new sorted list from the items in its first argument.
1 2 &amp;gt;&amp;gt;&amp;gt; sorted([3, 1, 2]) [1, 2, 3] sorted() also takes an optional key function. key, when provided, is used to extract a comparison key from the items being sorted.</description>
    </item>
    
    <item>
      <title>Visualizing Code in CFGs</title>
      <link>https://tamir.dev/posts/cfg-visualization-legend/</link>
      <pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/cfg-visualization-legend/</guid>
      <description>Overview of the visualization used in function-graph-overview</description>
    </item>
    
    <item>
      <title>Some Thoughts About Version Numbers &amp; Security Patch Levels</title>
      <link>https://tamir.dev/posts/thoughts-about-security-patch-levels/</link>
      <pubDate>Sat, 13 Apr 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/thoughts-about-security-patch-levels/</guid>
      <description>Some thoughts about the issues with version numbers, supporting multiple versions, and the usefullness of Patch Levels.</description>
    </item>
    
    <item>
      <title>Home Cooked Software</title>
      <link>https://tamir.dev/posts/home-cooked-software/</link>
      <pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/home-cooked-software/</guid>
      <description>Writing small, friendly software</description>
    </item>
    
    <item>
      <title>Tag your Go Types</title>
      <link>https://tamir.dev/posts/go-tag-interfaces-venomous-dogs/</link>
      <pubDate>Sun, 29 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/go-tag-interfaces-venomous-dogs/</guid>
      <description>Avoiding venomous dogs using nominal subtyping.</description>
    </item>
    
    <item>
      <title>Implementing C&#43;&#43; Semantics in Python - a writeup</title>
      <link>https://tamir.dev/posts/cpppy/</link>
      <pubDate>Sun, 22 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/cpppy/</guid>
      <description>A writeup of my 2021 talk Implementing C&#43;&#43; Semantics in Python</description>
    </item>
    
    <item>
      <title>Finalizing Mutexes</title>
      <link>https://tamir.dev/posts/resource-management-02/</link>
      <pubDate>Sun, 13 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/resource-management-02/</guid>
      <description>Looking into the release of Mutexes in GC languages</description>
    </item>
    
    <item>
      <title>Resource Management Models</title>
      <link>https://tamir.dev/posts/resource-management-01/</link>
      <pubDate>Sat, 05 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/resource-management-01/</guid>
      <description>An overview of different resource management models</description>
    </item>
    
    <item>
      <title>Context Managers in Go</title>
      <link>https://tamir.dev/posts/context-managers-in-go/</link>
      <pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/context-managers-in-go/</guid>
      <description>Go&amp;#39;s new proposed range over func grammar allows for Python-style context-managers.</description>
    </item>
    
    <item>
      <title>Binary Reverse Engineering Features</title>
      <link>https://tamir.dev/posts/binary-re-feature-overview/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/binary-re-feature-overview/</guid>
      <description>The benefits of binary-reverse-engineering tooling. Migrated from Twitter thread.</description>
    </item>
    
    <item>
      <title>Sets of Floats</title>
      <link>https://tamir.dev/posts/sets-of-floats/</link>
      <pubDate>Thu, 06 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/sets-of-floats/</guid>
      <description>Sets of floats are weird, especially when NaNs are involved.</description>
    </item>
    
    <item>
      <title>Github Discussions for Hugo posts</title>
      <link>https://tamir.dev/posts/github-discussions/</link>
      <pubDate>Thu, 08 Jun 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/github-discussions/</guid>
      <description>POC of discussing posts on github</description>
    </item>
    
    <item>
      <title>Snake Eyes: C&#43;&#43; Scoped enums</title>
      <link>https://tamir.dev/posts/snake-eyes-cpp-scoped-enums/</link>
      <pubDate>Mon, 24 Apr 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/snake-eyes-cpp-scoped-enums/</guid>
      <description>Implementing C&#43;&#43; Scoped Enums in Python</description>
    </item>
    
    <item>
      <title>Adding Wikilink Support To Mdformat</title>
      <link>https://tamir.dev/posts/adding-wikilink-support-to-mdformat/</link>
      <pubDate>Fri, 14 Apr 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/adding-wikilink-support-to-mdformat/</guid>
      <description>Extending mdformat to not destroy wikilinks.</description>
    </item>
    
    <item>
      <title>Python Tools &amp; Libraries</title>
      <link>https://tamir.dev/posts/python-tools-and-libs/</link>
      <pubDate>Fri, 10 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/python-tools-and-libs/</guid>
      <description>Python tools &amp;amp; libraries that I use and would recommend</description>
    </item>
    
    <item>
      <title>Significant Whitespace</title>
      <link>https://tamir.dev/posts/significant-whitespace/</link>
      <pubDate>Sat, 14 Jan 2023 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/significant-whitespace/</guid>
      <description>All whitespace is significant.
It might not always matter to your computer, or compiler, or piece of code. But to you, a human reading the code, it is significant.
I often here people complaining about significant whitespace. They say it makes no sense, that it makes working with the code harder. That whitespace, specifically in code, should not be significant. But the unavoidable truth is that whitespace is always significant, regardless of the language you use.</description>
    </item>
    
    <item>
      <title>The Karate Kid</title>
      <link>https://tamir.dev/posts/karate-kid/</link>
      <pubDate>Mon, 26 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/karate-kid/</guid>
      <description>The true mystery of The Karate Kid (1984)</description>
    </item>
    
    <item>
      <title>Thoughts on Iterators in Python and C&#43;&#43;</title>
      <link>https://tamir.dev/blogvent/2022-12-08/</link>
      <pubDate>Thu, 08 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/blogvent/2022-12-08/</guid>
      <description>This Sunday, during the monthly meeting of the Israeli WG21 National Body discussion forum1, we discussed a paper by Yehezkel Bernat. The paper discusses a specific issue with C++ ranges and iterators. It demonstrates it with the following code sample:
1 2 3 4 5 6 7 8 9 10 11 #include &amp;lt;ranges&amp;gt; #include &amp;lt;iostream&amp;gt; namespace rv = std::views; int main() { for (auto i : rv::iota(0) | rv::filter([](auto i) { return i &amp;lt; 11; }) | rv::take(11)) std::cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;#39;\n&amp;#39;; } The code in the example does the following:</description>
    </item>
    
    <item>
      <title>Markdown Images &amp; Accessibility</title>
      <link>https://tamir.dev/blogvent/2022-12-02/</link>
      <pubDate>Fri, 02 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/blogvent/2022-12-02/</guid>
      <description>I always knew image alt-text existed. I knew about it from learning HTML - it&amp;rsquo;s the text that shows when the image doesn&amp;rsquo;t load. And it&amp;rsquo;s also on XKCD as the extra pun (TIL that&amp;rsquo;s actually title= and not alt=). It&amp;rsquo;s only recently, when Twitter added image descriptions1 and my feed started talking about them, that I realized how important they are for accessibility.
Since then, I&amp;rsquo;ve been making an effort to describe the images in all my tweets to the best of my ability.</description>
    </item>
    
    <item>
      <title>A Bit of Codeviz</title>
      <link>https://tamir.dev/blogvent/2022-12-01/</link>
      <pubDate>Thu, 01 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/blogvent/2022-12-01/</guid>
      <description>When I started my professional career I was not doing software engineering, but rather reverse-engineering. Taking a compiled binary, disassembling it, and trying to understand what it does. My job was essentially reading code, with the stated goal in my job description was &amp;ldquo;vulnerability research&amp;rdquo;. Since then, I moved to the other side, and am now doing &amp;ldquo;forward engineering&amp;rdquo;.
While it is very tempting to say that as programmers (or developers, or software engineers, or whichever term you&amp;rsquo;re comfortable with) we only write code, we know that this is not true.</description>
    </item>
    
    <item>
      <title>Blogvent Calendar</title>
      <link>https://tamir.dev/posts/blogvent-calendar-2022/</link>
      <pubDate>Wed, 30 Nov 2022 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/blogvent-calendar-2022/</guid>
      <description>One post every day in December.</description>
    </item>
    
    <item>
      <title>More Memory Profiling (in Python)</title>
      <link>https://tamir.dev/posts/more-memory-profiling-in-python/</link>
      <pubDate>Fri, 02 Jul 2021 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/more-memory-profiling-in-python/</guid>
      <description>More lessons learned memory-optimizing Python code.</description>
    </item>
    
    <item>
      <title>GitLab CI Tricks</title>
      <link>https://tamir.dev/posts/gitlab-ci-tricks/</link>
      <pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/gitlab-ci-tricks/</guid>
      <description>A collection of useful hacks for the GitLab CI</description>
    </item>
    
    <item>
      <title>Finding a memory-leak in my Python code</title>
      <link>https://tamir.dev/posts/finding-a-memory-leak-in-my-python-code/</link>
      <pubDate>Sat, 30 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/finding-a-memory-leak-in-my-python-code/</guid>
      <description>Last week I had to fix a memory leak in a Python program for the first time. A long running process started eating too much RAM (only ~20GB to much) and the friendly OOM Killer had to step in and terminate this. Since this kept happening, I had to go ahead and fix the issue.
Step 1 - Reproduction As with every bug, before you can reliably fix it, you must reproduce it.</description>
    </item>
    
    <item>
      <title>TIL Python attribute lookup order is tricky</title>
      <link>https://tamir.dev/posts/til-python-attribute-lookup-order-is-tricky/</link>
      <pubDate>Wed, 03 Jun 2020 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/til-python-attribute-lookup-order-is-tricky/</guid>
      <description>This post is brought to you in the spirit of converting tweetstorms to blogposts. to the tweetstorm
Surprise! 🎁 In Python, if property access raises AttributeError, and the class implemented getattr, it will get called with the property name. This results in some very cryptic errors.
If you run the following code (repl):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 class Thing: name = &amp;#34;Thing&amp;#34; class NameProvider: def __init__(self, name): self.</description>
    </item>
    
    <item>
      <title>Snake Eyes: Extension Methods</title>
      <link>https://tamir.dev/posts/snake-eyes-extension-methods/</link>
      <pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/snake-eyes-extension-methods/</guid>
      <description>Implementing Extension-Methods in Python</description>
    </item>
    
    <item>
      <title>Snake Eyes: Scopes and IIFE</title>
      <link>https://tamir.dev/posts/snake-eyes-scopes-and-iife/</link>
      <pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/snake-eyes-scopes-and-iife/</guid>
      <description>Where we steal good concepts from other languages to create questionable Python code</description>
    </item>
    
    <item>
      <title>Recognizing Ducks</title>
      <link>https://tamir.dev/posts/recognizing-ducks/</link>
      <pubDate>Sat, 13 Oct 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/recognizing-ducks/</guid>
      <description>An overview of type-checking techniques in Python</description>
    </item>
    
    <item>
      <title>Working Across Time-Zones</title>
      <link>https://tamir.dev/posts/working-across-timezones/</link>
      <pubDate>Sat, 09 Jun 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/working-across-timezones/</guid>
      <description>Internationalization is a difficult problem is software-engineering. Usually that statement would refer to the technical aspects of providing a good user experience for your customers. Today, however, I am referring to the social aspects.
Just as it has become common-place to have your users spread across the globe, so it has with developers. It is not uncommon to work with teams in another country, or even to have a specific team-member working from a remote location.</description>
    </item>
    
    <item>
      <title>Adventures in Rust</title>
      <link>https://tamir.dev/posts/adventures-in-rust/</link>
      <pubDate>Fri, 27 Apr 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/adventures-in-rust/</guid>
      <description>A tale of my time in Rust-land</description>
    </item>
    
    <item>
      <title>Types of Loops</title>
      <link>https://tamir.dev/posts/types-of-loops/</link>
      <pubDate>Sat, 27 Jan 2018 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/types-of-loops/</guid>
      <description>Minor brain-dump of experiences from teaching programmers from complete scratch.</description>
    </item>
    
    <item>
      <title>A Functional-Style State Machine in C&#43;&#43;, Part 2</title>
      <link>https://tamir.dev/posts/a-functional-style-state-machine-in-cpp-part-2/</link>
      <pubDate>Mon, 04 Sep 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/a-functional-style-state-machine-in-cpp-part-2/</guid>
      <description>First, an apology. The first part of this post was published on May 26. It is now September. I had most of the code for this part done by then. But finalizing the code took some more effort. Once that was done, explaining took a while. There were quite a few things I had to learn myself first. So now, months later, I present this humble offering to the Gods of C++ and template meta-programming.</description>
    </item>
    
    <item>
      <title>That `overloaded` Trick: Overloading Lambdas in C&#43;&#43;17</title>
      <link>https://tamir.dev/posts/that-overloaded-trick-overloading-lambdas-in-cpp17/</link>
      <pubDate>Tue, 15 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/that-overloaded-trick-overloading-lambdas-in-cpp17/</guid>
      <description>C++17 has granted us with std::variant. Simply put, it is a type-safe union. To access the value it stores, you can either request a specific type (using std::get or something similar) or &amp;ldquo;visit&amp;rdquo; the variant, automatically handling only the data-type that is actually there. Visiting is done using std::visit, and is fairly straight forward.
Compilation, Execution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include &amp;lt;variant&amp;gt; #include &amp;lt;cstdio&amp;gt; #include &amp;lt;vector&amp;gt; using var_t = std::variant&amp;lt;int, const char*&amp;gt;; // (1) struct Print { // (2) void operator() (int i) { printf(&amp;#34;%d\n&amp;#34;, i); } void operator () (const char* str) { puts(str); } }; int main() { std::vector&amp;lt;var_t&amp;gt; vars = {1, 2, &amp;#34;Hello, World!</description>
    </item>
    
    <item>
      <title>A Functional-Style State Machine in C&#43;&#43;</title>
      <link>https://tamir.dev/posts/a-functional-style-state-machine-in-cpp/</link>
      <pubDate>Fri, 26 May 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/a-functional-style-state-machine-in-cpp/</guid>
      <description>It turns out that C&#43;&#43;&amp;#39;s type-system does not allow for recursive types. This is annoying. There is no reason why a function should not be able to return itself.</description>
    </item>
    
    <item>
      <title>The Windows CLI sucks, and that&#39;s good.</title>
      <link>https://tamir.dev/posts/the-windows-cli-sucks-and-thats-good/</link>
      <pubDate>Mon, 01 May 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/the-windows-cli-sucks-and-thats-good/</guid>
      <description>TL;DR Windows&amp;rsquo; shell sucks so people write tools. Tools are fun to use.
Linux&amp;rsquo;s shell is amazing so people write terrible bash scripts and makefiles.
Be sensible. Use Python. Use C.
The rest of the post is me ranting, letting off some steam. Have fun, and don&amp;rsquo;t take it too seriously.
🐢 A Story of Shells 🐢 1 2 3 my_var=$(application arg0 arg1) for /f %%i in (&amp;#39;application arg0 arg1&amp;#39;) do set my_var=%%i 🪟 Windows 🪟 I&amp;rsquo;ve been a Windows user for a very long time.</description>
    </item>
    
    <item>
      <title>Don&#39;t Amend, Fix</title>
      <link>https://tamir.dev/posts/dont-amend-fix/</link>
      <pubDate>Fri, 10 Mar 2017 00:00:00 +0000</pubDate>
      
      <guid>https://tamir.dev/posts/dont-amend-fix/</guid>
      <description>A fun alternative to `git commit --amend`</description>
    </item>
    
    
  </channel>
</rss>
