<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Manuel Bernhardt</title><link>https://manuel.bernhardt.io/</link><description>Recent content on Manuel Bernhardt</description><generator>Hugo</generator><language>en</language><lastBuildDate>Mon, 01 Dec 2025 09:39:20 +0100</lastBuildDate><atom:link href="https://manuel.bernhardt.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Macbook Pro Insomnia</title><link>https://manuel.bernhardt.io/posts/2025-07-24-macbook-pro-insomnia/</link><pubDate>Thu, 24 Jul 2025 20:38:38 +0000</pubDate><guid>https://manuel.bernhardt.io/posts/2025-07-24-macbook-pro-insomnia/</guid><description>&lt;p>&lt;em>Update (01.08.2025): fixed broken link, typo, clarified problematic behaviour&lt;/em>&lt;/p>
&lt;p>For a number of years now I have a MacBook Pro Silicon M1 Max. It worked beautifully.&lt;/p>
&lt;p>Then, seemingly out of nowhere, I started noticing that the battery drained over night when I left the notebook somewhere, not connected to power. This got worse and worse, up until the point that I&amp;rsquo;ve had enough of it and I started doing some research.&lt;/p></description></item><item><title>200 dives and counting</title><link>https://manuel.bernhardt.io/posts/2025-04-03-200-dives-and-counting/</link><pubDate>Thu, 03 Apr 2025 21:32:09 +0200</pubDate><guid>https://manuel.bernhardt.io/posts/2025-04-03-200-dives-and-counting/</guid><description>&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/IMG_3333.jpg" class="pure-img" alt="">
 &lt;figcaption>200th dive&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>I started diving when I was 6 years old. Although I now live for a very long time in land-locked Austria, I still enjoy diving when I get the chance. The above picture was taken on Curaçao last October, where I went diving with my father.&lt;/p>
&lt;p>When the world goes entirely crazy my plan is to relocate somewhere warm and work as a scuba dive instructor.&lt;/p></description></item><item><title>Cloud Run Job with arguments</title><link>https://manuel.bernhardt.io/posts/2025-02-22-cloud-run-job-scheduler-args/</link><pubDate>Sat, 22 Feb 2025 16:10:22 +0200</pubDate><guid>https://manuel.bernhardt.io/posts/2025-02-22-cloud-run-job-scheduler-args/</guid><description>&lt;p>&lt;a href="https://cloud.google.com/run/docs/create-jobs">Cloud Run Jobs&lt;/a> allows to run containers as jobs, i.e. as short-lived tasks that spin up a container every time that they&amp;rsquo;re invoked. As with every container you can use environment variables to pass context. But what if we want to pass arguments to the container?&lt;/p>
&lt;p>In this case, the GCP API specifies &lt;a href="https://cloud.google.com/run/docs/reference/rest/v1/namespaces.jobs/run#ContainerOverride">containerOverrides&lt;/a>. When using terraform, we can pass those with the &lt;code>google_cloud_scheduler_job&lt;/code>resource by customizing the &lt;code>http_target&lt;/code> body like so:&lt;/p></description></item><item><title>On Azure</title><link>https://manuel.bernhardt.io/posts/2024-05-16-on-azure/</link><pubDate>Thu, 16 May 2024 10:49:22 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2024-05-16-on-azure/</guid><description>&lt;p>&lt;em>I&amp;rsquo;m working with a client &lt;del>condemned to&lt;/del> graced with the privilege of using the Azure Cloud platform. Whilst I have years of experience working with AWS and GCP, my last exposure to Azure goes back to 2017. Memories from that time before Corona are faint, the world was a different place back then. But some things do not change.&lt;/em>&lt;/p>
&lt;h2 id="identities">On Managed Identities&lt;/h2>
&lt;p>&amp;hellip;without having to manage any credentials? The &lt;a href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview">sound of it&lt;/a> is pleasant to the ears, and off we go taking this approach to setup an &lt;a href="https://learn.microsoft.com/en-us/azure/postgresql/flexible-server/how-to-connect-with-managed-identity">Azure Database for PosgreSQL - Flexible Server&lt;/a>. The name is long, the process a bit involved, but in the end the identity is there, managed.&lt;/p></description></item><item><title>Migrating from Kubernetes to Google Cloud Run with terraform</title><link>https://manuel.bernhardt.io/posts/2024-03-07-k8s-to-cloud-run/</link><pubDate>Thu, 07 Mar 2024 11:14:12 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2024-03-07-k8s-to-cloud-run/</guid><description>&lt;p>Kubernetes has its advantages when you&amp;rsquo;re big enough and require the flexibility it offers. But when all you&amp;rsquo;re after is running services and you don&amp;rsquo;t need stateful sets, &lt;a href="https://cloud.google.com/run?hl=en">Google Cloud Run&lt;/a> can be a good alternative (provided you&amp;rsquo;re using Google Cloud Platform). This article provides a few pointers to migrate Kubernetes deployments to Google Cloud Run.&lt;/p>
&lt;h1 id="migrating-yaml-deployment-descriptors">Migrating YAML deployment descriptors&lt;/h1>
&lt;p>There&amp;rsquo;s a &lt;a href="https://cloud.google.com/run/docs/migrate/from-kubernetes">guide for migrating deployment descriptors&lt;/a> which outlines the major syntax differences between a Kubernetes deployment and a Cloud Run service.&lt;/p></description></item><item><title>Fearless concurrency with Rust, cats, and a few Raspberry PIs</title><link>https://manuel.bernhardt.io/posts/2024-01-26-rust-fearless-concurrency-cats-raspberry-pi/</link><pubDate>Fri, 26 Jan 2024 10:58:12 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2024-01-26-rust-fearless-concurrency-cats-raspberry-pi/</guid><description>&lt;p>Somehow I&amp;rsquo;m never satisfied when a program only runs on one computer. The reassuring feeling of connectedness, the thrill of discovering who else is there on the network, the fear of network instability and the insanity of trying to establish a coherent view of the world on multiple machines are both a source of joy and despair that keep me hooked. But I digress&amp;hellip;&lt;/p>
&lt;p>In the previous article, we looked at &lt;a href="https://manuel.bernhardt.io/posts/2024-01-12-rust-cat-litter-box/">building a blinking Raspberry PI with Rust&lt;/a> to help cat owners think about cleaning the cat litter box (and avoid death stares from their feline companions). In this article, we&amp;rsquo;ll take things a step further and expand the Reminder PIs to a network, allowing to spread them all over the house so that forgetting about this daily cat owner duty will become an almost impossible thing to do. In order to achieve this, we will embrace the principles of &lt;a href="https://doc.rust-lang.org/book/ch16-00-concurrency.html">Fearless Concurrency&lt;/a> made possible by Rust&amp;rsquo;s memory management paradigm. More specifically, we will:&lt;/p></description></item><item><title>Building a cat litter box reminder with Rust</title><link>https://manuel.bernhardt.io/posts/2024-01-12-rust-cat-litter-box/</link><pubDate>Fri, 12 Jan 2024 15:34:48 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2024-01-12-rust-cat-litter-box/</guid><description>&lt;p>I continued working on a side-project I built a year ago with &lt;a href="https://www.rust-lang.org/">Rust&lt;/a>, and it is now at a point at which I can write something about it.&lt;/p>
&lt;p>When you own cats, you also own a litter box for said cats which needs to be emptied regularly (at least once a day for two adult cats). Failing this, the cats will give you a look which, in human language, means as much as &amp;ldquo;I will murder you in your sleep&amp;rdquo; which is not a very pleasant feeling.&lt;/p></description></item><item><title>On pinning and isolating CPU cores</title><link>https://manuel.bernhardt.io/posts/2023-11-16-core-pinning/</link><pubDate>Thu, 16 Nov 2023 17:27:11 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2023-11-16-core-pinning/</guid><description>&lt;p>This year I have been involved in running performance benchmarks of &lt;a href="https://aeron.io">Aeron&lt;/a> over at &lt;a href="https://weareadaptive.com">Adaptive&lt;/a> on two major cloud providers. I learned quite a few things about the &lt;del>arcane arts&lt;/del> &lt;del>science&lt;/del> craft of running performance benchmarks.&lt;/p>
&lt;p>When benchmarking a piece of software, you really want to get the best performance out of it, which is to say that you also want to run it under the best conditions in order to see what is possible. One aspect I&amp;rsquo;d like to cover in this article is related to giving the program exclusive access to the CPU core(s) it needs to run, without having other threads interfering with the execution. This involves:&lt;/p></description></item><item><title>Photography</title><link>https://manuel.bernhardt.io/photography/</link><pubDate>Sun, 12 Mar 2023 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/photography/</guid><description>&lt;em>I'm using a &lt;a href="https://fujifilm-x.com/en-us/products/cameras/x-s10/">Fuji X-S10&lt;/a> camera, mostly with the &lt;a href="https://fujifilm-x.com/en-us/products/lenses/xf10-24mmf4-r-ois-wr/">Fujinon XF 10-24mmF4&lt;/a> and the &lt;a href="https://fujifilm-x.com/en-us/products/lenses/xf35mmf14-r/">Fujinon XF 35mmF1.4&lt;/a> lenses.&lt;/em>
&lt;br>&lt;br>





	




































 	
	

	
		&lt;script src="https://manuel.bernhardt.io/shortcode-gallery/jquery-3.6.1.min.js">&lt;/script>
	
	
	
		&lt;script src="https://manuel.bernhardt.io/shortcode-gallery/lazy/jquery.lazy.min.js">&lt;/script>
	

	&lt;script src="https://manuel.bernhardt.io/shortcode-gallery/swipebox/js/jquery.swipebox.min.js">&lt;/script>
	&lt;link rel="stylesheet" href="https://manuel.bernhardt.io/shortcode-gallery/swipebox/css/swipebox.min.css">

	&lt;script src="https://manuel.bernhardt.io/shortcode-gallery/justified_gallery/jquery.justifiedGallery.min.js">&lt;/script>
	&lt;link rel="stylesheet" href="https://manuel.bernhardt.io/shortcode-gallery/justified_gallery/justifiedGallery.min.css"/>


&lt;style>
	

	
&lt;/style>





&lt;div id="gallery-15de3d6588abed1d581e0bb2757d2309-0-wrapper" class="gallery-wrapper">
&lt;div id="gallery-15de3d6588abed1d581e0bb2757d2309-0" class="justified-gallery">
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF3096.JPG" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>55mm f/28/5 1/340sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOt0Axy6famIFUaMbQecU/VU8tRuAIVX6ng8Hr3qLQ1ltLSGCRmleMEbzxnkmptQjkvlaJkYIwIYq3qPWufqWcDomsDU9GLSWEIjju2VVj38DCknlj616IQPLbNc7beEbSztTChl2GQyZZ&amp;#43;5AHYf7IroUZ2jbeoUk5HOacmmCVhI23RKKkzgYxUUP&amp;#43;rX61KaQDWc8nA4pszlVyKG6Gmz/coA/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF3096_hu_c258b396e489a124.JPG"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF3190.JPG" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>18mm f/16/5 1/100sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOB0STyNS82UNgpjIbAPPQ8jt712UOlXeqpJfSyJ5EDLz90FucBSSB2GeciuVQLZNvLpIynDDZxjmt1dTSS1eIiRkkAJVRgNWDpJu7M2l1NCzl1CztJLx4S9nMTCzScDh8ZHPXPf3rt/h/rEF/BdwRBQUcNkE/NlcdPw/lXnc&amp;#43;rTTaRZ6aE8uGOSQ4Jycs&amp;#43;7Nb/w8lFldtEvmCMyNvfadg&amp;#43;XjJ6A04QXNdArc2hTk8J6dcuWUGDd/wA8wOMfWs&amp;#43;fwkqXCwx3zgSg8lMkD0611cH8P1NVrn/kIW/&amp;#43;639KhydztdOL6HOt4YVEAF4&amp;#43;9eN2zjp1xmul0m1WysxHGcHGWI43H1qvL1P&amp;#43;8f5Cr9r/AKn8K2pdzOUYrY//2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF3190_hu_d442505bfb6f5ee0.JPG"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF3266.JPG" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>107/5mm f/4 1/500sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AK1xHY3t3cSzTKJVlZkDHGcdPrW3MNkVjLIG&amp;#43;SMAsB&amp;#43;FYMjkxbVWX5ZNxYKSADz/AFrXvZ1FnaZV9ipggknLHH/16xqO2pUFoX7nx9q9vexTi1JshhWCAMB7n0p0fjnUTLeG2uYbkysDAjAgR4OSvPtgfWsG80&amp;#43;S9cwpNsjK5JAP6VJaabbwAwrOxeUgMC&amp;#43;ee&amp;#43;DjNY/WGluZyhZ7mQ0t1NdNbpOIokVTgLknI9c0&amp;#43;a6lFoYQ2BG20EDnp1pkH/IRm/3E/lTJ/wDVy/8AXb/GtavwmkTe0u4Z7bygMbYxlupbjvXCPq93bawG81n8tyFBPviu10f7rf8AXNa88vf&amp;#43;Qq//AF0P865aUU4u5MtUf//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF3266_hu_4e22db7e3ca54909.JPG"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF3575.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>10mm f/28/5 1/750sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOY8P6fp1xMftGo28KswZTNkHGCMZ6D8R6e9ehaF4W0lFZ4JvtWRgNBINuPy5NeVWDqzlC0e1RglycDn2rpNIks7OUu12&amp;#43;5R/wAurlfzNaUqk1sjCcIvdnotxpmh6S32nUp40hX5oxPgbT/Uj2rzvxpqHhye7t20m8eXylYNEI8ISSDnnGenv0FR67p9rrF009reO9wcZW5lL/QZzn9K5DUtMubBszRoFPR0fOf1p1ZzluVCMUrIoLO4YsCcn3qQTyKCQxBNV161IfuCslsaWQ9LuaNiyucnqc0ya8nm4kcsBxzUfrTG6mkOx//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF3575_hu_6bc8d2957668f5c7.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF3992.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>87/5mm f/28/5 62244/93366001sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOEvI4yI/kU9SeBVwaNYTkFoyjEclWIqxqunQaVYIb65je7YfJDEP1JPaq8V/wDMCdoHtWFmaaMhn0GFFOyZxn&amp;#43;9g1k3FsLRjH5u7cOTt5ree8Q55B9icCsu7Cu7M0Z5/u801zIl8pSu7ye7naedy8jHJJpBdOOgFQtSCtrEXJmuJD/FTBNIpJDkH602mnvTQH//2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF3992_hu_6e1440b8e3614eda.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4008.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>24mm f/28/5 1/750sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APT9Z1J7PSLm4hZGeLaMehJHB/A/rV8R7lDAdRmvAbrxfrGoWksFzfSGOXDsgwMnjnIGT0H5CteD4ia7FbJCLrO1AgJAJA9fr0610cjtoHI2d94y8QW9rbHSl3GSQjzSAQEX8BUXiLXraw8OxbGR/tSBFWVweCDknnp1/OvPpvGN7NK8szrK8nOZFDbSCCCAR61nar4hudTWP7WFkMYAJI5bknn8/wCVSqctbi5Gc2sxWRQAOmKlSVnZTnGAPx4/&amp;#43;tVYf61fwqaHqPp/Q1sm2aod57mRRnrkfrRI7YPPPr&amp;#43;X&amp;#43;NRD/Wp9T/OpJO/1P9KfQXU//9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4008_hu_905e7c56a5758276.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4032.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>3184928/131067mm f/4 29548/25115801sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/ANWDxhaXWiT/AG2ZfPncFlHBK7kBAx6qT&amp;#43;VU9O1vTl0N4TIfPks5VKcn5t4x/wCOis5dEifyzFwANpONuTkdKs3OgmNEjgEXlsw8xT94r6L&amp;#43;JrBVL7lKk7XOgTxFpdj4fvIVnVD5reUhyQ65Gcfh/OuKhvoVuElyjIxkI3cDgZ/Dr&amp;#43;ldAdCzKsbIjW6eWSrnJL7jnP1A/lWdcaOrGNEiRdqyAYXpk/4UnLZD9kzqL&amp;#43;y8sRTmQHauGGwDJznOfrSlf9PtkHSTJOeehxVnVP8AjzX6Cq//ADE7L/df/wBCrI6i9Goa8KAAKVViMDkg4quNs14kDKMIznI4zn/9VWYP&amp;#43;Qh/2y/9mqrD/wAhc/Vv60NCR//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4032_hu_65ab4f6d292bfbdf.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4039.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>24mm f/28/5 11533/21912701sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AM7wp44trGzSHVpJn2NhZlUNxjgEdT35rp7D4gaZPBPKLmKFo84idSWI7YwOfpXndj4Vlt2WS&amp;#43;KqfvGAnOcdMkdq09T0A8GSKOBZACvlnC4x7CnzySFyIv8Ai3x&amp;#43;l9b/AGGB2CMAXl243&amp;#43;xHpXDSXbzSZEjMu3HygnitK78OSxkzfZjMp53I&amp;#43;4fpWdO08UaQKixhfQYIJ61i9XdjSsdUlxKyyOzksy5Jrcil&amp;#43;1WXkSruXAxntXPxf6lv&amp;#43;uf&amp;#43;Nbll/qvwFWy0c5eyT6desLedl4J&amp;#43;vsadb3iasuy7to3OcbumaZrf/H83&amp;#43;4f51Bon&amp;#43;sP&amp;#43;8azjqNn/2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4039_hu_2d182a886a4683.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4884.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>3630556/131067mm f/16/5 1/2200sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/APNtNh3QQnA5c/zFejWNoAg4xXFaZbPHp1jMy/JI5Of&amp;#43;BEf0r0vT44bhF&amp;#43;cFQR061i5W1NVG5m5uZCi2yFcSrvaQYBTPOK15NA&amp;#43;0qspEbY5U5Nc3ZyMf7QWW6ZYXlITgYG7kc9R712umTR/2fEA5dWBO5vrSlO2g4wPHrO7l&amp;#43;wRQscxRtlFHG3nOPzNb0XiK6a3kt44oY0kGPlXBXjHBGK5q0/49hV&amp;#43;2&amp;#43;9Q0gTZpW7CEp8oKjnapI59etbMPiKSBQgtkKgZ&amp;#43;8axR1X8KU9fwrJ67mq0P/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4884_hu_b1f462e3180295d5.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4894.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>3630556/131067mm f/28/5 1/480sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AJkiFVLnzVlINyqJkDCJgr37g9qel2oi8yQ7Uyepxx9fWsu7mJkW6YAwlwGY9B0z268iorYjmXLFl06PLrJE0MskmoxQmdzA6Aja3zdf51ptbrFM4FwZUKjCtjKnnOcf54rDmgt7SVZtLhjIBBO9&amp;#43;pz1H48VOL17yNshYbgbdwQcA5OPr/8AWrKFWSd7mk6cWrWIIz8gX2JB9OlSvbrNbiJyxTOSMnk8f4VDH0H&amp;#43;7Vtfu1LLWxUFr9ngaOCQp8wbJGaljtIUkjk25bI5NPk&amp;#43;61Sdk&amp;#43;tK7CyP/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4894_hu_eafe3d846be62b22.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4912.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>55mm f/8 1/2200sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AH2esQhRt3YHtWlP4hntdOuLmC2aTyIy&amp;#43;XYIpx7k1xcK2&amp;#43;4blQjucr/WrV9Bp91oN9BFLGknlFlbcScjDY4OOcelcjgrnSpux2S6xfyaVbXs1i4FxEsgEcqOORng7qw7zxIFJ32s4&amp;#43;pT/wCKqjYzWb6DZLthQiBEcM2TkAA9c981mXwXO1MKOwV15/DbQoK43N2K9sHZA25R/wABqxdpG9hJ5iscK&amp;#43;Nrkdqhtf8AUj8Knuv&amp;#43;PCX/AHX/AJVb3IWw6wnWbTI1Ee3CnJLZJ5qpdJsf5WYVLpP/ACDk&amp;#43;h/9Cpt59/8AGmtxPY//2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4912_hu_75b0b73eaae8218d.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF4987.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>9384755/262144mm f/28/5 1/480sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AN&amp;#43;0ljcDBrVjjVlzXmMWvyxnG12H&amp;#43;zzmte18aTxRlGtZzxwSmAPzrCaqLY66bpPdnYz7V6msy5kTnkVyl94lkvI3QGSIPyxQgH&amp;#43;fFQS6&amp;#43;WHLH8q0gqnUzm6d9GVLeTcASq8&amp;#43;1aCxwGNt1tC31QVmWv3R9K1F/wBWaiZUClcQ2&amp;#43;DtgReewxVOWCH&amp;#43;4f8Avo1euPun61Uk6VpFszkkf//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF4987_hu_96e6dfe19338f74f.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF5116.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>55mm f/4 1/58sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AKujwomnQERqcxrkEe1aXlI6FNm1SOcnr7Vi2N35WlxfOilUXJY4AHFXJHd4FLsVIJLKDkkDt/I1nY1TKcrLYmeMMgDnCo2OcgDoeo69x&amp;#43;NVbdzc6ZNuhwq/KJC2TJnvjtxirV6YXbdLJtEeF9MH8RWVa3MkUM0JAMfl7xgjjHt&amp;#43;VACadcuLVHJJEeAFBwDnA5q8s8lxaxyqRHvRiVHIyeOfWsuw/wCPE/VP5itC0/5B8H&amp;#43;4f503sT1Q&amp;#43;eN1VnaTdtUKgI6f41jNMyRyjJJ8sjOfUVu3X&amp;#43;pf8K56T7s3/XP&amp;#43;hoQ2f//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF5116_hu_729c86889a6e97e.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF5149.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>4495598/131067mm f/8 13980/44736001sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOcjIkbbvVWxwDxxWhYq3m7ZNu3sQwJP4Vzia3tHEGfq2P6VctvE/kuG&amp;#43;zxg9Ml//rVk3O2iLSjfU9B0zTIr5JokkWOaNNzIWGQp7kemcj8K5rVNMeC8P2m9iCj/AJZqOT6c9ahsNfe41qS&amp;#43;/dII7BkKgk7vnBA6fX9ayrzxOruw8oAem4/4VlFzuatQscwCgxmMGrVskbkAxiqfpV2z&amp;#43;8K6XsYLc7Dw/psCabfXAALx2&amp;#43;FyOAcnmuUupGLbvXn6V2&amp;#43;hf8gPUf8AriP5muFuei/SsYatmstkf//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF5149_hu_9c643a252ad432a9.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF5169.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>55mm f/28/5 11533/21912701sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOY0f&amp;#43;2ULrbgKzrndIOnuM1fNlrKwSl4rV958xpWYEk&amp;#43;w/8ArVkNrUjr8qz8js2P60yDXNQicmG4uIfUpJj&amp;#43;RqffepfurQ6WwvI7N0SaKea6k4kmKEqPYZ7D2q1PdRSqQMt7YxXKnUZJjvllmduuWbNRG8AbJLE&amp;#43;/NKzG7GLHu4IfB&amp;#43;lWEV3BAmkXHoRz&amp;#43;lV4vuj61ag/iq3sZrcdGw4Db2z/tAfyFNlSKRclXGP9vNC/fWg/cNMD//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF5169_hu_a8f53f0cf59b5b69.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF5185.jpg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF18-55mmF2.8-4 R LM OIS&lt;br/>4495598/131067mm f/28/5 1/640sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AI7NrZY0CjauABwRj2q79pgDbVG8jrjoPxrgYb&amp;#43;7OACF/wCAf/XrQtNQngkDP9nkGeRInH86pudtBxjSb1Z2Nw8QgLiaOIdN7YwP1FZ0MkWxnkvluck9FCgfQf8A165681Z7qRmM9upH8KEcD86zHuCcsJlOeuKUedrVjmqadolGKKZ1H&amp;#43;kMB6Y/&amp;#43;vVpUuF6XTf98io7f7gqyO1WjJkRWdAf3&amp;#43;T6larSRu4JLjPf5auydDVZvummB//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF5185_hu_f46a1aeacd201a72.jpg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF6731.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>29/2mm f/4 1/60sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOV0HRtS19pJrPbw&amp;#43;JC74BJ/nXTJ4E1Bbb7RPeLuAbbHGvQjgck&amp;#43;tZfhTXtO0Cz&amp;#43;zzXGw7iw&amp;#43;UnP1wKhvPiFrcZhitJoTGsSl9sWct1P61z&amp;#43;z5rkWQ8abqOnXrm5sWvB5ZGd2SvTJ/UfnWb9th/ezRMwyuMFs4&amp;#43;lehahfJL4Yg1OWRYLo2yShlGAzFeVx6HJHrzXkToMlIyzMOCmMDNZeyi3qJrojSttOR2GWPPWtS30e3bJwCxHJKg5/Oq9n98VsWvQ/Sum2oXYxtKSdVSWVmULgDaBgD09KqT&amp;#43;HIol3pcuMdiAa2k6j6U26/1B&amp;#43;lackbbAf//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF6731_hu_91c3c29e9a71078b.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF6971.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF35mmF1.4 R&lt;br/>35mm f/5 1/950sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AJPCmnW095fMwJZ0jdDuIx1H9BXY/ZV4CqAB1OK4LwvrNpp0ss9zIyRLbjd05O4Y6/U11dx4iSe0WTTxvRxkyN0A/DrXZ7RRWpycjky3ctBaLvxyPVq5bVPEk80ph02Js8fvnXOOn3R/U0&amp;#43;XfczJJcln5ySxAA/CkLwm3Z4iqoufl4FctSvJ6dDphRUdWebEedw/zDpgjNI1xd2sf&amp;#43;j3k0ar0QOccU6L&amp;#43;tRXP&amp;#43;qb6GqkKI5PE2qqu43cjduSCf1Bq3D4l1QW5Hmxuvo8eSec9eK57/llVyH/AI9zWdkXdn//2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF6971_hu_47c942af7bf7f309.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF7181.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>24mm f/28/5 1/420sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/ANy206745B/AVpfZbgRASW&amp;#43;8DofevI4NY1uM/LqUoH/XRv8ACrceseI5ZCp1OTbju7Hmtni4X1ZzezstD1NZ7iNdmGA9Oh/Oq08sbD5oMH1OSTXnUWq&amp;#43;It3lHVWaRvuqrsag1dtbhSN7rUSTkEtFI2R7GqjXg1zIOWWxnf2i8YGI1IXj5uc0h1S4kUAEIPRRVR/un602Pov&amp;#43;e9eXyps2N&amp;#43;2drZQUOXflmPU1HPdPNvV/mGO9O/hT6VWb77/SvVSSVkQf/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF7181_hu_60299a724d789e28.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF7204.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF35mmF1.4 R&lt;br/>35mm f/7/5 1/105sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AOcs9DM2rSWCzRHyo1fzDFkMD7bv61NNoWo21zbRSR2AkuG2Rqpbk4yc/p370/SoGs9fuohdA7IUzJJ6cmtK9cXGraPi4jlWSRtrr2ytcDbueitihfaNqllCJLiCxERIGVLc5wBzz3NUL3S9RtYiZre0RR1Kv0/DFdDq2lf2ZoZT7fLdRqUIViOPnXpWJqbARynMqJIpZEZDuI2n7&amp;#43;T2z&amp;#43;vanFA2wtY3ufEN4jyDLIik4PQqferdzY/2fqOj28b7lVyFJHt35qHTP&amp;#43;Rmuv8Atn/6Ca0NZ/5Dekf9dD/6DU3fMl5foFvdfr&amp;#43;omvSSw6PP84IVVPQ9mHv71iXGuXJ1K&amp;#43;0sRwrBKJI2IDFsAE8Ek&amp;#43;gra8S/8ga4/wB0f&amp;#43;hCuTm/5Gq5/wB&amp;#43;b/0Fq1pK8dTOppJWP//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF7204_hu_3213670adea9db8d.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF7507.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF35mmF1.4 R&lt;br/>35mm f/28/5 1/1100sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AKksQubPy3hyyj5G4OBWXLpEkJAbB3DIwc1VF2H6zSAj&amp;#43;6xX&amp;#43;VDSQMOZJ2I55mf/ABrojm0IaKLPNnQVTVsnGlu4bGBgZ5OKrSWLL/DUy3SxYMckwIP/AD1Y4/M1B9r2s7APlz8xLHmtVnUL/CzJ4W2zM0O20nJ47U8FjnJ6DNRL/q2qRf4vpXgHSBdueTwKYZCF/Kl/vf7tMP3fwFNAj//Z"
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF7507_hu_5dbbe6438970e387.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF8578.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF70-300mmF4-5.6 R LM OIS WR&lt;br/>377/5mm f/28/5 1/680sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/ANQxyXGnpJpl4sE4UERuqkOfTHX9aoJ4jvbeMwX9pClx/C6t8vX0/A8ZrC0&amp;#43;z1pIxHA5hVvmY78jP4ZqxcPqBiFndywSrDyS5Tr6nPNcbxtR3XN&amp;#43;JHsYL7J1llqFtNGwuSUIPyts4K9unep5UsJFwt3Bz2ZwD&amp;#43;Rribewu5gPssiMpOCVk&amp;#43;UUT2kCKANSkaQdf3bEZ7gE8/pW1PM6sNHZmM8JTkdHZ3Ukw4WNcdTsBzUkghlcq0IVj1ZDtJ/EVV0vvVkf678a8GTsz0&amp;#43;g9IghCfKRjA3KCR&amp;#43;J6mor3TIcMxVDxnmNas/8tV/Cn3n3H/3f6Uotgkj/2Q=="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF8578_hu_ddb57b931a4f0ebc.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF9091.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF35mmF1.4 R&lt;br/>35mm f/2 1/240sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/AON8CeH7nxBqssVqyBoIWc7wDzjC8H3/AC60yZGur23kgR0RnYImcs7jCscDpkkAfSo/C17Pp0U0lvI8bTjZI8Yy6x/xFffsM1pLFK88Mum8w20aqquRlGxlsqDz19e3PSsZS1sWkbnh/wAVyw3ENrdbpI1fZjPIPAGO2O2DXLaiFN1dMMcyEgY65JxW1rUVo&amp;#43;j6bDpETi4SNTcfIQS4IOc9889Kyr8KrXA24kIBwOSB/k4qIQUZ3QmraEOgKDp525XeDuOeTzj8K3NKtIre42RZGSTkkk1ieHv&amp;#43;PAfQ/wDoVdFY/wDH6PrV/aN1smX767kijKLjEeSM/WuNvpWiuWfqwXqfoK6vUukv0P8AOuR1P/XP/un&amp;#43;Qq7e8ZTP/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF9091_hu_334c49a7ded91c7a.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
		
		
				
			
			
			
				
			

			
			
				
					
				
			


			
			
			
				
				
				
				
				
				
				
				
			

			
			


			&lt;div>
				
				
					
				
				&lt;a href="https://manuel.bernhardt.io/photography/images/DSCF9233.jpeg" 
					class="galleryImg"
					
						

						
							data-description="X-S10 + XF10-24mmF4 R OIS WR&lt;br/>24mm f/28/5 1/850sec ISO "
						

						
					
					>
					&lt;img			
						width="600" height="400"

						
							
							style="filter: blur(25px);"
							
								src="data:image/jpeg;base64,/9j/2wCEAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIfIiEmKzcvJik0KSEiMEExNDk7Pj4&amp;#43;JS5ESUM8SDc9PjsBCgsLDg0OHBAQHDsoIig7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O//AABEIABUAIAMBIgACEQEDEQH/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5&amp;#43;gEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4&amp;#43;Tl5ufo6ery8/T19vf4&amp;#43;fr/2gAMAwEAAhEDEQA/ANXwJq8Gs6QTfz/PaJ&amp;#43;&amp;#43;eVdq4HfPQ/nWJrPjm6u55LWGUJBu&amp;#43;V4wUOOeh6/yz6CqPw2gluv7VuFtxKot9m0qNrtnIHTtjOBWPqsF9DsN3AY5NuQNrBvpz/nilVnNpM1pRgm7nT6Z43vxfW9pcTwG2JwzSdSPqO9dFfJv&amp;#43;ZeQwyCK8502C71FVmNvK8T8mVkOD27duvSu3u9VEHhm3uoZYp2AEZ7YIHOR19K6MNU5E&amp;#43;dmGIhzNcqPP7XxhfadZvbaVFHYq&amp;#43;NzJlmOB6n&amp;#43;eM1HH4p1zymiOpTMrsWO7DHkYxkgnGO1YY6VPH2rkc5PqbKKRqW2t6na2P2KC9mS3wf3W7K4PUYqH7fdpC0AnJjY8qRmqw6fhSv1P1qLvctI/9k="
							
							class="lazy"
							data-src="https://manuel.bernhardt.io/photography/images/DSCF9233_hu_7274a7abcc6bff62.jpeg"
						

						
							
								
							
						
					>
				&lt;/a>
			&lt;/div>
		
	
