<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blogs on Personal weblog</title>
    <link>https://carl.duevel.online/blog/</link>
    <description>Recent content in Blogs on Personal weblog</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 20 Jan 2023 20:40:30 +0100</lastBuildDate>
    <atom:link href="https://carl.duevel.online/blog/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Harvest Java Heap Dumps in constrained environments</title>
      <link>https://carl.duevel.online/blog/create-heapdumps/</link>
      <pubDate>Fri, 20 Jan 2023 20:40:30 +0100</pubDate>
      <guid>https://carl.duevel.online/blog/create-heapdumps/</guid>
      <description>&lt;p&gt;Creating and analyzing Heap Dumps is a standard for analyzing memory issues with&#xA;JVM based programs. To do this, you have to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;create the Heap Dump (duh!)&lt;/li&gt;&#xA;&lt;li&gt;move the data to your computer &lt;/li&gt;&#xA;&lt;li&gt;actually analyze the data&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Each of these steps has it&amp;#39;s own challenges though the first two seem trivial at&#xA;first sight.&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-3&#34;&gt;&#xA;&lt;h3 id=&#34;headline-1&#34;&gt;&#xA;Creating the Heap Dump&#xA;&lt;/h3&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-3&#34;&gt;&#xA;&lt;p&gt;The main challenge in Heap Dump creation I faced in today&amp;#39;s production environments&#xA;is that only essential software is installed in order to keep containers and the&#xA;potential attack surface small. So likely there is only a JVM which is enough to&#xA;run the program but not enough to get a Heap Dump. Through the recommendation of&#xA;a colleague I became aware of &lt;a href=&#34;https://github.com/apangin/jattach&#34;&gt;jattach&lt;/a&gt;. It describes itself as:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing the problem of too many tabs</title>
      <link>https://carl.duevel.online/blog/desktop/</link>
      <pubDate>Tue, 03 May 2022 21:22:29 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/desktop/</guid>
      <description>&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Tab mayhem and windows inflation&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;How many browser tabs are open on your browser right now? Too many to count? Let&#xA;me guess: Rows and rows of tabs belonging to different research tasks that you&#xA;want to pick up later. The occasional tab on social network. That&#xA;store you still have a cart open with that thing you &lt;em&gt;maybe&lt;/em&gt; want to buy. Some&#xA;are still relevant but many are not.&#xA;&lt;img src=&#34; /img/tabs.png&#34; alt=&#34; /img/tabs.png&#34; title=&#34; /img/tabs.png&#34; /&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>The last version manager you&#39;ll ever need</title>
      <link>https://carl.duevel.online/blog/asdf/</link>
      <pubDate>Mon, 18 Apr 2022 22:01:01 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/asdf/</guid>
      <description>&lt;figure&gt;&#xA;&lt;img src=&#34;https://carl.duevel.online/img/Prog4.png&#34; alt=&#34;/img/Prog4.png&#34; title=&#34;/img/Prog4.png&#34;/&gt;&#xA;&lt;figcaption&gt;&#xA;&lt;a href=&#34;https://commons.wikimedia.org/wiki/File:Prog4.png&#34;&gt;programming languages&lt;/a&gt; by AAMINE1965, licensed under &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/4.0/deed.en&#34;&gt;CC BY-SA 4.0&lt;/a&gt;&#xA;&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;&#xA;Chances are high you have already used tfenv, pyenv, SDKMAN!, rbenv, nvm or some&#xA;other version manager. In case you haven&amp;#39;t: A version manager is a program that&#xA;let&amp;#39;s you install multiple versions of a tool for different contexts: Your one&#xA;project needs version &lt;code&gt;X&lt;/code&gt;, the other version &lt;code&gt;Y.alpha&lt;/code&gt;. Just the tool in one&#xA;version all the time does not cut it as different versions behave differently.&#xA;So if people work on the same project with different versions of core tools, it&#xA;often gets messy:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why does MaxRAMPercentage stop working at heaps of ~ 30 GB?</title>
      <link>https://carl.duevel.online/blog/max_ram_percentage/</link>
      <pubDate>Sat, 22 Jan 2022 18:30:50 +0100</pubDate>
      <guid>https://carl.duevel.online/blog/max_ram_percentage/</guid>
      <description>&lt;p&gt;&#xA;The other day at work a Clojure program on a machine with 100 GB ran into OutOfMemory&#xA;errors. A quick look at the metrics showed that the heap was only at about 30 GB&#xA;though. Checking the JVM flags I found a configuration that is commonplace:&lt;/p&gt;&#xA;&lt;div class=&#34;src src-bash&#34;&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-XX:MaxRAMPercentage&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;So one would assume that the JVM could have sized the heap much larger than it&#xA;actually did. Thanks to docker this behavior can be observed quite easily by&#xA;doing a few tests like this one:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create downtimes with Instance Refresh for EC2 Auto Scaling</title>
      <link>https://carl.duevel.online/blog/aws_instance_refresh/</link>
      <pubDate>Fri, 12 Nov 2021 10:12:13 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/aws_instance_refresh/</guid>
      <description>&lt;p&gt;When AWS &lt;a href=&#34;https://aws.amazon.com/blogs/compute/introducing-instance-refresh-for-ec2-auto-scaling/&#34;&gt;launched Instance Refresh for EC2 Auto Scaling&lt;/a&gt; last year my colleagues&#xA;and me were delighted: Should we be able to retire our half baked and&#xA;&lt;em&gt;mostly&lt;/em&gt; working lambda for restarting ec2 instances and hand this over to AWS&#xA;Auto Scaling?&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I think we were not the only ones looking forward to this: Auto Scaling groups&#xA;is an extremely popular option of the most popular AWS service (EC2) of the&#xA;biggest cloud provider in the world. At the same time all of these many&#xA;customers are responsible &lt;a href=&#34;https://docs.aws.amazon.com/imagebuilder/latest/userguide/vulnerability-analysis-and-management.html&#34;&gt;to use a recent machine image with current security&#xA;patches&lt;/a&gt;. That means refreshing instances in an Auto Scaling Group is something&#xA;anybody out there needs to do on a regular basis&lt;sup class=&#34;footnote-reference&#34;&gt;&lt;a id=&#34;footnote-reference-1&#34; href=&#34;#footnote-1&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and anybody who does not&#xA;like busywork will automate the process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Do you ever forget to push your git commits?</title>
      <link>https://carl.duevel.online/blog/git-remind/</link>
      <pubDate>Thu, 14 Oct 2021 15:23:33 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/git-remind/</guid>
      <description>&lt;p&gt;The title of this post is a rhetorical question.&#xA;At least I think it is. Or I like to think it is.&#xA;What I can say with certainty is that I forgot my fair share&#xA;of pushes. 😅&lt;/p&gt;&#xA;&lt;p&gt;&#xA;Sometimes I was the one tripping over my own mistake (Why is that commit not&#xA;live? Ah, because the pipeline did not run. Because I did not push. &lt;strong&gt;facepalm&lt;/strong&gt;).&#xA;Sometimes my colleagues had to find out.☺️ &lt;/p&gt;</description>
    </item>
    <item>
      <title>Notifications for failed cron jobs</title>
      <link>https://carl.duevel.online/blog/cron/</link>
      <pubDate>Thu, 14 Oct 2021 15:07:39 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/cron/</guid>
      <description>&lt;p&gt;&#xA;Every few years when I setup a new computer I stumble over the same question:&#xA;&amp;#34;How do I get notified of failed cron jobs again?&amp;#34;. It is pretty simple, but&#xA;as I tripped over it again today, here is a little write-up so I do not have&#xA;to google this again. Or potentially I will and then hopefully this post will&#xA;turn up in the search results.😉&lt;/p&gt;&#xA;&lt;p&gt;&#xA;As cron is an old program from the days where the server use case was the&#xA;predominant one, it will send emails with the output it&amp;#39;s jobs will&#xA;produce. Now I don&amp;#39;t want my desktop machine to send emails over the internet&#xA;to myself about broken jobs, when I am working on the very same machine at the same time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create virtualenvs in project directories</title>
      <link>https://carl.duevel.online/blog/python_venvs_in_projects/</link>
      <pubDate>Sat, 17 Jul 2021 12:59:33 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/python_venvs_in_projects/</guid>
      <description>&lt;p&gt;It&amp;#39;s quite handy to create the virtual environment aka venv for a python project in the project folder&#xA;itself. This means:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;No huge &lt;code&gt;.virtualenvs&lt;/code&gt; folder in your home directory with a lot of envs which&#xA;you will never use again (The one on this computer is 1.2 GB big although I do&#xA;not work with many Python projects at all(!)). If you are done with a project&#xA;and delete all local files, the corresponding environment will be gone with&#xA;it.&lt;/li&gt;&#xA;&lt;li&gt;Pointing your editor/IDE to the current virtual env as well as deleting it&#xA;is easy, because it is right there in the project root folder.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;As there are &lt;strong&gt;many&lt;/strong&gt; tools in this realm, obviously every one of them handles&#xA;things a little bit differently and it is the default for &lt;em&gt;none&lt;/em&gt; of the popular ones:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Why does poetry not use the specified Python version?</title>
      <link>https://carl.duevel.online/blog/python_poetry/</link>
      <pubDate>Fri, 16 Jul 2021 08:38:43 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/python_poetry/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR: There is only one way to install poetry proper and that is with the&#xA;installer script provided by the project itself.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&#xA;I was sweating for the better part of an afternoon with a colleague about this.&#xA;I had installed &lt;a href=&#34;https://python-poetry.org/&#34;&gt;poetry&lt;/a&gt;, the new star in the python tooling world and it kept&#xA;using the global version of Python instead the one for the project at hand,&#xA;though poetry&amp;#39;s own &lt;code&gt;pyproject.toml&lt;/code&gt; specifies it. It was &lt;em&gt;quite&lt;/em&gt; a frustrating&#xA;experience.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Missing system modules in Python</title>
      <link>https://carl.duevel.online/blog/python_missing_system_deps/</link>
      <pubDate>Fri, 25 Jun 2021 22:22:59 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/python_missing_system_deps/</guid>
      <description>&lt;p&gt;I got to work on a Python code-base in the last days and have been struggling&#xA;to get to a stable development environment. I learned some lessons along the way.&#xA;Here is one of them, as it seems to be rather common and causes headaches&#xA;for many people (&lt;a href=&#34;https://www.google.com/search?q=ModuleNotFoundError%3A+No+module+named+&amp;#39;underscore&amp;#39;&#34;&gt;a simple search has a whopping half a million hits on Google&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;The error&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;ModuleNotFoundError: No module named &amp;#39;_lzma&amp;#39;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I found this error at the bottom of a very long stack trace after running a unit&#xA;test. That was suprising as the tests had worked fine before. I stashed all&#xA;current changes, but the error persisted. I recognized&#xA;&lt;a href=&#34;https://docs.python.org/3/library/lzma.html&#34;&gt;that the lzma module&lt;/a&gt; is part of the standard library. I could not find the&#xA;module &lt;em&gt;_lzma&lt;/em&gt; though. It turned out that the problem could be reproduced with a&#xA;simple import statement:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Consume HTTP APIs lazily</title>
      <link>https://carl.duevel.online/blog/lazy_api_consumption/</link>
      <pubDate>Sat, 17 Apr 2021 13:26:00 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/lazy_api_consumption/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Using lazy sequences for API consumption has advantages in memory&#xA;consumption and promotes interactive development.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;HTTP APIs are ubiquitous and consuming them is a programming task coming up quite&#xA;regularly (at least for me). Therefore I found the following idiom pretty&#xA;useful, which turns a paginated, remote data source (in this case the GitHub jobs API)&#xA;into a lazy sequence:&lt;/p&gt;&#xA;&lt;div class=&#34;src src-clojure&#34;&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;defn- &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;fetch-lazy-jobs-seq!&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;([]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;fetch-lazy-jobs-seq!&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;let &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;jobs-url&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;](&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;https://jobs.github.com/positions.json?page=%d&amp;#34;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;http/get&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;jobs-url&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;:as&lt;/span&gt; &lt;span class=&#34;ss&#34;&gt;:json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;seq &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;lazy-cat &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;fetch-lazy-jobs-seq!&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;inc &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;page&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nv&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;In the REPL it is comfortable to just inspect parts of the data without waiting for&#xA;many HTTP requests to be send:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making REPL driven development easy with leiningen</title>
      <link>https://carl.duevel.online/blog/lein_repl/</link>
      <pubDate>Tue, 13 Apr 2021 20:40:19 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/lein_repl/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Leiningen provides facilities that make using a REPL driven workflow a breeze.&#xA;You should consider using them on your projects for a more pleasant development&#xA;experience.&lt;/p&gt;&#xA;&lt;div id=&#34;outline-container-headline-1&#34; class=&#34;outline-2&#34;&gt;&#xA;&lt;h2 id=&#34;headline-1&#34;&gt;&#xA;Make your system reloadable&#xA;&lt;/h2&gt;&#xA;&lt;div id=&#34;outline-text-headline-1&#34; class=&#34;outline-text-2&#34;&gt;&#xA;&lt;p&gt;First of all the &lt;a href=&#34;https://cognitect.com/blog/2013/06/04/clojure-workflow-reloaded&#34;&gt;application should be reloadable&lt;/a&gt;, that means restartable in the&#xA;REPL without restarting the entire process. If the app can shutdown and start&#xA;quickly, this makes development way faster, less error prone and &#xA;more pleasing experience. If you use component, this can be easily done with&#xA;the &lt;a href=&#34;https://github.com/weavejester/reloaded.repl&#34;&gt;reloaded.repl&lt;/a&gt; library provided by weavejester.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Clone all those gitlab repositories</title>
      <link>https://carl.duevel.online/blog/getalltherepos/</link>
      <pubDate>Sat, 13 Jul 2019 20:40:19 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/getalltherepos/</guid>
      <description>&lt;p&gt;If you change work environments once in a while you know that there is one thing&#xA;that you are doing quite a lot of when starting off: Cloning quite a lot of&#xA;repositories. Microservices, git and infrastructure as code among other things&#xA;have let to a big number of repositories in almost all organizations.&lt;/p&gt;&#xA;&lt;p&gt;&#xA;As I was doing that the last time it got really tedious. Mainly because I wanted&#xA;to search the whole code base and that did not work with the local gitlab&#xA;instance. Naturally I turned to the shell to give this a shot and as it turns&#xA;out it is a one liner (line breaks added for your convenience ;)), mostly&#xA;thanks to &lt;a href=&#34;https://python-gitlab.readthedocs.io/en/stable/cli.html&#34;&gt;python-gitlab&lt;/a&gt; and the inherent awesomeness of the shell:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thinkpad Ultra Dock Annoyances</title>
      <link>https://carl.duevel.online/blog/display/</link>
      <pubDate>Thu, 08 Mar 2018 22:26:18 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/display/</guid>
      <description>&lt;p&gt;Just a few days ago I finally fixed an annoyance with my Thinkpad T460p and the Ultra Dock:&#xA;Removing the laptop from the Dock results in it going into hibernation. Then after opening the&#xA;lid it does not switch the built in screen back on. This turns out to be easy to fix.&lt;/p&gt;&#xA;&lt;p&gt;Undocking and docking leads to a lot of events which can be observed by a simple&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo acpi_listen&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The event that seems to be the most promising is used as a trigger to correct the display settings.&#xA;In my case that meant putting&lt;/p&gt;</description>
    </item>
    <item>
      <title>Releasing clojure libs</title>
      <link>https://carl.duevel.online/blog/releases/</link>
      <pubDate>Sat, 15 Jul 2017 22:44:39 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/releases/</guid>
      <description>&lt;p&gt;Releasing libraries is a tedious but important task.&lt;!-- raw HTML omitted --&gt;&#xA;There is lots to do and lots to screw up:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Tagging the release state&lt;/li&gt;&#xA;&lt;li&gt;Making a clean build&lt;/li&gt;&#xA;&lt;li&gt;Signing the artifacts&lt;/li&gt;&#xA;&lt;li&gt;Pushing them to some repository&lt;/li&gt;&#xA;&lt;li&gt;Bumping the version to the next snapshot iteration&lt;/li&gt;&#xA;&lt;li&gt;And so on and so forth&amp;hellip;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Having a dark past in the java world I looked for something like the &lt;a href=&#34;http://maven.apache.org/maven-release/maven-release-plugin/&#34;&gt;maven release&lt;/a&gt; plugin for leiningen, which&#xA;automates the whole process quite nicely. Turns out there exist &lt;a href=&#34;https://clojars.org/search?q=release&#34;&gt;a &lt;em&gt;lot&lt;/em&gt; of release plugins&lt;/a&gt;. Right now &lt;a href=&#34;https://clojars.org/&#34;&gt;clojars&lt;/a&gt; lists 50 results for the search term release.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create bugs with overtone</title>
      <link>https://carl.duevel.online/blog/overtone/</link>
      <pubDate>Fri, 14 Jul 2017 22:26:18 +0200</pubDate>
      <guid>https://carl.duevel.online/blog/overtone/</guid>
      <description>&lt;p&gt;These days I stumbled upon some code committed by a very competent but sadly no longer present colleague and was baffled to see this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-clojure&#34; data-lang=&#34;clojure&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Throwable&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;log/error&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;horrible&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;things&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;happend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This left me puzzled and after looking for clues why this had been done (and not finding any) I decided to remove this exception dodger and move on.&#xA;Turns out I created a bug.&lt;/p&gt;&#xA;&lt;p&gt;Why? Because this code was called in a job scheduler from the very popular &lt;a href=&#34;https://github.com/overtone/at-at&#34;&gt;overtone/at-at&lt;/a&gt; library.&#xA;And it showed the following behavior:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
