<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Daniel Mitterdorfer</title>
    <link>https://daniel.mitterdorfer.name/posts/</link>
    <description>Recent content in Posts on Daniel Mitterdorfer</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 30 Jan 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://daniel.mitterdorfer.name/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Largest-Triangle-Three-Buckets and the Fourier Transform</title>
      <link>https://daniel.mitterdorfer.name/posts/2024-01-30-downsampling-lttb-and-fft/</link>
      <pubDate>Tue, 30 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2024-01-30-downsampling-lttb-and-fft/</guid>
      <description>&lt;p&gt;When visualizing time series with more data points than available on-screen pixels we waste system resources and network bandwidth without adding any value. Therefore, various algorithms are available to reduce the data volume. One such algorithm is Largest-Triangle-Three-Buckets (LTTB) described by Sveinn Steinarsson in his &lt;a href=&#34;https://skemman.is/handle/1946/15343?locale=en&#34;&gt;master&amp;rsquo;s thesis&lt;/a&gt;. The key idea of the algorithm is to preserve the visual properties of the original data as much as possible by putting the original data in equally sized buckets and then determining the &amp;ldquo;most significant point&amp;rdquo; within each bucket. It does so by comparing adjacent points and selecting one point per bucket for which the largest triangle can be constructed (see page 19ff in the thesis for an in-depth description of the algorithm). The algorithm is implemented in various languages; in this blog post we&amp;rsquo;ll use the Python implementation in the &lt;a href=&#34;https://sr.ht/~javiljoen/lttb/&#34;&gt;lttb library&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Latency Analysis of Elasticsearch</title>
      <link>https://daniel.mitterdorfer.name/posts/2023-10-15-latency-analysis-elasticsearch/</link>
      <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2023-10-15-latency-analysis-elasticsearch/</guid>
      <description>&lt;p&gt;I currently work on the backend of &lt;a href=&#34;https://www.elastic.co/observability/universal-profiling&#34;&gt;Elastic Universal Profiling&lt;/a&gt;, which is a fleet-wide continuous profiler. In our benchmarks we have observed higher than desired latency in a query that retrieves data for flamegraphs. As this is a key aspect of our product we wanted to better understand the root cause.&lt;/p&gt;
&lt;h5 id=&#34;cpu-profiling&#34;&gt;CPU Profiling&lt;/h5&gt;
&lt;p&gt;We started to gather CPU profiles with &lt;a href=&#34;https://github.com/async-profiler/async-profiler&#34;&gt;async-profiler&lt;/a&gt; in &lt;a href=&#34;https://github.com/async-profiler/async-profiler#wall-clock-profiling&#34;&gt;Wall-clock profiling mode&lt;/a&gt; on the Elasticsearch cluster while it was processing a query:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Downsampling Profiles</title>
      <link>https://daniel.mitterdorfer.name/posts/2023-07-20-downsampling-profiles/</link>
      <pubDate>Thu, 20 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2023-07-20-downsampling-profiles/</guid>
      <description>&lt;p&gt;I currently work on the backend of &lt;a href=&#34;https://www.elastic.co/observability/universal-profiling&#34;&gt;Elastic Univeral Profiling&lt;/a&gt;, which is a fleet-wide continuous profiler. At Elastic we live the concept of &lt;a href=&#34;https://www.elastic.co/about/our-source-code#space-time&#34;&gt;space-time&lt;/a&gt;, which means that we regularly get to experiment in a little bit similar vein to &lt;a href=&#34;https://en.wikipedia.org/wiki/Side_project_time&#34;&gt;Google&amp;rsquo;s 20% time&lt;/a&gt;. Mostly recently, I&amp;rsquo;ve experimented with possibilities to either store less profiling data or query data in a way that allows us to reduce latency. The data model consists basically of two entities:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Life as a remote worker: Organization</title>
      <link>https://daniel.mitterdorfer.name/posts/2018-03-10-remote-work-organization/</link>
      <pubDate>Sat, 10 Mar 2018 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2018-03-10-remote-work-organization/</guid>
      <description>&lt;p&gt;I work for more than two years at &lt;a href=&#34;https://www.elastic.co/&#34;&gt;Elastic&lt;/a&gt; where I focus on benchmarking, performance analysis and performance tuning for Elasticsearch. In my daily work, I have to deal with many people: our users, various of our engineering teams, support, consulting, marketing, sales, product management and our developer relations team. As you might imagine, these are a lot of balls to juggle.&lt;/p&gt;