&lt;/div>
&lt;/div>

&lt;script>
	if (!jQuery) {
		alert("jquery is not loaded");
	}

	$( document ).ready(() => {
		const gallery = $("#gallery-15de3d6588abed1d581e0bb2757d2309-0");
		

		
		let swipeboxInstance = null;

		
		
		gallery.on('jg.complete', () => {
			
				
				
				$(() => {
					$('.lazy').Lazy({
						visibleOnly: true,
						afterLoad: element => element.css({filter: "none", transition: "filter 1.0s ease-in-out"})
					});
				});
			

			swipeboxInstance = $('.galleryImg').swipebox(
				jQuery.extend({},
					{ }
				)
			);
		});

		
		gallery.justifiedGallery({
			rowHeight : "150",
			margins : "5",
			border : 0,
			randomize : false ,
			waitThumbnailsLoad : false,
			lastRow : "nojustify",
			captions : false,
			
			
		});

		
		
	});
&lt;/script></description></item><item><title>Rust Development for the Raspberry Pi on Apple Silicon</title><link>https://manuel.bernhardt.io/posts/2022-11-04-rust-development-for-the-raspberry-pi-on-apple-silicon/</link><pubDate>Fri, 04 Nov 2022 17:36:39 +0100</pubDate><guid>https://manuel.bernhardt.io/posts/2022-11-04-rust-development-for-the-raspberry-pi-on-apple-silicon/</guid><description>&lt;p>&lt;em>Update (18.02.2023): Updated the article to reflect the usage of VSCode remote development instead of JetBrains Gateway&lt;/em>&lt;/p>
&lt;p>A few weeks ago I started building a Rust project for the Raspberry PI using my brand new MacBook Pro with an M1 chip (the old MacBook Pro from late 2013 still works but it simply is too slow for the work I&amp;rsquo;m doing these days).&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/new-mac.jpg" class="pure-img" alt="">
 &lt;figcaption>Shiny new MacBook Pro complete with scuba-diving sticker from my wife&lt;/figcaption>
 &lt;/figure>

&lt;/p></description></item><item><title>Resume</title><link>https://manuel.bernhardt.io/resume/</link><pubDate>Fri, 14 Oct 2022 14:06:31 +0100</pubDate><guid>https://manuel.bernhardt.io/resume/</guid><description>&lt;h1 id="training-course-delivery">&lt;a name="training">&lt;/a> Training course delivery&lt;/h1>
&lt;p>I&amp;rsquo;m a certified &lt;a href="https://lightbend.com">Lightbend Academy&lt;/a> trainer and have delivered a number of courses on Akka and Scala.&lt;/p>
&lt;ul>
&lt;li>2020: Company (financial products and services): Lightbend Akka for Java - Professional&lt;/li>
&lt;li>2020: &lt;a href="https://www.dbsystel.de">Deutsche Bahn Systel&lt;/a> (mobility): Lightbend Akka for Java - Expert&lt;/li>
&lt;li>2020: Company (digital media measurement and analytics): Lightbend Scala Language - Professional&lt;/li>
&lt;li>2020: Company (digital media measurement and analytics): Lightbend Akka for Scala - Professional&lt;/li>
&lt;li>2019: Company (financial products and services): Lightbend Akka for Java - Professional&lt;/li>
&lt;li>2019: &lt;a href="https://lunatech.com/">Lunatech&lt;/a> (consulting), Netherlands: Lightbend Akka for Scala - Expert&lt;/li>
&lt;li>2018: &lt;a href="https://www.wirecard.com/">WireCard&lt;/a> (financial services), Germany: Lightbend Akka for Java - Professional (multiple times)&lt;/li>
&lt;li>2017: &lt;a href="https://www.wirecard.com/">WireCard&lt;/a> (financial services), Germany: Lightbend Akka for Java - Expert&lt;/li>
&lt;li>2017: &lt;a href="https://www.wirecard.com/">WireCard&lt;/a> (financial services), Germany: Lightbend Akka for Java - Professional&lt;/li>
&lt;li>2017: In cooperation with &lt;a href="https://www.openforce.com/">OpenForce&lt;/a>: Lightbend Akka for Scala - Expert (public training course held in Vienna)&lt;/li>
&lt;li>2017: In cooperation with &lt;a href="https://trifork.com/">Trifork&lt;/a>: Lightbend Akka for Scala - Expert (public training at Scala Days 2017 Copenhagen)&lt;/li>
&lt;li>2016: &lt;a href="https://www.chapsvision-cybergov.fr/">Deveryware&lt;/a>, France: Akka Lightbend for Java - Professional&lt;/li>
&lt;li>2016: &lt;a href="https://www.dimoco-payments.com/">DIMOCO&lt;/a>, Austria: Lightbend Akka for Java - Professional&lt;/li>
&lt;/ul>
&lt;h1 id="tools--technologies">&lt;a name="tools">&lt;/a> Tools &amp;amp; Technologies&lt;/h1>
&lt;div class="work-content">
&lt;p>The following is an (incomplete) list of tools and technologies that I have experience with.&lt;/p></description></item><item><title>Switching to Hugo after 17 years of WordPress</title><link>https://manuel.bernhardt.io/2022/08/11/switching-to-hugo-after-17-years-of-wordpress/</link><pubDate>Thu, 11 Aug 2022 11:53:32 +0200</pubDate><guid>https://manuel.bernhardt.io/2022/08/11/switching-to-hugo-after-17-years-of-wordpress/</guid><description>&lt;p>In the fall of 2005, I installed WordPress on the free hosting space provided by my ISP in France (fittingly called &lt;em>Free&lt;/em>). I had very little experience with PHP but enough so to get the site up and running.&lt;/p>
&lt;p>Initially called &lt;em>Lost in translation&lt;/em> (after the &lt;a href="https://en.wikipedia.org/wiki/Lost_in_Translation_%28film%29">eponymous movie&lt;/a> starring Bill Murray and Scarlett Johansson) and I was writing about&amp;hellip; well, I frankly don&amp;rsquo;t remember. However it must have been such poor writing that I decided to &lt;a href="https://manuel.bernhardt.io/2008/01/19/reset/">wipe all of it&lt;/a> in the beginning of 2008 (even the wayback machine didn&amp;rsquo;t care to keep a trace of the content, to give you an idea of how bad it must have been). The subsequent writing wasn&amp;rsquo;t much better but I apparently wasn&amp;rsquo;t ashamed enough about it to wipe it out again.&lt;/p></description></item><item><title>Programming Languages</title><link>https://manuel.bernhardt.io/2021/10/12/programming-languages/</link><pubDate>Tue, 12 Oct 2021 07:08:14 +0200</pubDate><guid>https://manuel.bernhardt.io/2021/10/12/programming-languages/</guid><description>&lt;p>Programming languages I have dabbled with, in approximate order of first encounter:&lt;/p>
&lt;ul>
&lt;li>Sinclair ZX81 basic&lt;/li>
&lt;li>QuickBasic&lt;/li>
&lt;li>logo&lt;/li>
&lt;li>turbo basic&lt;/li>
&lt;li>turbo pascal&lt;/li>
&lt;li>assembly&lt;/li>
&lt;li>html&lt;/li>
&lt;li>c&lt;/li>
&lt;li>java&lt;/li>
&lt;li>sql&lt;/li>
&lt;li>matlab&lt;/li>
&lt;li>php&lt;/li>
&lt;li>perl&lt;/li>
&lt;li>javascript&lt;/li>
&lt;li>python&lt;/li>
&lt;li>action script&lt;/li>
&lt;li>scala&lt;/li>
&lt;li>groovy&lt;/li>
&lt;li>typescript&lt;/li>
&lt;li>go&lt;/li>
&lt;li>swift&lt;/li>
&lt;li>kotlin&lt;/li>
&lt;li>rust&lt;/li>
&lt;/ul>
&lt;p>I always planned on looking closer at a LISP (such as Clojure) but so far haven&amp;rsquo;t found the time to play with one.&lt;/p>
&lt;p>In general, I find it increasinly easy to pick up a new programming language. Concepts translate rather well. There definitely are design differences between the languages that require more time to get right and getting the feeling for the idiomatic way of writing in language X does take a bit of practice, but all in all I find the exercise to be rather repetitive (I expect that someone will point out that I have not yet experienced LISP).&lt;/p></description></item><item><title>Hey</title><link>https://manuel.bernhardt.io/2021/05/01/hey/</link><pubDate>Sat, 01 May 2021 14:38:24 +0200</pubDate><guid>https://manuel.bernhardt.io/2021/05/01/hey/</guid><description>&lt;p>I started using &lt;a href="hey.com/">Hey&lt;/a> last July as it seemed like a good way to get less noise via e-mail, for my personal e-mails. After about a year of using it, here&amp;rsquo;s what I can say about it.&lt;/p>
&lt;h2 id="what-works-for-me">What works for me&lt;/h2>
&lt;ul>
&lt;li>it is easy to just turn off noise by screening out incoming e-mail adresses&lt;/li>
&lt;li>for some things, it is fast&lt;/li>
&lt;/ul>
&lt;h2 id="what-does-not-work-for-me">What does not work for me&lt;/h2>
&lt;ul>
&lt;li>when I click on an e-mail to read it, it is marked as read. Then, it will be shown at the bottom of the Imbox. There, it tends to disappear. So, if I read an important e-mail that I do not want to forget about but have already left it, I need to scroll back down after reading it and do something with it. Unfortunately, neither the views &amp;ldquo;Reply later&amp;rdquo; or &amp;ldquo;Set aside&amp;rdquo; help me with the remembering because they tend to stack up. So what I do is to mark the e-mail as &amp;ldquo;new&amp;rdquo; so that it keeps on top of the Imbox and I don&amp;rsquo;t end up forgetting about it. Unfortunately this doesn&amp;rsquo;t always work and I end up forgetting about important e-mails sometimes.&lt;/li>
&lt;li>finding back forgotten e-mail is hard and very time consuming. In Hey it is not possible to archive e-mails so everything ends up at the bottom of the Imbox. Scrolling down the Imbox is slow as it needs to load e-mails quite often and that takes time. So I cannot easily go back through the e-mails to see if I forgot something important, like communications with friends.&lt;/li>
&lt;li>the search doesn&amp;rsquo;t work well (it does not find everything) and is slow. I find myself going to GMail (from where mail is redirected) to search&lt;/li>
&lt;/ul>
&lt;p>All in all, I think I will not renew my subscription and go back to using GMail. And perhaps be somewhat more agressive with filtering out e-mails I do not want to see.&lt;/p></description></item><item><title>Tour of Temporal: Performance</title><link>https://manuel.bernhardt.io/2021/04/25/tour-of-temporal-performance/</link><pubDate>Sun, 25 Apr 2021 18:59:46 +0200</pubDate><guid>https://manuel.bernhardt.io/2021/04/25/tour-of-temporal-performance/</guid><description>&lt;p>In &lt;a href="https://manuel.bernhardt.io/2021/04/12/tour-of-temporal-welcome-to-the-workflow/">the last part of this series&lt;/a>, we looked into the fundamentals of the &lt;a href="http://temporal.io/" target="_blank" rel="noreferrer noopener">Temporal workflow engine&lt;/a> and how it compares to actor toolkits such as &lt;a href="http://akka.io">Akka&lt;/a>. As I wrote in the previous part, my personal experience with workflows has led me to associate anything with the word &amp;ldquo;worfklow&amp;rdquo; in it to &amp;ldquo;a slow process&amp;rdquo; (taking minutes to complete). In order to clear that idea from my mind (and also because I like exploring performance characteristics of technologies) I wanted to have a closer look at the performance of Temporal workflows.&lt;/p></description></item><item><title>Akka Raspberry PI demos</title><link>https://manuel.bernhardt.io/2021/04/15/akka-raspberry-pi-demos/</link><pubDate>Thu, 15 Apr 2021 15:57:21 +0200</pubDate><guid>https://manuel.bernhardt.io/2021/04/15/akka-raspberry-pi-demos/</guid><description>&lt;p>Here are a few demonstrations of how Akka Cluster works internally using a Raspberry PI cluster stack.&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/1ZC2FuZ1eaw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Akka Cluster Membership State Convergence">&lt;/iframe>
 &lt;/div>

&lt;br> 
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/PvwSXk82RaM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video">&lt;/iframe>
 &lt;/div>

&lt;br>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/PvwSXk82RaM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Akka Christmas Aware Shard Allocation Strategy">&lt;/iframe>
 &lt;/div></description></item><item><title>Tour of Temporal: Welcome to the Workflow</title><link>https://manuel.bernhardt.io/2021/04/12/tour-of-temporal-welcome-to-the-workflow/</link><pubDate>Mon, 12 Apr 2021 07:42:15 +0200</pubDate><guid>https://manuel.bernhardt.io/2021/04/12/tour-of-temporal-welcome-to-the-workflow/</guid><description>&lt;p>I&amp;rsquo;ve been exposed to workflows early on in my career, at first in enterprise environments where advanced GUIs were used to model highly complex business workflows whose execution would invariable lead to hours of debugging through mountains of log files via a remote desktop connection to the server running the proprietary workflow execution engine and later in research projects which would invariably feature some type of home-grown workflow engine (with a shiny GUI) to solve a part of the project. These interactions with workflows left me with a rather poor after-taste of the entire concept of workflows which can be summed up in two words: &lt;em>slow&lt;/em> and &lt;em>complicated&lt;/em>.&lt;/p></description></item><item><title>Smartphone Detox</title><link>https://manuel.bernhardt.io/2021/03/26/smartphone-detox/</link><pubDate>Fri, 26 Mar 2021 20:04:41 +0100</pubDate><guid>https://manuel.bernhardt.io/2021/03/26/smartphone-detox/</guid><description>&lt;p>&amp;ldquo;Insanity is doing the same thing over and over again and expecting different results.&amp;rdquo; &amp;ndash; Someone (&lt;a href="https://checkyourfact.com/2019/06/26/fact-check-albert-einstein-definition-instanity-same-thing-over-different-results/">not Einstein&lt;/a>)&lt;/p>
