<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Today I Learned</title>
    <description>TIL is an open-source project by Hashrocket that exists to catalogue the sharing and accumulation of knowledge as it happens day-to-day.
    </description>
    <link>http://[https://til.giantmonkey.de]/</link>
    <atom:link href="http://[https://til.giantmonkey.de]/rss" rel="self" type="application/rss+xml" />
      <item>
        <title>
          <![CDATA[Global prompt for Claude Code (CLI) - #AI]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/zc6gqby8jn-global-prompt-for-claude-code-cli</link>
        <description>
          <![CDATA[<p>For Claude Code CLI there are two mechanisms for cross-project preferences:</p><p><strong>1. <code class="inline">~/.claude/CLAUDE.md</code></strong> – For instructions and context (equivalent to the claude.ai preferences in <a href="https://claude.ai/settings/general">https://claude.ai/settings/general</a>)</p><pre><code class="markdown language-markdown"># My Coding Standards

- Test Driven Development: Specs first
- Focus on relevant specs (request, feature, complex methods)
- No trivial boilerplate specs
- Indentation: 2 spaces
- Lean, human-readable code
- When unclear: ask one clarifying question
...</code></pre><p><strong>2. <code class="inline">~/.claude/settings.json</code></strong> – For technical settings (permissions, tools, hooks)</p><pre><code class="json language-json">{
  &quot;permissions&quot;: {
    &quot;allowedTools&quot;: [&quot;Read&quot;, &quot;Write&quot;, &quot;Bash(bundle exec rspec *)&quot;]
  }
}</code></pre><p>The <code class="inline">CLAUDE.md</code> is loaded at every session start and is the right place for your coding preferences. 
The <code class="inline">settings.json</code> is more for tool permissions and hooks.</p><p><strong>NOTE:</strong> The settings in <a href="https://claude.ai/settings/general">https://claude.ai/settings/general</a> are only for the web chat and do not take effect in Claude Code nor in API calls.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Tue, 06 Jan 2026 07:13:28 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/zc6gqby8jn-global-prompt-for-claude-code-cli</guid>
      </item>
      <item>
        <title>
          <![CDATA[Find out your IP from the console - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/wffhqxbyby-find-out-your-ip-from-the-console</link>
        <description>
          <![CDATA[<pre><code class=" language-">curl ifconfig.me</code></pre><p>That’s it!</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Tue, 21 Oct 2025 07:30:53 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/wffhqxbyby-find-out-your-ip-from-the-console</guid>
      </item>
      <item>
        <title>
          <![CDATA[Construct an array with _ index - #Ruby]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/admoeq8ihj-construct-an-array-with-index</link>
        <description>
          <![CDATA[<p>Blocksyntax:</p><pre><code class=" language-">years = Array.new(11) { Time.now.year + _1 }</code></pre><p>Hier wird Array.new(11) verwendet, um ein Array mit 11 Elementen zu erstellen (einschließlich des aktuellen Jahres), und der Block { Time.now.year + _1 } berechnet das Jahr für jedes Element (beginnend mit dem aktuellen Jahr). _1 ist ein Platzhalter für den Index des Blocks (ab 0).</p>]]>
        </description>
        <dc:creator>adrianfuhrmann</dc:creator>
        <pubDate>Thu, 19 Jun 2025 15:30:52 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/admoeq8ihj-construct-an-array-with-index</guid>
      </item>
      <item>
        <title>
          <![CDATA[rspec --profile gives a performance overview  - #Rails]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/amhz1dlvi2-rspec-profile-gives-a-performance-overview-</link>
        <description>
          <![CDATA[<p>Using <code class="inline">--profile</code> in your rspec command line allows you to see the slowest 10 examples in your test suite, along with a speed benchmark. </p><p>For more, see:- <a href="https://rspec.info/features/3-13/rspec-core/configuration/profile">https://rspec.info/features/3-13/rspec-core/configuration/profile</a>/</p><p>Example:</p><pre><code class=" language-">$ bundle exec rspec ./path/to/my/test.rb:90

Top 10 slowest examples (54.21 seconds, 73.1% of total time):

  # displays list of examples here with benchmark

Finished in 1 minute 7.22 seconds</code></pre>]]>
        </description>
        <dc:creator>axelbagenal</dc:creator>
        <pubDate>Tue, 18 Feb 2025 12:43:52 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/amhz1dlvi2-rspec-profile-gives-a-performance-overview-</guid>
      </item>
      <item>
        <title>
          <![CDATA[Fake HTTP responses and response times - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/4kls181fo9-fake-http-responses-and-response-times</link>
        <description>
          <![CDATA[<p>If you need an HTTP endpoint replying with a specific HTTP status code or taking a specific response time: try <a href="https://httpstat.us">https://httpstat.us</a>!</p><p>For example: </p><ul><li>return a 200 OK success status, taking 5 seconds: <a href="https://httpstat.us/200?sleep=5000">https://httpstat.us/200?sleep=5000</a></li><li>return a 400 Bad Request: <a href="https://httpstat.us/400">https://httpstat.us/400</a></li></ul>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Mon, 17 Feb 2025 13:20:22 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/4kls181fo9-fake-http-responses-and-response-times</guid>
      </item>
      <item>
        <title>
          <![CDATA[yes and no are booleans when used as keys in YAML - #Rails]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/sgtqfdcck7-yes-and-no-are-booleans-when-used-as-keys-in-yaml</link>
        <description>
          <![CDATA[<p>Whilst fixing a strange bug, I learnt today that yes and no are actually boolean key values in yaml. </p><p>E.g. We take this line of ruby:</p><pre><code class=" language-">booking.feedback_done ? I18n.t(&quot;billing.billing_public_tours.yes&quot;) : I18n.t(&quot;billing.billing_public_tours.no&quot;),</code></pre><p>calling <code class="inline">#feedback_done</code> should simply return a boolean value, so all looks okay right?</p><pre><code class=" language-">[2] pry(#&lt;#&lt;Class:0x0000000162290e60&gt;&gt;)&gt; booking.feedback_done ? true : false
=&gt; false</code></pre><p>If we take a look at our YAML:</p><pre><code class=" language-">    billing_public_tours:
      ...
      yes: &quot;Ja&quot;
      no: &quot;Nein&quot;</code></pre><p>Our translations look correctly configured. So why do we get this?</p><pre><code class=" language-">[1] pry(#&lt;#&lt;Class:0x0000000162290e60&gt;&gt;)&gt; booking.feedback_done ? I18n.t(&quot;billing.billing_public_tours.yes&quot;) : I18n.t(&quot;billing.billing_public_tours.no&quot;)
=&gt; &quot;Translation missing: de.billing.billing_public_tours.no&quot;</code></pre><p>Because <strong>Booleans are formatted as English words in YAML</strong></p><p>If we wrap them in quotes:</p><pre><code class=" language-">    billing_public_tours:
      ...
      &quot;yes&quot;: &quot;Ja&quot;
      &quot;no&quot;: &quot;Nein&quot;</code></pre><p>Our code will now work:</p><pre><code class=" language-">[1] pry(#&lt;#&lt;Class:0x000000016dff30c0&gt;&gt;)&gt; booking.feedback_done ? I18n.t(&quot;billing.billing_public_tours.yes&quot;) : I18n.t(&quot;billing.billing_public_tours.no&quot;)
=&gt; &quot;Nein&quot;</code></pre>]]>
        </description>
        <dc:creator>axelbagenal</dc:creator>
        <pubDate>Thu, 13 Feb 2025 14:17:32 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/sgtqfdcck7-yes-and-no-are-booleans-when-used-as-keys-in-yaml</guid>
      </item>
      <item>
        <title>
          <![CDATA[git commits from then to now - #Git]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/zj0bm07jrq-git-commits-from-then-to-now</link>
        <description>
          <![CDATA[<p>To show all commit “children” from a specific commit to current <code class="inline">master</code>, <a href="https://stackoverflow.com/a/9870218/1162143">use git log</a>
like </p><pre><code class="bash language-bash">git log --reverse --ancestry-path 894e8b4e93d8f3^..master</code></pre>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Tue, 16 Apr 2024 09:22:07 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/zj0bm07jrq-git-commits-from-then-to-now</guid>
      </item>
      <item>
        <title>
          <![CDATA[Method git history with `git log -L` - #Git]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/bg82im1yjt-method-git-history-with-git-log-l</link>
        <description>
          <![CDATA[<p>Today I found out that - <a href="https://calebhearth.com/git-method-history">via <code class="inline">git log -L</code></a> - it’s possible to list the history of changes <strong>to a specific method</strong>:</p><pre><code class="ruby language-ruby">$ git log -L :initialize:app/lib/giant_money.rb -n5

commit e6ef7f8a3cf06af2ecbf8a528ad5cf312a8d03b1
Author: Alexander Presber &lt;post@momolog.info&gt;
Date:   Sun Aug 13 20:05:59 2023 +0200

    don&apos;t fail hard (yet) on GiantMoney[nil] [GOM-8932]

diff --git a/app/lib/giant_money.rb b/app/lib/giant_money.rb
--- a/app/lib/giant_money.rb
+++ b/app/lib/giant_money.rb
@@ -16,12 +16,16 @@
   def initialize value, allow_nil: false
-    raise &quot;GiantMoney.new: value cannot be nil.&quot; unless value || allow_nil
+
+    unless value || allow_nil
+      # raise &quot;GiantMoney.new: value cannot be nil.&quot; # don&apos;t fail hard (yet) on GiantMoney[nil]
+      Rollbar.error(&quot;GiantMoney.new: value cannot be nil in #{caller[2]}.&quot;, stack: caller)
+    end

     @amount = case value
       when nil      then nil
       when Money    then value
       when Integer  then Money.new(value)
       when Float    then Money.new((value * 100.0))
       else raise &apos;GiantMoney.new: value needs to be an Integer, Float or Money object.&apos;
     end
   end


commit f55678a8c33029b1e998e1e0b6d536afd2f77107
Author: Lion Vollnhals &lt;lion@giantmonkey.de&gt;
Date:   Fri Jun 9 12:58:05 2023 +0000

    giant_monkey: multiple float by float

diff --git a/app/lib/giant_money.rb b/app/lib/giant_money.rb
--- a/app/lib/giant_money.rb
+++ b/app/lib/giant_money.rb
@@ -16,12 +16,12 @@
   def initialize value, allow_nil: false
...</code></pre><p>Noice.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Wed, 15 Nov 2023 08:18:26 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/bg82im1yjt-method-git-history-with-git-log-l</guid>
      </item>
      <item>
        <title>
          <![CDATA[Copy-paste friendly executable comments in Ruby - #Ruby]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/034oqqtmkx-copy-paste-friendly-executable-comments-in-ruby</link>
        <description>
          <![CDATA[<p>Imagine this comment on top of a ruby file:</p><pre><code class="ruby language-ruby">### usage:
#### reset and seed database
# rake db:reset 
#### get korona base data
# rails runner &apos;Korona.synchronize_all!&apos;
#### create valid day tickets in local development
# rails runner rails-runner/create_valid_ticket_for_shop_tests.rb</code></pre><p>It is supposed to document the usage and gives executable example lines. However to use them verbatim you have to copy-paste them line by line, removing the leading <code class="inline">#</code>.</p><p>There is a better alternative using the <a href="https://stackoverflow.com/a/3000121/1162143">mostly frowned upon</a><code class="inline">=begin</code> / <code class="inline">=end</code> comment style:</p><pre><code class="ruby language-ruby">=begin usage:
rake db:reset                                                   # reset and seed database
rails runner &apos;Korona.synchronize_all!&apos;                          # get korona base data
rails runner rails-runner/create_valid_ticket_for_shop_tests.rb # create valid day tickets in local development
=end</code></pre><p>Now it is possible to copy-paste the whole block into a shell to execute.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Thu, 16 Mar 2023 08:15:52 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/034oqqtmkx-copy-paste-friendly-executable-comments-in-ruby</guid>
      </item>
      <item>
        <title>
          <![CDATA[Ours and theirs in git rebase - #Git]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/utgajuqey5-ours-and-theirs-in-git-rebase</link>
        <description>
          <![CDATA[<p>When resolving a conflict while doing a git rebase, <code class="inline">--ours</code> does <strong>not</strong> refer to the branch we are currently on (the one being rebased) but the base branch, e.g. <code class="inline">main</code>.  </p><p>While arguably being pretty confusing, this actually <a href="https://git-scm.com/docs/git-checkout/2.27.0#Documentation/git-checkout.txt---theirs">has a good reason</a>.</p><p>A nice cheat sheet is <a href="https://nitaym.github.io/ourstheirs/">here</a>.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Sat, 21 Jan 2023 18:27:33 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/utgajuqey5-ours-and-theirs-in-git-rebase</guid>
      </item>
      <item>
        <title>
          <![CDATA[Hyphens and underscores in mysql.cnf - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/v3hmu5yel2-hyphens-and-underscores-in-mysqlcnf</link>
        <description>
          <![CDATA[<p>According to <a href="https://bugs.mysql.com/bug.php?id=55288">this bug</a><code class="inline">_</code>and <code class="inline">-</code> may both be used in mysql / mariadb configuration options inside the <code class="inline">mysql.cnf</code> file.</p><p>E.g.</p><pre><code class=" language-">[mariadb]
log-bin                         # enable binary logging</code></pre><p>and </p><pre><code class=" language-">[mariadb]
log_bin                         # enable binary logging</code></pre><p>are both ok!</p><p>For googling and searching inside pages the <code class="inline">_</code> variant usually works better.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Thu, 03 Nov 2022 15:49:24 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/v3hmu5yel2-hyphens-and-underscores-in-mysqlcnf</guid>
      </item>
      <item>
        <title>
          <![CDATA[Capybara content matchers cheat sheet - #Rails]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/arute4enzu-capybara-content-matchers-cheat-sheet</link>
        <description>
          <![CDATA[<p>There’s a cheat sheet I use to determine the capybara content matcher to use for a specific purpose:</p><h5>Wait for some text to eventually be there:</h5><pre><code class=" language-">expect(page).to have_content(&apos;some text&apos;)</code></pre><p>Succeeds as soon as the text is there and can be very fast.</p><h5>Wait for some text to be - and stay - there:</h5><pre><code class=" language-">expect(page).not_to have_no_content(&apos;some text&apos;)</code></pre><p>Succeeds if the text stays there for the whole <code class="inline">default_max_wait_time</code> and is therefore <strong>always</strong> slow. But sometimes needed.</p><h5>Wait for some text to eventually disappear:</h5><pre><code class=" language-">expect(page).to have_no_content(&apos;some text&apos;)</code></pre><p>Succeeds as soon as this text is not there and can be very fast.</p><h5>Wait for some text to be - and stay - absent:</h5><pre><code class=" language-">expect(page).not_to have_content(&apos;some text&apos;)</code></pre><p>Succeeds if the text stays absent for the whole <code class="inline">default_max_wait_time</code> and is therefore <strong>always</strong> slow. But sometimes needed.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Fri, 29 Apr 2022 09:33:20 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/arute4enzu-capybara-content-matchers-cheat-sheet</guid>
      </item>
      <item>
        <title>
          <![CDATA[TIL to log-into til.giantmonkey.de - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/bmxu6t9hff-til-to-log-into-tilgiantmonkeyde</link>
        <description>
          <![CDATA[<p>I needed some time because it’s not obvious, but now it’s easy. Just open <a href="https://til.giantmonkey.de/admin">https://til.giantmonkey.de/admin</a> and sign in with your giant monkey google account …</p>]]>
        </description>
        <dc:creator>marcotralles</dc:creator>
        <pubDate>Tue, 12 Apr 2022 09:25:32 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/bmxu6t9hff-til-to-log-into-tilgiantmonkeyde</guid>
      </item>
      <item>
        <title>
          <![CDATA[make firefox to accept puma-dev cert permanently - #Ruby]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/m5bzr3nvpv-make-firefox-to-accept-puma-dev-cert-permanently</link>
        <description>
          <![CDATA[<p>every time, firefox is restarted, and i’m opening <a href="https://gomus.test">https://gomus.test</a> again, the cert has to be accepted manually again.</p><ul><li>use <code class="inline">open ~/Library/Application\ Support/io.puma.dev/</code> in terminal to show your local puma-dev certs folder
</li><li>enter <code class="inline">about:preferences#privacy</code> into firefox url-bar
</li><li>all the way at the bottom you’ll find <em>Certificates</em></li><li>click on <em>View Certificates</em></li><li>in the last <em>Authorities</em> tab, you can import the Puma-dev certificate you’ve revealed in first step
</li><li>you only need to accept this for websites …
</li></ul><p>from now on, firefox will without any disturbance open local https:// puma-dev websites.</p>]]>
        </description>
        <dc:creator>marcotralles</dc:creator>
        <pubDate>Tue, 12 Apr 2022 09:22:49 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/m5bzr3nvpv-make-firefox-to-accept-puma-dev-cert-permanently</guid>
      </item>
      <item>
        <title>
          <![CDATA[capybara: save page to disk - #Rails]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/fnvol8feol-capybara-save-page-to-disk</link>
        <description>
          <![CDATA[<p>Today i learned that capybara’s <code class="inline">save_and_open_page</code> statement is a gem to debug the current page capybara wants to test.</p>]]>
        </description>
        <dc:creator>adrianfuhrmann</dc:creator>
        <pubDate>Tue, 29 Mar 2022 12:19:36 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/fnvol8feol-capybara-save-page-to-disk</guid>
      </item>
      <item>
        <title>
          <![CDATA[Sandboxed rails console - #Rails]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/eqejmn4z6j-sandboxed-rails-console</link>
        <description>
          <![CDATA[<p>If you want to do some changes to your models in the console but want them to be rolled back after your session, just use </p><pre><code class=" language-">rails console --sandbox</code></pre><p>Straight <a href="https://guides.rubyonrails.org/command_line.html#bin-rails-console">from the docs</a>.</p><p>It’s <a href="https://pawelurbanek.com/rails-mistakes-downtime">not a good idea</a> to use this in production, though.</p>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Fri, 11 Mar 2022 10:44:26 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/eqejmn4z6j-sandboxed-rails-console</guid>
      </item>
      <item>
        <title>
          <![CDATA[Ripgrep: searching with negative lookahead - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/9q2qllty6v-ripgrep-searching-with-negative-lookahead</link>
        <description>
          <![CDATA[<p>Using <a href="https://github.com/BurntSushi/ripgrep">ripgrep</a> we can search using PCREs. First we need to enable pcre expressions in <code class="inline">~/.ripgreprc</code>:</p><pre><code class=" language-">--pcre2</code></pre><p>Then we can search for all occurences of <code class="inline">myword</code><strong>not</strong> followed by <code class="inline">_</code>:</p><pre><code class=" language-">&gt; rg &apos;myword(?!_)&apos;</code></pre>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Tue, 14 Dec 2021 08:06:51 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/9q2qllty6v-ripgrep-searching-with-negative-lookahead</guid>
      </item>
      <item>
        <title>
          <![CDATA[TIL how to check the progress of a recursive grep - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/vh2zwffom0-til-how-to-check-the-progress-of-a-recursive-grep</link>
        <description>
          <![CDATA[<p>If you want to check the progress of a recursive grep, going trough lots of files, just <code class="inline">sudo ls -lah /proc/[GREP PID]/fd</code>. You’ll see which files grep is accessing at the moment, which will give you an idea how far it is in the search.</p>]]>
        </description>
        <dc:creator>kamilgwóźdź</dc:creator>
        <pubDate>Tue, 15 Jun 2021 08:17:44 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/vh2zwffom0-til-how-to-check-the-progress-of-a-recursive-grep</guid>
      </item>
      <item>
        <title>
          <![CDATA[Ansible: decrypt single vault value in the shell - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/b8s3f51dzo-ansible-decrypt-single-vault-value-in-the-shell</link>
        <description>
          <![CDATA[<pre><code class=" language-">$ ansible localhost -m debug -a &apos;var=my_password&apos;
localhost | SUCCESS =&gt; {
    &quot;my_password&quot;: &quot;not secret anymore&quot;
}</code></pre>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Fri, 28 May 2021 11:03:06 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/b8s3f51dzo-ansible-decrypt-single-vault-value-in-the-shell</guid>
      </item>
      <item>
        <title>
          <![CDATA[Delete duplicates with PostgreSQL using USING - #PostgreSQL]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/baotlbxjqc-delete-duplicates-with-postgresql-using-using</link>
        <description>
          <![CDATA[<p>Consise way to delete duplicates (depending on a condition, e.g. <code class="inline">col1</code> and <code class="inline">col2</code> being equal) while keeping the row with the highest id:</p><pre><code class=" language-">DELETE FROM
          my_table delete
    USING my_table check
  WHERE
        delete.id &lt; check.id
    AND delete.col1 = check.col1
    AND delete.col2 = check.col2</code></pre>]]>
        </description>
        <dc:creator>alexanderpresber</dc:creator>
        <pubDate>Tue, 23 Mar 2021 08:03:12 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/baotlbxjqc-delete-duplicates-with-postgresql-using-using</guid>
      </item>
      <item>
        <title>
          <![CDATA[You can jump to slash in zsh - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/yvajb0eabm-you-can-jump-to-slash-in-zsh</link>
        <description>
          <![CDATA[<p>After changing from bash to zsh I found it quite annoying that ⌥ + ← was always jumping to the closest white character, instead to space or slash (or some other special characters considered to be word-separators).</p><p>Fortunately it’s possible to change this behaviour by editing the <code class="inline">WORDCHARS</code> env variable.</p><p>Source: <a href="https://github.com/ohmyzsh/ohmyzsh/issues/5108#issuecomment-233480020">https://github.com/ohmyzsh/ohmyzsh/issues/5108#issuecomment-233480020</a></p>]]>
        </description>
        <dc:creator>kamilgwóźdź</dc:creator>
        <pubDate>Fri, 05 Mar 2021 09:43:01 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/yvajb0eabm-you-can-jump-to-slash-in-zsh</guid>
      </item>
      <item>
        <title>
          <![CDATA[Rebase without having anything pushed yet - #Git]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/sho5uoe4ud-rebase-without-having-anything-pushed-yet</link>
        <description>
          <![CDATA[<p>Prototyping should also be cleaning up commits before first push. How to do that?</p><p>Well, <code class="inline">git rebase --interactive --root master</code>does the trick.</p><p>Thanks to <a href="https://troglobit.com/howto/rebase-without-an-origin">https://troglobit.com/howto/rebase-without-an-origin</a>/</p>]]>
        </description>
        <dc:creator>adrianfuhrmann</dc:creator>
        <pubDate>Fri, 04 Dec 2020 22:15:38 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/sho5uoe4ud-rebase-without-having-anything-pushed-yet</guid>
      </item>
      <item>
        <title>
          <![CDATA[Tom's Obvious, Minimal Language isn't so obvious - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/7xizvkdw7k-toms-obvious-minimal-language-isnt-so-obvious</link>
        <description>
          <![CDATA[<p>TIL that order <em>really</em> matters when it comes to Tom’s Obvious, Minimal Language aka TOML. </p><p><a href="https://gitlab.giantmonkey.de/docker/gitlab-runner/-/merge_requests/20">https://gitlab.giantmonkey.de/docker/gitlab-runner/-/merge_requests/20</a></p>]]>
        </description>
        <dc:creator>kamilgwóźdź</dc:creator>
        <pubDate>Wed, 11 Nov 2020 12:56:12 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/7xizvkdw7k-toms-obvious-minimal-language-isnt-so-obvious</guid>
      </item>
      <item>
        <title>
          <![CDATA[Breaking the runner - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/kvf50grfgt-breaking-the-runner</link>
        <description>
          <![CDATA[<p>Today I learned that our GitLab runner deploys itself. Which means that if you push a change which breaks it, later when you’ll try to fix it, it won’t be there to deploy the fix.  </p>]]>
        </description>
        <dc:creator>kamilgwóźdź</dc:creator>
        <pubDate>Thu, 22 Oct 2020 08:55:08 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/kvf50grfgt-breaking-the-runner</guid>
      </item>
      <item>
        <title>
          <![CDATA[Cloud Tasks need App Engine to be enabled - #Infrastructure]]>
        </title>
        <link>http://[https://til.giantmonkey.de]/posts/dncdepvbfk-cloud-tasks-need-app-engine-to-be-enabled</link>
        <description>
          <![CDATA[<p>Today I learned that even though cloud tasks are a separate product now they still need your App Engine project to be enabled. Otherwise, all tasks will just hang and any attempt of forcing them to execute will result in a 500 error.</p>]]>
        </description>
        <dc:creator>kamilgwóźdź</dc:creator>
        <pubDate>Fri, 09 Oct 2020 08:06:27 GMT</pubDate>
        <guid isPermaLink="true">http://[https://til.giantmonkey.de]/posts/dncdepvbfk-cloud-tasks-need-app-engine-to-be-enabled</guid>
      </item>
  </channel>
</rss>