&lt;h4 id=&#34;structuring-work&#34;&gt;Structuring Work&lt;/h4&gt;
&lt;p&gt;Often, I get requests that I cannot immediately work on. Therefore, I need a way to organize the incoming stream of tasks. I use a variation of &lt;a href=&#34;http://gamestorming.com/personal-kanban/&#34;&gt;Personal Kanban&lt;/a&gt; that I have implemented in &lt;a href=&#34;https://www.trello.com/&#34;&gt;Trello&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Xprof, the forgotten HotSpot profiler</title>
      <link>https://daniel.mitterdorfer.name/posts/2017-08-17-xprof/</link>
      <pubDate>Thu, 17 Aug 2017 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2017-08-17-xprof/</guid>
      <description>&lt;p&gt;Did you know that every HotSpot-based JVM includes a profiler? You can activate it on the command line with &lt;code&gt;-Xprof&lt;/code&gt; and it dumps its output to stdout.&lt;/p&gt;
&lt;p&gt;The information about it is pretty sparse, so I decided to write a short blog post about it.&lt;/p&gt;
&lt;h3 id=&#34;getting-started&#34;&gt;Getting Started&lt;/h3&gt;
&lt;p&gt;Let&amp;rsquo;s dive right in with an example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class Fibonacci {
    private static long fib(long n) {
        if (n &amp;lt;= 0) {
            throw new IllegalArgumentException(&amp;#34;n must be a natural number&amp;#34;);
        } else if (n == 1 || n == 2) {
            return 1;
        } else {
            return fib(n - 2) + fib(n - 1);
        }
    }

    public static void main(String[] args) {
        System.out.println(fib(50));
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you compile and run this code with &lt;code&gt;java Fibonacci -Xprof&lt;/code&gt; you&amp;rsquo;ll get the following output after the program has finished:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Simplicity</title>
      <link>https://daniel.mitterdorfer.name/posts/2017-02-06-simplicity/</link>
      <pubDate>Mon, 06 Feb 2017 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2017-02-06-simplicity/</guid>
      <description>&lt;p&gt;I admit it: I use &lt;a href=&#34;https://noscript.net/&#34;&gt;noscript&lt;/a&gt;, I block trackers like Google Analytics and all sorts of ads. If you browse the web this way, you see strange things: in the best case layouts are completely broken but in some cases pages even do not show up. And no, I am not talking about interactive pages like Google Maps. I am talking about pages that are content heavy. To me these people are just downright sloppy.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>There goes my low latency: Analyzing hiccups with jHiccup, Elasticsearch and Kibana</title>
      <link>https://daniel.mitterdorfer.name/posts/2016-04-18-analyze-hiccups-with-jhiccup-elasticsearch-kibana/</link>
      <pubDate>Mon, 18 Apr 2016 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2016-04-18-analyze-hiccups-with-jhiccup-elasticsearch-kibana/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/finish_line.jpg&#34; alt=&#34;Who crosses the finish line first?&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;https://www.flickr.com/photos/usmcarchives/6302891708/&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/usmcarchives/&#34;&gt;USMC Archives
&lt;/a&gt;; license: &lt;a href=&#34;https://creativecommons.org/licenses/by/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The other day I had to analyze search latency spikes in Elasticsearch for a customer. When latency spikes are involved, one of the first things I want to know is the &amp;ldquo;noiseness&amp;rdquo; of the host where the problem occurs.&lt;/p&gt;
&lt;p&gt;A great tool that helps with this analysis is Gil Tene&amp;rsquo;s &lt;a href=&#34;https://github.com/giltene/jHiccup&#34;&gt;jHiccup&lt;/a&gt;. It records hiccups in the application and also in a control process. One thing that bugged me about jHiccup for a long time is that you need to Microsoft Excel to visualize the data. However, I don&amp;rsquo;t own an MS Office license and as much as I like jHiccup, I won&amp;rsquo;t buy a license just for that.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hidden Gems in the JVM: jcmd</title>
      <link>https://daniel.mitterdorfer.name/posts/2015-05-27-jcmd/</link>
      <pubDate>Wed, 27 May 2015 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2015-05-27-jcmd/</guid>
      <description>&lt;p&gt;&lt;code&gt;jcmd&lt;/code&gt; is one of those neat tools that only a few people seem to know about. It is a command line tool that is shipped with each Oracle JDK installation and provides basic information about a running Java process, which is practical for unobtrusively inspecting a running production instance.&lt;/p&gt;
&lt;h3 id=&#34;how-to-use-jcmd&#34;&gt;How to Use jcmd&lt;/h3&gt;
&lt;p&gt;To use &lt;code&gt;jcmd&lt;/code&gt; we need to specify the process id of a running Java process. When &lt;code&gt;jcmd&lt;/code&gt; is invoked without any arguments, it prints a list of all running Java processes:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Handling InterruptedException Properly</title>
      <link>https://daniel.mitterdorfer.name/posts/2015-01-20-handling-interruptedexception/</link>
      <pubDate>Tue, 20 Jan 2015 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2015-01-20-handling-interruptedexception/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/stop.jpg&#34; alt=&#34;Stop&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;https://www.flickr.com/photos/juan-antonio-capo/6506889559&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/juan-antonio-capo/&#34;&gt;Juan Antonio Capó Alonso&lt;/a&gt;; license: &lt;a href=&#34;https://creativecommons.org/licenses/by/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;InterruptedException&lt;/code&gt; is among the most misunderstood exceptions in the JDK. How often did we come across exception handlers like this one:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;enqueue&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;Object&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;queue&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;put&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;catch&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;InterruptedException&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;e&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;// ignore&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or even:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;public&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;void&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#6639ba&#34;&gt;enqueue&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;Object&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;try&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;queue&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;put&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;value&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;catch&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;InterruptedException&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;e&lt;span style=&#34;color:#1f2328&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;{&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;    &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;throw&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;RuntimeException&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;e&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;  &lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In most cases, these handler implementations are wrong.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microbenchmarking in Java with JMH: Digging Deeper</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/</link>
      <pubDate>Wed, 20 Aug 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/</guid>
      <description>&lt;p&gt;This is the fifth and last post in a series about microbenchmarking on the JVM with the &lt;a href=&#34;http://openjdk.java.net/projects/code-tools/jmh/&#34;&gt;Java Microbenchmarking Harness (JMH)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/&#34;&gt;part 1: Microbenchmarking in Java with JMH: An Introduction&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/&#34;&gt;part 2: Microbenchmarks and their environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/&#34;&gt;part 3: Common Flaws of Handwritten Benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/&#34;&gt;part 4: Hello JMH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the previous post, I have introduced JMH with a Hello World benchmark. Now, let&amp;rsquo;s dig a bit deeper to find out more about the capabilities of JMH.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Cheap Read-Write Lock Explained</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-07-29-cheap-read-write-lock/</link>
      <pubDate>Tue, 29 Jul 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-07-29-cheap-read-write-lock/</guid>
      <description>&lt;p&gt;I have recently stumbled across a nice idiom called the &lt;a href=&#34;http://www.ibm.com/developerworks/library/j-jtp06197/&#34;&gt;cheap read-write lock&lt;/a&gt;. It is intended for very frequent concurrent reads of a field where synchronization would lead to too much contention. I think that the idiom is a bit odd and begs for an explanation.&lt;/p&gt;
&lt;h4 id=&#34;usage-scenario&#34;&gt;Usage Scenario&lt;/h4&gt;
&lt;p&gt;For the sake of demonstration consider the following situation: Our system has a globally available calendar that holds the current day within the year. Every part of the system may read the current day. Once a day, a background thread will update it. Note that this scenario might not justify using the idiom in practice, but the example is sufficient for illustrating it.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microbenchmarking in Java with JMH: Hello JMH</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/</link>
      <pubDate>Tue, 17 Jun 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/</guid>
      <description>&lt;p&gt;This is the fourth post in a series about microbenchmarking on the JVM with the &lt;a href=&#34;http://openjdk.java.net/projects/code-tools/jmh/&#34;&gt;Java Microbenchmarking Harness (JMH)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/&#34;&gt;part 1: Microbenchmarking in Java with JMH: An Introduction&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/&#34;&gt;part 2: Microbenchmarks and their environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/&#34;&gt;part 3: Common Flaws of Handwritten Benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/&#34;&gt;part 5: Digging Deeper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the previous post I have shown different problems that we might miss when writing microbenchmarks from scratch. In this blog post I&amp;rsquo;ll introduce JMH and show how it helps us to avoid these problems.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microbenchmarking in Java with JMH: Common Flaws of Handwritten Benchmarks</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/</link>
      <pubDate>Tue, 20 May 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/fail_road.jpg&#34; alt=&#34;Fail Road&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;https://www.flickr.com/photos/sarah_g/4485767592/&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/sarah_g/&#34;&gt;Sarah&lt;/a&gt;; license: &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-sa/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;This is the third post in a series about microbenchmarking on the JVM with the &lt;a href=&#34;http://openjdk.java.net/projects/code-tools/jmh/&#34;&gt;Java Microbenchmarking Harness (JMH)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/&#34;&gt;part 1: Microbenchmarking in Java with JMH: An Introduction&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/&#34;&gt;part 2: Microbenchmarks and their environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/&#34;&gt;part 4: Hello JMH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/&#34;&gt;part 5: Digging Deeper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the previous post I have shown typical issues that have to be considered when executing microbenchmarks, such as the behavior of the JIT compiler or background system load. In this blog post we&amp;rsquo;ll discover different problems that you&amp;rsquo;ll encounter when writing microbenchmarks on the JVM.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microbenchmarking in Java with JMH: Microbenchmarks and their environment</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/</link>
      <pubDate>Mon, 14 Apr 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/cpu_pins.jpg&#34; alt=&#34;CPU Pins&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;https://www.flickr.com/photos/ed10vi/5786763200&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/ed10vi/&#34;&gt;Eduardo Diez Viñuela&lt;/a&gt;; license: &lt;a href=&#34;https://creativecommons.org/licenses/by-sa/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;This is the second post in a series about microbenchmarking on the JVM with the &lt;a href=&#34;http://openjdk.java.net/projects/code-tools/jmh/&#34;&gt;Java Microbenchmarking Harness (JMH)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/&#34;&gt;part 1: Microbenchmarking in Java with JMH: An Introduction&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/&#34;&gt;part 3: Common Flaws of Handwritten Benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/&#34;&gt;part 4: Hello JMH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/&#34;&gt;part 5: Digging Deeper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the previous post I have introduced microbenchmarking. In this blog post we&amp;rsquo;ll discover different problems and precautions that should be taken when writing microbenchmarks on the JVM.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>False Sharing</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-03-28-false-sharing/</link>
      <pubDate>Fri, 28 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-03-28-false-sharing/</guid>
      <description>&lt;p&gt;Normally, Java programmers are not too concerned about the hardware on which their beautiful software runs as long as provides loads of memory. Most of the time this is a good thing as software should solve a business problem rather than satisfying a machine. The JVM does a decent job hiding the underlying platform but as we know, abstractions are leaky. Sometimes we have to peek under hood, especially when we&amp;rsquo;re concerned about performance. One such topic is false sharing, were a very performance-critical component might not perform as well as we&amp;rsquo;d expect.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Microbenchmarking in Java with JMH: An Introduction</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/</link>
      <pubDate>Tue, 18 Mar 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-03-18-jmh-microbenchmarking-intro/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/fire_breathers_500.jpg&#34; alt=&#34;Fire Breathers&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;http://www.flickr.com/photos/zachd1_618/4940159724/&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;http://www.flickr.com/photos/zachd1_618/&#34;&gt;Zach Dischner&lt;/a&gt;; license: &lt;a href=&#34;http://creativecommons.org/licenses/by/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;This is the first post in a series about microbenchmarking on the JVM with the &lt;a href=&#34;http://openjdk.java.net/projects/code-tools/jmh/&#34;&gt;Java Microbenchmarking Harness (JMH)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-04-14-microbenchmarking-environment/&#34;&gt;part 2: Microbenchmarks and their environment&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-05-20-benchmarking-flaws/&#34;&gt;part 3: Common Flaws of Handwritten Benchmarks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-06-17-benchmarking-hello-jmh/&#34;&gt;part 4: Hello JMH&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-08-20-benchmarking-digging-deeper/&#34;&gt;part 5: Digging Deeper&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this post I&amp;rsquo;ll introduce benchmarking conceptually and describe the specific flavor microbenchmarking.&lt;/p&gt;
&lt;h4 id=&#34;what-is-benchmarking&#34;&gt;What is Benchmarking?&lt;/h4&gt;
&lt;p&gt;When software engineers are concerned with the performance of a system, they can resort to a rich variety of practices, for example:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Using Perlock with Spring</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-02-25-using-perlock-with-spring/</link>
      <pubDate>Tue, 25 Feb 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-02-25-using-perlock-with-spring/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/danielmitterdorfer/perlock&#34;&gt;Perlock&lt;/a&gt; - a simple Java path watching library I have written - is available in &lt;a href=&#34;http://repo1.maven.org/maven2/name/mitterdorfer/perlock/perlock-core/0.2.0/&#34;&gt;Maven Central&lt;/a&gt; since a few weeks now. I thought it would be nice to provide another demo application to show how it can be used with Spring. It is provided along with &lt;a href=&#34;https://github.com/danielmitterdorfer/perlock&#34;&gt;Perlock&lt;/a&gt; on Github in &lt;a href=&#34;https://github.com/danielmitterdorfer/perlock/tree/master/examples/perlock-spring-demo&#34;&gt;examples/perlock-spring-demo&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&#34;demo-scenario&#34;&gt;Demo Scenario&lt;/h4&gt;
&lt;p&gt;The demo application implements a XML file processing application. Clients put XML files in an input directory (in the example, it&amp;rsquo;s just the /tmp directory), a &lt;code&gt;MessageDispatcher&lt;/code&gt; listens for new XML files in the directory with Perlock, and dispatches the file processing to a &lt;code&gt;MessageProcessor&lt;/code&gt; which simulates some work. Below is an overview of the involved classes:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Perlock - Path Watching without Headaches</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-01-28-perlock-path-watching-without-headaches/</link>
      <pubDate>Tue, 28 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-01-28-perlock-path-watching-without-headaches/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/sherlock.jpg&#34; alt=&#34;Sherlock&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;http://www.flickr.com/photos/46427634@N06/10910153674/&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;http://www.flickr.com/photos/46427634@N06/&#34;&gt;Sandra&lt;/a&gt;; license: &lt;a href=&#34;http://creativecommons.org/licenses/by-nc-sa/2.0/&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;As I have written in my &lt;a href=&#34;https://daniel.mitterdorfer.name/posts/2014-01-08-watching-files-with-jdk7/&#34;&gt;previous post&lt;/a&gt; the JDK 7 &lt;code&gt;WatchService&lt;/code&gt; API is too low level to be used directly in an application. To my surprise, to this day no Java library has existed that abstracts the JDK 7 &lt;code&gt;WatchService&lt;/code&gt; API and provides an easy high level API on top.&lt;/p&gt;
&lt;h4 id=&#34;a-simplified-api-perlock&#34;&gt;A Simplified API: Perlock&lt;/h4&gt;
&lt;p&gt;Therefore I created &lt;a href=&#34;https://github.com/danielmitterdorfer/perlock&#34;&gt;perlock&lt;/a&gt; (short for Path-Sherlock). It supports the standard use case of watching files or directories for modifications and performing some action then. It consists of a very small API with two interfaces and two classes:&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Watching File Changes with the JDK 7 WatchService</title>
      <link>https://daniel.mitterdorfer.name/posts/2014-01-08-watching-files-with-jdk7/</link>
      <pubDate>Wed, 08 Jan 2014 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2014-01-08-watching-files-with-jdk7/</guid>
      <description>&lt;p&gt;Have you ever needed to watch the file system for changes in a Java application? Java 7 ships with the WatchService API that is suited exactly for this use case as you might know. My journey with the WatchService API began a few months ago when I stumbled across this code I have originally written a few years ago:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#57606a&#34;&gt;//TODO: Update to JDK 7 and replace with native watcher&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FileSystemManager&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;fsManager&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;VFS&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;getManager&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;();&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;watchedDirectory&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;fsManager&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;resolveFile&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;queueDirectory&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;getAbsolutePath&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;());&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DefaultFileMonitor&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;fileMonitor&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;new&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt; &lt;/span&gt;DefaultFileMonitor&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;this&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fileMonitor&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;setRecursive&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#cf222e&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;span style=&#34;color:#fff&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;fileMonitor&lt;span style=&#34;color:#1f2328&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;addFile&lt;/span&gt;&lt;span style=&#34;color:#1f2328&#34;&gt;(&lt;/span&gt;watchedDirectory&lt;span style=&#34;color:#1f2328&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the snippet above I setup a Apache Commons VFS &lt;code&gt;DefaultFileMonitor&lt;/code&gt; which checks for modification within the &lt;code&gt;queueDirectory&lt;/code&gt;. The code is part of a Dropbox-based data synchronization I use for myself. Although there is nothing wrong with Apache Commons VFS, I use only a small portion of a quite large library and wanted to reduce the application&amp;rsquo;s footprint by switching to native JDK facilities. Furthermore, Apache Commons VFS relies on polling whereas the Java 7 WatchService can use native kernel facilities if they are available on the platform. As Java 7 is available for quite some time, I decided to finally have a look at the WatchService API. I was not amused.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Hello World on (20)131211</title>
      <link>https://daniel.mitterdorfer.name/posts/2013-12-11-13-12-11-hello-world/</link>
      <pubDate>Wed, 11 Dec 2013 00:00:00 +0000</pubDate>
      
      <guid>https://daniel.mitterdorfer.name/posts/2013-12-11-13-12-11-hello-world/</guid>
      <description>&lt;p&gt;What&amp;rsquo;s this all &lt;a href=&#34;https://daniel.mitterdorfer.name/about.html&#34;&gt;about&lt;/a&gt;? Well, let the pictures speak for themselves:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/11-12-13-concurrency.jpg&#34; alt=&#34;Geek and Poke - Concurrency&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/11-12-13-latency.jpg&#34; alt=&#34;Geek and Poke - Latency&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://daniel.mitterdorfer.name/img/11-12-13-se.jpg&#34; alt=&#34;Geek and Poke - Software Engineering&#34;&gt;&lt;/p&gt;
&lt;p style=&#34;clear:both&#34;&gt;&lt;small&gt;&lt;a href=&#34;http://geek-and-poke.com/geekandpoke/2012/9/3/simply-explained.html&#34;&gt;Image&lt;/a&gt;, &lt;a href=&#34;http://geek-and-poke.com/geekandpoke/2012/12/9/simply-explained.html&#34;&gt;Image&lt;/a&gt;, &lt;a href=&#34;http://geek-and-poke.com/geekandpoke/2010/9/23/behind-the-lines.html&#34;&gt;Image&lt;/a&gt; by &lt;a href=&#34;http://geek-and-poke.com&#34;&gt;Geek&amp;amp;Poke&lt;/a&gt;; license: &lt;a href=&#34;http://creativecommons.org/licenses/by/3.0/deed.en_US&#34;&gt;CC&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