&lt;p>Smartphones are addictive and highly distracting. Their &lt;a href="https://www.journals.uchicago.edu/doi/abs/10.1086/691462?journalCode=jacr&amp;amp;">mere presence reduces cognitive ability&lt;/a>. I tried getting rid of mine - or at least of its intensive usage - many times over and have failed. Here&amp;rsquo;s my attempt at another shot, inspired by &lt;a href="https://www.alvarez.io/posts/living-like-its99/">this article&lt;/a>.&lt;/p>
&lt;h2 id="day-1-270321">Day 1 (27.03.21)&lt;/h2>
&lt;p>Attempting to setup my old &lt;a href="https://www.gsmarena.com/ericsson_t28s-117.php">Ericsson T28s&lt;/a>, which stores all contacts on the SIM card. iOS doesn&amp;rsquo;t allow to copy contacts to a SIM card anymore, so I found an old Android phone and connected it with my Google account to synchronize contacts. Tried 3 different SIM tooling apps but none of them manages to copy contacts over the SIM card. After a bit of research it turns out that most SIM cards issued by operators these days are read-only.&lt;/p></description></item><item><title>Disciplines for getting out of the stream</title><link>https://manuel.bernhardt.io/2021/03/08/disciplines-for-getting-out-of-the-stream/</link><pubDate>Mon, 08 Mar 2021 14:38:34 +0100</pubDate><guid>https://manuel.bernhardt.io/2021/03/08/disciplines-for-getting-out-of-the-stream/</guid><description>&lt;p>&amp;ldquo;Life is what happens to you while you&amp;rsquo;re busy making other plans&amp;rdquo; &amp;ndash; John Lennon&lt;/p>
&lt;p>But what if you&amp;rsquo;re not making plans. Or if all the plans you are making are more reactions to address short-term goals, needs or issues, rather than stepping back and looking at the general direction you&amp;rsquo;re headed?&lt;/p>
&lt;p>I think this easily happens to most of us. When caught up in daily chores without the time to think - &lt;strong>really&lt;/strong> think - it is very difficult to &lt;em>go meta&lt;/em> and ask yourself about what it is that you really want. Add to this the plethora of interruptions and distractions we&amp;rsquo;re subjected to these days thanks to the attention economy and you get yourself a state of &amp;ldquo;constant drifting in a stream&amp;rdquo;. If you also have kids, replace &amp;ldquo;stream&amp;rdquo; with &amp;ldquo;torrent&amp;rdquo;.&lt;/p></description></item><item><title>When not to save money</title><link>https://manuel.bernhardt.io/2021/03/06/when-not-to-save-money/</link><pubDate>Sat, 06 Mar 2021 18:04:50 +0100</pubDate><guid>https://manuel.bernhardt.io/2021/03/06/when-not-to-save-money/</guid><description>&lt;p>Most people like to save money. But in some cases, saving money is counter-productive or will cost you more money, or so much time that you had wished spending a little more money.&lt;/p>
&lt;p>Buying &lt;em>low quality&lt;/em> items is one of these situations. The old saying &lt;em>too poor to buy cheap&lt;/em> captures to essence of it: low quality ends up costing more on the long run than saving some money on the short term.&lt;/p></description></item><item><title>Three key findings from ten years of home-office</title><link>https://manuel.bernhardt.io/2020/10/23/key-findings-ten-years-of-home-office/</link><pubDate>Fri, 23 Oct 2020 14:30:20 +0200</pubDate><guid>https://manuel.bernhardt.io/2020/10/23/key-findings-ten-years-of-home-office/</guid><description>&lt;p>It&amp;rsquo;s been nearly ten years that I have worked mainly from home (or more accurately, &lt;em>homes&lt;/em>, as we moved around a bit). As it turns out, many people now work from home, less so by choice than by &lt;s>dystopian scenario C&lt;/s> circumstance. Whilst I&amp;rsquo;m sure that there are already hundreds of articles on the topic I thought I&amp;rsquo;d write a bit about my experience and especially about some aspects that may not be that obvious and that took me a while to prioritize.&lt;/p></description></item><item><title>10000 nodes and beyond with Akka Cluster and Rapid</title><link>https://manuel.bernhardt.io/2020/04/30/10000-node-cluster-with-akka-and-rapid/</link><pubDate>Thu, 30 Apr 2020 09:39:47 +0200</pubDate><guid>https://manuel.bernhardt.io/2020/04/30/10000-node-cluster-with-akka-and-rapid/</guid><description>&lt;p>Update: there&amp;rsquo;s a &lt;a href="https://soundcloud.com/lightbend/scaling-akka-cluster-to-10000-nodes-with-rapid-manuel-bernhardt" target="_blank" rel="noreferrer noopener">podcast episode&lt;/a> about this&lt;/p>
&lt;p>&lt;span class="firstcharacter">T&lt;/span>he year is 2021. As the world is still deeply affected by the COVID-19 pandemic, the United Nations have decided that in order to prevent the same scenario of ever happening again, there should be a worldwide, real-time contact-tracing system in place capable of tracking every human being on the planet. Everyone is now equipped with a small, pebble-like device. If a person you have been in contact with is confirmed to carry a new kind of virus for which there is no remedy, the device starts glowing in red. Each device reports the anonymized contact information to one global backend system capable of handling this type of massive scale.&lt;/p></description></item><item><title>Akka Consulting</title><link>https://manuel.bernhardt.io/akka-consulting/</link><pubDate>Fri, 14 Feb 2020 13:55:41 +0100</pubDate><guid>https://manuel.bernhardt.io/akka-consulting/</guid><description>&lt;p>If you are looking for a consultant to help you with the &lt;a href="https://akka.io/">Akka Toolkit&lt;/a>, you have come to the right place! Over the past decade I have consulted with &lt;a href="https://manuel.bernhardt.io/testimonials/">dozens of clients&lt;/a> on the topic distributed and reactive systems using technologies such as Akka, Akka Cluster, Akka Streams as well as related technologies such as Kafka, Kubernetes and Cassandra to name but a few.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/DdY1IWfWsAAMmEN.jpeg" class="pure-img" alt="Akka Cluster used for demonstrations during consulting projects">
 &lt;figcaption>A physical Akka Cluster used in Akka Consulting projects to demonstrate specific issues hands-on&lt;/figcaption>
 &lt;/figure>

&lt;/p></description></item><item><title>Akka Cluster on Raspberry PI</title><link>https://manuel.bernhardt.io/akka-cluster-on-raspberry-pi/</link><pubDate>Mon, 10 Feb 2020 16:00:09 +0100</pubDate><guid>https://manuel.bernhardt.io/akka-cluster-on-raspberry-pi/</guid><description>&lt;p>Akka is a toolkit for building massively scalable applications. At the same time, it is lightweight enough to be deployed on Raspberry PI computers. I&amp;rsquo;m fascinated with these machines since I first saw one in real life at Devoxx Antwerp in 2010, own quite a few of them (some of which are hooked up to various appliances in my home) and use them in order to demonstrate Akka Cluster to clients or at training courses.&lt;/p></description></item><item><title>Akka anti-patterns overview</title><link>https://manuel.bernhardt.io/akka-anti-patterns/</link><pubDate>Fri, 20 Dec 2019 09:52:44 +0100</pubDate><guid>https://manuel.bernhardt.io/akka-anti-patterns/</guid><description>&lt;p>This is an overview of &lt;a href="http://akka.io">Akka&lt;/a> anti-pattern articles. You can think of these anti-patterns as the opposite of Akka best practices – that is, things you should not be doing when using Akka.&lt;/p>
&lt;p>Here is also a talk about 8 very frequent anti-patterns out there:&lt;figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio">&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/h3mulWmX1Oo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="Akka Cluster Membership State Convergence">&lt;/iframe>
 &lt;/div>

&lt;h3 id="basics">Basics&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/">Shared mutable state&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/05/15/akka-anti-patterns-blocking/">Blocking&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/">Flat actor hierarchies / Mixing business logic and failure handling&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/16/akka-anti-patterns-race-conditions/">Race conditions&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/05/30/akka-anti-patterns-stateless-actors/">Stateless actors&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/08/06/akka-anti-patterns-many-actors/">Too many actors&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="performance">Performance&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/31/akka-anti-patterns-logging-the-wrong-way/">Logging the wrong way&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/11/21/akka-anti-patterns-being-out-of-touch-with-the-hardware/">Being out of touch with the hardware&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/03/20/akka-anti-patterns-overusing-actorselection/">Overusing ActorSelection&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/07/20/akka-anti-patterns-java-serialization">Using Java Serialization&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="network--cluster">Network / Cluster&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/06/08/akka-anti-patterns-using-remoting/">Using remoting&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/06/20/akka-anti-patterns-trusting-network/">Trusting the network&lt;/a>&lt;/li>
&lt;li>Always using the defaults (to be written)&lt;/li>
&lt;li>Using cluster without / with the wrong split-brain resolver (to be written)&lt;/li>
&lt;/ul>
&lt;h3 id="architecture--design">Architecture / Design&lt;/h3>
&lt;ul>
&lt;li>Not defining a protocol (to be written)&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/08/26/akka-anti-patterns-naming-your-application-after-akka-concepts/">Naming your application components after akka concepts&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/23/akka-anti-patterns-too-many-actor-systems/">Too many actor systems&lt;/a>&lt;/li>
&lt;li>Blindly ignoring dead letters (to be written)&lt;/li>
&lt;/ul></description></item><item><title>Tour of Akka Typed: Cluster Singleton and Routers</title><link>https://manuel.bernhardt.io/2019/12/03/tour-of-akka-typed-cluster-singleton-and-routers/</link><pubDate>Tue, 03 Dec 2019 14:59:48 +0100</pubDate><guid>https://manuel.bernhardt.io/2019/12/03/tour-of-akka-typed-cluster-singleton-and-routers/</guid><description>&lt;p>In &lt;a href="https://manuel.bernhardt.io/2019/11/09/tour-of-akka-typed-cluster-sharding/">part 5 of this series&lt;/a>, we started to scale the application from a local one to a clustered one by introducing Cluster Sharding. In this article, we will continue our effort to scale the payment processor out and make it resilient through the use of Cluster Singletons and Cluster-Aware Routers.&lt;/p>
&lt;p>Before we get started, here’s a quick reminder of what we’ve seen so far: in the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">first part&lt;/a> we had a look at the the raison d’être of Akka Typed and what advantages it has over the classic, untyped API. In the &lt;a href="https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/">second part&lt;/a> we introduced the concepts of message adapters, the ask pattern and actor discovery. In the third part, we covered one of the core concepts of Actor systems: &lt;a href="https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/">supervision and failure recovery&lt;/a>. In the fourth part, we covered one of the most popular use-cases for Akka: &lt;a href="https://manuel.bernhardt.io/2019/10/07/tour-of-akka-typed-event-sourcing/">event sourcing&lt;/a>. Finally, as mentioned before, in the &lt;a href="https://manuel.bernhardt.io/2019/11/09/tour-of-akka-typed-cluster-sharding/">fifth part&lt;/a> we started scaling out by making use of cluster sharding.&lt;/p></description></item><item><title>Tour of Akka Typed: Cluster Sharding</title><link>https://manuel.bernhardt.io/2019/11/09/tour-of-akka-typed-cluster-sharding/</link><pubDate>Sat, 09 Nov 2019 20:14:10 +0100</pubDate><guid>https://manuel.bernhardt.io/2019/11/09/tour-of-akka-typed-cluster-sharding/</guid><description>&lt;p>&lt;em>Update 21/11/2019: Fixed comment about &lt;code>shardId&lt;/code> extraction in relation to &lt;code>ShardingEnvelope&lt;/code>&lt;/em>&lt;/p>
&lt;p>Welcome to the fifth part of the Akka Typed series! In this part, we&amp;rsquo;ll leave the safe harbor of a single JVM and sail into the seas of distributed systems by exploring a key features of Akka Cluster with the typed API: Cluster Sharding. If you want to get a more in-depth introduction to Akka Cluster, I invite you to check out &lt;a href="https://manuel.bernhardt.io/2018/08/03/tour-akka-cluster/">the article series on this topic&lt;/a>.&lt;/p></description></item><item><title>One step closer: exploiting locality in Akka Cluster based systems</title><link>https://manuel.bernhardt.io/2019/10/28/one-step-closer-exploiting-locality-in-akka-cluster-based-systems/</link><pubDate>Mon, 28 Oct 2019 12:36:24 +0100</pubDate><guid>https://manuel.bernhardt.io/2019/10/28/one-step-closer-exploiting-locality-in-akka-cluster-based-systems/</guid><description>&lt;p>When it comes to the latency of processing a request in a distributed system, everyone knows (or &lt;a rel="noreferrer noopener" aria-label="should know (opens in a new tab)" href="https://gist.github.com/jboner/2841832" target="_blank">should know&lt;/a>) that doing things over the network is the most expensive thing you can do (alongside with disk reads):&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/687474703a2f2f692e696d6775722e636f6d2f6b307431652e706e67.png" class="pure-img" alt="">
 &lt;figcaption>The round trip time in a datacenter is about 5000 times longer than a main memory reference&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>Modern architectures have recognized this and will favor keeping data in memory, avoiding the need to go to disk or to the database, when consistency requirements allow for it. With &lt;a href="https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/">Akka Cluster Sharding&lt;/a> combined with &lt;a href="https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/">Akka Persistence&lt;/a>, it is possible to keep millions of durable entities in memory, reducing latency to a large degree.&lt;/p></description></item><item><title>Articles</title><link>https://manuel.bernhardt.io/articles/</link><pubDate>Fri, 18 Oct 2019 15:40:23 +0200</pubDate><guid>https://manuel.bernhardt.io/articles/</guid><description>&lt;p>&lt;em>This is an overview of some of what I&amp;rsquo;ve written over the years.&lt;/em>&lt;/p>
&lt;h2 id="featured">Featured&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2020/04/30/10000-node-cluster-with-akka-and-rapid/">10000 nodes and beyond with Akka Cluster and Rapid&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/posts/2023-11-16-core-pinning/">On pinning and and isolating CPU cores&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2021/04/15/akka-raspberry-pi-demos/">Akka Raspberry PI demos&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/07/26/a-new-adaptive-accrual-failure-detector-for-akka/">A new adaptive accrual failure detector for Akka&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="sre--devops">SRE / DevOps&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/posts/2024-05-16-on-azure/">On Azure&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="rust">Rust&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/posts/2024-01-26-rust-fearless-concurrency-cats-raspberry-pi/">Fearless concurrency with Rust, cats, and a few Raspberry PIs&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/posts/2024-01-12-rust-cat-litter-box/">Building a cat litter box reminder with Rust&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/posts/2022-11-04-rust-development-for-the-raspberry-pi-on-apple-silicon/">Rust development for th Raspberry Pi on Apple Silicon&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="tour-of-temporal">Tour of Temporal&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2021/04/12/tour-of-temporal-welcome-to-the-workflow/">Part 1: Welcome to the Workflow&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2021/04/25/tour-of-temporal-performance/">Part 2: Performance (latency)&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="h-tour-of-akka-typed">&lt;a href="https://manuel.bernhardt.io/tags/akka-typed/">Tour of Akka Typed&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">Part 1: Protocols and Behaviors&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/">Part 2: Message adapters, ask pattern and actor discovery&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/09/05/tour-of-akka-typed-supervision-and-signals/">Part 3: Supervision and signals&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/10/07/tour-of-akka-typed-event-sourcing/">Part 4: Event Sourcing&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/11/09/tour-of-akka-typed-cluster-sharding/">Part 5: Cluster Sharding&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/12/03/tour-of-akka-typed-cluster-singleton-and-routers/">Part 6: Cluster Singleton and Routers&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="h-tour-of-akka-cluster">&lt;a href="https://manuel.bernhardt.io/tags/akka-cluster">Tour of Akka Cluster&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/">Part 1: Akka Distributed Data&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/">Part 2: Eventual consistency, persistent actors, message delivery semantics&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/">Part 3: Cluster Sharding&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/03/23/tour-akka-cluster-testing-multi-node-testkit-handful-raspberry-pis/">Part 4: Testing with the multi-node-testkit and a handful Raspberry PIs&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="h-akka-anti-patterns">&lt;a href="https://manuel.bernhardt.io/articles/#akka-anti-patterns-classic">Akka anti-patterns&lt;/a>&lt;/h2>
&lt;h3 id="h-basics">Basics&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/">Shared mutable state&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/05/15/akka-anti-patterns-blocking/">Blocking&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/">Flat actor hierarchies / Mixing business logic and failure handling&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/16/akka-anti-patterns-race-conditions/">Race conditions&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/05/30/akka-anti-patterns-stateless-actors/">Stateless actors&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/08/06/akka-anti-patterns-many-actors/">Too many actors&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="h-performance">Performance&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/31/akka-anti-patterns-logging-the-wrong-way/">Logging the wrong way&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/11/21/akka-anti-patterns-being-out-of-touch-with-the-hardware/">Being out of touch with the hardware&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/03/20/akka-anti-patterns-overusing-actorselection/">Overusing ActorSelection&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/07/20/akka-anti-patterns-java-serialization">Using Java Serialization&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="h-network-cluster">Network / Cluster&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/06/08/akka-anti-patterns-using-remoting/">Using remoting&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/06/20/akka-anti-patterns-trusting-network/">Trusting the network&lt;/a>&lt;/li>
&lt;li>Always using the defaults (to be written)&lt;/li>
&lt;li>Using cluster without / with the wrong split-brain resolver (to be written)&lt;/li>
&lt;/ul>
&lt;h3 id="h-architecture-design">Architecture / Design&lt;/h3>
&lt;ul>
&lt;li>Not defining a protocol (to be written)&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/08/26/akka-anti-patterns-naming-your-application-after-akka-concepts/">Naming your application components after akka concepts&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/08/23/akka-anti-patterns-too-many-actor-systems/">Too many actor systems&lt;/a>&lt;/li>
&lt;li>Blindly ignoring dead letters (to be written)&lt;/li>
&lt;/ul>
&lt;h2 id="akka">Akka&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/05/02/raspberry-pi-akka-cluster-led-strips/">Raspberry PI Akka Cluster LED strips&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/04/19/akka-cluster-java-and-the-raspberry-pi-3-model-b/">Akka Cluster, Java and the Raspberry PI 3 Model B&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/05/22/akka-streams-notused/">Akka Streams – What is NotUsed all about&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2014/04/23/a-handful-akka-techniques/">A handful Akka techniques&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="scala">Scala&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/06/17/optimizing-ci-build-times-for-scala-projects/">Optimizing CI build times for Scala projects&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/04/19/quick-tour-build-tools-scala/">A quick tour of build tools in Scala&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in-scala/">A quick tour of JSON libraries in Scala&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2014/02/04/a-quick-tour-of-relational-database-access-with-scala/">A quick tour of relational database access with Scala&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2015/11/13/5-years-of-scala-and-counting-debunking-some-myths-about-the-language-and-its-environment/">5 years of Scala and counting – debunking some myths about the language and its environment&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="play-framework">Play Framework&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/10/17/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-1/">Reactive Golf or Iteratees and all that stuff in practice, part 1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/">Reactive Golf or Iteratees and all that stuff in practice, part 2&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/10/26/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-3/">Reactive Golf or Iteratees and all that stuff in practice, part 3&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/11/16/tips-tricks-for-setting-up-a-play-2-project/">Tips &amp;amp; tricks for setting up a Play 2 project&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/08/01/how-to-read-the-play-session-from-angularjs/">How to read the Play session from AngularJS&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/07/08/crud-trait-for-slick-models-in-the-play-framework/">CRUD trait for Slick models in the Play! framework&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/06/14/quickly-open-errors-in-your-ide-when-developing-play-applications/">Quickly open errors in your IDE when developing Play applications&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2013/03/26/multi-modular-development-with-play-2-1/">Multi-modular development with Play 2.1&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2012/10/26/activating-logging-in-test-mode-in-play-2-0-x/">Activating logging in test mode in Play 2.0.x&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2011/11/18/mongodb-based-cache-for-play-1-2-x-and-play-scala/">MongoDB-based Cache for Play 1.2.x and Play-Scala&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2011/09/16/play-scala-and-json/">Play! Scala and JSON&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2011/03/23/selenium-ide-plugin-for-the-play-framework/">Selenium IDE plugin for the Play! framework&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="reactive-database-access">Reactive Database Access&lt;/h2>
&lt;ul>
&lt;li>&lt;a rel="noreferrer noopener" aria-label=" (opens in a new tab)" href="https://blog.jooq.org/2015/12/03/reactive-database-access-part-1-why-async" target="_blank">Part 1: Why Reactive, why “Async” &amp;amp; an introduction to Futures&lt;/a>&lt;/li>
&lt;li>&lt;a rel="noreferrer noopener" aria-label=" (opens in a new tab)" href="https://blog.jooq.org/2015/12/16/reactive-database-access-part-2-actors" target="_blank">Part 2: Introduction to Actors&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.jooq.org/2016/01/14/reactive-database-access-part-3-using-jooq-with-scala-futures-and-actors/" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)">Part 3: Using jOOQ with Scala, Futures and Actors&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="misc">Misc&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2019/06/07/why-im-still-using-a-macbook-pro-late-2013/">Why I&amp;rsquo;m still using a MacBook Pro Late 2013 in 2019&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/12/31/2018-year-review/">2018: year in review&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2020/10/23/key-findings-ten-years-of-home-office/">3 key findings from 10 years of home-office&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/05/08/got-hold-frame-avoiding-burnout-lessons-learned-six-years-independent-consultant/">You got to hold the frame – Avoiding burnout or Lessons learned from six years as an independent consultant&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2015/01/27/reactive-play/">Reactive Play&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2016/07/15/the-reality-of-writing-a-technical-book/">The reality of writing a technical book&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2015/10/16/initial-thoughts-on-fatherhood/">Initial thoughts on fatherhood&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2017/11/16/subsequent-thoughts-fatherhood/">Subsequent thoughts on fatherhood&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Tour of Akka Typed: Event Sourcing</title><link>https://manuel.bernhardt.io/2019/10/07/tour-of-akka-typed-event-sourcing/</link><pubDate>Mon, 07 Oct 2019 13:42:32 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/10/07/tour-of-akka-typed-event-sourcing/</guid><description>&lt;p>Welcome to the fourth part of the Akka Typed series. In the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">first part&lt;/a> we had a look at the the raison d’être of Akka Typed and what advantages it has over the classic, untyped API. In the &lt;a href="https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/">second part&lt;/a> we introduced the concepts of message adapters, the ask pattern and actor discovery. In the third part, we covered one of the core concepts of Actor systems: &lt;a href="https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/">supervision and failure recovery&lt;/a>. In this part of the series we&amp;rsquo;ll explore one of the most popular use-cases for Akka: event sourcing. We&amp;rsquo;ll assume that you are already familiar with the concept of event sourcing - if not, first &lt;a href="https://hackernoon.com/events-as-first-class-citizens-8633e8479493">read about it&lt;/a> to get some context.&lt;/p></description></item><item><title>Tour of Akka Typed: supervision and signals</title><link>https://manuel.bernhardt.io/2019/09/05/tour-of-akka-typed-supervision-and-signals/</link><pubDate>Thu, 05 Sep 2019 10:10:10 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/09/05/tour-of-akka-typed-supervision-and-signals/</guid><description>&lt;p>&lt;em>Update 18.10.2019: fixed wrong syntax for handling multiple exceptions, clarifying a few points&lt;/em>&lt;/p>
&lt;p>Welcome to the third part of the Akka Typed series. In the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">first part&lt;/a> we had a look at the the raison d&amp;rsquo;être of Akka Typed and what advantages it has over the classic, untyped API. In the &lt;a href="https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/">second part&lt;/a> we introduced the concepts of message adapters, the ask pattern and actor discovery. In this part of the series, we&amp;rsquo;ll have a look at one of the core concepts of actor systems: &lt;a href="https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/">supervision and failure recovery&lt;/a>.&lt;/p></description></item><item><title>Tour of Akka Typed: Message Adapters, Ask Pattern and Actor Discovery</title><link>https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/</link><pubDate>Wed, 07 Aug 2019 08:13:01 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/08/07/tour-of-akka-typed-message-adapters-ask-pattern-and-actor-discovery/</guid><description>&lt;p>In the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">previous article&lt;/a> of this series we&amp;rsquo;ve explored the basics of the Akka Typed API: why it was created and what are its benefits in comparison to the classic Actor API, how to build typed actor systems via protocols and behaviors and how to create typed actors. In this series we&amp;rsquo;re going to go further down the route of building typed actor systems by looking at fundamental concepts necessary for the interaction between actors.&lt;/p></description></item><item><title>Tour of Akka Typed: Protocols and Behaviors</title><link>https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/</link><pubDate>Thu, 11 Jul 2019 08:05:53 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/</guid><description>&lt;p>&lt;em>Update 18.08.2019: corrected actor hierarchy and default supervision strategy&lt;/em>&lt;/p>
&lt;p>&lt;a rel="noreferrer noopener" aria-label="Ukrainian translation (opens in a new tab)" href="https://uk.codegalaxy.io/theory/scala/papers/90eb098342b4434499ae9029a166922a/akka_typed___protocols_and_behaviors" target="_blank">Ukrainian translation&lt;/a> / &lt;a rel="noreferrer noopener" aria-label="Chinese translation (opens in a new tab)" href="https://my.oschina.net/enyo/blog/3133185" target="_blank">Chinese translation&lt;/a>&lt;/p>
&lt;p>In this series we are going to explore &lt;a href="https://doc.akka.io/docs/akka/2.6/typed/index.html">Akka Typed&lt;/a>, the new Akka Actor API that brings significant advantage over the classic one. Akka Typed is &lt;a href="https://akka.io/blog/news/2019/04/10/akka-tyoed-prod-ready">ready for production since April&lt;/a> and although the API is still marked as &lt;a href="https://doc.akka.io/docs/akka/current/common/may-change.html">may change&lt;/a> I think it is a good time to look into it and to learn what&amp;rsquo;s new.&lt;/p></description></item><item><title>Optimizing CI build times for Scala projects</title><link>https://manuel.bernhardt.io/2019/06/17/optimizing-ci-build-times-for-scala-projects/</link><pubDate>Mon, 17 Jun 2019 10:12:38 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/06/17/optimizing-ci-build-times-for-scala-projects/</guid><description>&lt;p>CI / CD pipelines that run for each new and merged pull-request (or even for each commit on a branch) are today&amp;rsquo;s de-facto standard when it comes to developing software. Running the complete test suite automatically ensures that regressions are rapidly identified and do not make it into production.&lt;/p>
&lt;p>As applications grow and their test suites grow (well, ideally, of course), build times tend to grow as well. Without care, these increasing build times can become a productivity bottleneck as the feedback loop provided by the automated CI/CD pipeline grows longer and longer. And yet I&amp;rsquo;ve also observed that teams tend to get used to those long build times (over 20 minutes or longer) without realizing just how much time is spent waiting for the tests to pass. It&amp;rsquo;s a bit of a &lt;a href="https://en.wikipedia.org/wiki/Boiling_frog">&amp;ldquo;boiling frog&amp;rdquo; situation&lt;/a> as the build times increase gradually and people just get used to them. The trouble is that &lt;strong>this has a potentially large impact on team productivity&lt;/strong> - waiting for the CI pipeline to finish before submitting a pull-request for review (because you wouldn&amp;rsquo;t want to submit it if the tests fail), waiting for the pipeline to finish after merging it to the master branch before deployment, etc. is just wasted time - without mentioning the &lt;a href="https://www.joelonsoftware.com/2001/02/12/human-task-switches-considered-harmful/">context switch&lt;/a> that inevitably occurs when you have to wait for a 20 minutes for a build to finish.&lt;/p></description></item><item><title>Why I’m still using a MacBook Pro Late 2013 in 2019</title><link>https://manuel.bernhardt.io/2019/06/07/why-im-still-using-a-macbook-pro-late-2013/</link><pubDate>Fri, 07 Jun 2019 09:18:05 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/06/07/why-im-still-using-a-macbook-pro-late-2013/</guid><description>&lt;p>&lt;em>Update: it is now June 2021 and I&amp;rsquo;m still using the MacBook Pro Late 2013&lt;/em>&lt;br>
&lt;em>Update: it is now February 2022 and I&amp;rsquo;m still using the MacBook Pro Late 2013 after having changed the thermal paste for the CPU and GPU&lt;/em>&lt;/p>
&lt;p>I&amp;rsquo;ve started using Apple computers in 2008. Of all the Apple computers - and other computers - I&amp;rsquo;ve owned, the MacBook Pro Late 2013 is the one I&amp;rsquo;ve been able to keep the longest so far. The main reason that&amp;rsquo;s possible is because there are still a few ways to upgrade this Apple computer.&lt;/p></description></item><item><title>Raspberry PI Akka Cluster LED strips</title><link>https://manuel.bernhardt.io/2019/05/02/raspberry-pi-akka-cluster-led-strips/</link><pubDate>Thu, 02 May 2019 12:00:59 +0200</pubDate><guid>https://manuel.bernhardt.io/2019/05/02/raspberry-pi-akka-cluster-led-strips/</guid><description>&lt;p>Ever since Eric Loots from Lightbend first showed me the Raspberry-PI based Akka Cluster with special LED stripes, I&amp;rsquo;ve wanted (at least) one of them.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/DdY1IWfWsAAMmEN.jpeg" class="pure-img" alt="">
 &lt;figcaption>The Akka PI Cluster at Scala Days 2018&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>This is a 5 node cluster with special LED stripes setup in such a way that the LED colour and status (on, off, blinking, etc.) show in which state each node is. It is an excellent way to teach Akka Cluster, and since &lt;a href="https://manuel.bernhardt.io/training">I do this regularly&lt;/a> I was very interested from the beginning to get one of these myself.&lt;/p></description></item><item><title>2018: year in review</title><link>https://manuel.bernhardt.io/2018/12/31/2018-year-review/</link><pubDate>Mon, 31 Dec 2018 17:52:53 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/12/31/2018-year-review/</guid><description>&lt;p>I had intended to write a yearly review for a few years now but have not managed so far - 2018 is going to be the year that I finally get down to it. Looking back at the year is an interesting exercise and if I manage to keep this up for a few years (fingers crossed) it might provide a few interesting insights — and if not, it will have been fun anyway.&lt;/p></description></item><item><title>Akka anti-patterns: too many actors</title><link>https://manuel.bernhardt.io/2018/08/06/akka-anti-patterns-many-actors/</link><pubDate>Mon, 06 Aug 2018 06:01:22 +0200</pubDate><guid>https://manuel.bernhardt.io/2018/08/06/akka-anti-patterns-many-actors/</guid><description>&lt;p>&lt;em>Update (07.08.2018): clarified optimal vs. suboptimal use cases of having many actors at runtime (it could have been misunderstood that Akka isn&amp;rsquo;t meant to build systems with many actors - it entirely is - but it is questionable whether that&amp;rsquo;s always the best approach)&lt;/em>&lt;/p>
&lt;p>It occurred to me that I haven&amp;rsquo;t written yet about this very frequent anti-pattern. It is to be found in codebases written by developers who have just discovered the actor model.&lt;/p></description></item><item><title>Tour of Akka Cluster</title><link>https://manuel.bernhardt.io/2018/08/03/tour-akka-cluster/</link><pubDate>Fri, 03 Aug 2018 09:25:34 +0200</pubDate><guid>https://manuel.bernhardt.io/2018/08/03/tour-akka-cluster/</guid><description>&lt;p>Here&amp;rsquo;s an overview of the Tour of Akka Cluster article series:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/">Tour of Akka Cluster - Akka Distributed Data&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/">Tour of Akka Cluster - Eventual consistency, persistent actors, message delivery semantics&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/">Tour of Akka Cluster - Cluster Sharding&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://manuel.bernhardt.io/2018/03/23/tour-akka-cluster-testing-multi-node-testkit-handful-raspberry-pis/">Tour of Akka Cluster - Testing with the multi-node-testkit and a handful Raspberry PIs&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Akka anti-patterns: Java serialization</title><link>https://manuel.bernhardt.io/2018/07/20/akka-anti-patterns-java-serialization/</link><pubDate>Fri, 20 Jul 2018 11:29:45 +0200</pubDate><guid>https://manuel.bernhardt.io/2018/07/20/akka-anti-patterns-java-serialization/</guid><description>&lt;p>&lt;a href="http://akka.io">Akka&lt;/a> makes use of serialization when messages leave the JVM boundaries. This can happen in mainly two scenarios: sending messages over the network when using Akka Cluster (&lt;a href="https://manuel.bernhardt.io/2017/06/08/akka-anti-patterns-using-remoting/">do not use Akka Remote directly&lt;/a>) or using Akka Persistence.&lt;/p>
&lt;p>Now here&amp;rsquo;s the catch: the default serialization technology configured in Akka is nothing but the infamous Java serialization, &lt;a href="https://developers.slashdot.org/story/18/05/26/0520227/oracle-calls-java-serialization-a-horrible-mistake-plans-to-dump-it">which Mark Reinhold called a &amp;ldquo;horrible mistake&amp;rdquo; and which Oracle plans to dump in the near future anyway&lt;/a>.&lt;/p></description></item><item><title>Akka anti-patterns: stateless actors</title><link>https://manuel.bernhardt.io/2018/05/30/akka-anti-patterns-stateless-actors/</link><pubDate>Wed, 30 May 2018 07:31:24 +0200</pubDate><guid>https://manuel.bernhardt.io/2018/05/30/akka-anti-patterns-stateless-actors/</guid><description>&lt;p>Actors are object-orientation done right (as opposed to say, objects in Java): their state is not visible from the outside and they communicate via messages. There&amp;rsquo;s no way to break encapsulation because you can&amp;rsquo;t peek into an actor&amp;rsquo;s state while it is running. That&amp;rsquo;s the entire point of actors: they provide you with the illusion of a safe space in which things are executed sequentially, one message after the other, allowing you to use mutable state inside of your actor without having to worry about race conditions (well, almost: &lt;a href="https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/">don&amp;rsquo;t leak the state&lt;/a>).&lt;/p></description></item><item><title>A quick tour of build tools in Scala</title><link>https://manuel.bernhardt.io/2018/04/19/quick-tour-build-tools-scala/</link><pubDate>Thu, 19 Apr 2018 13:07:55 +0200</pubDate><guid>https://manuel.bernhardt.io/2018/04/19/quick-tour-build-tools-scala/</guid><description>&lt;ul>
&lt;li>&lt;strong>Update 20.04.2018&lt;/strong>: added Polyglot Maven&lt;/li>
&lt;/ul>
&lt;p>Scala has a rich ecosystem and active community producing &lt;a href="https://github.com/lauris/awesome-scala">a lot of useful libraries&lt;/a>. So much so that, sometimes it is not easy as a newcomer to decide which library to pick for a given task (this is the case for example when it comes to &lt;a href="https://manuel.bernhardt.io/2014/02/04/a-quick-tour-of-relational-database-access-with-scala/">database access&lt;/a> and &lt;a href="https://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in-scala/">JSON handling&lt;/a>). In this article we are going to cover another domain in which there is an increasing number of alternatives: build tools. At the time of writing this article in April 2018 we have at our disposal:&lt;/p></description></item><item><title>60-Minute Strategy Call</title><link>https://manuel.bernhardt.io/call/</link><pubDate>Fri, 30 Mar 2018 15:34:01 +0200</pubDate><guid>https://manuel.bernhardt.io/call/</guid><description>&lt;p>Do you want to make sure you’re headed the right direction before investing a considerable amount of time and money? Do you need a quick look at your planned architecture? Are you unsure as to the next steps to take? I can help you with a focused strategy call during which we’ll work out solutions for your problems.&lt;/p>
&lt;div class="bg_filled mgb-40">
 [testimonials category="strategy-testimonials" class="owl-one"]
&lt;/div>&lt;/p> 
&lt;h2 id="whats-included">What&amp;rsquo;s included?&lt;/h2>
&lt;ul>
&lt;li>60-minute video conversation via Skype (with screen sharing if necessary)&lt;/li>
&lt;li>Video recording of the call&lt;/li>
&lt;li>One week follow-up via email&lt;/li>
&lt;/ul>
&lt;h2 id="ready-for-the-call">Ready for the call?&lt;/h2>
&lt;p>The 60-minute strategy call currently costs 399€. Please book a time slot using the button below, and I&amp;rsquo;ll get back with a payment link and further details.&lt;/p></description></item><item><title>Services</title><link>https://manuel.bernhardt.io/services/</link><pubDate>Fri, 30 Mar 2018 15:33:06 +0200</pubDate><guid>https://manuel.bernhardt.io/services/</guid><description>&lt;h2 id="expert-services-to-guide-you-towards-a-reactive-system-architecture">Expert services to guide you towards a reactive system architecture&lt;/h2>
&lt;p>&lt;em>My services are available as low-risk, fixed-price packages. If you didn&amp;rsquo;t find a package to meet your needs, don&amp;rsquo;t hesitate to &lt;a href="https://manuel.bernhardt.io/contact">get in touch&lt;/a> with me to discuss a custom engagement. I offer all of these services in english, german and french.&lt;/em>&lt;/p>
&lt;h3 id="60-minute-strategy-call">60-Minute Strategy Call&lt;/h3>
&lt;p style="margin-bottom: 0.4em;">
 Do you want to make sure you're headed the right direction before investing a considerable amount of time and money? Do you need a quick look at your planned architecture? Are you unsure as to the next steps to take? I can help you with a focused strategy call during which we'll work out solutions for your problems.
&lt;/p></description></item><item><title>Tour of Akka Cluster – Testing with the multi-node-testkit and a handful Raspberry PIs</title><link>https://manuel.bernhardt.io/2018/03/23/tour-akka-cluster-testing-multi-node-testkit-handful-raspberry-pis/</link><pubDate>Fri, 23 Mar 2018 08:19:47 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/03/23/tour-akka-cluster-testing-multi-node-testkit-handful-raspberry-pis/</guid><description>&lt;p>In the previous parts of this article series, we have looked at various functionality of Akka Cluster: &lt;a href="https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/">distributed data&lt;/a>, &lt;a href="https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/">persistence, message delivery semantics&lt;/a> and &lt;a href="https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/">cluster sharding&lt;/a>. We are far from done with exploring Akka Cluster features, but today it is time to look at one feature that is extremely useful when it comes to building production-quality systems based on Akka Cluster: the test support. As testing itself isn&amp;rsquo;t the most exciting activity there is, let&amp;rsquo;s space this article a bit up by throwing a few Raspberry PIs in the mix:&lt;/p></description></item><item><title>Akka anti-patterns: overusing ActorSelection</title><link>https://manuel.bernhardt.io/2018/03/20/akka-anti-patterns-overusing-actorselection/</link><pubDate>Tue, 20 Mar 2018 09:27:15 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/03/20/akka-anti-patterns-overusing-actorselection/</guid><description>&lt;p>&lt;a href="https://akka.io">Akka&amp;rsquo;s&lt;/a> &lt;a href="https://doc.akka.io/japi/akka/current/akka/actor/ActorSelection.html">ActorSelection&lt;/a> makes it possible to look up actors by logical path in the hierarchy:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-scala" data-lang="scala">&lt;span class="line">&lt;span class="cl">&lt;span class="k">val&lt;/span> &lt;span class="n">selection&lt;/span>&lt;span class="k">:&lt;/span> &lt;span class="kt">ActorSelection&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">context&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">actorSelection&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;../processor/storage&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This selection can then be used like &lt;code>ActorRef&lt;/code> in order to send messages to it using the &lt;code>tell&lt;/code> or &lt;code>ask&lt;/code> patterns:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-scala" data-lang="scala">&lt;span class="line">&lt;span class="cl">&lt;span class="n">selection&lt;/span> &lt;span class="o">!&lt;/span> &lt;span class="nc">Storage&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nc">Store&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;important words&amp;#34;&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">val&lt;/span> &lt;span class="n">allWords&lt;/span>&lt;span class="k">:&lt;/span> &lt;span class="kt">Future&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="kt">Seq&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="kt">String&lt;/span>&lt;span class="o">]]&lt;/span> &lt;span class="k">=&lt;/span> &lt;span class="n">selection&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nc">Storage&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="nc">RetrieveAll&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>ActorSelection&lt;/code> is therefore quite useful and allows more flexibility when designing an actor system given that trees can be built dynamically and queried dynamically at runtime. That being said, there are a few things that you should be aware of when using this mechanism.&lt;/p></description></item><item><title>Lightbend Akka Streams for Scala – Professional</title><link>https://manuel.bernhardt.io/courses/lightbend-akka-streams-professional/</link><pubDate>Fri, 16 Mar 2018 16:31:52 +0100</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-akka-streams-professional/</guid><description>&lt;p>&lt;em>Want to help your team to get up to speed with Akka Streams, enabling them to build powerful streaming data applictions? I have been working intensively with Akka since 2011 and am offering remote and in-house training for teams.&lt;/em>&lt;/p>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>This one day course introduces experienced Akka developers to the Akka Streams API. Akka Streams enables the consumption of streaming data, in a fully non-blocking, asynchronous manner. It also allows us to consume that data while providing non-blocking backpressure to prevent mailbox overflows. Our goal is to learn the components that make up the Akka Streams API and how they interact. We will see a broad range of different Akka Streams components and have a chance to use many of them.&lt;/p></description></item><item><title>Tour of Akka Cluster – Cluster Sharding</title><link>https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/</link><pubDate>Mon, 26 Feb 2018 16:33:04 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/02/26/tour-akka-cluster-cluster-sharding/</guid><description>&lt;p>In &lt;a href="https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/">Tour of Akka Cluster - Eventual consistency, persistent actors and message delivery semantics&lt;/a> we started to look into making the reactive payment processor resilient to node crashes by exploring Akka Persistence, a mechansim that provides durability guarantees for actor state. We also briefly mentioned &lt;a href="https://doc.akka.io/docs/akka/2.5/cluster-sharding.html">Akka Cluster Sharding&lt;/a> which offers a way to automatically distribute actors of the same type over several nodes. In this article we are going to take a closer look at cluster sharding and then make use of it for our reactive payment processor.&lt;/p></description></item><item><title>Tour of Akka Cluster – Eventual consistency, persistent actors, message delivery semantics</title><link>https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/</link><pubDate>Wed, 31 Jan 2018 14:19:43 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/01/31/tour-akka-cluster-eventual-consistency-persistent-actors-message-delivery-semantics/</guid><description>&lt;p>In &lt;a href="https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/">Tour of Akka Cluster - Akka Distributed Data&lt;/a> we looked into building a reactive payment processing system using Akka Distributed Data as a means to provide master-master replication to the order storage component. We did not, however, ensure in any way of form that the system as a whole could withstand individual node crashes. In this article, we will explore options for making the Reactive Payment Processor fault-tolerant.&lt;/p>
&lt;h2 id="evaluating-the-existing-design-in-the-light-of-redundancy">Evaluating the existing design in the light of redundancy&lt;/h2>
&lt;p>Let&amp;rsquo;s make a thought experiment and see if our current design is fit to be &amp;ldquo;upgraded&amp;rdquo; in the light of redundancy. Let&amp;rsquo;s suppose we have made the validation process redundant, so that it would take place on any node (not just the node on which the order was first registered). This way, should the order receiving the node fail, we would still be able to continue validation and processing (so long as it wasn&amp;rsquo;t the node also handling the particular acquring bank).&lt;/p></description></item><item><title>Tour of Akka Cluster – Akka Distributed Data</title><link>https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/</link><pubDate>Wed, 03 Jan 2018 15:23:04 +0100</pubDate><guid>https://manuel.bernhardt.io/2018/01/03/tour-akka-cluster-akka-distributed-data/</guid><description>&lt;p>Building distributed systems is hard. Pesky things like the laws of physics get in the way of maintaining state accross geographically (and chronologically) disparate systems, and, if that weren&amp;rsquo;t already outrageous enough in itself, those systems may be subject to network failures, forcing us to think about annoying tradeoffs regarding consistency, availability and the meaning of life.&lt;/p>
&lt;p>One of the more interesting (well, at least from my perspective) tools in the &lt;a href="https://akka.io">Akka&lt;/a> toolbox is &lt;a href="https://doc.akka.io/docs/akka/current/cluster-usage.html?language=scala">Akka Cluster&lt;/a> and the modules built on top of it. Through its design it acknowledges the hard reality of life, promoting a &amp;ldquo;no magic here&amp;rdquo; approach to building distributed applications and yet at the same time, takes care about many of the harder aspects of doing so.&lt;/p></description></item><item><title>Subsequent thoughts on fatherhood</title><link>https://manuel.bernhardt.io/2017/11/16/subsequent-thoughts-fatherhood/</link><pubDate>Thu, 16 Nov 2017 09:04:29 +0100</pubDate><guid>https://manuel.bernhardt.io/2017/11/16/subsequent-thoughts-fatherhood/</guid><description>&lt;p>A bit over two years ago, I wrote &lt;a href="https://manuel.bernhardt.io/2015/10/16/initial-thoughts-on-fatherhood/">about my initial thoughts on fatherhood&lt;/a> a bit after our daughter was born. Our son ThÃ o is now 4 months old and I find it fitting to write a follow-up.&lt;/p>
&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://i0.wp.com/imgs.xkcd.com/comics/natural_parenting.png?w=1384&amp;amp;#038;ssl=1" class="pure-img" alt="">
&lt;/figure>

&lt;/p>
&lt;h2 id="life-with-one-kid">Life with one kid&lt;/h2>
&lt;p>Life with one kid is easy (in a couple). You&amp;rsquo;re two adults (well, more-or-less) against one child. Yes, the nights can be rough - in our case, ValÃ rie still hasn&amp;rsquo;t learned to sleep through the nights. There&amp;rsquo;s about a gazillion books, blog posts, video courses, self-proclaimed sleep gurus out there, and while &lt;em>some&lt;/em> of the advice may apply to &lt;em>some&lt;/em> kids, the reality of the matter is that each kid is wildly different (or should I say unique) and will have wildly different sleep patterns. And all that money spent on books and whatnot won&amp;rsquo;t change this. Judging from what we&amp;rsquo;ve heard from friends and acquaintances with children, the sleep pattern seems to be in large part hereditary - there seems to be a rather strong relationship between how the parents slept as kids (or still sleep as adults) and how the children sleep. In our case, we hit the double jackpot since neither I nor my wife is particularly sound sleepers. Perhaps, now is a good time to consider reliable options such as buying the &lt;a href="https://www.sleepeducation.net.au/best-adjustable-beds-in-australia/">best adjustable bed in Australia&lt;/a>. Hopefully, that way, no matter what time we sleep, we can get a good night&amp;rsquo;s sleep.&lt;/p></description></item><item><title>Akka anti-patterns: naming your application components after Akka concepts</title><link>https://manuel.bernhardt.io/2017/08/26/akka-anti-patterns-naming-your-application-after-akka-concepts/</link><pubDate>Sat, 26 Aug 2017 06:00:47 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/08/26/akka-anti-patterns-naming-your-application-after-akka-concepts/</guid><description>&lt;p>So you&amp;rsquo;ve just learned Akka and are tremendously excited. It&amp;rsquo;s got dispatchers, routers, supervisors - so many shiny things to play with, and in style (I mean, come on, a dispatcher sounds a lot nicer than, say, an &lt;code>AbstractSingletonProxyFactoryBean&lt;/code>).&lt;/p>
&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/d726ffbf9d0930295e3d98de53b93c53.jpg" class="pure-img" alt="">
&lt;/figure>

&lt;/p>
&lt;p>And so it happens that, perhaps even unknowingly to you (you&amp;rsquo;re busy configuring a &lt;a href="http://doc.akka.io/docs/akka/2.5.3/scala/routing.html">pool router&lt;/a>), your actors start getting names such as:&lt;/p>
&lt;ul>
&lt;li>&lt;code>Dispatcher&lt;/code>&lt;/li>
&lt;li>&lt;code>IncomingRouter&lt;/code>&lt;/li>
&lt;li>&lt;code>FailureSupervisor&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>I&amp;rsquo;ve observed this on three projects now, for two of which I delivered &lt;a href="https://manuel.bernhardt.io/fast-track-to-akka-with-java/">an introductory Akka training&lt;/a> to the team beforehand. I&amp;rsquo;d say that this anti-pattern is especially to be found in projects where people are just getting started with Akka.&lt;/p></description></item><item><title>A new adaptive accrual failure detector for Akka</title><link>https://manuel.bernhardt.io/2017/07/26/a-new-adaptive-accrual-failure-detector-for-akka/</link><pubDate>Wed, 26 Jul 2017 15:28:38 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/07/26/a-new-adaptive-accrual-failure-detector-for-akka/</guid><description>&lt;p>&lt;a href="http://akka.io">Akka&lt;/a> uses the &lt;a href="http://fubica.lsd.ufcg.edu.br/hp/cursos/cfsc/papers/hayashibara04theaccrual.pdf">The Φ Accrual Failure Detector&lt;/a> for failure detection, which is to say for answering the question of whether a node is alive or not. That&amp;rsquo;s one of the harder problems of distributed systems since it is virtually impossible (from the point of view of one node) to tell the difference of a remote system being completely unavailable (process crashed, computer died, etc.) or &lt;em>slow&lt;/em> (network congestion, other kind of congestion such as CPU during a garbage collection for JVM processes, etc.).&lt;/p></description></item><item><title>Akka anti-patterns: trusting the network</title><link>https://manuel.bernhardt.io/2017/06/20/akka-anti-patterns-trusting-network/</link><pubDate>Tue, 20 Jun 2017 05:06:33 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/06/20/akka-anti-patterns-trusting-network/</guid><description>&lt;p>One anti-pattern I&amp;rsquo;ve observed in networked Akka applications is a tendency to forget that it is, well, networked and to treat the network as a friendly place.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/trusting-the-network.jpg" class="pure-img" alt="">
 &lt;figcaption>Trusting the network to be reliable&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>How does that look like? Well, consider the following piece of code:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="line">&lt;span class="cl">&lt;span class="n">actorOnDifferentNode&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="na">tell&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">veryImportantMessage&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">sender&lt;/span>&lt;span class="p">());&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Akka&amp;rsquo;s default message sending mechanism is the fire-and-forget &lt;code>tell&lt;/code> method. And that works great - until it doesn&amp;rsquo;t. See, &lt;code>tell&lt;/code> has &lt;a href="http://doc.akka.io/docs/akka/current/java/general/message-delivery-reliability.html">at-most-once message delivery semantics&lt;/a>. This means that in theory (and in practice!) messages may not make it to their destination.&lt;/p></description></item><item><title>Lightbend Akka for Java – Expert</title><link>https://manuel.bernhardt.io/courses/lightbend-akka-java-expert/</link><pubDate>Sun, 18 Jun 2017 13:00:43 +0200</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-akka-java-expert/</guid><description>&lt;p>&lt;em>Want to help your team in getting started with building distributed reactive applications using Akka? I have been working intensively with Akka since 2011 and am offering remote and in-house training for teams.&lt;/em>&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;p>This is a three-day advanced course on building distributed reactive applications using Akka and Java. It is intended for developers who already have a strong understanding of the fundamentals of building applications using Akka and Java on a single JVM and are looking to learn how to scale out to multiple nodes and 3rd party systems. This course has extensive hands-on work and successive exercises build upon prior lessons learned to produce a fully functional application that is both event-driven and resilient by the conclusion of the course.&lt;/p></description></item><item><title>Akka anti-patterns: using remoting</title><link>https://manuel.bernhardt.io/2017/06/08/akka-anti-patterns-using-remoting/</link><pubDate>Thu, 08 Jun 2017 07:14:03 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/06/08/akka-anti-patterns-using-remoting/</guid><description>&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/lucy-waves.jpg" class="pure-img" alt="">
 &lt;figcaption>Senior developer using Akka remoting directly to build a special type of cluster&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>Whilst I have always successfully discouraged my clients from using &lt;a href="http://doc.akka.io/docs/akka/snapshot/scala/remoting.html">Akka Remoting&lt;/a> in their application, I often get questions regarding remoting while &lt;a href="https://manuel.bernhardt.io/talks/">talking&lt;/a> about anti-patterns at conferences and user groups.&lt;/p>
&lt;p>Don&amp;rsquo;t get me wrong. I love Akka remoting. Especially the new &lt;a href="https://github.com/real-logic/Aeron">Aeron&lt;/a>-based &lt;a href="http://doc.akka.io/docs/akka/snapshot/scala/remoting-artery.html">Artery&lt;/a> remoting version that is based on UDP rather than TCP. Whilst it maintains the same delivery guarantees, it is quite a bit faster than the TCP counterpart.&lt;/p></description></item><item><title>Tour de Lagom Part 1: Lagom and microservices</title><link>https://manuel.bernhardt.io/2017/06/05/tour-de-lagom-part-1-lagom-microservices/</link><pubDate>Mon, 05 Jun 2017 16:17:52 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/06/05/tour-de-lagom-part-1-lagom-microservices/</guid><description>&lt;p>&lt;a href="https://www.lagomframework.com">Lagom&lt;/a> is a framework for building reactive microservices in Scala or Java with an emphasis on developer productivity. I&amp;rsquo;ve had a chance to work with it for some time and would like to share my impressions about it. This is going to take a bit longer than just one post, so you&amp;rsquo;re reading part one of a 3-part series:&lt;/p>
&lt;ul>
&lt;li>Part 1: Lagom and microservices&lt;/li>
&lt;li>Part 2: Lagom and reactive&lt;/li>
&lt;li>Part 3: Lagom and developer productivity&lt;/li>
&lt;/ul>
&lt;p>The idea is to cover most of what Lagom has to offer by looking at it at various angles. Let&amp;rsquo;s go!&lt;/p></description></item><item><title>Akka Streams – What is NotUsed all about</title><link>https://manuel.bernhardt.io/2017/05/22/akka-streams-notused/</link><pubDate>Mon, 22 May 2017 08:55:14 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/05/22/akka-streams-notused/</guid><description>&lt;p>&lt;a href="http://akka.io">Akka Streams&lt;/a> is a powerful implementation on top of the &lt;a href="http://www.reactive-streams.org/">Reactive Streams&lt;/a> SPI for non-blocking asynchronous communication with back-pressure on the JVM. This post is not about explaining what this means, nor what Akka Streams does. The purpose of this post is to explain what on earth the &lt;code>NotUsed&lt;/code> type in type signatures of Akka Streams is all about which — incidentally — also means explaining a fundamental design aspect of Akka Streams.&lt;/p></description></item><item><title>Akka anti-patterns: blocking</title><link>https://manuel.bernhardt.io/2017/05/15/akka-anti-patterns-blocking/</link><pubDate>Mon, 15 May 2017 07:59:20 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/05/15/akka-anti-patterns-blocking/</guid><description>&lt;p>This is probably one of the most frequent (and dangerous) anti-patterns when it comes to working with &lt;a href="http://akka.io/">Akka&lt;/a>. Let&amp;rsquo;s look at an adequate description of the mindset you must be in in order to use it:&lt;/p>
&lt;p>So maybe you didn&amp;rsquo;t actually want to see the world burn. Maybe you thought that this one time it was okay to call blocking code inside of an actor. Little did you know that, seven months later, this decision would bring down the entire system minutes after its official launch and announcement in the media.&lt;/p></description></item><item><title>You got to hold the frame – Avoiding burnout or Lessons learned from six years as an independent consultant</title><link>https://manuel.bernhardt.io/2017/05/08/got-hold-frame-avoiding-burnout-lessons-learned-six-years-independent-consultant/</link><pubDate>Mon, 08 May 2017 09:15:06 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/05/08/got-hold-frame-avoiding-burnout-lessons-learned-six-years-independent-consultant/</guid><description>&lt;p>There&amp;rsquo;s a scene in the 1987 classic movie Dirty Dancing in which Johnny (Patrick Swayze) explains the concept of &lt;em>dancing space&lt;/em> to Baby (Jennifer Grey).&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Lock your frame. Lock it, lock it, lock it.&lt;br>
Look. Spaghetti arms.&lt;br>
This is my dance space, this is your dance space.&lt;br>
I don&amp;rsquo;t go into yours, you don&amp;rsquo;t go into mine.&lt;br>
You got to hold the frame&amp;rdquo;&lt;/p>
&lt;p>— Johnny, Dirty Dancing&lt;/p>&lt;/blockquote>
&lt;p>Baby, who is a quick learner, later makes fun of this:&lt;/p></description></item><item><title>IntelliJ IDEA OS X Shortcuts on Ubuntu Gnome</title><link>https://manuel.bernhardt.io/2017/04/10/intellij-idea-os-x-shortcuts-ubuntu-gnome/</link><pubDate>Mon, 10 Apr 2017 19:43:20 +0200</pubDate><guid>https://manuel.bernhardt.io/2017/04/10/intellij-idea-os-x-shortcuts-ubuntu-gnome/</guid><description>&lt;p>I recently got myself a new desktop computer with nice and fast hardware (more about this in another post) and am setting up Ubuntu Gnome on it. Since I&amp;rsquo;ll still be using my MacBook Pro for some time I don&amp;rsquo;t want to learn another set of keyboard shortcuts, so I set out to use IDEA&amp;rsquo;s OS X 10.5+ keyboard bindings on Ubuntu. It turns out that it possible, although not straightforward. Here&amp;rsquo;s how to go about it.&lt;/p></description></item><item><title>What I'm doing now</title><link>https://manuel.bernhardt.io/now/</link><pubDate>Tue, 21 Mar 2017 20:20:31 +0100</pubDate><guid>https://manuel.bernhardt.io/now/</guid><description>&lt;p>This is a &lt;a href="http://nownownow.com/about">now page&lt;/a> that tells you what I am focusing on at this point in my life.&lt;/p>
&lt;p>These days, I am:&lt;/p>
&lt;ul>
&lt;li>Putting in place SRE and DevSecOps practices at a client in Vienna&lt;/li>
&lt;li>experimenting with AI agents&lt;/li>
&lt;/ul>
&lt;p>This page was last updated on 18th of March 2025&lt;/p></description></item><item><title>About</title><link>https://manuel.bernhardt.io/about/</link><pubDate>Sun, 19 Mar 2017 21:12:15 +0100</pubDate><guid>https://manuel.bernhardt.io/about/</guid><description>&lt;div class="row">
&lt;div class="col-md-7 text">
&lt;p>I&amp;rsquo;m a polyglot software engineer and trainer working as an independent consultant.&lt;/p>
&lt;p>My consulting work consists in helping my clients:&lt;/p>
&lt;ul>
&lt;li>engineer, deploy and operate highly available and fault-tolerant systems&lt;/li>
&lt;li>get existing systems to meet predictable performance requirements in the face of increasing load&lt;/li>
&lt;/ul>
&lt;p>I have significant experience in engineering and operating distributed systems at all levels of the stack, from high-level architecture down to debugging issues at the kernel or network level. Next to working on client projects I have also explored the topics of cluster membership and distributed consensus, trying to keep up to date with the latest research in this field and sometimes &lt;a href="https://manuel.bernhardt.io/2020/04/30/10000-node-cluster-with-akka-and-rapid/">pushing the limit myself&lt;/a>.&lt;/p></description></item><item><title>Lightbend Akka for Scala – Expert</title><link>https://manuel.bernhardt.io/courses/lightbend-akka-scala-expert/</link><pubDate>Mon, 02 Jan 2017 15:14:23 +0100</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-akka-scala-expert/</guid><description>&lt;p>&lt;em>Want to help your team in getting started with building distributed reactive applications using Akka? I have been working intensively with Akka since 2011 and am offering remote and in-house training for teams.&lt;/em>&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;p>This is a two-day advanced course on building distributed reactive applications using Akka and Scala. It is intended for developers who already have a strong understanding of the fundamentals of building applications using Akka and Scala on a single JVM and are looking to learn how to scale out to multiple nodes and 3rd party systems. This course has extensive hands-on work and successive exercises build upon prior lessons learned to produce a fully functional application that is both event-driven and resilient by the conclusion of the course.&lt;/p></description></item><item><title>Akka anti-patterns: being out of touch with the hardware</title><link>https://manuel.bernhardt.io/2016/11/21/akka-anti-patterns-being-out-of-touch-with-the-hardware/</link><pubDate>Mon, 21 Nov 2016 17:02:31 +0100</pubDate><guid>https://manuel.bernhardt.io/2016/11/21/akka-anti-patterns-being-out-of-touch-with-the-hardware/</guid><description>&lt;p>Choosing Akka as a tool is often - if not always - driven by the need for good performance. Surely, the actor model itself is appealing as a means for organizing and reasoning about code, but this isn&amp;rsquo;t in itself a good reason enough to use the Akka toolkit. If all you are concerned about is a nice way to organize code and build modular applications you might as well pick the Spring Framework which has a very rich and clear component model and provides very good support for building software where performance isn&amp;rsquo;t one of the driving factors.&lt;/p></description></item><item><title>Lightbend Akka for Scala – Professional</title><link>https://manuel.bernhardt.io/courses/lightbend-akka-scala-professional/</link><pubDate>Mon, 24 Oct 2016 20:49:54 +0200</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-akka-scala-professional/</guid><description>&lt;p>&lt;em>Want to help your team to get up to speed with the core concepts of Akka and the Actor model, enabling them to build production-ready Akka applications? I have been working intensively with Akka since 2011 and am offering remote and in-house training for teams.&lt;/em>&lt;/p>
&lt;p>The course is updated to include the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">new Akka Typed API&lt;/a> that brings significant advantages over the classic API.&lt;/p>
&lt;h3 id="summary">Summary&lt;/h3>
&lt;p>This two-day course introduces experienced application developers to the reactive Akka toolkit and runtime and the methodologies that enable the creation of real-world actor-based systems in Java on a single JVM. This course has extensive hands-on work and successive exercises build upon prior lessons learned to produce a fully functional application that is both message-driven and resilient by the conclusion of the course.&lt;/p></description></item><item><title>Lightbend Scala Language – Professional</title><link>https://manuel.bernhardt.io/courses/lightbend-scala-language-professional/</link><pubDate>Thu, 06 Oct 2016 09:50:09 +0200</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-scala-language-professional/</guid><description>&lt;p>&lt;em>Want to help your team to get started with Scala faster and to share the same basic knowledge about the language and the functional programming concepts? I have been working intensively with Scala since 2010 and am offering remote and in-house training for teams.&lt;/em>&lt;/p>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>This two-day course is designed to give experienced developers the know-how to confidently start programming in Scala. The course ensures you will have a solid understanding of the fundamentals of the language, the tooling and the development process as well as a good appreciation of the more advanced features. If you already have Scala programming experience, then this course could be a useful refresher, yet no previous knowledge of Scala is assumed.&lt;/p></description></item><item><title>Lightbend Akka for Java – Professional</title><link>https://manuel.bernhardt.io/courses/lightbend-akka-java-professional/</link><pubDate>Wed, 28 Sep 2016 06:29:44 +0200</pubDate><guid>https://manuel.bernhardt.io/courses/lightbend-akka-java-professional/</guid><description>&lt;p>&lt;em>&lt;span style="vertical-align: inherit;">&lt;span style="vertical-align: inherit;">Do you want to help your team start using Akka and the actor model quickly to create operational applications? &lt;/span>&lt;span style="vertical-align: inherit;">I have worked intensively with Akka since 2011 and offer the official training of Lightbend Akka for Java – Professional, remotely or in your office. &lt;/span>&lt;/span>&lt;/em>&lt;/p>
&lt;p>The course is updated to include the &lt;a href="https://manuel.bernhardt.io/2019/07/11/tour-of-akka-typed-protocols-and-behaviors/">new Akka Typed API&lt;/a> that brings significant advantages over the classic API.&lt;/p>
&lt;h3 id="presentation">&lt;span style="vertical-align: inherit;">&lt;span style="vertical-align: inherit;">Presentation&lt;/span>&lt;/span>&lt;/h3>
&lt;p>&lt;span style="vertical-align: inherit;">&lt;span style="vertical-align: inherit;">This three-day training was designed for the purpose enable experienced Java developers to create &lt;/span>&lt;/span>&lt;a href="http://www.reactivemanifesto.org">&lt;span style="vertical-align: inherit;">&lt;span style="vertical-align: inherit;">reactive applications &lt;/span>&lt;/span>&lt;/a>&lt;span style="vertical-align: inherit;">&lt;span style="vertical-align: inherit;">based on Akka on the FMV. &lt;/span>&lt;span style="vertical-align: inherit;">The training devotes a large part to the acquisition of knowledge by carrying out several practical exercises using adapted tools, which at the end of the training result in a operational application that is both resilient and message-oriented.&lt;/span>&lt;/span>&lt;/p></description></item><item><title>Akka anti-patterns: logging (the wrong way)</title><link>https://manuel.bernhardt.io/2016/08/31/akka-anti-patterns-logging-the-wrong-way/</link><pubDate>Wed, 31 Aug 2016 05:59:33 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/08/31/akka-anti-patterns-logging-the-wrong-way/</guid><description>&lt;p>&lt;strong>Update&lt;/strong>: removed rogue &lt;code>toString&lt;/code> call in the second code example, since it was unnecessary (and harmful).&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/2534404231_f65753fc3a_b.jpg" class="pure-img" alt="">
 &lt;figcaption>Proper logging&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>Debugging actor systems is no small feat, even when there is &lt;a href="http://scala-ide.org/docs/current-user-doc/features/async-debugger/index.html">IDE support for it&lt;/a>. In fact, debugging any asynchronous system for that matter is a rather complicated task. Which is why, especially during development, it is not entirely uncommon to rely on DEBUG level logging to get a sense of how messages flow between actors. Whilst doing so is fine, there are a few precautions that need to be taken when logging at DEBUG level (or any other level). Remember, logging ranks very high on the &lt;a href="https://vimeo.com/177215741">list of top 10 performance mistakes&lt;/a>.&lt;/p></description></item><item><title>Akka anti-patterns: too many actor systems</title><link>https://manuel.bernhardt.io/2016/08/23/akka-anti-patterns-too-many-actor-systems/</link><pubDate>Tue, 23 Aug 2016 07:25:10 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/08/23/akka-anti-patterns-too-many-actor-systems/</guid><description>&lt;p>Admittedly I&amp;rsquo;ve seen this one in use only one time, but it was one time too many. For some reason I keep seeing clients come up with this during design discussions and reviews though, therefore it makes it into the list of &lt;a href="https://manuel.bernhardt.io/tags/anti-pattern/">Akka anti-patterns&lt;/a>.&lt;/p>
&lt;p>What I am talking about is this:&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/actorsystems.png" class="pure-img" alt="">
 &lt;figcaption>Many ActorSystems on a single JVM, competing for resources&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>Reasons I hear for this design:&lt;/p>
&lt;ul>
&lt;li>isolation of concerns: each ActorSystem is separated, hence failure of one system does not affect the other&lt;/li>
&lt;li>custom classloading in the ActorSystem, dynamically loading libraries and isolating them between systems&lt;/li>
&lt;li>using multiple Akka versions without having to restart&lt;/li>
&lt;/ul>
&lt;p>And I am not talking about designs where there are 2 or 3 ActorSystems on the same JVM here, but possible hundreds if not thousands. Now, Akka itself &lt;a href="http://doc.akka.io/docs/akka/current/general/actor-systems.html#Configuration_Container">does not share any global state&lt;/a> so you can theoretically pull this off. But should you?&lt;/p></description></item><item><title>Akka anti-patterns: race conditions</title><link>https://manuel.bernhardt.io/2016/08/16/akka-anti-patterns-race-conditions/</link><pubDate>Tue, 16 Aug 2016 05:00:39 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/08/16/akka-anti-patterns-race-conditions/</guid><description>&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/3169240519_49e8193ab4_o.jpg" class="pure-img" alt="">
&lt;/figure>

&lt;/p>
&lt;p>The actor model makes it possible to build highly-concurrent applications through the notion that actors obey the &lt;a href="http://doc.akka.io/docs/akka/snapshot/general/jmm.html#Actors_and_the_Java_Memory_Model">actor send rule and the actor subsequent processing rule&lt;/a>, hence creating a &lt;strong>single-threaded environment&lt;/strong> inside of an actor.&lt;/p>
&lt;p>That being said, it&amp;rsquo;s all an &lt;strong>illusion&lt;/strong>: as we have &lt;a href="https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/">briefly talked about previously&lt;/a>, Akka&amp;rsquo;s dispatchers make sure that messages are being processed by actors and so the thread by which one message is processed may not be the same as the one by which the next message is going to be processed.&lt;/p></description></item><item><title>Akka anti-patterns: flat actor hierarchies or mixing business logic and failure handling</title><link>https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/</link><pubDate>Tue, 09 Aug 2016 04:00:31 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/08/09/akka-anti-patterns-flat-actor-hierarchies-or-mixing-business-logic-and-failure-handling/</guid><description>&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/Portable-Network-Graphics-image-C1B055469582-1.png" class="pure-img" alt="">
 &lt;figcaption>Flat actor hierarchy. Sad actors being all flat.&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>One of the fundamental ideas built into Akka is the one of failure handling through parental &lt;em>supervision&lt;/em>.&lt;/p>
&lt;p>In other words this means agencing actors in such a way that parent actors that depend upon the correct execution of a child to perform their work are also responsible for deciding what to do when one of the child actor crashes.&lt;/p>
&lt;p>An exception thrown inside of an actor results in that actor crashing, prompting its parent to decide what to do, which it does using a &lt;a href="http://doc.akka.io/docs/akka/current/general/supervision.html">SupervisorStrategy&lt;/a>. You should not be writing defensive &lt;code>try...catch&lt;/code> blocks inside of an actor - except perhaps for a few rare cases, this too is an anti-pattern! Instead the idea is to &lt;a href="http://letitcrash.com">let it crash&lt;/a> and handle failures through another channel entirely.&lt;/p></description></item><item><title>Akka anti-patterns: shared mutable state</title><link>https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/</link><pubDate>Tue, 02 Aug 2016 15:00:40 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/08/02/akka-anti-patterns-shared-mutable-state/</guid><description>&lt;p>When I work with clients on designing actor systems there are a few anti-patterns that seem to make it into initial, non-reviewed designs no matter what. In this series of short articles I would like to cover a few of those.&lt;/p>
&lt;h1 id="anti-pattern-1-sharing-mutable-state-accross-actors">Anti-pattern #1: sharing mutable state accross actors&lt;/h1>
&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/one-does-not-state.jpg" class="pure-img" alt="">
&lt;/figure>

&lt;/p>
&lt;p>Even though the Akka documentation &lt;a href="http://doc.akka.io/docs/akka/current/general/actor-systems.html#Actor_Best_Practices">points this out&lt;/a> &lt;a href="http://doc.akka.io/docs/akka/current/general/jmm.html#Actors_and_shared_mutable_state">in various places&lt;/a>, one of the favourite anti-patterns I&amp;rsquo;ve seen is use is &lt;em>sharing mutable state accross actor boundaries&lt;/em>.&lt;/p></description></item><item><title>The reality of writing a technical book</title><link>https://manuel.bernhardt.io/2016/07/15/the-reality-of-writing-a-technical-book/</link><pubDate>Fri, 15 Jul 2016 16:18:15 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/07/15/the-reality-of-writing-a-technical-book/</guid><description>&lt;p>Two days ago I received my copies of &lt;a href="https://manuel.bernhardt.io/reactive-web-applications/">Reactive Web Applications&lt;/a>.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/IMG_8064.jpg" class="pure-img" alt="">
 &lt;figcaption>Stairways to Reactive&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>Needless to say, I had been waiting for this moment for some time. Even though the final PDF version had been out for a few weeks prior to this, nothing compares to holding in your hands an actual, physical, printed book (sites like &lt;a href="https://www.printivity.com/books/perfect-bound-books">Printivity&lt;/a> could help out in this regard) and seeing the pages you&amp;rsquo;ve been working on in context with the possibility of turning them back and forth. Call me old-fashioned, but when it comes to reading a book with the purpose of learning new material I have the feeling that printed books have a better quality to it, with some form of tactile memory helping to remember the contents better.&lt;/p></description></item><item><title>The microservices marathon</title><link>https://manuel.bernhardt.io/2016/06/14/the-microservices-marathon/</link><pubDate>Tue, 14 Jun 2016 09:19:58 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/06/14/the-microservices-marathon/</guid><description>&lt;p>Everyone is talking about microservices. And many people are betting on it. At this year&amp;rsquo;s &lt;a href="https://voxxeddays.com/vienna/">Voxxed Days Vienna&lt;/a> over 60% of the submissions contained the word microservices. At JAX 2016 in Mainz, the word microservices was spoken out aloud on average 40 times per minute accross the entire venue. It&amp;rsquo;s hard to go one day on Twitter without seeing microservices in the stream.&lt;/p>
&lt;p>In this post I&amp;rsquo;ll first try to answer the question of why there is a need for microservices (in some settings) and then I&amp;rsquo;d like to talk a bit about what I think is a neglected issue in all the hype surrounding the topic these days: the feasability of organizational adoption of microservices. It is one thing to have the tools to microservice and another one entirely to be able to get an organization to think and act in terms compatible with the vision promised by the microservice architecture.&lt;/p></description></item><item><title>Akka Cluster, Java and the Raspberry PI 3 Model B</title><link>https://manuel.bernhardt.io/2016/04/19/akka-cluster-java-and-the-raspberry-pi-3-model-b/</link><pubDate>Tue, 19 Apr 2016 07:39:52 +0200</pubDate><guid>https://manuel.bernhardt.io/2016/04/19/akka-cluster-java-and-the-raspberry-pi-3-model-b/</guid><description>&lt;p>I recently built an architecture prototype for &lt;a href="http://dimoco.at">DIMOCO&lt;/a> aiming at answering roughly the following questions:&lt;/p>
&lt;ul>
&lt;li>what does it entail to run an Akka cluster, how fast can new nodes join, how manageable is such a cluster?&lt;/li>
&lt;li>are traditional publish-subscribe message distribution semantics supported (one-to-one, one-to-N, one-to-any-of-N)?&lt;/li>
&lt;li>how can message loss be averted / minimized?&lt;/li>
&lt;li>how fast is the message sending, is it fast enough?&lt;/li>
&lt;li>does it feel &amp;ldquo;Java-like&amp;rdquo; enough (since Akka has strong ties to Scala and the aim is to use Java for this project)?&lt;/li>
&lt;li>how well does it run on the data centers on premise, how easy is it to operate?&lt;/li>
&lt;/ul>
&lt;p>Since I&amp;rsquo;ve been itching to find an excuse for trying out the new &lt;a href="https://www.raspberrypi.org/products/raspberry-pi-3-model-b/">Raspberry PI 3 Model B&lt;/a> this was the perfect opportunity to order 3 of them and use them for testing the prototype.&lt;/p></description></item><item><title>Reactive Web Applications</title><link>https://manuel.bernhardt.io/reactive-web-applications/</link><pubDate>Mon, 21 Mar 2016 15:38:10 +0000</pubDate><guid>https://manuel.bernhardt.io/reactive-web-applications/</guid><description>&lt;h1 id="reactive-web-applications">Reactive Web Applications&lt;/h1>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/UNADJUSTEDNONRAW_thumb_215b.jpg" class="pure-img" alt="">
 &lt;figcaption>Reactive Web Applications&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>I decided to put the know-how I’ve collected over the years to good use by writing a book that will help others get started with reactive web applications. “Reactive Web Applications” will introduce you to a few concepts that will provide a basis for working with reactive architecture and making the most out of it.&lt;/p>
&lt;p>The book is the result of several years of experience designing, building and working with teams to build high-performant, fault-resilient web applications using the Play Framework, Akka and Scala. In a way, this is the book I wish I had had when I first started working with this stack.&lt;/p></description></item><item><title>The one Play Framework productivity tip you should know about</title><link>https://manuel.bernhardt.io/2016/03/07/the-one-play-framework-productivity-tip-you-should-know-about/</link><pubDate>Mon, 07 Mar 2016 15:08:38 +0100</pubDate><guid>https://manuel.bernhardt.io/2016/03/07/the-one-play-framework-productivity-tip-you-should-know-about/</guid><description>&lt;p>If there is one thing you need to know when it comes to enhancing your productivity when working with the &lt;a href="http://www.playframework.com">Play Framework&lt;/a> it&amp;rsquo;s the following tip because it will save you a lot of time during development. I&amp;rsquo;ve watched many developers repeat the same steps countless times in a day and every time I show this albeit simple tooling tip it&amp;rsquo;s like developing is a whole new experience again.&lt;/p>
&lt;p>So what&amp;rsquo;s this &amp;ldquo;magic&amp;rdquo; tip I am talking about? Since Play leverages type-safety and warns you early on that things go bad through compilation errors, your screen will often look like this:&lt;/p></description></item><item><title>Upgrading from React 0.11.2 to 0.14.7 in 374 easy steps</title><link>https://manuel.bernhardt.io/2016/02/25/upgrading-from-react-0-11-2-to-0-14-7-in-374-easy-steps/</link><pubDate>Thu, 25 Feb 2016 17:42:17 +0100</pubDate><guid>https://manuel.bernhardt.io/2016/02/25/upgrading-from-react-0-11-2-to-0-14-7-in-374-easy-steps/</guid><description>&lt;p>Today I set out to the task of upgrading a set of views crafted with the &lt;a href="https://facebook.github.io/react/">React&lt;/a> library. The upgrade was necessary because one part of a view using React stopped working in Chrome Version 48.0.2564.116 (64-bit). I don&amp;rsquo;t know why this happened, I didn&amp;rsquo;t find anything related to it and as it stands this was probably the only project on the Internet still running on this old version of React anyway. If not, you may or may not find this post useful. Or not. But at least it might be entertaining.&lt;/p></description></item><item><title>5 years of Scala and counting – debunking some myths about the language and its environment</title><link>https://manuel.bernhardt.io/2015/11/13/5-years-of-scala-and-counting-debunking-some-myths-about-the-language-and-its-environment/</link><pubDate>Fri, 13 Nov 2015 12:39:21 +0100</pubDate><guid>https://manuel.bernhardt.io/2015/11/13/5-years-of-scala-and-counting-debunking-some-myths-about-the-language-and-its-environment/</guid><description>&lt;p>I started using Scala 5 years ago instead of Java after starting (but never quite finishing) to read the first edition of &lt;a href="http://www.artima.com/shop/programming_in_scala_2ed">Programming in Scala&lt;/a>. First only present in tests, my first attempts at Scala code would quite soon invade small utility classes and before I knew it take over all of my projects.&lt;/p>
&lt;p>There are many rants about Scala out there. This isn&amp;rsquo;t one of them. I&amp;rsquo;m not here to complain, but rather to applaud.&lt;/p></description></item><item><title>A quick tour of JSON libraries in Scala</title><link>https://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in-scala/</link><pubDate>Fri, 06 Nov 2015 00:22:48 +0100</pubDate><guid>https://manuel.bernhardt.io/2015/11/06/a-quick-tour-of-json-libraries-in-scala/</guid><description>&lt;p>&lt;strong>Update (18.11.2015)&lt;/strong>: added spray-json-shapeless library&lt;br>
&lt;strong>Update (06.11.15)&lt;/strong>: added circe library&lt;/p>
&lt;p>Some time ago I wrote a &lt;a href="https://manuel.bernhardt.io/2014/02/04/a-quick-tour-of-relational-database-access-with-scala/">post on relational database access in Scala&lt;/a> since I was looking for a library and there were many of them available, making it hard to make a choice. It turns out that the situation is similar if not worse when it comes to JSON libraries in Scala.&lt;/p>
&lt;p>There are just plenty of them. You have no idea. (me neither until I wrote this post)&lt;/p></description></item><item><title>Initial thoughts on fatherhood</title><link>https://manuel.bernhardt.io/2015/10/16/initial-thoughts-on-fatherhood/</link><pubDate>Fri, 16 Oct 2015 12:30:34 +0200</pubDate><guid>https://manuel.bernhardt.io/2015/10/16/initial-thoughts-on-fatherhood/</guid><description>&lt;p>Our daughter Valérie was born &lt;strike>two&lt;/strike> three weeks ago. Our friends have all suggested we use someone similar to this &lt;a href="https://www.tsaitibabella.com/">newborn photographer El Dorado Hills&lt;/a> to capture these special memories before they&amp;rsquo;re gone, but I&amp;rsquo;ve decided to write them down instead. We&amp;rsquo;ll definitely get photos soon though. This post is a collection of thoughts and first impressions that my tired brain will probably forget if I don&amp;rsquo;t write them down.&lt;/p>
&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://i0.wp.com/imgs.xkcd.com/comics/babies.png?fit=300%2C300&amp;amp;#038;ssl=1" class="pure-img" alt="">
&lt;/figure>

&lt;/p></description></item><item><title>The Art of Meaningful Programming</title><link>https://manuel.bernhardt.io/2015/05/28/the-art-of-meaningful-programming/</link><pubDate>Wed, 27 May 2015 23:16:38 +0200</pubDate><guid>https://manuel.bernhardt.io/2015/05/28/the-art-of-meaningful-programming/</guid><description>&lt;p>As a child (I think I was around 6 at that time), I wanted to become an inventor, much like &lt;a href="http://en.wikipedia.org/wiki/Gyro_Gearloose">Gyro Gearloose&lt;/a>. My father wisely pointed out that this wasn&amp;rsquo;t a job that existed on the job market, but that the closest thing was likely to become an engineer of some kind. And so I ended up becoming a telecommunications engineer with a specialization in the development of distributed systems.&lt;/p>
&lt;p>Software is an excellent medium for expressing one&amp;rsquo;s creativity. It is cheap and malleable, and nowadays it is possible to see the result of what code does almost instantly. I haven&amp;rsquo;t yet figured out how to build a &lt;a href="http://disneycomics.wikia.com/wiki/Little_Helper">walking light-bulb&lt;/a> with software yet but give it 15 years and we&amp;rsquo;ll have APIs for this, too. But programming is not easy, which also means that next to actually building things, we software people spend a lot of time learning how to build things and arguing about how things should be built.&lt;/p></description></item><item><title>Reactive Play</title><link>https://manuel.bernhardt.io/2015/01/27/reactive-play/</link><pubDate>Tue, 27 Jan 2015 08:17:00 +0100</pubDate><guid>https://manuel.bernhardt.io/2015/01/27/reactive-play/</guid><description>&lt;p>&lt;strong>TL;DR:&lt;/strong> Play applications are not automagically performant. I&amp;rsquo;m writing a &lt;a href="http://manning.com/bernhardt">book&lt;/a> that shows how to use Play correctly, especially when used to working with threaded web-servers such as &lt;a href="http://tomcat.apache.org">Tomcat&lt;/a> or &lt;a href="http://eclipse.org/jetty">Jetty&lt;/a>. Save 50% with the code &lt;em>mlbernhardt&lt;/em>.&lt;/p></description></item><item><title>Generation Javascript</title><link>https://manuel.bernhardt.io/2014/12/30/generation-javascript/</link><pubDate>Tue, 30 Dec 2014 09:24:36 +0100</pubDate><guid>https://manuel.bernhardt.io/2014/12/30/generation-javascript/</guid><description>&lt;p>I&amp;rsquo;ll start by saying that this is not a rant, but rather a cry of despair that I&amp;rsquo;m repeating and that slowly - but steadily - seems to come to consciousness in our industry, like &lt;a href="http://www.breck-mckye.com/blog/2014/12/the-state-of-javascript-in-2015/">this one&lt;/a>. The phenomenon I&amp;rsquo;m about to describe is not only limited to the Javascript community either, that community seems a lot more affected than others.&lt;/p>
&lt;p>Up until this morning, I had been mumbling about those concerns mostly to myself, and to some colleagues and friends. Then I read &lt;a href="https://queue.acm.org/detail.cfm?id=2349257">this article&lt;/a> and I felt like I had to do something. This really is a good read, if you haven&amp;rsquo;t seen it yet, I recommend adding it to your reading list or Instapaper or whatsonot right away. The article, &lt;a href="https://queue.acm.org/detail.cfm?id=2349257">A generation lost in the Bazaar&lt;/a>, talks about Unix and how the lack of overall design or &amp;ldquo;bazaar&amp;rdquo; mentality (depicted in &lt;a href="http://en.wikipedia.org/wiki/The_Cathedral_and_the_Bazaar">The Cathedral and the Bazaar&lt;/a>) have made it extremely hard to get anything done without digging through a jungle of libraries that kind of repeat functionality, contain copy-pasted code, or depend on libraries that they perhaps don&amp;rsquo;t need at all.&lt;/p></description></item><item><title>A handful Akka techniques</title><link>https://manuel.bernhardt.io/2014/04/23/a-handful-akka-techniques/</link><pubDate>Wed, 23 Apr 2014 19:50:28 +0200</pubDate><guid>https://manuel.bernhardt.io/2014/04/23/a-handful-akka-techniques/</guid><description>&lt;p>I&amp;rsquo;ve been using &lt;a href="http://akka.io">Akka&lt;/a> for 3 years in a variety of projects and by now, I have a hard time imagining to deal with
some of the parts of my work without it. Sure, Scala provides other powerful paradigms for dealing with concurrency, but
I find Actors to be one of the most elegant concept when it comes to reasoning about it.&lt;/p>
&lt;p>There are a few techniques that I&amp;rsquo;ve used repeatedly in projects and that I would like to share. Make no mistake though&lt;/p></description></item><item><title>A quick tour of relational database access with Scala</title><link>https://manuel.bernhardt.io/2014/02/04/a-quick-tour-of-relational-database-access-with-scala/</link><pubDate>Tue, 04 Feb 2014 18:43:39 +0100</pubDate><guid>https://manuel.bernhardt.io/2014/02/04/a-quick-tour-of-relational-database-access-with-scala/</guid><description>&lt;p>&lt;strong>Update:&lt;/strong> Added Squeryl, thanks to &lt;a href="https://twitter.com/JoeZulli">@JoeZulli&lt;/a> for the heads-up&lt;br>
&lt;strong>Update 2:&lt;/strong> Added link to latest Squeryl release for Scala 2.10 and 2.9.2&lt;/p>
&lt;p>I recently started working with relational databases again from within Scala, after a while in JSON-land (mostly &lt;a href="http://www.mongodb.org/">MongoDB&lt;/a> and &lt;a href="http://www.elasticsearch.org/">elasticsearch&lt;/a>). During that time, I&amp;rsquo;d been happily working with lightweight libraries / DSLs that take care of case class serialization, such as the impeccable &lt;a href="https://github.com/novus/salat/">Salat&lt;/a> and &lt;a href="https://github.com/sksamuel/elastic4s">elastic4s&lt;/a>.&lt;/p>
&lt;p>So I started looking for a tool that would let me achieve the following:&lt;/p></description></item><item><title>Java2Days Sofia 2013</title><link>https://manuel.bernhardt.io/2013/12/21/java2days-sofia-2013/</link><pubDate>Sat, 21 Dec 2013 16:50:40 +0100</pubDate><guid>https://manuel.bernhardt.io/2013/12/21/java2days-sofia-2013/</guid><description>&lt;p>Two weeks ago, I went to speak about &lt;a href="http://www.scala-lang.org/">Scala&lt;/a> at the &lt;a href="http://2013.java2days.com/">Java2Days&lt;/a> conference in Sofia, Bulgaria. This was the 5th edition of the conference, and my first time there. A small group of speakers (to the extent of my knowledge, &lt;a href="http://www.joshlong.com">Josh Long&lt;/a>, &lt;a href="https://twitter.com/botchagalupe">John Willis&lt;/a> and &lt;a href="http://www.mysticcoders.com/blog/">Andrew Lombardi&lt;/a>) has been flying overseas every year to attend the conference since it&amp;rsquo;s first edition. Why, you ask? After having been there, I too know why: it&amp;rsquo;s a really nice conference!&lt;/p></description></item><item><title>Tips &amp; tricks for setting up a Play 2 project</title><link>https://manuel.bernhardt.io/2013/11/16/tips-tricks-for-setting-up-a-play-2-project/</link><pubDate>Sat, 16 Nov 2013 16:47:32 +0100</pubDate><guid>https://manuel.bernhardt.io/2013/11/16/tips-tricks-for-setting-up-a-play-2-project/</guid><description>&lt;p>Here are the slides from my talk at &lt;a href="http://devoxx.be" title="Devoxx 2013">Devoxx 2013 in Antwerp&lt;/a>: &lt;a href="https://speakerdeck.com/manuelbernhardt/tips-and-tricks-for-setting-up-a-play-2-project">https://speakerdeck.com/manuelbernhardt/tips-and-tricks-for-setting-up-a-play-2-project&lt;/a>&lt;/p>
&lt;div style="left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.1972%;">&lt;iframe src="https://speakerdeck.com/player/37ba4e89c08e4e50bee0d3324e974fd6" style="top: 0; left: 0; width: 100%; height: 100%; position: absolute; border: 0;" allowfullscreen scrolling="no" allow="encrypted-media;">&lt;/iframe>&lt;/div>
&lt;p>Devoxx was great, as always! A huge thank to Stephane and his crew for making it happen, year after year!&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/photo-2.jpg" class="pure-img" alt="">
 &lt;figcaption>Devoxx wristbands 2012 and 2013&lt;/figcaption>
 &lt;/figure>

&lt;/p></description></item><item><title>Reactive Golf or Iteratees and all that stuff in practice, part 3</title><link>https://manuel.bernhardt.io/2013/10/26/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-3/</link><pubDate>Sat, 26 Oct 2013 17:44:07 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/10/26/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-3/</guid><description>&lt;p>In &lt;a href="https://manuel.bernhardt.io/2013/10/17/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-1/">part 1&lt;/a> and &lt;a href="https://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/">2&lt;/a> we&amp;rsquo;ve seen how to build a completely reactive chain to fetch a large stream of data from a REST API, transform it on the fly and send it over to indexing to &lt;a href="http://elasticsearch.org">ElasticSearch&lt;/a>.&lt;/p>
&lt;p>Now one question remains: does it actually work, and does it help solve a real problem?&lt;/p>
&lt;p>In order to answer to this question, let&amp;rsquo;s build a naive, blocking version of the pipe-line above. We&amp;rsquo;ll consume the stream, then transform it, and then send it over to ElasticSearch, in chunks:&lt;/p></description></item><item><title>Java Klassentreffen 2013: Scala Introduction slides</title><link>https://manuel.bernhardt.io/2013/10/24/scala-introduction-slides/</link><pubDate>Thu, 24 Oct 2013 15:25:09 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/10/24/scala-introduction-slides/</guid><description>&lt;p>A bit late, but nonetheless: my slides from the &lt;a href="http://java.at/web/guest/jkt13">Java Klassentreffen 2013&lt;/a> in Vienna and Linz.&lt;/p>
&lt;div style="margin-bottom:5px">
 &lt;strong> &lt;a href="https://www.slideshare.net/ManuelBernhardt/java-klassentreffenvienna" title="Introduction to Scala" target="_blank">Introduction to Scala&lt;/a> &lt;/strong> from &lt;strong>&lt;a href="http://www.slideshare.net/ManuelBernhardt" target="_blank">Manuel Bernhardt&lt;/a>&lt;/strong>
&lt;/div></description></item><item><title>Reactive Golf or Iteratees and all that stuff in practice, part 2</title><link>https://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/</link><pubDate>Mon, 21 Oct 2013 18:29:43 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/</guid><description>&lt;p>Last week, we saw how to get data from a REST API and modify it to our liking in order to send it off for indexing to &lt;a href="http://elasticsearch.org">ElasticSearch&lt;/a>. Now, let&amp;rsquo;s see how to get the data into ElasticSearch in a resource-friendly manner.&lt;/p>
&lt;h2 id="indexing-with-elasticsearch-and-elastic4s">Indexing with ElasticSearch and elastic4s&lt;/h2>
&lt;p>ElasticSearch has a &lt;a href="http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-index_.html">RESTful index API&lt;/a> through which to send data for indexing, like for example so (from the ElasticSearch documentation):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="cl">$ curl -XPUT &lt;span class="s1">&amp;#39;http://localhost:9200/twitter/tweet/1&amp;#39;&lt;/span> -d &lt;span class="s1">&amp;#39;{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;user&amp;#34; : &amp;#34;kimchy&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;post_date&amp;#34; : &amp;#34;2009-11-15T14:12:12&amp;#34;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1"> &amp;#34;message&amp;#34; : &amp;#34;trying out Elastic Search&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s1">}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>It also supports bulk requests, which is what we&amp;rsquo;ll need, since it makes little sense to issue one HTTP request for each document.&lt;/p></description></item><item><title>Reactive Golf or Iteratees and all that stuff in practice, part 1</title><link>https://manuel.bernhardt.io/2013/10/17/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-1/</link><pubDate>Thu, 17 Oct 2013 20:24:13 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/10/17/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-1/</guid><description>&lt;p>I&amp;rsquo;m currently working on a project that involves synchronizing large amounts of data from backend systems for the purpose of making it searchable. Amongst other things, one domain the system deals with is &lt;a href="http://en.wikipedia.org/wiki/Golf">Golf&lt;/a> and the booking of tee times (i.e. a time at which to start playing). If I got things correctly, tee times are there in order to avoid getting hit by a player that starts later on (I haven&amp;rsquo;t played golf yet).&lt;/p></description></item><item><title>Scala with SublimeText</title><link>https://manuel.bernhardt.io/2013/09/20/scala-with-sublimetext/</link><pubDate>Fri, 20 Sep 2013 13:07:13 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/09/20/scala-with-sublimetext/</guid><description>&lt;p>Three weeks ago, one of our cats set its mind to beat its long-distance jumping record on my desk, accross my laptop. Unfortunately for my laptop, there was a cup of tea standing next to it, and our cat didn&amp;rsquo;t care too much about adjusting the height of the jump.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/IMG_20130915_165229.jpg" class="pure-img" alt="">
 &lt;figcaption>Laptop-destroying cat&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>As a result, I am now working for the past 3 weeks with my old MacBook Pro Early 2008 (which I kept in a shelf for this purpose exactly). As a side effect though, I can&amp;rsquo;t work anymore with &lt;a href="http://www.jetbrains.com/idea/">IntelliJ IDEA&lt;/a>, because coding with Scala on this old machine (with little RAM) needs quite a bit of resources, and the IDE is too slow.&lt;/p></description></item><item><title>How to read the Play session from AngularJS</title><link>https://manuel.bernhardt.io/2013/08/01/how-to-read-the-play-session-from-angularjs/</link><pubDate>Thu, 01 Aug 2013 19:24:12 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/08/01/how-to-read-the-play-session-from-angularjs/</guid><description>&lt;p>If you happen to work, like me, on a project that makes use of both the &lt;a href="http://www.playframework.com">Play framework&lt;/a> and &lt;a href="http://angularjs.org">AngularJS&lt;/a>, you may at some point need to read some data from the Play session in your AngularJS application. Play uses a &lt;a href="http://www.playframework.com/documentation/2.1.x/ScalaSessionFlash">client-side session&lt;/a>, which makes sharing the data with client-side applications easy.&lt;/p>
&lt;p>In order to access the session data on the client-side, you&amp;rsquo;ll need the following:&lt;/p>
&lt;h3 id="1-allow-the-play-session-to-be-read-by-javascript">1. Allow the Play session to be read by javascript&lt;/h3>
&lt;p>In &lt;code>application.conf&lt;/code>, set the &lt;code>session.httpOnly&lt;/code> flag to false:&lt;/p></description></item><item><title>The case for document-oriented databases</title><link>https://manuel.bernhardt.io/2013/07/28/the-case-for-document-oriented-databases/</link><pubDate>Sun, 28 Jul 2013 14:21:41 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/07/28/the-case-for-document-oriented-databases/</guid><description>&lt;p>Last week, I started working with &lt;a href="http://angularjs.org">AngularJS&lt;/a> for a real-world project - I had played with Angular before, mainly to see how it differs from &lt;a href="http://knockoutjs.com">KnockoutJS&lt;/a> which I had been using intensively before. This post is not about AngularJS itself (I may write one later on when I have a better perspective about the framework), I&amp;rsquo;ll just say that my first impressions about it are:&lt;/p>
&lt;ul>
&lt;li>it lacks good documentation - the existing documentation doesn&amp;rsquo;t exactly have the right &amp;ldquo;feel&amp;rdquo;, and is incomplete&lt;/li>
&lt;li>when coming from Knockout, Angular feels rather invasive, given that it is a &amp;ldquo;full-blown&amp;rdquo; framework rather than &amp;ldquo;just&amp;rdquo; a MVVM mapping tool&lt;/li>
&lt;li>my current impression is that the learning curve looks like a roller-coaster - there&amp;rsquo;s moments of intense productivity interrupted with high amounts of &amp;ldquo;not getting anywhere, why on earth am I using this sh*t&amp;rdquo;&lt;/li>
&lt;/ul>
&lt;p>That being said, there&amp;rsquo;s one thing that AngularJS seems to get really right: it makes it possible to map documents to the UI without imposing its own design philosophy on the said document. With KnockoutJS for example, you&amp;rsquo;d have to make sure certain fields were provided as arrays, and generally had to know really well how the different bindings worked before knowing into what shape to bring your data so that the UI would do what you wanted.&lt;/p></description></item><item><title>CRUD trait for Slick models in the Play! framework</title><link>https://manuel.bernhardt.io/2013/07/08/crud-trait-for-slick-models-in-the-play-framework/</link><pubDate>Mon, 08 Jul 2013 20:09:41 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/07/08/crud-trait-for-slick-models-in-the-play-framework/</guid><description>&lt;p>&lt;a href="http://slick.typesafe.com/">Slick&lt;/a> is a powerful library for functional database access, leveraging Scala language features such as implicit conversions and macro&amp;rsquo;s to allow type-safe interaction with databases.&lt;/p>
&lt;p>The &lt;a href="https://github.com/freekh/play-slick">play-slick&lt;/a> module allows easy integration with the &lt;a href="http://www.playframework.com">Play! framework&lt;/a> by providing e.g. support for database evolutions and other convenience methods.&lt;/p>
&lt;p>As I got to work with Slick more extensively, one thing that started to annoy me pretty soon is that I had to repeat boilerplate code for generic CRUD methods such as insert, update, delete, etc. At the same time, it didn&amp;rsquo;t look really easy to provide a CRUD trait for models, given that Slick&amp;rsquo;s design is heavily centered around the idea of drivers encapsulating the implementation details for all generic concerns (querying, insertion, etc.) and is therefore already making use of large portions of abstractions.&lt;/p></description></item><item><title>Quickly open errors in your IDE when developing Play applications</title><link>https://manuel.bernhardt.io/2013/06/14/quickly-open-errors-in-your-ide-when-developing-play-applications/</link><pubDate>Fri, 14 Jun 2013 11:08:23 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/06/14/quickly-open-errors-in-your-ide-when-developing-play-applications/</guid><description>&lt;p>A few weeks ago, &lt;a href="http://www.jamesward.com/">James Ward&lt;/a> &lt;a href="http://www.jamesward.com/2013/05/15/auto-refresh-for-play-framework-apps">announced&lt;/a> a new &lt;a href="https://chrome.google.com/webstore/detail/play-framework-tools/dchhggpgbommpcjpogaploblnpldbmen">Google Chrome extension&lt;/a> (and &lt;a href="https://github.com/jamesward/play-auto-refresh">SBT plugin&lt;/a>) to automatically refresh &lt;a href="http://playframework.org">Play framework&lt;/a> applications during development in the browser. So I jumped on there being a Google Chrome extension and revived a feature of Play 1 that allows you to directly click on the error message in the browser to open the correct file and line in the IDE.&lt;/p>
&lt;p>Getting this to run is pretty simple, below the instructions for &lt;a href="https://www.jetbrains.com/idea/">IntelliJ IDEA&lt;/a> - if anyone has the equivalents for Eclipse, VIM, Emacs, etc. just send them to me and I&amp;rsquo;ll add them here!&lt;/p></description></item><item><title>How to disable the Shift + F10 “slow motion” animation on OS X and reclaim the keyboard shortcut</title><link>https://manuel.bernhardt.io/2013/06/04/how-to-disable-the-shift-f10-slow-motion-animation-on-os-x-and-reclaim-the-keyboard-shortcut/</link><pubDate>Tue, 04 Jun 2013 10:21:24 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/06/04/how-to-disable-the-shift-f10-slow-motion-animation-on-os-x-and-reclaim-the-keyboard-shortcut/</guid><description>&lt;p>On OS X, when you press the Exposé keys (F9, F10, F11) with Shift as a modifier, you get the animation shown much, much slower. That&amp;rsquo;s nice and all, but this keyboard shortcut clashes with &lt;a href="http://www.jetbrains.com/idea/">IntelliJ IDEA&amp;rsquo;s&lt;/a> run shortcut, and there&amp;rsquo;s no option to turn this off via the default settings.&lt;/p>
&lt;p>So here&amp;rsquo;s how to do it by hand:&lt;/p>
&lt;p>Start by opening a terminal, and go to &lt;code>~/Library/Preferences&lt;/code>. There, open the &lt;code>com.apple.symbolichotkeys.plist&lt;/code> preference list by typing:&lt;/p></description></item><item><title>Java impressions after 2 years of abstinence</title><link>https://manuel.bernhardt.io/2013/06/03/java-impressions-after-2-years-of-abstinence/</link><pubDate>Mon, 03 Jun 2013 21:20:13 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/06/03/java-impressions-after-2-years-of-abstinence/</guid><description>&lt;p>Today I wrote &lt;a href="https://github.com/manuelbernhardt/myTransportSchedule">my first useful Android app&lt;/a>, which shows the bus connections from the bus stop next to our flat to the subway line (I didn&amp;rsquo;t say it was going to be useful for you).&lt;/p>
&lt;p>
&lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/androidApp.png" class="pure-img" alt="">
&lt;/figure>

&lt;/p>
&lt;p>Since I didn&amp;rsquo;t want to start right away making things more complicated by adding Scala to the mix, I decided to write the application in plain old Java. I haven&amp;rsquo;t been writing much more than a line of Java in two years, I think - so here are my impressions after this evening&amp;rsquo;s experiment:&lt;/p></description></item><item><title>One week on Tenerife</title><link>https://manuel.bernhardt.io/2013/04/25/one-week-on-tenerife/</link><pubDate>Thu, 25 Apr 2013 10:10:08 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/04/25/one-week-on-tenerife/</guid><description>&lt;p>We spent last week on vacations in Tenerife, enjoying the nice climate and all the hiking possibilities.&lt;/p>
&lt;p>The highlight of this short stay was to climb on the Teide volcano, in two steps - first to the Altavista hut at 3200m, then to the top, the next morning at 5:45 AM, to catch the sunrise at 3700m.&lt;/p>
&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/DSC_3834_cr-1.jpg" class="pure-img" alt="">
 &lt;figcaption>At the top of the Teide at sunrise, with the shadow of the crater&lt;/figcaption>
 &lt;/figure>

&lt;/p></description></item><item><title>Dynamic multi-modular SBT project</title><link>https://manuel.bernhardt.io/2013/04/09/dynamic-multi-modular-sbt-project/</link><pubDate>Tue, 09 Apr 2013 12:18:46 +0200</pubDate><guid>https://manuel.bernhardt.io/2013/04/09/dynamic-multi-modular-sbt-project/</guid><description>&lt;p>As the &lt;a href="https://github.com/delving/culture-hub">Delving Culture-Hub&lt;/a> project grows, I found myself adding module definitions by hand to the &lt;a href="http://www.scala-sbt.org/">SBT&lt;/a> more often than what I&amp;rsquo;d wish for, and for each adjustment of a common value, having to go through all modules and adjust them.&lt;/p>
&lt;p>So after a while, I wondered whether it wouldn&amp;rsquo;t be possible to discover modules dynamically, rather than maintaining them by hand. It turns out that this is a bit tricky, &lt;a href="https://groups.google.com/forum/?fromgroups=#!topic/simple-build-tool/pNaz6ERZu1c">but still possible&lt;/a>.&lt;/p></description></item><item><title>Multi-modular development with Play 2.1</title><link>https://manuel.bernhardt.io/2013/03/26/multi-modular-development-with-play-2-1/</link><pubDate>Tue, 26 Mar 2013 15:53:30 +0100</pubDate><guid>https://manuel.bernhardt.io/2013/03/26/multi-modular-development-with-play-2-1/</guid><description>&lt;p>&lt;a href="http://www.playframework.com/documentation/2.1.0/Home">Play 2.1&lt;/a> makes it possible to write completely modular applications, and on top of this, to develop each module separately. I&amp;rsquo;ve been waiting for this for some time now, and even implemented a &lt;a href="https://github.com/delving/culture-hub/blob/13.03/app/Global.scala#L122">custom router based on plugins&lt;/a> while waiting for the framework to support modular routing. Now that the wait is over, let&amp;rsquo;s see how to take advantage of this feature.&lt;/p>
&lt;p>The Play documentation describes &lt;a href="http://www.playframework.com/documentation/2.1.0/SBTSubProjects">how to set-up a multi-modular project&lt;/a> via SBT sub-projects. What is important to understand here is that:&lt;/p></description></item><item><title>Activating logging in test mode in Play 2.0.x</title><link>https://manuel.bernhardt.io/2012/10/26/activating-logging-in-test-mode-in-play-2-0-x/</link><pubDate>Fri, 26 Oct 2012 09:38:47 +0200</pubDate><guid>https://manuel.bernhardt.io/2012/10/26/activating-logging-in-test-mode-in-play-2-0-x/</guid><description>&lt;p>Because of a permgen leak related to third-party libraries, the logging in test mode is disabled in Play 2.0.x (there&amp;rsquo;s a &lt;a href="https://groups.google.com/forum/?fromgroups=#!topic/play-framework/ZFGHd_99Uhk">fix coming up in Play 2.1&lt;/a>). In some cases, seeing what happens while running a test can be useful - e.g. when debugging calls to various Akka actors that don&amp;rsquo;t quite behave as expected.&lt;/p>
&lt;p>Luckily there&amp;rsquo;s a workaround, which is to specify a logger for logback by hand when starting play or SBT:&lt;/p></description></item><item><title>MongoDB-based Cache for Play 1.2.x and Play-Scala</title><link>https://manuel.bernhardt.io/2011/11/18/mongodb-based-cache-for-play-1-2-x-and-play-scala/</link><pubDate>Fri, 18 Nov 2011 22:33:57 +0100</pubDate><guid>https://manuel.bernhardt.io/2011/11/18/mongodb-based-cache-for-play-1-2-x-and-play-scala/</guid><description>&lt;p>In case anyone needs this: &lt;a href="https://gist.github.com/1377952">https://gist.github.com/1377952&lt;/a>&lt;/p>
&lt;p>You&amp;rsquo;ve got to bootstrap it in some bootstrap job like so:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-scala" data-lang="scala">&lt;span class="line">&lt;span class="cl">&lt;span class="nc">ScalaCacheAccessor&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="nc">MongoCacheImpl&lt;/span>&lt;span class="o">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>It&amp;rsquo;s only tested with the Press module so far (shared state is evil anyway 😉 )&lt;/p></description></item><item><title>Writing custom de/serializers for Jerkson</title><link>https://manuel.bernhardt.io/2011/11/01/writing-custom-deserializers-for-jerkson/</link><pubDate>Tue, 01 Nov 2011 19:54:45 +0100</pubDate><guid>https://manuel.bernhardt.io/2011/11/01/writing-custom-deserializers-for-jerkson/</guid><description>&lt;p>Since I wrote my &lt;a href="http://logician.eu/index.php/2011/09/16/play-scala-and-json/">previous post&lt;/a> on how to use &lt;a href="http://scala.playframework.org">Play! Scala&lt;/a> with &lt;a href="https://github.com/codahale/jerkson">Jerkson&lt;/a>, I was asked a number of times how to make use of custom de/serialization for classes. This happens when e.g. the case class you want to de/serialize has a POJO or another complex type that you&amp;rsquo;d like to have more control over, such as e.g. the &lt;a href="http://www.mongodb.org/display/DOCS/Object&amp;#43;IDs">BSON ObjectId&lt;/a> or Play&amp;rsquo;s &lt;a href="http://scala.playframework.org/documentation/scala-0.9.1/anorm">Anorm&lt;/a> PK.&lt;/p>
&lt;p>Here&amp;rsquo;s a wrap-up on how you can easily create custom de/serializers and use them within your Play! Scala application. Let&amp;rsquo;s take the example of the BSON ObjectId, which you will most likely run into if you use MongoDB in the backend.&lt;/p></description></item><item><title>Play! Scala and JSON</title><link>https://manuel.bernhardt.io/2011/09/16/play-scala-and-json/</link><pubDate>Fri, 16 Sep 2011 22:59:50 +0200</pubDate><guid>https://manuel.bernhardt.io/2011/09/16/play-scala-and-json/</guid><description>&lt;p>&lt;em>Update: If you need to have custom de/serialization of some types, check out &lt;a href="http://logician.eu/index.php/2011/11/01/writing-custom-deserializers-for-jerkson/">this new post&lt;/a>&lt;/em>&lt;/p>
&lt;p>I&amp;rsquo;ve been working with &lt;a href="http://scala.playframework.org/">Play! Scala&lt;/a> for a couple of months now, and the experience is really good - the combination of the Scala language and the sound design principles of Play! make web-development a real pleasure.&lt;/p>
&lt;p>One of the aspects I have been fighting with for a while (and which had initially put me off writing my first bigger Play! application with Play! Scala) is the lack of simple support for JSON de/serialization. With simple, I mean the possibility to turn a case class into a JSON string and back, and to additionally have access to a couple of more advanced features that are often required (e.g. implementing custom serialization of specific types).&lt;/p></description></item><item><title>Selenium IDE plugin for the Play! framework</title><link>https://manuel.bernhardt.io/2011/03/23/selenium-ide-plugin-for-the-play-framework/</link><pubDate>Wed, 23 Mar 2011 15:34:34 +0100</pubDate><guid>https://manuel.bernhardt.io/2011/03/23/selenium-ide-plugin-for-the-play-framework/</guid><description>&lt;p>Two months ago we started using the &lt;a href="http://www.playframework.org">Play! framework&lt;/a> for our work at &lt;a href="http://www.oxiras.com">Oxiras&lt;/a> (as I am writing these lines, the Oxiras website is still totally empty, this should change soon however).&lt;/p>
&lt;p>As we started making UI tests using the excellent integration with the &lt;a href="http://seleniumhq.org/">Selenium&lt;/a> test runner, we quickly noticed that also having an integration with the &lt;a href="http://seleniumhq.org/projects/ide/">Selenium IDE plugin&lt;/a> would make our lives much easier. So I looked a bit around, found that creating a Selenium IDE formatter was not all too hard and &lt;a href="http://manuelbernhardt.github.com/play-selenium-plugin/">here we go&lt;/a> with what I can call my first Firefox plugin.&lt;/p></description></item><item><title>Information Retrieval</title><link>https://manuel.bernhardt.io/2011/02/11/information-retrieval/</link><pubDate>Fri, 11 Feb 2011 11:58:17 +0100</pubDate><guid>https://manuel.bernhardt.io/2011/02/11/information-retrieval/</guid><description>&lt;p>This morning I spent some time looking for information on how to deploy a legacy webservice on Apache Karaf.&lt;/p>
&lt;p>This post isn&amp;rsquo;t about Karaf and OSGi and webservices though, but a reflection on how to efficiently find information that can lead towards a specific technical problem on the Internet. For quite some time now I feel that this task has become much more complicated in the past 2-3 years than it used to.&lt;/p></description></item><item><title>Deploying a GWT application as OSGi module with Apache Karaf and Maven</title><link>https://manuel.bernhardt.io/2010/12/15/deploying-a-gwt-applicatio-as-osgi-module-with-apache-karaf-and-maven/</link><pubDate>Wed, 15 Dec 2010 15:20:14 +0100</pubDate><guid>https://manuel.bernhardt.io/2010/12/15/deploying-a-gwt-applicatio-as-osgi-module-with-apache-karaf-and-maven/</guid><description>&lt;p>In a project I&amp;rsquo;m currently working on we use the OSGi platform in order to achieve higher modularity (the project is about building a framework for massive data ingestion and processing for a high-availability service, and the processing is dealt with via workflows that are composed of a number of plugins that we don&amp;rsquo;t develop, hence the need for modularity).&lt;/p>
&lt;p>We use the &lt;a href="http://karaf.apache.org/" target="_blank">Apache Karaf&lt;/a> framework, which offers neat extension points and means to customize it. One of the nice features is the &lt;a href="http://felix.apache.org/site/apache-felix-web-console.html">WebConsole&lt;/a> that can also be extended, which would provide the means to add a GUI for the users. However, this happens through providing a Servlet implementation, which isn&amp;rsquo;t really handy these days when wanting to develop a bit more complicated GUIs.&lt;/p></description></item><item><title>Debugging ANT tasks in IntelliJ IDEA</title><link>https://manuel.bernhardt.io/2010/09/08/debugging-ant-tasks-in-intellij-idea/</link><pubDate>Wed, 08 Sep 2010 20:14:20 +0200</pubDate><guid>https://manuel.bernhardt.io/2010/09/08/debugging-ant-tasks-in-intellij-idea/</guid><description>&lt;p>I recently started using &lt;a href="http://www.jetbrains.com/idea/">IntelliJ IDEA&lt;/a> in addition to &lt;a href="http://eclipse.org/">Eclipse&lt;/a> after seeing it being used by some dutch colleagues of mine. And I must say that I do like it more and more every day — it just has all these many little things that fill so well to Java.&lt;/p>
&lt;p>One thing I do miss though is the ability to debug ANT tasks. In Eclipse, you can make an external launcher, select one or more targets, and run them in debug mode. With IDEA, that just doesn&amp;rsquo;t seem to work. I did install the &lt;a href="http://plugins.intellij.net/plugin/?idea&amp;amp;id=4526">ANT debugger plugin&lt;/a> which makes it possible to debug through the build file, but that&amp;rsquo;s not still what I wanted.&lt;/p></description></item><item><title>Early rising</title><link>https://manuel.bernhardt.io/2010/04/01/early-rising/</link><pubDate>Thu, 01 Apr 2010 07:43:01 +0200</pubDate><guid>https://manuel.bernhardt.io/2010/04/01/early-rising/</guid><description>&lt;p>
 &lt;figure style="text-align: center">
 &lt;img src="https://manuel.bernhardt.io/wp-content/rising-sun.jpg" class="pure-img" alt="">
 &lt;figcaption>The headache is bad, the coffee tastes bitter, but I still keep on fighting.&lt;/figcaption>
 &lt;/figure>

&lt;/p>
&lt;p>This is what a diary of mine would sound like, if I were keeping track of my journey of becoming an early riser.&lt;/p>
&lt;p>I got inspired by &lt;a href="http://stronglifts.com/how-to-wake-up-early-the-definitive-guide/">this post&lt;/a> and decided to try out if I could get up earlier. Doing the switch from getting up at around 8 AM to 6 AM when the summer time started (effectively getting up 3 hours earlier each day) doesn&amp;rsquo;t make it any easier. Let&amp;rsquo;s see how it goes!&lt;/p></description></item><item><title>New CV</title><link>https://manuel.bernhardt.io/2009/09/01/new-cv/</link><pubDate>Tue, 01 Sep 2009 11:00:59 +0200</pubDate><guid>https://manuel.bernhardt.io/2009/09/01/new-cv/</guid><description>&lt;p>Have you ever written a CV as part of a lecture at university (yes, in France, there are such lectures), a seminar for young graduates, or have you ever gotten feedback from the professionals in the branch?&lt;/p>
&lt;p>I did. It always ended up with some frustration - all the small pieces of creativity would get marked in red as &amp;ldquo;too unusual&amp;rdquo;, and in the end my CV (the one through which I got into my current job last year) looked very standard (or as some may say, professional).&lt;/p></description></item><item><title>How I stopped reading the news and feel much better now</title><link>https://manuel.bernhardt.io/2009/04/09/how-i-stopped-reading-the-news-and-feel-much-better-now/</link><pubDate>Thu, 09 Apr 2009 21:12:30 +0200</pubDate><guid>https://manuel.bernhardt.io/2009/04/09/how-i-stopped-reading-the-news-and-feel-much-better-now/</guid><description>&lt;p>Over the past years, we have been given the access of increasingly more and more information. Not only are we given the opportunity to get nearly real-time information about all the terrorist attacks, accidents, revolutions and other events happening around the world, but with the evolution of mobile services, we get access to this information just everwhere.&lt;/p>
&lt;p>Like Tim Berners-Lee &lt;a href="http://www.ted.com/index.php/talks/tim_berners_lee_on_the_next_web.html">points out in his last TED talk&lt;/a>, there is an even greater potential to the world wide web - the interlinking of raw data, and not just documents, making it possible to get a new kind of understanding of the world.&lt;/p></description></item><item><title>Following through with dreams in rough times</title><link>https://manuel.bernhardt.io/2009/03/09/following-through-with-dreams-in-rough-times/</link><pubDate>Mon, 09 Mar 2009 19:57:45 +0100</pubDate><guid>https://manuel.bernhardt.io/2009/03/09/following-through-with-dreams-in-rough-times/</guid><description>&lt;p>For a while now I am following the &lt;a href="http://www.illuminatedmind.net/">Illuminated Mind&lt;/a> blog and even purchased &lt;a href="http://illuminatedmind.net/reclaim-your-dreams">Reclaim your dreams&lt;/a> (and also started reading it, though I still have something to do about the &amp;ldquo;finish reading it&amp;rdquo; part). The blog deals with how to get out of the trap of a job and life you don&amp;rsquo;t want, and raises challenging questions.&lt;/p>
&lt;p>Today in the tramway back home I listened to &lt;a href="http://www.thisamericanlife.org/Radio_Episode.aspx?sched=1284">Plan B&lt;/a>, a recent episode of &lt;a href="http://www.thisamericanlife.org/">This American Life&lt;/a> (which is great for a european listener like me since it communicates some of the culture of american life - or at least that&amp;rsquo;s the impression I got). This episode illustrates how many people live Plan B (or C, D, E&amp;hellip;) of their life, because Plan A didn&amp;rsquo;t work out or didn&amp;rsquo;t turn out to be that good.&lt;/p></description></item><item><title>The cost of simplicty in technology</title><link>https://manuel.bernhardt.io/2008/09/14/the-cost-of-simplicty-in-technology/</link><pubDate>Sun, 14 Sep 2008 13:30:50 +0200</pubDate><guid>https://manuel.bernhardt.io/2008/09/14/the-cost-of-simplicty-in-technology/</guid><description>&lt;p>Recently I decided to try out a new kind of computer and bought a &lt;a href="http://www.apple.com/macbookpro/">MacBook Pro&lt;/a>. After many years on PC, which never really satisfied me in matters of simplicity of use, I wanted to give a shot to this kind of computer.&lt;/p>
&lt;p>So what to say?&lt;/p>
&lt;ul>
&lt;li>the design is nice, the computer becomes an eye-candy and I don&amp;rsquo;t spend my time removing dust from the screen or the keyboard (it looks as if the aluminium casing was dust-repelling)&lt;/li>
&lt;li>the visual effects and graphics of Mac OS X feel good - and it matters. After all, the computer being my main working tool, it is important for me to have a nice, ergonomic working space (it is not just a tool, but a space full of virtual tools)&lt;/li>
&lt;li>there is a lot of free software out there which works for the Mac, and for the moment I did only buy Microsoft Office (at a student price that is)&lt;/li>
&lt;li>Mac OS X Leopard comes with Java 6, so it isn&amp;rsquo;t a problem for development, unless you need something very specific that is OS-dependent (but even then, &lt;a href="http://www.virtualbox.org/">VirtualBox&lt;/a> makes it possible to run Linux or else)&lt;/li>
&lt;/ul>
&lt;p>However, I think that one important point with the Mac (or the whole &amp;ldquo;switching to Mac&amp;rdquo; thing) is to commit fully, in ways I am going to elaborate about now. Indeed, besides the (obvious) cost of money, there are other costs that come with using a Mac. For example, after you purchase a Mac, you&amp;rsquo;ll need to keep up with continuous upgrades, and if you&amp;rsquo;re not too tech-savvy about the whole process, you could &lt;a href="https://www.microcenter.com/site/stores/overland-park.aspx?storeid=191">continue reading at this website&lt;/a> to see how experts can assist you.&lt;/p></description></item><item><title>The pain of configuration and ideas for making it a bit more bearable</title><link>https://manuel.bernhardt.io/2008/02/14/the-pain-of-configuration-and-ideas-for-making-it-a-bit-more-bearable/</link><pubDate>Thu, 14 Feb 2008 21:15:32 +0100</pubDate><guid>https://manuel.bernhardt.io/2008/02/14/the-pain-of-configuration-and-ideas-for-making-it-a-bit-more-bearable/</guid><description>&lt;p>Three weeks ago, I decided to give up on my Windows operating system and try again using Linux (the Ubuntu release). Windows had been running fine for a while, but it ended up becoming very, very slow, and just too unreliable. I had been using Linux before in order to work on my previous laptop, and I thought I could give it a try again.&lt;/p>
&lt;p>Now what happened of course is that I spent a lot of time configuring the OS. I eventually succeeded (though I am not completely sure yet, surprises keep arising as I go). During the process, I also had to send back my laptop to Lenovo (I own a Thinkpad T43) because the computer was overheating (but nevermind, this was another issue that I may be writing about later).&lt;/p></description></item><item><title>Twitter, geolocalisation and pervasive games – mixing virtual and real life</title><link>https://manuel.bernhardt.io/2008/01/30/twitter-geolocalisation-and-pervasive-games-mixing-virtual-and-real-life/</link><pubDate>Wed, 30 Jan 2008 22:08:52 +0100</pubDate><guid>https://manuel.bernhardt.io/2008/01/30/twitter-geolocalisation-and-pervasive-games-mixing-virtual-and-real-life/</guid><description>&lt;p>Today I created an account on &lt;a href="http://www.twitter.com">twitter&lt;/a> after reading &lt;a href="http://academhack.outsidethetext.com/home/2008/twitter-for-academia/">an article at academhack&lt;/a>. Apparently there seem to be some interesting usages of this micro-blogging tool, like increasing communication amongst members of a same community. Whilst the article on academhack emphasizes the educational usages of the tool, I wonder if the same thing wouldn&amp;rsquo;t work in other settings. Then again it may be that belonging to several communities would clash - how to do &amp;ldquo;directed twittering&amp;rdquo;, what to prioritise when writing and how to keep up with the additional information flow?&lt;/p></description></item><item><title>Reset</title><link>https://manuel.bernhardt.io/2008/01/19/reset/</link><pubDate>Sat, 19 Jan 2008 01:09:03 +0100</pubDate><guid>https://manuel.bernhardt.io/2008/01/19/reset/</guid><description>&lt;p>Welcome!&lt;/p>
&lt;p>If you have been here before, you will notice, past posts have disappeared. Probably, they were too short to sustain a Reset.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">re&amp;lt;br /&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">set
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Maybe this time I will manage to write something sustainable?&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2005-09-makumba/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2005-09-makumba/</guid><description>&lt;p>Contributor to the &lt;a href="http://www.makumba.org/">Makumba&lt;/a> open-source web framework for Rapid Application Development&lt;/p>
&lt;p>Tools used: &lt;code>Java&lt;/code>, &lt;code>Tomcat&lt;/code>, &lt;code>ANTLR&lt;/code>, &lt;code>Spring&lt;/code>, &lt;code>SQL&lt;/code>, &lt;code>Hibernate&lt;/code>, &lt;code>Maven&lt;/code>, &lt;code>Ant&lt;/code>, &lt;code>Linux&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2007-07-kth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2007-07-kth/</guid><description>&lt;p>As part of the team at the HCI lab at KTH I worked on software solutions for collaborative programming (see &lt;a href="http://kth.diva-portal.org/smash/record.jsf?pid=diva2%3A485482&amp;amp;dswid=765">this paper&lt;/a>)&lt;/p>
&lt;p>Tools used: &lt;code>Java&lt;/code>, &lt;code>Tomcat&lt;/code>, &lt;code>Hibernate&lt;/code>, &lt;code>ANTLR&lt;/code>, &lt;code>SQL&lt;/code>, &lt;code>Linux&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2008-10-tmobile/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2008-10-tmobile/</guid><description>&lt;p>As part of the eBusiness &amp;amp; CRM team at T-Mobile Austria I worked on the maintenance and development of the Order Management System for mobile phone tariffs as well as on a project to build the next generation order management system (Oracle Siebel, IBM Master Data Management)&lt;/p>
&lt;p>Tools used: &lt;code>Java&lt;/code>, &lt;code>SQL&lt;/code>, &lt;code>Linux&lt;/code>, &lt;code>Oracle Siebel&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2009-11-ait/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2009-11-ait/</guid><description>&lt;p>As part of the Digital Preservation team at the Austrian Institute of Technology I took part in building software tools aiming at making digital assets accessible in the long term, such as:&lt;/p>
&lt;ul>
&lt;li>building workflow engines with automated plans for data format migration&lt;/li>
&lt;li>building tools to annotate digital media&lt;/li>
&lt;li>etc.&lt;/li>
&lt;/ul>
&lt;p>Tools used: &lt;code>Java&lt;/code>, &lt;code>Scala&lt;/code>, &lt;code>Adobe Flex&lt;/code>, &lt;code>CSS&lt;/code>, &lt;code>Javascript&lt;/code>, &lt;code>SQL&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2011-02-oxiras/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2011-02-oxiras/</guid><description>&lt;p>Oxiras provided a SaaS solution for manual testing, akin to HP Quality Centre&lt;/p>
&lt;p>Tools used: &lt;code>Scala&lt;/code>, &lt;code>Play Framework&lt;/code>, &lt;code>Javascript&lt;/code>, &lt;code>Chef&lt;/code>, &lt;code>SQL&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2011-09-delving/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2011-09-delving/</guid><description>&lt;p>Delving provided a SaaS offering for cultural heritage organizations (museums, libraries, archives) allowing them to bring their digital content online and make it searchable.&lt;/p>
&lt;p>Tools used: &lt;code>Scala&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Play Framework&lt;/code>, &lt;code>Javascript&lt;/code>, &lt;code>XML&lt;/code>, &lt;code>SOLR&lt;/code>, &lt;code>elasticsearch&lt;/code>, &lt;code>MongoDB&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2013-07-nexxchange/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2013-07-nexxchange/</guid><description>&lt;p>Nexxchange provides an all-in-one platform for managing Golf resorts and hotels.&lt;/p>
&lt;p>I designed and implemented the online portal that aggregates the tee times of the multiple golf clubs, making them searchable and bookable.&lt;/p>
&lt;p>See also the Reactive Golf article series &lt;a href="https://manuel.bernhardt.io/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-1/">part 1&lt;/a>, &lt;a href="https://manuel.bernhardt.io/2013/10/21/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-2/">part 2&lt;/a> and &lt;a href="https://manuel.bernhardt.io/2013/10/26/reactive-golf-or-iteratees-and-all-that-stuff-in-practice-part-3/">part 3&lt;/a>.&lt;/p>
&lt;p>Tools used: &lt;code>Scala&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Play Framework&lt;/code>, &lt;code>Groovy&lt;/code>, &lt;code>Javascript&lt;/code>, &lt;code>elasticsearch&lt;/code>, &lt;code>MongoDB&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2013-12-talenthouse/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2013-12-talenthouse/</guid><description>&lt;p>I joined the engineering team at TalentHouse in order to build the new version of the company site using the Play Framework and Scala.&lt;/p>
&lt;p>Tools used: &lt;code>Scala&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Play Framework&lt;/code>, &lt;code>Javascript&lt;/code>, &lt;code>elasticsearch&lt;/code>, &lt;code>RabbitMQ&lt;/code>, &lt;code>PostgreSQL&lt;/code>, &lt;code>Heroku&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2014-07-book/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2014-07-book/</guid><description>&lt;div class="row">
&lt;div class="col-xs-3">
 &lt;div class="l-box">
 &lt;a href="https://manuel.bernhardt.io/reactive-web-applications">&lt;img class="alignright" style="height: 250px !important;" src="https://manuel.bernhardt.io/wp-content/reactive-web-applications.png"/>&lt;/a>
 &lt;/div>
 &lt;/div>
&lt;div class="col-xs-9 text">
&lt;p>Writing the book &lt;a href="https://www.manning.com/books/reactive-web-applications">Reactive Web Applications&lt;/a>. The book is the result of several years of experience designing, building and working with teams to build high-performant, fault-resilient web applications using the Play Framework, Akka and Scala. In a way, this is the book I wish I had had when I first started working with this stack.&lt;/p>
&lt;p>Read more about the &lt;a href="https://manuel.bernhardt.io/2016/07/15/the-reality-of-writing-a-technical-book/">story of writing the book&lt;/a>.&lt;/p>
&lt;p>4000+ copies sold so far.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2016-02-dimoco/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2016-02-dimoco/</guid><description>&lt;p>DIMOCO initially approached me in order to develop a prototype for an architecture evaluation with Akka Cluster to help make a decision of which technology to use (the other contending technology was VertX). I developed a software prototype deployed on multiple &lt;a href="https://manuel.bernhardt.io/2016/04/19/akka-cluster-java-and-the-raspberry-pi-3-model-b/">Raspberry PIs&lt;/a> to demonstrate the resilience and failover capability of Akka Cluster (unplugging a network cable while transactions were being executed and showing that the processing continues and no transaction is failing makes for a good demonstration).&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2016-06-wirecard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2016-06-wirecard/</guid><description>&lt;p>Ongoing support of the engineering teams working on the next generation of the PSP (Payment Services Provider) core platform:&lt;/p>
&lt;ul>
&lt;li>architecture reviews&lt;/li>
&lt;li>design and code reviews&lt;/li>
&lt;li>performance engineering workshops&lt;/li>
&lt;/ul>
&lt;p>Topics &amp;amp; tools: &lt;code>Reactive design principles&lt;/code>, &lt;code>Actor systems&lt;/code>, &lt;code>Event Sourcing&lt;/code>, &lt;code>CQRS&lt;/code>, &lt;code>Performance Engineering&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Akka Cluster&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2016-08-vcharge/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2016-08-vcharge/</guid><description>&lt;p>This engagement was a direct result of my work on &lt;a href="https://manuel.bernhardt.io/akka-cluster-on-raspberry-pi/">deploying Akka on the Raspberry PI&lt;/a> (see also the &lt;a href="https://manuel.bernhardt.io/2016/04/19/akka-cluster-java-and-the-raspberry-pi-3-model-b/">initial article&lt;/a>).&lt;/p>
&lt;p>VCharge developed an embedded system and software solution to help address the issue of maintaining the stability of the electric grid in the presence of increasing renewable generation.&lt;/p>
&lt;p>During this engagement I supported VCharge in:&lt;/p>
&lt;ul>
&lt;li>building a new version of the low-latency backend service (based on Akka) responsible for aggregating telemetry as well as actuating the IoT devices at the core of the VCharge Grid network.&lt;/li>
&lt;li>further development of the firmware driving the embedded IoT devices&lt;/li>
&lt;/ul>
&lt;p>Tools used: &lt;code>C&lt;/code>, &lt;code>Buildroot&lt;/code>, &lt;code>Bash&lt;/code>, &lt;code>Scala&lt;/code>, &lt;code>Python&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>elasticsearch&lt;/code>, &lt;code>logstash&lt;/code>, &lt;code>Kibana&lt;/code>, &lt;code>Puppet&lt;/code>, &lt;code>AWS&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2017-05-cr/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2017-05-cr/</guid><description>&lt;ul>
&lt;li>architecture of the new microservice-based software platform for an existing real-time communication platform&lt;/li>
&lt;li>design and code reviews&lt;/li>
&lt;li>hands-on development of the core feature set of the platform (based on Akka, Scala and Scala.js)&lt;/li>
&lt;li>Cloud DevOps infrastructure on Azure&lt;/li>
&lt;/ul>
&lt;p>Topics &amp;amp; tools: &lt;code>Scala&lt;/code>, &lt;code>Scala.js&lt;/code>, &lt;code>Typescript&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Microservices&lt;/code>, &lt;code>Kafka&lt;/code>, &lt;code>SBT&lt;/code>, &lt;code>Terraform&lt;/code>, &lt;code>Azure&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-01-bernhardt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-01-bernhardt/</guid><description>&lt;ul>
&lt;li>reading 50+ papers on the topic of distributed systems&lt;/li>
&lt;li>basis for the talk &lt;a href="https://slideslive.com/38907973/is-there-anybody-out-there">Is there anybody out there?&lt;/a>&lt;/li>
&lt;li>basis for my personal research work in the distributed systems field&lt;/li>
&lt;/ul></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-03-deliveryhero/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-03-deliveryhero/</guid><description>&lt;p>Architecture review and code review of an Akka Cluster based application&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Reactive design principles&lt;/code>, &lt;code>Akka Cluster&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-03-metaco/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-03-metaco/</guid><description>&lt;p>I supported the engineering team during the initial development of the SILO platform (based on Akka Cluster and Scala) by:&lt;/p>
&lt;ul>
&lt;li>reviewing the system architecture and technical feature designs&lt;/li>
&lt;li>providing guidance and best practices with regard to the use of Akka Cluster, Scala and Kubernetes&lt;/li>
&lt;li>developing the initial project scaffold and core application layer&lt;/li>
&lt;/ul>
&lt;p>Topics &amp;amp; tools: &lt;code>Reactive design principles&lt;/code>, &lt;code>Actor systems&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Akka Cluster&lt;/code>, &lt;code>Scala&lt;/code>, &lt;code>Kubernetes&lt;/code>, &lt;code>Helm&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-05-moia/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-05-moia/</guid><description>&lt;p>Evaluation of the deployment of a split-brain resolution solution for Akka Cluster deployed with Kubernetes on Amazon Web Services (AWS). At this time, there was no official support for Kubernetes deployments of Akka and therefore I proceeded to analyze the deployment model with regard to different edge-cases that could occur in a split-brain scenario.&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Distributed Systems&lt;/code>, &lt;code>Akka Cluster&lt;/code>, &lt;code>AWS&lt;/code>, &lt;code>Kubernetes&lt;/code>, &lt;code>Helm&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-06-moia-contract/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-06-moia-contract/</guid><description>&lt;p>I joined the Payment Services team at MOIA to help with developing the second version of the payment system based on Scala and Akka.
The system needed to enable the payment of MOIA trips and needed to integrate with multiple Payment Service Providers while providing strong consistency as well as being highly available.&lt;/p>
&lt;p>Tools used: &lt;code>Scala&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Akka Cluster&lt;/code>, &lt;code>Akka HTTP&lt;/code>, &lt;code>Microservices&lt;/code>, &lt;code>SBT&lt;/code>, &lt;code>DynamoDB&lt;/code>, &lt;code>AWS Kinesis&lt;/code>, &lt;code>PostgreSQL&lt;/code>, &lt;code>AWS&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2018-12-swissborg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2018-12-swissborg/</guid><description>&lt;p>Development of a template project for deploying Akka Cluster projects with Kubernetes&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Kubernetes&lt;/code>, &lt;code>Akka Cluster&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2019-09-deliveryhero/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2019-09-deliveryhero/</guid><description>&lt;p>A core application based on Akka Cluster had ongoing memory issues, requiring to run virtual machines with a lot of memory (64+ GB) as a workaround. I held a performance engineering workshop to show the team how to use the adequate tooling for performance profiling and memory pressure analysis. A key result of the workshop was a tenfold decrease of the JVM memory required to run the project.&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Performance Engineering&lt;/code>, &lt;code>Async Profiler&lt;/code>, &lt;code>JVM memory management&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2019-10-paidy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2019-10-paidy/</guid><description>&lt;p>The onboarding of a new strategic client on the Paidy platform brought with it stricter latency requirements (in order to meet the agreed-upon Service Level Agreement). The backend application built on top of Akka Cluster with cluster sharding did not deliver consistent latency in redeployment and failover scenarios. I helped the engineering team find and understand the root cause of the latency fluctuations and guided them throughout the process of implementing a solution.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2020-02-swissborg/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2020-02-swissborg/</guid><description>&lt;p>Troubleshooting performance issues with an Order Management System (based on Akka Cluster, Kafka and Kubernetes) and setting up a large-scale load test for the system.&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Performance Engineering&lt;/code>, &lt;code>Akka Cluster&lt;/code>, &lt;code>Kafka&lt;/code>, &lt;code>Kubernetes&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2020-03-dolphin/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2020-03-dolphin/</guid><description>&lt;p>Architecture evaluation of an event-sourced system based on Apache Kafka and Kubernetes&lt;/p>
&lt;p>Topics &amp;amp; tools: &lt;code>Event Sourcing&lt;/code>, &lt;code>CQRS&lt;/code>, &lt;code>Kafka&lt;/code>, &lt;code>Kubernetes&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2020-07-plenty/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2020-07-plenty/</guid><description>&lt;ul>
&lt;li>review of the technical design of a single-node Akka application against the business objectives&lt;/li>
&lt;li>support of the project team with regard to questions and issues arising during the project with regard to the usage of Akka and Scala&lt;/li>
&lt;/ul>
&lt;p>Topics &amp;amp; tools: &lt;code>Actor Systems&lt;/code>, &lt;code>Reactive design patterns&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Scala&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2021-01-dv/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2021-01-dv/</guid><description>&lt;p>Ongoing support of the engineering team with the implementation of Scala- and Akka-based microservices:&lt;/p>
&lt;ul>
&lt;li>architecture and design reviews&lt;/li>
&lt;li>code reviews&lt;/li>
&lt;li>technical questions&lt;/li>
&lt;li>performance engineering&lt;/li>
&lt;/ul>
&lt;p>Topics &amp;amp; tools: &lt;code>Reactive design patterns&lt;/code>, &lt;code>Microservices&lt;/code>, &lt;code>Distributed systems&lt;/code>, &lt;code>Akka&lt;/code>, &lt;code>Scala&lt;/code>, &lt;code>Kubernetes&lt;/code>, &lt;code>Helm&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2021-10-leap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2021-10-leap/</guid><description>&lt;p>After watching the drone footage of &lt;a href="https://www.youtube.com/watch?v=so-FcHTWEIY">San Francisco in burning orange skies&lt;/a> due to wildfires, with the Blade Runner soundtrack playing on top of it, I decided to look for an engagement with a company helping to do something to address climate change. This is how I learned about Leap Energy which provides solutions for connecting distributed energy resources to wholesale energy markets in order to make the electric grid more resilient.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2022-03-bernhardt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2022-03-bernhardt/</guid><description>&lt;p>Taking time off paid work&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2022-12-adaptive/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2022-12-adaptive/</guid><description>&lt;p>At Adaptive, I helped to benchmark the &lt;a href="https://aeron.io/">Aeron&lt;/a> messaging platform on Amazon Web Services (AWS) and Google Cloud Platform (GCP).&lt;/p>
&lt;p>During the course of the project, I:&lt;/p>
&lt;ul>
&lt;li>built the infrastructure provisioning harness required to run the tests on two cloud providers with different scenarios and configurations
&lt;ul>
&lt;li>instance types&lt;/li>
&lt;li>network topology and configuration&lt;/li>
&lt;li>transport security (IPSec, Wireguard, etc.)&lt;/li>
&lt;li>storage types&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>built an automation for rendering results (latency graphs, experiment parameters, etc.)&lt;/li>
&lt;li>built an automation for provisioning infrastructure, running benchmarks in various configurations (peer-to-peer, cluster) and rendering results&lt;/li>
&lt;li>assisted with the running of benchmarks, analyzing results and investigating performance issues&lt;/li>
&lt;/ul>
&lt;p>See the &lt;a href="https://aws.amazon.com/blogs/industries/aeron-performance-enables-capital-markets-to-move-to-the-cloud-on-aws/">press release from AWS&lt;/a> on the topic and the &lt;a href="https://weareadaptive.com/2023/11/14/aeron-cloud-performance-testing-on-aws/">performance testing results are publicly available&lt;/a>.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2024-02-mybioma/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2024-02-mybioma/</guid><description>&lt;p>Migration of an on-premise kubernetes deployment to Google Cloud Run.&lt;/p>
&lt;p>Tools used: &lt;code>GCP&lt;/code>, &lt;code>Google Cloud Run&lt;/code>, &lt;code>Terraform&lt;/code>, &lt;code>Kubernetes&lt;/code>, &lt;code>Vault&lt;/code>, &lt;code>Python&lt;/code>&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/engagements/2024-03-mavie/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/engagements/2024-03-mavie/</guid><description>&lt;p>Mavie is a holistic healthcare provider, offering a range of services from preventive care and rehabilitation to company health management and telehealth, all under the umbrella of the UNIQA Group.&lt;/p>
&lt;p>I&amp;rsquo;m working with Mavie on establishing their Site Reliability Engineering practices from the ground up, bringing the teams up to speed in the use of DevSecOps and SRE practices with a focus on best-practice security aspects of cloud-based software development.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/intro-short/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/intro-short/</guid><description>&lt;p> &lt;/p>
&lt;div class="row middle-xs">
&lt;div class="col-xs-9" style="text-wrap: wrap;">
I'm an experienced software engineer, author and trainer working as an independent software consultant.
&lt;p>I have significant experience in engineering and operating distributed systems at all levels of the stack, ranging from high-level architecture down to debugging issues at the kernel and network level.&lt;/p>
&lt;p>Next to working on client projects I also like to &lt;a href="https://manuel.bernhardt.io/articles">write&lt;/a> and &lt;a href="https://manuel.bernhardt.io/talks/">talk&lt;/a> at conferences. I wrote the book &lt;a href="https://manuel.bernhardt.io/reactive-web-applications/">Reactive Web Applications&lt;/a> (Manning Publications) about building web applications following the &lt;a href="https://www.reactivemanifesto.org/">reactive system principles&lt;/a>.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/intro/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/intro/</guid><description>&lt;p>I&amp;rsquo;m a polyglot software engineer and trainer working as an independent consultant.&lt;/p>
&lt;p>My consulting work consists in helping my clients:&lt;/p>
&lt;ul>
&lt;li>engineer, deploy and operate highly available and fault-tolerant systems&lt;/li>
&lt;li>get existing systems to meet predictable performance requirements in the face of increasing load&lt;/li>
&lt;/ul>
&lt;p>I have significant experience in engineering and operating distributed systems at all levels of the stack, from high-level architecture down to debugging issues at the kernel or network level. Next to working on client projects I have also explored the topics of cluster membership and distributed consensus, trying to keep up to date with the latest research in this field and sometimes &lt;a href="https://manuel.bernhardt.io/2020/04/30/10000-node-cluster-with-akka-and-rapid/">pushing the limit myself&lt;/a>.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/talks/00/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/00/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/01/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/01/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/02/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/02/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/03/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/03/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/04/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/04/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/05/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/05/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/06/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/06/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/07/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/07/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/08/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/08/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/09/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/09/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/10/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/10/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/11/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/11/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/12/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/12/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/13/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/13/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/14/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/14/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/15/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/15/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/16/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/16/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/17/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/17/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/18/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/18/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/19/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/19/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/20/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/20/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/21/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/21/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/22/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/22/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/23/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/23/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/24/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/24/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/25/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/25/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/26/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/26/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/27/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/27/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/28/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/28/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/29/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/29/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/30/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/30/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/31/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/31/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/32/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/32/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/33/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/33/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/34/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/34/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/35/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/35/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/36/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/36/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/37/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/37/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/talks/38/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/talks/38/</guid><description/></item><item><title/><link>https://manuel.bernhardt.io/testimonials/adrien_treccani/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/adrien_treccani/</guid><description>&lt;p>Security is paramount when it comes to cryptocurrencies and banking. So when these two interact, security becomes an even bigger deal. Our solution SILO, which launched in 2018, finally makes it possible for banks to safely store their clients’ crypto-assets.&lt;/p>
&lt;p>We got Manuel on board right away when we started building SILO because of his outstanding expertise in Akka Cluster. He helped us kickstart the project and accompanied us during the first few months of development. By putting best practices in place, Manuel made sure SILO was off to a good start. This has allowed us to build a successful product that is secure, reliable and integrates seamlessly with the infrastructure of financial institutions.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/andrew_ayres/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/andrew_ayres/</guid><description>&lt;p>I think the stand-out quality of Manuel’s consultancy is that he told me what I needed to hear, rather than what I wanted to hear, and it’s had a big affect on how we approach the launch of our startup.&lt;/p>
&lt;p>Whilst micro service architecture may be great, Manuel has helped us understand how to launch with a more manageable architecture, more suited to our startup team, but with the core principles already in place to allow for rapid growth in future. I highly recommend Manuel as a technical consultant.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/daniel_lang/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/daniel_lang/</guid><description>&lt;p>When we wanted to switch our technical platform to a reactive architecture, Manuel supported and coached us through the entire process. He helped us rewrite our platform from scratch and migrate the massive Talenthouse databases.&lt;/p>
&lt;p>We only had three months to pull it off and wouldn’t have been able to do it without Manuel. With enthusiasm and creativity, he set us up with a brand new and stable platform that can now grow with our company.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/gabriela_schatz/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/gabriela_schatz/</guid><description>&lt;p>Wirecard has been growing substantially over the past couple of years. Consequently, we needed to rethink our architectural paradigm to support this sustained growth going forward.&lt;/p>
&lt;p>We found that reactive microservices were the perfect solution, allowing us to scale up in terms of transaction volume. The microservices architecture also lets us fully leverage our international developer teams as it allows them to work independently without requiring constant communication, which is crucial for a company that operates on a global scale.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/houston_ross/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/houston_ross/</guid><description>&lt;p>Paidy’s business is rapidly growing, and with each new customer, we face exciting new challenges and targets to strive towards.&lt;/p>
&lt;p>The recent on-boarding of a significant new customer with a newly agreed-upon Service Level Agreement meant we had to review the latency requirements of our core payment service.&lt;/p>
&lt;p>Manuel, who is incredibly experienced with Akka Cluster, helped us better understand the background behind the elevated latencies in our core services and improve the issues. We are now on the way to having predictable latency at the scale we will need to support our growth, including during update and failover scenarios. Manuel’s work was invaluable in helping us achieve this milestone for Paidy.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/james_watson/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/james_watson/</guid><description>&lt;p>We hired Manuel to help us benchmark Aeron, our cloud-native, open-source, low-latency message transport and cluster technology. We wanted to benchmark Aeron on Amazon Web Services and Google Cloud Platform to prove that capital markets could be run in the cloud.&lt;/p>
&lt;p>Manuel helped us with the entire process: setting up the infrastructure to run the performance benchmarks, automating the collection and presentation of results, running the benchmarks, and investigating performance issues.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/jessica_millar/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/jessica_millar/</guid><description>&lt;p>VCharge has a complex and naturally reactive technology which is working in production but needs to rapidly scale by two or three orders of magnitude. We hired Manuel to help with this. He is perceptive and practical, detail-oriented and abstract, hard-working and laid-back, smart and humble. He is fun to work with and learn from, and a great teammate and all-around strategist / thinker in addition to having deep reactive / Akka-based experience.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/matias_pacelli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/matias_pacelli/</guid><description>&lt;p>As the world’s largest food delivery network, logistics are a vital part of our business and it’s important that we’re always operational and avoid outages at all costs. A critical service of our logistics infrastructure uses Akka Cluster, so we reached out to Manuel to get input from a reactive systems expert.&lt;/p>
&lt;p>Manuel conducted a thorough reactive audit, reviewing the architecture of one of our core applications, and then discussed his findings with us in a one-day workshop. He helped us improve our application and optimise our infrastructure so we can ensure maximum uptime. I’m happy to say that our logistics are now running even more smoothly for our brands all around the world.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/michael_briem/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/michael_briem/</guid><description>&lt;p>I consulted Manuel during my recent venture into software as a service, and he has been a great resource. His input has helped me obtain the technical solutions for the Nexxchange platform that I’d been envisioning.&lt;/p>
&lt;p>I value his know-how in both technical and business matters and how diligently he translated technical content for me.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/nicolas_leroux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/nicolas_leroux/</guid><description>&lt;p>I contacted Manuel to teach us a bit more about Akka for a new project that required our team to get to know the distributed side of Akka. The course went really well — so well, in fact, that we’re probably going to book another one for more of our people.&lt;/p>
&lt;p>I first reached out to Manuel via Twitter and we hashed most of the course out in direct messages. This is the kind of flexibility and openness I welcome from partners.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/ralf_sigmund/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/ralf_sigmund/</guid><description>&lt;p>We started MOIA because we wanted to create a ride-sharing service that makes transport more environmentally friendly and more affordable. In order to meet our Hamburg launch target, we needed some external help to speed up the development process, and this is where Manuel came in.&lt;/p>
&lt;p>Manuel initially consulted with us on evaluating and setting up split-brain resolution for Akka Cluster in the context of our Kubernetes deployment.&lt;/p>
&lt;p>Then, to offer a competitive app, our payment service needed to be rearchitected so as to support more payment methods. With time until our Hamburg launch running out, we asked Manuel to support our payment team with the overhaul.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/robert_lux/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/robert_lux/</guid><description>&lt;p>We had to replace a key component in our system and brought Manuel in to introduce us to Akka. We had already been looking closely at a different solution, but Manuel’s prototype quickly convinced us that Akka would be the best choice for us.&lt;/p>
&lt;p>Manuel used three connected Raspberry Pi computers to demonstrate how lightweight and fast the Akka toolkit is. He then got our team up-to-speed on the technology and supported us while we developed and successfully implemented our new system with Akka. In this critical process, his expertise with distributed systems was invaluable to us.&lt;/p></description></item><item><title/><link>https://manuel.bernhardt.io/testimonials/thierry_bathias/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://manuel.bernhardt.io/testimonials/thierry_bathias/</guid><description>&lt;p>Manuel recently delivered one of his courses at Deveryware to help our development team get on track with Akka for Java. It makes things a lot easier that Manuel also offers his workshops in French, and the whole team made a lot of progress during the training.&lt;/p>
&lt;p>I especially appreciate Manuel’s flexibility and the work he put into making the training a perfect fit for us. He even went out of his way to accommodate our scheduling problems so that all our developers could attend the course.&lt;/p></description></item></channel></rss>