<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[About diving and IT]]></title><description><![CDATA[Learning and loving it.]]></description><link>https://blog.devndive.com/</link><image><url>https://blog.devndive.com/favicon.png</url><title>About diving and IT</title><link>https://blog.devndive.com/</link></image><generator>Ghost 5.59</generator><lastBuildDate>Mon, 08 Jun 2026 03:02:24 GMT</lastBuildDate><atom:link href="https://blog.devndive.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Cilium and hubble]]></title><description><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Please note<br>This is not simple content and you will need some time to setup a Kubernetes cluster with cilium and hubble. If you get stuck, that is normal. I got stuck along this journey many times. It might also be that my description and samples are not the</div></div>]]></description><link>https://blog.devndive.com/blog/2022/08/09/cilium-and-hubble/</link><guid isPermaLink="false">64e89167c6af27537aa34f14</guid><category><![CDATA[aks]]></category><category><![CDATA[azure]]></category><category><![CDATA[k8s]]></category><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Tue, 09 Aug 2022 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/cilium_horizontal-color.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4A1;</div><div class="kg-callout-text">Please note<br>This is not simple content and you will need some time to setup a Kubernetes cluster with cilium and hubble. If you get stuck, that is normal. I got stuck along this journey many times. It might also be that my description and samples are not the best. Take your time and read the official <a href="https://docs.cilium.io/en/stable/intro/?ref=blog.devndive.com">cilium documentation</a> when you get stuck. It is well written and goes into way more detail.</div></div><!--kg-card-begin: markdown--><img src="https://blog.devndive.com/content/images/2023/01/cilium_horizontal-color.png" alt="Cilium and hubble"><p>To know what is going on in your container network and to control the flow of traffic we need tools that are well integrated into the stack. Cilium and hubble are tools that provide many options to control flows and to observe what is happening.</p>
<p><em>What is cilium?</em></p>
<p>Cilium is a container network interface plugin to provide eBPF-based networking, observability and security. I will not go through eBPF and what it is in detail. For more information the <a href="https://ebpf.io/?ref=blog.devndive.com">ebpf.io website is an excellent source of information</a>.</p>
<p><em>What is hubble?</em></p>
<p>Hubble allows us to monitor the network behavior of cilium managed Kubernetes pods. It will allow us to troubleshoot network connectivity issues when we are trying to lock down containers as much as possible.</p>
<p>In this post I will go through</p>
<ul>
<li>locking down a container and</li>
<li>debugging connection issues.</li>
</ul>
<h2 id="targetsimplifiedarchitecture">Target (simplified) architecture</h2>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/architecture.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="1339" height="887" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/architecture.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/architecture.png 1000w, https://blog.devndive.com/content/images/2023/01/architecture.png 1339w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><h2 id="ebpfbasednetworkingobservabilityandsecurity">eBPF-based Networking, Observability and Security</h2>
<p>In advanced Kubernetes setups requirements for the networking stack become more advanced. There is an increased need for observability and security. Container runtimes use <a href="https://www.redhat.com/sysadmin/cni-kubernetes?ref=blog.devndive.com">container network interface (CNI)</a> plugins to create network interfaces for the containers.</p>
<p>There are multiple CNI plugins like</p>
<ul>
<li><a href="https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/?ref=blog.devndive.com#kubenet">kubenet</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni?ref=blog.devndive.com">Azure CNI</a></li>
<li><a href="https://cilium.io/?ref=blog.devndive.com">Cilium</a></li>
<li><a href="https://landscape.cncf.io/card-mode?category=cloud-native-network&amp;grouping=category&amp;ref=blog.devndive.com">and many more</a></li>
</ul>
<p>Some of the customers I work with use Cilium. To get a better understanding it helps myself to take this plugin for a test drive.</p>
<h2 id="settingupciliumandhubbleonaks">Setting up Cilium and Hubble on AKS</h2>
<p>The Cilium documentation has instructions on how to setup it up. The steps I took are as follows:</p>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/aks/use-byo-cni?tabs=azure-cli&amp;ref=blog.devndive.com">Bring your own CNI plugin with Azure Kubernetes Service (AKS)</a></li>
<li><a href="https://docs.cilium.io/en/stable/gettingstarted/k8s-install-helm/?ref=blog.devndive.com">Install Cilium with Helm, select AKS (BYOCNI)</a></li>
<li><a href="https://docs.cilium.io/en/stable/gettingstarted/hubble_setup/?ref=blog.devndive.com#hubble-setup">Setup hubble</a></li>
</ul>
<p>When I first got started I had no clue what happened under the hood or how to know if everything is setup correctly. To make sure everything is working the documentation includes validate steps. Make sure to run through those sections.</p>
<h2 id="acontainerforsomeexperiments">A container for some experiments</h2>
<p>For the first steps we just need a container with a small footprint. I like to use an <a href="https://hub.docker.com/_/alpine/?ref=blog.devndive.com">alpine image</a> for this purpose. From here on I am assuming that you have configured kubectl to work with your cluster. I am running everything in the default namespace.</p>
<pre><code class="language-bash"># run on local machine
# This will run a pod and allocate a tty to play around

# Note: The label &quot;app&quot; is important we will be using that
# later to target this pod
kubectl run -it alpine --image=alpine --labels=&quot;app=alpine&quot;
</code></pre>
<p>You are now attached to the pod and can run any command available. Let&apos;s run a first simple test to check if our DNS is working. If you get disconnected from your pod you can use kubectl attach to reattach to the pod.</p>
<pre><code class="language-bash"># Reattach to the container
kubectl attach alpine -c alpine -i -t
</code></pre>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/nslookup.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="786" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/nslookup.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/nslookup.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/nslookup.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/nslookup.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><p>Nice! Getting a response and the name could be resolved. Now we make sure that we can do a HTTP GET request and get a response with status code 200. This status code will indicate a successful HTTP request to the server. To execute the request we need a command to do this. I usually use cURL for that. To install run the following command in the container.</p>
<pre><code class="language-bash"># run in pod
apk add curl
</code></pre>
<p>Now we can use cURL. I am only interested in the status code. With the <code>-I</code> option we will only see the headers, that is enough.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/curl-microsoft-com.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="786" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/curl-microsoft-com.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/curl-microsoft-com.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/curl-microsoft-com.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/curl-microsoft-com.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><p>Again, this is looking good. Our pod can communicate to the outside world of our cluster. It can actually connect to <em>anywhere</em> in the world.</p>
<p>The container keeps running even when we exit the tty. To reattach to that container we can use</p>
<h2 id="lockingdownthecontainer">Locking down the container</h2>
<p>Locking down the container can be achieved with a <a href="https://docs.cilium.io/en/stable/policy/?ref=blog.devndive.com">cilium network policy</a>. To get started we apply the following basic policy. It only has a name <code>locking-down-alpine</code> and the name of the pod we want to target. By <a href="https://docs.cilium.io/en/stable/policy/intro/?ref=blog.devndive.com">default</a> if no rules are applied, everything is allowed.</p>
<pre><code class="language-yaml">apiVersion: &quot;cilium.io/v2&quot;
kind: CiliumNetworkPolicy
metadata:
  name: &quot;locking-down-alpine&quot;
spec:
  endpointSelector:
    matchLabels:
      app: alpine
</code></pre>
<pre><code class="language-bash"># run on local machine
# applying the policy
kubectl apply -f ./locking-down-alpine.yml
</code></pre>
<h3 id="denyeverything">Deny everything</h3>
<p>By defining empty ingress and egress definitions we deny all traffic to and from the pod.</p>
<pre><code class="language-yaml">apiVersion: &quot;cilium.io/v2&quot;
kind: CiliumNetworkPolicy
metadata:
  name: &quot;locking-down-alpine&quot;
spec:
  endpointSelector:
    matchLabels:
      app: alpine
  egress:
    - {}
  ingress:
    - {}
</code></pre>
<p>If you try to run <code>nslookup</code>, <code>apk add</code> or <code>curl -I</code> you will get timeouts or similar error messages</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/timeouts.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="786" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/timeouts.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/timeouts.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/timeouts.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/timeouts.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><h3 id="allowdns">Allow DNS</h3>
<p>So first, let&apos;s check how to find out to which service the pod wants to talk to. To use hubble to observe traffic<br>
we forward hubble&apos;s port to our machine. Run the following command on your local machine</p>
<pre><code class="language-bash"># Run on local machine
# I like to run the port-forward as a process in the background, hence the &amp; at the end
cilium hubble port-forward &amp;
</code></pre>
<p>Now, in the container we try another <code>nslookup www.microsoft.com</code>. And now we observe what happened using hubble.</p>
<pre><code class="language-bash">hubble observe --pod alpine
</code></pre>
<p>And depending on your configuration the visualization might differ. This is telling us that our alpine pod in the default namespace is trying to talk to the coredns service in the kube-system namespace. The port we want to talk to with coredns is 53 (the port for DNS) and the protocol used is UDP. It might not look like much but when you are investigating connection issues this is a lot of information that we are getting here.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/hubble-observe.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="402" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/hubble-observe.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/hubble-observe.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/hubble-observe.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/hubble-observe.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><p>Let&apos;s adjust the egress rule for our pod.</p>
<pre><code class="language-yaml">apiVersion: &quot;cilium.io/v2&quot;
kind: CiliumNetworkPolicy
metadata:
  name: &quot;locking-down-alpine&quot;
spec:
  endpointSelector:
    matchLabels:
      app: alpine
  egress:
  # Allow traffic from our endpoint alpine to the endpoints
  - toEndpoints:
    # that match the following criteria
    - matchLabels:
        # have a label &apos;k8s:io.kubernetes.pod.namespace&apos; with value &apos;kube-system&apos;
        &quot;k8s:io.kubernetes.pod.namespace&quot;: kube-system
        # and a label &apos;k8s:k8s-app&apos; with value &apos;kube-dns&apos;
        &quot;k8s:k8s-app&quot;: kube-dns
    # and uses the following ports
    toPorts:
      - ports:
        # port 53 and protocol UDP
        - port: &quot;53&quot;
          protocol: UDP
  # Do not allow any traffic from the outside in
  ingress:
  - {}
</code></pre>
<p>Using hubble observe we should now see that traffic is allowed and requests are forwarded.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/hubble-observe-allowed.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="402" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/hubble-observe-allowed.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/hubble-observe-allowed.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/hubble-observe-allowed.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/hubble-observe-allowed.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><h3 id="allowhttptraffictoaspecificdomain">Allow HTTP traffic to a specific domain</h3>
<p>Running <code>curl -I www.microsoft.com</code> will still timeout. Using <code>hubble observe</code> we can investigate who is trying to talk to whom.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/dropped-traffic-to-microsoft-com.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="1051" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/dropped-traffic-to-microsoft-com.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/dropped-traffic-to-microsoft-com.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/dropped-traffic-to-microsoft-com.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/dropped-traffic-to-microsoft-com.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><p>To make allow and deny rules easier to understand I prefer to use fully qualified domain names (FQDNs). For the next person to understand what is going on it is easier to understand that a rule allows traffic to www.microsoft.com rather than 80.67.94.7.</p>
<pre><code class="language-yaml">apiVersion: &quot;cilium.io/v2&quot;
kind: CiliumNetworkPolicy
metadata:
  name: &quot;locking-down-alpine&quot;
spec:
  endpointSelector:
    matchLabels:
      app: alpine
  egress:
  - toEndpoints:
    - matchLabels:
        &quot;k8s:io.kubernetes.pod.namespace&quot;: kube-system
        &quot;k8s:k8s-app&quot;: kube-dns
    toPorts:
      - ports:
        - port: &quot;53&quot;
          protocol: UDP
        # There is a challenge with alpine/musl and how a dns refused response is treated. This is
        # a not so elegant work around. As DNS is not simple I avoided going for a better solution for
        # now.
        # https://docs.cilium.io/en/stable/policy/language/#alpine-musl-deployments-and-dns-refused
        rules:
          dns:
            - matchPattern: &quot;*&quot;
  # allow traffic to a FQDN that
  - toFQDNs:
    # matches the pattern &quot;*.microsoft.com&quot;
    - matchPattern: &quot;*.microsoft.com&quot;
  ingress:
  - {}
</code></pre>
<p>Applying the rule <code>kubectl apply -f ./locking-down-alpine.yml</code>, running <code>curl -I www.microsoft.com</code> in the container again and using <code>hubble observe</code> to check if everything is working as expected.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/allowed-traffic.png" class="kg-image" alt="Cilium and hubble" loading="lazy" width="2000" height="1051" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/allowed-traffic.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/allowed-traffic.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/allowed-traffic.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/allowed-traffic.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><!--kg-card-begin: markdown--><p>In case you are wondering why there are so many requests going back and forth between our pod and the target website, you can actually see the steps involved in a <a href="https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/?ref=blog.devndive.com">TLS handshake</a>.</p>
<h2 id="thanksformakingitthisfar">Thanks for making it this far</h2>
<p>If you have any questions or suggestions, either contact me on <a href="https://twitter.com/@devndive?ref=blog.devndive.com">twitter @devndive</a>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[From bug to triathlon]]></title><description><![CDATA[<p>A new position at Microsoft is enough action for the first half of the year, right? When my brother and one of my sisters signed up for the <a href="https://www.psd-bank-triathlon-duesseldorf.de/?ref=blog.devndive.com">PSD Triathlon in D&#xFC;sseldorf</a> I did not want to task load myself with another challenge. A bit later my second</p>]]></description><link>https://blog.devndive.com/blog/2022/06/26/from-bug-to-triathlon/</link><guid isPermaLink="false">64e89167c6af27537aa34f19</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Sun, 26 Jun 2022 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/resp_title_1200-1.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.devndive.com/content/images/2023/01/resp_title_1200-1.jpg" alt="From bug to triathlon"><p>A new position at Microsoft is enough action for the first half of the year, right? When my brother and one of my sisters signed up for the <a href="https://www.psd-bank-triathlon-duesseldorf.de/?ref=blog.devndive.com">PSD Triathlon in D&#xFC;sseldorf</a> I did not want to task load myself with another challenge. A bit later my second sister signed up and I was the only one left not participating. With 3 siblings excited for the event I wanted to at least get fitter. I started looking for a personal trainer. The way I am, offers have to be compared and evaluated. That involves tabs.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/compare_and_select-1.jpg" class="kg-image" alt="From bug to triathlon" loading="lazy" width="2000" height="63" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/compare_and_select-1.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/compare_and_select-1.jpg 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/compare_and_select-1.jpg 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/compare_and_select-1.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>I decided to contact someone from the first 3 tabs. Prepared a short text describing what I want to do. Basically from couch potato to healthier lifestyle. The next morning an email arrived from <a href="https://helwig.berlin/?ref=blog.devndive.com">Stefan Helwig</a>. I was 100% sure I did not contact this person but hey - let&apos;s see how this works. Fast email response time and an offer to have a quick getting to know call a few days later. During the call we talked about goals and I mentioned the triathlon. We agreed that this is a good and achievable goal.</p><h2 id="the-first-trainings">The first trainings</h2><p>Totally motivated I showed up for the first training. A little bit of warming and then start running. I was pretty out of shape and jogging for more than 600m - no chance. Having at least one too many layers of cloths it got pretty warm. The first training was about</p><ul><li>how to warm up</li><li>key parts of running technique</li><li>and getting started</li></ul><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/first_tracked_run-1.jpg" class="kg-image" alt="From bug to triathlon" loading="lazy" width="2000" height="1219" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/first_tracked_run-1.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/first_tracked_run-1.jpg 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/first_tracked_run-1.jpg 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/first_tracked_run-1.jpg 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>The beginning was tough. Heart rate was high, speed was low. Small steps. During this time we also started the swim training. I did a lot of swimming during my childhood / teenage years. Working on my technique was rewarding. I started seeing improvements in my everyday life, less sweating and less effort needed for other sports and activities.</p><h2 id="before-the-event">Before the event</h2><p>The weeks before the event I started to compare running and biking activities from the start to where I was then. Tracking my training made this pretty easy.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/5k_runs.png" class="kg-image" alt="From bug to triathlon" loading="lazy" width="2000" height="632" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/5k_runs.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/5k_runs.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/5k_runs.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/5k_runs.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>Basically I got faster and my body was able to perform at a lower heart rate. Seeing this impressed me a lot. Already pretty hyped about the actual event this gave me another boost of confidence that I will for sure finish the triathlon standing. During my training we focused on running and swimming. I used my bike more but never trained for the distance. I did two tours with a friend. The first one ground and scared me a bit. It was super hard for me. The second one was another confirmation that the training is going in exactly the right direction</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/biking.png" class="kg-image" alt="From bug to triathlon" loading="lazy" width="2000" height="627" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/biking.png 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/biking.png 1000w, https://blog.devndive.com/content/images/size/w1600/2023/01/biking.png 1600w, https://blog.devndive.com/content/images/size/w2400/2023/01/biking.png 2400w" sizes="(min-width: 1200px) 1200px"></figure><p>Everything prepared - the day may come.</p><h2 id="the-event">The event</h2><p>I arrived in D&#xFC;sseldorf on Friday already. A light job in the afternoon. Saturday we spend at an outdoor swimming pool; it was just too hot for anything else. We participated in a &quot;Pasta Party&quot; the night before. Went to bed early.</p><p>Sunday morning breakfast at my brothers home at 7 o&apos;clock. My siblings arrived and we left for the starting location at 7.45. Everyone ready and focused.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://blog.devndive.com/content/images/2023/01/from_start.jpeg" class="kg-image" alt="From bug to triathlon" loading="lazy" width="1564" height="1009" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/from_start.jpeg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/from_start.jpeg 1000w, https://blog.devndive.com/content/images/2023/01/from_start.jpeg 1564w" sizes="(min-width: 1200px) 1200px"></figure><p>During the setup of our changing area first swimmers from the olympic distance returned to switch to cycling. The atmosphere was overwhelming. With everything setup we were ready to proceed to the water starting area. From a short briefing to a water start. I was so excited that I did not even hear the starting sound clearly - started swimming when everyone else did.</p><p>Swimming in open water is a whole other discipline than in a pool. Luckily I was well prepared. Getting to the first buoy felt like it took forever. Recalling my training to just swim like it feels good - long strokes, gliding and regular breathing helped. After the first turn it was more like, got that done check, next one till I left the water.</p><p>Switching from swimming to running to my bike was tougher than expected. Switched to shoes, quick big sip of water, take the bike and off I went. The cycling started with a head wind. The motivation for having rear wind on the way back kept me going. After about a total time of 60minutes I returned to the changing area.</p><p>Finding my spot, storing the bike, another quick sip of water and start running. Well, had to return after a few steps to leave the helmet at the bike Oo. The running distance was pretty smooth. Took a drink at the water station, tried to drink, almost puked. Guess my body was not ready to really process something. The second round it was easier to drink another sip.</p><p>During the second round the excitement already kicked in that I am on the final lap. Getting closer to the finish line and finally getting through. Done. My siblings already waited for me. Due to my delayed sign up I was in a different starting group than them.</p><p>We all reached the finish line safe and sound. An amazing day!</p><h2 id="thank-you">Thank you</h2><p>A big thank you goes out to all the supporters, family and friends that helped with everything from lending me a bike, to making sure I have time for training, to cheering and keeping my head focused on finishing and not being to competitive.</p><p>After the event is before the event - next sprint distance is planned for the 18th of September - olympic distance 2023! To be continued ...</p>]]></content:encoded></item><item><title><![CDATA[100 days of home office - a recap]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="introduction">Introduction</h2>
<p>On March 16th 2020 our office officially closed. Everyone had to work from home. Since then I have been working from home, round about 100 days.</p>
<p>This is a little recap on what worked well and what did not.</p>
<h3 id="context">Context</h3>
<p>I live in Berlin and we are very fortunate</p>]]></description><link>https://blog.devndive.com/blog/2020/08/24/100-days-of-home-office-a-recap/</link><guid isPermaLink="false">64e89167c6af27537aa34f10</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Mon, 24 Aug 2020 00:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/resp_title_1200.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="introduction">Introduction</h2>
<img src="https://blog.devndive.com/content/images/2023/01/resp_title_1200.jpg" alt="100 days of home office - a recap"><p>On March 16th 2020 our office officially closed. Everyone had to work from home. Since then I have been working from home, round about 100 days.</p>
<p>This is a little recap on what worked well and what did not.</p>
<h3 id="context">Context</h3>
<p>I live in Berlin and we are very fortunate to have a small garden and balcony. In my free time I like playing online games. My setup at home was pretty decent already, a good chair, a very good screen (4k, 60Hz), a small office, no kids.</p>
<h3 id="sortingthingsout">Sorting things out</h3>
<p>The first days and weeks where mostly about figuring things out. How to separate work and life, how to live healthy, how to distribute information and how to stay connected to friends and family.</p>
<h3 id="worklifebalance">Work life balance</h3>
<p>In uncertain times strict schedules help me a lot. This was task one. Start working at 9.00, lunch from 12.00 to 13.00 o&apos;clock, end of day at 17.00. To end the day I did some sports (running or yoga).</p>
<p>The strict schedule frees up my mind and I can focus on other tasks. A clear start and end helps to get into work mode and out of work mode.</p>
<p>With the regained time of not having to commute (about 1 hour a day) we started cooking more and decided to go with <a href="https://www.hellofresh.de/?ref=blog.devndive.com">HelloFresh</a>.</p>
<h3 id="workanddistributinginformation">Work and distributing information</h3>
<p>The actual work and processes we have in our team did not really change. We extended our standup by 20 minutes to compensate for the morning coffee we used to have. Our virtual coffee break is for all topics, off topic, private chat, work stuff anything that is on our minds.</p>
<p>Our nice scrum board at the office got retired and the work is organized with JIRA. We have a lot more comments now on our tickets. This ensures information does not get lost or stays between two people.</p>
<h3 id="livinghealthy">Living healthy</h3>
<ul>
<li>Tracking calories</li>
<li>Breakfast, Lunch, Dinner</li>
<li>Enough and good rest</li>
<li>A bit of sport</li>
</ul>
<p>That&apos;s about all I did.</p>
<h3 id="keepingintouchwithfamilyandfriends">Keeping in touch with family and friends</h3>
<p>My family does not live in Berlin. So it involves travelling which we did not do. Over the time parts of the family came to visit us in Berlin. A vacation where we will see my brother is already planned and booked.</p>
<p>We spend one week of vacation visiting some friends not too far away. This was time very well spent.</p>
<p>Till now, this area of life we did not figure quite out yet. Things are calming down and we will see how to improve here. Of course you can always have a call, but still, kids grow up fast and it is always nice to meet and have some time together.</p>
<h2 id="whatdidnotworksowell">What did not work so well</h2>
<p>Overall things worked out okay. The main parts I will change in the near future are</p>
<h3 id="privatelife">Private life</h3>
<p>To end every work day with some sport is really nice. But we did not manage to keep up with it. Once you start slacking it is really hard to get back into it. The plan now is to not be too ambitious and start with 2 days of sports every week.</p>
<h3 id="atwork">At work</h3>
<p>Staying in contact with people from other teams is not easy. If you have dependencies on each other it is easier. If not, you have to call them and just chat. This part I have been missing out on and will get to more often.</p>
<h2 id="thingsicanrecommend">Things I can recommend</h2>
<p>A few things that I really like in my home office setup. For the sound and video you can check <a href="https://www.hanselman.com/blog/GoodBetterBestCreatingTheUltimateRemoteWorkerWebcamSetupOnABudget.aspx?ref=blog.devndive.com">a blog post from Scott Hanselman</a>. It is a very good starting point.</p>
<h3 id="heightadjustabledesk">Height adjustable desk</h3>
<p>This is the one item that really changed working from home for me. In the morning I enjoy my coffee, prepare the day while sitting. In the afternoon I work standing up. Keeps your mind fresh and helps with your posture.</p>
<h3 id="adecentwebcam">A decent webcam</h3>
<p>When you do a lot of calls, a decent camera gives people looking at you a more face to face feeling. With the build in notebook cameras it is easy to be looking down on people.</p>
<h3 id="microphonesound">Microphone / Sound</h3>
<p>Make sure your sound setup is good. Meetings with bad sound quality are very hard to follow. Test how your voice sounds to others. MS Teams and Skype have a recording function to test what you sound like to others. Make sure you do not annoy people with our sounds for incoming mails or other notifications.</p>
<h2 id="thanksformakingitthisfar">Thanks for making it this far</h2>
<p>There are still a lot of things to improve. Overall I am happy and will ensure that future work is possible to do from home.</p>
<p>Feel free to reach out if you have questions or feedback.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Running my blog on AWS]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="introduction">Introduction</h2>
<p>I have been running my own server for almost 7 years now. Back then you had to buy a SSL certificate and configure it. Later on this became a lot easier with <a href="https://letsencrypt.org/?ref=blog.devndive.com">letsencrypt</a>. Other tasks did not become easier or less time consuming:</p>
<ul>
<li>keeping the software up-to-date</li>
<li>keeping the</li></ul>]]></description><link>https://blog.devndive.com/blog/2020/04/26/running-my-blog-on-aws/</link><guid isPermaLink="false">64e89167c6af27537aa34f1e</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="introduction">Introduction</h2>
<p>I have been running my own server for almost 7 years now. Back then you had to buy a SSL certificate and configure it. Later on this became a lot easier with <a href="https://letsencrypt.org/?ref=blog.devndive.com">letsencrypt</a>. Other tasks did not become easier or less time consuming:</p>
<ul>
<li>keeping the software up-to-date</li>
<li>keeping the os (ubuntu) up-to-date</li>
<li>keeping security settings up-to-date</li>
</ul>
<p>Over time the task to stay up-to-date and having all the security settings correct became to complex and time consuming. Time to let the professionals take over. The following tools had to be replaced:</p>
<ul>
<li>mail server</li>
<li><a href="https://owncloud.org/?ref=blog.devndive.com">OwnCloud</a> (Cross device file sync, calendar and contact sync)</li>
<li>Website / Blog</li>
<li><a href="http://koken.me/?ref=blog.devndive.com">Image Gallery</a></li>
<li><a href="https://www.selfoss.aditu.de/?ref=blog.devndive.com">Selfoss</a> (rss aggregator and reader)</li>
</ul>
<h2 id="whatiwanttoaccomplish">What I want to accomplish</h2>
<p>The target picture is to reduce the effort and be as secure as possible. When using cloud services (SaaS products) you hand over some or all of your data to someone else. This has to be considered when doing your threat modeling.</p>
<ul>
<li>For now, the mail server is shutdown. In the future I might replace it with either <a href="https://purelymail.com/?ref=blog.devndive.com">Purelymail</a> or <a href="https://www.fastmail.com/?ref=blog.devndive.com">Fastmail</a>.</li>
<li>OwnCloud got replaced by <a href="https://www.dropbox.com/?ref=blog.devndive.com">Dropbox</a> and <a href="https://posteo.de/?ref=blog.devndive.com">Posteo</a>.</li>
<li>The blog has been and still is generated with <a href="https://gohugo.io/?ref=blog.devndive.com">Hugo</a>.</li>
<li>The image gallery is now generated with <a href="http://sigal.saimon.org/en/latest/?ref=blog.devndive.com">Sigal</a>. The theme is build custom.</li>
<li>Selfoss got replaced by <a href="https://feedly.com/?ref=blog.devndive.com">Feedly</a>.</li>
</ul>
<h2 id="howididitamdoingit">How I did it / am doing it</h2>
<p>The cancellation for the hosting contract and the request for domain transfer had to be initiated via snail mail. Two days later I had the confirmation and the transfer code.</p>
<p>The services involved for running a static website on AWS are</p>
<ul>
<li>Route53</li>
<li>CloudFront</li>
<li>Lambda@Edge (for prettier URLs like /blog/)</li>
<li>S3</li>
</ul>
<p>The basic architecture:</p>
<pre><code>+---&gt; Route 53 +---&gt; CloudFront +---&gt; /gallery +---&gt; S3 /gallery-bucket/
                                +---&gt; /*       +---&gt; S3 /blog-bucket/

</code></pre>
<h2 id="result">Result</h2>
<p>As a result I now have to maintain a lot less moving parts and can focus on content.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Writing shell scripts]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h1 id="writingshellscripts">Writing shell scripts</h1>
<p>When you are using your terminal a lot during the day make sure to improve your workflow and reduce the number of keystrokes you have to type to perform your daily tasks.</p>
<p>This post will only outline the options and not go to deep into details. There</p>]]></description><link>https://blog.devndive.com/blog/2020/02/25/writing-shell-scripts/</link><guid isPermaLink="false">64e89167c6af27537aa34f20</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Tue, 25 Feb 2020 00:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h1 id="writingshellscripts">Writing shell scripts</h1>
<p>When you are using your terminal a lot during the day make sure to improve your workflow and reduce the number of keystrokes you have to type to perform your daily tasks.</p>
<p>This post will only outline the options and not go to deep into details. There are great posts out there that describe all the details way better than I could.</p>
<p>The focus of this post is a basic overview what you can do and why you want to invest time in your tooling on a shell level.</p>
<h2 id="whatcanshellscriptsdoforyouandyourteam">What can shell scripts do for you and your team?</h2>
<p>It is nice to optimize your own workflow - enabling a whole team to be faster and deliver software with better quality is just amazing.</p>
<h3 id="decreaseonboardingtime">Decrease onboarding time</h3>
<p>When you enter a new team with there development processes and tools might be intimidating at times. Having great tools and scripts makes this easy and even fun for new engineers joining a team. They can focus on finishing the first tasks early and actually contribute from day one without having to learn nifty little details.</p>
<h3 id="streamlinetooling">Streamline tooling</h3>
<p>In case updates to the flow (having extra steps, parameters) can be handled centrally.</p>
<h2 id="startsmall">Start small</h2>
<p>To get used to writing shell scripts that you actually use and make your daily work easier and faster start small.</p>
<h3 id="whatdoesthatmean">What does that mean?</h3>
<p>Let&apos;s assume you have some command that you use for deploying your application. In my case that is a serverless backend on AWS. We use the serverless framework in a multi-repo managed with lerna</p>
<pre><code class="language-bash">npx lerna exec --scope @some/package \
  --stream sls -- deploy -v \
  --param1 value1 \
  --param2 value2
</code></pre>
<p>You can always look it up in your history or wrap it in a little script called <code>deploy</code>. Do not forget to give the script the permission to be executed (<code>chmod +x deploy</code>)</p>
<pre><code class="language-bash">#!/bin/bash

npx lerna exec --scope @some/package
  --stream sls -- deploy -v \
  --param1 value1 \
  --param2 value2
</code></pre>
<p>Now you only have to remember the command <code>deploy</code>. Later you might notice that you can only deploy a specific package because it is hard coded in the script.</p>
<p>Let&apos;s change that!</p>
<h3 id="simpleparameters">Simple parameters</h3>
<p>You can access simple parameters by using <code>$[number]</code>.</p>
<pre><code class="language-bash">#!/bin/bash

PACKAGE_NAME=$1

npx lerna exec --scope &quot;@some/${PACKAGE_NAME}&quot; \
  --stream sls -- deploy -v \
  --param1 value1 \
  --param2 value2
</code></pre>
<p>Now you can deploy whatever package you want by running</p>
<pre><code class="language-bash">deploy package
deploy otherpackage
</code></pre>
<h3 id="anoptionalparametertodeployasinglefunction">An optional parameter to deploy a single function</h3>
<p>A lot of times I just change one function and just want to test that in Lambda. So let&apos;s extend our little script to include the option to deploy a single function.</p>
<pre><code class="language-bash">#!/bin/bash

PACKAGE_NAME=$1
FUNCTION_NAME=$2

# Do we have a function name?
if [ &quot;${FUNCTION_NAME}&quot; != &quot;&quot; ]; then
  # Seems like it, so let&apos;s create the correct parameter
  FUNCTION_PARAM=&quot;--function ${FUNCTION_NAME}&quot;
fi

npx lerna exec --scope &quot;@some/${PACKAGE_NAME}&quot; \
  --stream sls -- deploy -v \
  --param1 value1 \
  --param2 value2 \
  # Append the parameter, if it is empty - nothing gets added
  &quot;${FUNCTION_PARAM}&quot;
</code></pre>
<h2 id="nextsteps">Next steps</h2>
<p>The next steps are a bit more advanced and might be frustrating at times to make them work. Keep at it, the result is usually amazing for you and your team.</p>
<h3 id="autocompletion">Autocompletion</h3>
<p>How to enable autocompletion depends on the shell you are using. Refer to your manual. I use the zsh on a Mac with <a href="https://github.com/ohmyzsh/ohmyzsh?ref=blog.devndive.com">oh-my-zsh</a>.</p>
<p>An example to autocomplete our deployment script with a single function to deploy</p>
<pre><code class="language-bash">#compdef

_deploy_package() {
  local -a functions
  # Extract functions from serverless.yml
  functions=$(grep &apos;^[^[:blank:]]\(.*\):$&apos; ./path/to/serverless.yml | tr -d &apos;:&apos;)

  _alternative &quot;argument:group:($functions)&quot;
}

...

_deploy() {
  local line

  # Autocompletion for our commands
  _commands() {
    local -a commands
    commands=(
      &apos;package:Deploy @some/package&apos;
      &apos;otherpackage:Deploy @some/otherpackage&apos;
    )
    _describe &apos;command&apos; commands
  }

  _arguments -C \
    &quot;1: :_commands&quot; \
    &quot;*::arg:-&gt;args&quot;

  # Autocompletion for the commands - in this case to list all functions
  # from our serverles.yml
  case $line[1] in
    package)       _deploy_package ;;
    otherpackage)  _deploy_otherpackage ;;
  esac
}
</code></pre>
<h2 id="resourcesthatmightcomehandy">Resources that might come handy</h2>
<ul>
<li><a href="https://google.github.io/styleguide/shellguide.html?ref=blog.devndive.com">Shell Style Guide by many Googlers</a></li>
<li><a href="https://shellmagic.xyz/?ref=blog.devndive.com">Bash Quick Reference</a></li>
<li><a href="https://github.com/koalaman/shellcheck?ref=blog.devndive.com">ShellCheck - A shell script static analysis tool</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[About diving and software engineering]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>A frequent question I get &quot;How do software engineering and diving go together?&quot;.<br>
The explanation starts with learning, going to improving your skills, caring<br>
about the environment over to mentoring people to improve their skills.</p>
<!-- more -->
<h3 id="learning">Learning</h3>
<p>In this section I will explain how we (@PADI) let people learn</p>]]></description><link>https://blog.devndive.com/blog/2019/03/22/about-diving-and-software-engineering/</link><guid isPermaLink="false">64e89167c6af27537aa34f11</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Fri, 22 Mar 2019 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/about-diving-and-software-engineering.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.devndive.com/content/images/2023/01/about-diving-and-software-engineering.jpg" alt="About diving and software engineering"><p>A frequent question I get &quot;How do software engineering and diving go together?&quot;.<br>
The explanation starts with learning, going to improving your skills, caring<br>
about the environment over to mentoring people to improve their skills.</p>
<!-- more -->
<h3 id="learning">Learning</h3>
<p>In this section I will explain how we (@PADI) let people learn to dive and how<br>
I let people learn to code.</p>
<h4 id="diving">Diving</h4>
<p>Learning to dive is a live changing experience. The 70% <sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> of our earth<br>
covered by water become a place you can start to discover and explore. You will<br>
be able to see turtles, alligators, dolphins, sharks and all kinds of other<br>
magnificent creatures in their natural habitat. Teaching someone to dive is<br>
more about mentoring them to learn diving by themselves. Training every skill in<br>
a safe environment, a swimming pool or a place with pool like conditions, is the<br>
key. This allows the student to tryout new skills and practice them until<br>
mastering them.</p>
<p>How do you you introduce new skills? You demonstrate them with emphasis on the<br>
key features of the skill <sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>. After the demonstration the student can then<br>
repeat the skill. Once they have mastered the skill they will perform the skill<br>
by themselves in open water (the ocean, a lake, or such) without prior<br>
demonstration. This ensures that they memorized that skill with the key<br>
features.</p>
<h4 id="softwareengineering">Software engineering</h4>
<p>When you start software development it opens completely new areas for your<br>
professional career or a new hobby for your time off. It can start letting you<br>
automate your home or find a new job. When new software engineers start in my<br>
team I make sure that they learn to code or improve their skills by themselves.<br>
New skills will be introduced in a safe environment, version control and our dev<br>
stages. This helps the new person to adjust to our processes, naming<br>
conventions, code styles, etc.</p>
<p>How do you introduce new skills? Depending on the current skillset I let the new<br>
person start with a tutorial and then jump into fixing simple bugs. The tutorial<br>
part can be skipped if skills for the current project are sufficient. Code<br>
reviews and pairing sessions ensure that developers can learn, practice, make<br>
mistakes and get the appropriate feedback to improve further. As they progress<br>
they will implement complete new features and participate more in architecture<br>
discussions.</p>
<h3 id="improvingskills">Improving skills</h3>
<p>Once you have mastered a base set of skills you want to explore new things.</p>
<h4 id="diving">Diving</h4>
<p>Once you have mastered the basics, it is time to advance to new depths, explore<br>
wrecks or dive in cold waters. For these special conditions some more skills are<br>
needed. By now you usually have some idea of what interests you most or which<br>
areas of the world you want to explore. Again you will be looking for a mentor<br>
that can foster safe learning to let you learn and practice the skills so you<br>
can rely on them when needed.</p>
<h4 id="softwareengineering">Software engineering</h4>
<p>After you have gotten a good taste for the project/programming<br>
language/framework it is time to go deeper, explore basic concepts of<br>
libraries/languages/frameworks used. At this point developers start noticing<br>
areas they are really interested in and you can guide them to explore those<br>
areas more. This helps a lot in T-shaping your team.</p>
<h3 id="theenvironment">The environment</h3>
<p>Caring about the environment is very important if you look at things like the<br>
climate change. In the IT world you need to care about the environment by using<br>
resources efficiently and by taking care of the communities you rely on<br>
(stackoverflow, opensource, etc).</p>
<h4 id="diving">Diving</h4>
<p>In diving we can and need to take care of the underwater world. We can do so by<br>
documenting the amount of garbage found <sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup> and cleaning it up. But there are<br>
also things you can do without touching anything, be aware of your fins, avoid<br>
garbage if possible and recycle what ever is possible.</p>
<h4 id="softwareengineering">Software engineering</h4>
<p>Looking at the amount of computers running now a days, it is always a good idea<br>
to make sure you use those resources properly. You can shutdown unneeded servers<br>
in dev and test stages during nights and weekends or you can try to avoid<br>
servers at all (go serverless <sup class="footnote-ref"><a href="#fn4" id="fnref4">[4]</a></sup>).</p>
<p>The other environments that need to be taken care of are the communities that you<br>
rely on. If you are using stackoverflow upvote answers that really helped you.<br>
Of course it is also possible to raise questions and post answers.</p>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p><a href="https://en.wikipedia.org/wiki/Water_distribution_on_Earth?ref=blog.devndive.com">https://en.wikipedia.org/wiki/Water_distribution_on_Earth</a> <a href="#fnref1" class="footnote-backref">&#x21A9;&#xFE0E;</a></p>
</li>
<li id="fn2" class="footnote-item"><p><a href="https://www.youtube.com/watch?v=knWMq-fc9dg&amp;ref=blog.devndive.com">https://www.youtube.com/watch?v=knWMq-fc9dg</a> <a href="#fnref2" class="footnote-backref">&#x21A9;&#xFE0E;</a></p>
</li>
<li id="fn3" class="footnote-item"><p><a href="https://www.projectaware.org/?ref=blog.devndive.com">https://www.projectaware.org/</a> <a href="#fnref3" class="footnote-backref">&#x21A9;&#xFE0E;</a></p>
</li>
<li id="fn4" class="footnote-item"><p><a href="https://serverless.com/?ref=blog.devndive.com">https://serverless.com</a> <a href="#fnref4" class="footnote-backref">&#x21A9;&#xFE0E;</a></p>
</li>
</ol>
</section>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Git tools]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>When working with git for sometime you might encounter some challenges. From making mistakes to growing needs for strategies of branching and merging to monitor the history of accidental committing of secrets.</p>
<!-- more -->
<h3 id="learning">Learning</h3>
<p>There are some resource to learn git - here is a guide you can use to teach</p>]]></description><link>https://blog.devndive.com/blog/2019/02/20/git-tools/</link><guid isPermaLink="false">64e89167c6af27537aa34f1b</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Wed, 20 Feb 2019 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/git-logo-white.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.devndive.com/content/images/2023/01/git-logo-white.jpg" alt="Git tools"><p>When working with git for sometime you might encounter some challenges. From making mistakes to growing needs for strategies of branching and merging to monitor the history of accidental committing of secrets.</p>
<!-- more -->
<h3 id="learning">Learning</h3>
<p>There are some resource to learn git - here is a guide you can use to teach someone a bit more about git</p>
<ul>
<li><a href="https://rachelcarmena.github.io/2018/12/12/how-to-teach-git.html?ref=blog.devndive.com">How to teach Git</a></li>
<li><a href="https://thoughtbot.com/upcase/mastering-git?ref=blog.devndive.com">Mastering Git by thoughtbot</a></li>
<li><a href="https://gitexplorer.com/?ref=blog.devndive.com">Git command explorer</a></li>
</ul>
<h3 id="makingmistakes">Making mistakes</h3>
<p>Be careful what you are doing because you are altering the past, it can have unforeseen consequences for the present and future!</p>
<ul>
<li><a href="https://ohshitgit.com/?ref=blog.devndive.com">Oh shit, git!</a></li>
<li><a href="https://sethrobertson.github.io/GitFixUm/fixup.html?ref=blog.devndive.com">On undoing, fixing, or removing commits in git</a></li>
<li><a href="https://help.github.com/en/articles/changing-author-info?ref=blog.devndive.com">Changing author info</a></li>
</ul>
<h3 id="branchingandmerging">Branching and merging</h3>
<p>The obvious one is <a href="https://nvie.com/posts/a-successful-git-branching-model/?ref=blog.devndive.com">git-flow</a>. Personally I have not used it in any team so far because the &quot;overhead&quot; was just not worth investing time in. The branching model that worked for me best so far:</p>
<p>Having</p>
<ul>
<li>master branch -&gt; CI/CD -&gt; to production / pre production</li>
<li>develop branch -&gt; CI/CD -&gt; to dev stage</li>
<li>feature branches -&gt; CI/CD -&gt; to verify dependencies are up-to-date, linting, unit|e2e tests are passing</li>
</ul>
<p>Merging is always done from feature to develop to master branch. You can gather multiple features in develop and at the end of the sprint / development period merge to master.</p>
<p>This allows you to do hot fixes in production at anytime. Later you can than decide if you merge / cherrypick the hotfix to develop or anything else that works for you.</p>
<h3 id="monitoringyourhistory">Monitoring your history</h3>
<p>There have been some reports of people pushing private keys to public repositories. To check your repositories history for common security relevant filenames and extensions the UK Home Office has published a <a href="https://github.com/UKHomeOffice/repo-security-scanner?ref=blog.devndive.com">repo-security-scanner</a> than can be configured to look for certain things in the history.</p>
<p>Be aware that this is only a post commit measurement, so stuff has already been committed and maybe pushed.</p>
<h3 id="gitindetailwriteyourowngitclient">Git in detail - write your own git client</h3>
<ul>
<li><a href="https://wyag.thb.lt/?ref=blog.devndive.com">Write your own git client</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Bootstrap themes and alternatives]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Nowadays, it has become quite easy to build nice looking websites without investing time into your styling.</p>
<p>Here are some libraries to try</p>
<p>Currently using in my project learning vuejs</p>
<ul>
<li><a href="https://getuikit.com/?ref=blog.devndive.com">getuikit</a></li>
</ul>
<p>Used in my project to explore current version of angular</p>
<ul>
<li><a href="https://www.getpapercss.com/?ref=blog.devndive.com">papercss</a></li>
</ul>
<h3 id="nonbootstrapbased">Non bootstrap based</h3>
<ul>
<li><a href="http://element.eleme.io/?ref=blog.devndive.com#/en-US">Element</a></li>
<li><a href="https://bulma.io/?ref=blog.devndive.com">Bluma</a></li>
<li><a href="https://milligram.io/?ref=blog.devndive.com">Milligram</a></li>
</ul>
<h3 id="somethemesforbootstrap">Some themes</h3>]]></description><link>https://blog.devndive.com/blog/2018/05/06/bootstrap-themes-and-alternatives/</link><guid isPermaLink="false">64e89167c6af27537aa34f13</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Sun, 06 May 2018 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/bootstrap-themes-and-alternatives.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.devndive.com/content/images/2023/01/bootstrap-themes-and-alternatives.png" alt="Bootstrap themes and alternatives"><p>Nowadays, it has become quite easy to build nice looking websites without investing time into your styling.</p>
<p>Here are some libraries to try</p>
<p>Currently using in my project learning vuejs</p>
<ul>
<li><a href="https://getuikit.com/?ref=blog.devndive.com">getuikit</a></li>
</ul>
<p>Used in my project to explore current version of angular</p>
<ul>
<li><a href="https://www.getpapercss.com/?ref=blog.devndive.com">papercss</a></li>
</ul>
<h3 id="nonbootstrapbased">Non bootstrap based</h3>
<ul>
<li><a href="http://element.eleme.io/?ref=blog.devndive.com#/en-US">Element</a></li>
<li><a href="https://bulma.io/?ref=blog.devndive.com">Bluma</a></li>
<li><a href="https://milligram.io/?ref=blog.devndive.com">Milligram</a></li>
</ul>
<h3 id="somethemesforbootstrap">Some themes for bootstrap</h3>
<ul>
<li><a href="http://bootstrap.themes.guide/?ref=blog.devndive.com">Bootstrap 4 Themes</a></li>
<li><a href="https://flatlogic.github.io/sing-app/?ref=blog.devndive.com">Sign app - Admin template</a></li>
<li><a href="https://www.patternfly.org/?ref=blog.devndive.com">PatternFly</a></li>
</ul>
<h3 id="iconsets">Iconsets</h3>
<ul>
<li><a href="https://webkul.github.io/vivid/?ref=blog.devndive.com">vivid.js</a></li>
<li><a href="https://octicons.github.com/?ref=blog.devndive.com">octicons</a></li>
</ul>
<h3 id="vectorgraphics">Vector graphics</h3>
<ul>
<li><a href="https://gallery.manypixels.co/?ref=blog.devndive.com">Illustration Gallery by manypixels</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Diving accidents a real life example without injuries]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="settingthescene">Setting the scene</h3>
<p>It is about 35&#xB0; in Egypt, the water is about 24-25&#xB0; degrees warm. We are a group of 10 divers and 2 snorkelers. We start out for a trip to Tiran Island.</p>
<h3 id="gettingthere">Getting there</h3>
<p>Leaving the dive center at around 8.15 o&apos;clock</p>]]></description><link>https://blog.devndive.com/blog/2018/03/05/diving-accidents-a-real-life-example-without-injuries/</link><guid isPermaLink="false">64e89167c6af27537aa34f17</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Mon, 05 Mar 2018 16:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="settingthescene">Setting the scene</h3>
<p>It is about 35&#xB0; in Egypt, the water is about 24-25&#xB0; degrees warm. We are a group of 10 divers and 2 snorkelers. We start out for a trip to Tiran Island.</p>
<h3 id="gettingthere">Getting there</h3>
<p>Leaving the dive center at around 8.15 o&apos;clock left everybody with the possibility to a breakfast before hand. Planned are 3 dives and we should be back around 5 o&apos;clock.</p>
<p>At 8.45 we arrive at the harbour. Our equipment was with us in the car. For the divers with rental equipment, other equipment had to be organized. I never figured out why they could not take the gear the rented and knew.</p>
<p>From other trips before, we (me and my girlfriend) already know that we have to be a bit patient at the harbour. We have to wait for 30minutes. Our boat is not there yet.</p>
<p>Around 9.30, the boat arrives and we can hop on. Nice. No tanks, no equipment. So we wait on the sundeck for the equipment. At 10 o&apos;clock the guide comes from the diving deck asking us to check our equipment if we forgot anything because he is making a call to some dive shop now. I explain to him that we can not check equipment that is not there ...<br>
Around 10.15 the equipment and tanks arrive and are loaded onto the boat. &quot;Divers prepare your equipment please!&quot;</p>
<p>We prepare our stuff - everything from us is there. The rental equipment gets handed out. Torn and really out of shape regulators. One pressure gauge reads 170 bar. Take a new tank, same thing, take a different pressure gauge - 200 bar. Faulty equipment, BCDs with ripped pockets, glued inflators, you name it. Some people get snorkeling fins for diving - soft and short blades.</p>
<p>Before I get to prepare my weights we have to get to the sun deck because we are leaving the harbour now at 10.45! My girlfriend was lucky and got done. I prepare my weights 10minutes into the boat ride.</p>
<h3 id="briefing">Briefing</h3>
<p>&quot;Divers, briefing on the dive deck!&quot; Whoop Whoop let&apos;s go! It is 12.20 now.</p>
<p>Guide: &quot;Okay, equipment is prepared, weights are ready&quot;<br>
Someone: &quot;No, we did not prepare weights, yet!&quot;<br>
Guide: &quot;Oh okay, then do that now please&quot;</p>
<p>Weights are ready, again, briefing.</p>
<p>The dive planning is presented, hand signals are explained, turn pressure is 100 bar, everything you need is being talked about. Nothing special, nothing really missing. We have two plans, one for with current one for without.</p>
<p>Finally wet suite time! At 12.50 we are finally in the water. Two divers have trouble going down to about 3-4 meters. Missing weights? Nothing a guide can solve be pulling the divers down a bit. Remember the &quot;new&quot; rental equipment - no weight checks. 15minutes into the dive we reach the actual reef where a bit of current is encountered. For us it did not seem like current, but for more unexperienced divers this might have been a challenge. So we start ascending to the top of the reef where we try to stay close to the bottom (around 8meters).<br>
The first person is struggling to stay down and constantly trying to swim downwards - with snorkeling fins. This diver gets really tired and is using a lot of air. After the guide realized this he gave the diver about 2 extra kilos of weights which solved the problem. This diver had to take a rest with his partner to catch some breath. The guide is swimming in front and we divers waited with the tired couple. We could not see the guide anymore - so we wait as a group for about 5-8 minutes until he comes back and signals us to follow. I guess some miscommunication happened. The next diver is having a hard time staying at 6-8meters. The divers tank is at about 50 bar. Just to make sure I signal the guide that this diver has only 50 bar left. Staying close to this diver and making sure he breathes calmly helps him stay at level. This diver is on his 11th dive - 4 from Open Water, 5 from Advanced Course and one check dive the day before. We get to the boats, at this time about 18 boats at this dive site. You can imagine the noise. We have to dive beneath the boats and stay low, because some boats are leaving, the diver with 50 bar is now at about 10 bar, I signal the guide. I stay close to this diver but I am not here to safe the world and supply people with air. But I prepare myself and the diver for the worst. Luckily only one boat is leaving above us and we can start our ascend.</p>
<p>The dive felt really chaotic with a lot of miscommunication and not very professional. Was it the guide, the people, the equipment, the environment? Probably a mix of everything. Never the less we are back on the boat after a 50minute dive. It is 1.40 now - actually lunch time.</p>
<h3 id="thelunch">The lunch</h3>
<p>I am really hungry and the crew is preparing the lunch. Since I already knew we are on a tight schedule I check how much time we plan for the surface interval. About an hour - hmmm - lunch is prepared we have to change tanks - it feels like not enough time because eating right before the next dive is not a good idea.<br>
So I ask the guide what the plan is, he says we could prepare a plate and eat after the second dive. We are in our wet suits and the lunch is in the dry area of the boat. The diver with low air before is not participating in the second dive because 50minutes of surface time does not feel enough for him. He stays strong even after repeated questions by people! I like this diver, he is not feeling prepared and rested for the next dive and sits out. Never go diving if you do not feel it is the right decision. There were no snacks (candy bars, bananas, other fruits or some bread) for us who decided to eat later. Going diving hungry is not very good either. But I prefer this over eating right before diving.</p>
<h3 id="theseconddive">The second dive</h3>
<p>People just ate and are now getting their equipment ready. The plan is a drift dive. Standing ready at the edge we are waiting for the &quot;go&quot;. But instead someone is calling &quot;use the yellow one, use the yellow one, the other one is free flowing when you breath&quot; - this does not sound good. Looking around I can see a person cleaning an octopus with his finger. We are just moments before the dive.<br>
But nevertheless just a minute later we are all underwater and descending to about 16meters. The freshly cleaned octopus seems to be operating okay. Nevertheless another diver seems to have a problem and starts ascending rapidly. The guide catches up to him and makes sure the person breathes calmly. They are 8-10meters above us and we have no clue what is going on. It seems like they are already doing their safety stop and it seems like they try to signal each other to cancel the dive. Clear communication is missing - again.<br>
Some people are still looking around at the reef. Seems like they did not notice anything yet. Me and my girlfriend ascended to about 10meters to safe some air and check what is happening. The guide signals me to cancel the dive but still do the safety stop - on our safety stop we signal the other divers to cancel and do a safety stop. At the surface the boat is already trying to approach us. The boat crew deploys a line and pulls us all in.<br>
On deck the diver who tried to ascend rapidly described a feeling of not being able to breath, not being able to see anymore and dizziness. Now he is feeling better only the dizziness is still present. He is laying down and given some emergency oxygen just in case.<br>
Now we are having our little lunch break and a boat ride of about 1,5 hours.</p>
<h3 id="thethirddive">The third dive</h3>
<p>On the third dive we are only three divers plus the guide. The dive site is quite nice but with only 30minutes of diving it feels really short and just rushing through.</p>
<h3 id="whatcouldweasdivershavedonebetter">What could we as divers have done better?</h3>
<p>When you rent equipment make sure it is in a decent state. This equipment is meant to keep you alive under water!</p>
<p>Ensure you have proper breaks between dives</p>
<p>If you have new equipment (BCD, Wetsuit) do weight check or pack some extra weights and do a weight check after the dive.</p>
<h3 id="whatcouldthetripoperatorhavedonebetter">What could the trip operator have done better?</h3>
<p>Proper time management. If there is no room for three dives - do not squeeze them in. It will just make the time management even worse.</p>
<p>If you are guiding a big group (for me this would be more than 4 divers) you have to have very clear communication and make sure everyone can see your signals.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Ghost in the shell]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>About running ghost in a docker container and having no troubles with file permissions</p>
<pre><code class="language-bash">#!/bin/bash

docker run -d \
    --name ghost-blog-v1 \
    -p 9999:2368 \
    -e NODE_ENV=production \
    -e url=[URL to your blog] \
    -v ${PWD}:/var/lib/ghost/content \
    -v /etc/group:/etc/group:ro \
    -v /etc/passwd:/etc/</code></pre>]]></description><link>https://blog.devndive.com/blog/2017/06/11/ghost-in-the-shell/</link><guid isPermaLink="false">64e89167c6af27537aa34f1a</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Sun, 11 Jun 2017 16:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>About running ghost in a docker container and having no troubles with file permissions</p>
<pre><code class="language-bash">#!/bin/bash

docker run -d \
    --name ghost-blog-v1 \
    -p 9999:2368 \
    -e NODE_ENV=production \
    -e url=[URL to your blog] \
    -v ${PWD}:/var/lib/ghost/content \
    -v /etc/group:/etc/group:ro \
    -v /etc/passwd:/etc/passwd:ro \
    -u $(id -u $USER):$(id -g $USER) \
    ghost:1.16-alpine
</code></pre>
<p>By mapping the group and passwd as readonly you can easily share files between the container and your host.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Mousse au chocolat]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Zutaten:</p>
<ul>
<li>2 Tafeln gute dunkle Schokolade, am besten Zartbitter</li>
<li>4 Eier</li>
<li>1 Becher Schlagsahne (250 ml)</li>
<li>Etwa 50 Gramm Zucker</li>
<li>2 bis 3 Essl&#xF6;ffel kochendes Wasser (Die Wassermenge kann nach Belieben durch Lik&#xF6;r, Cognac etc. ersetzt werden)</li>
</ul>
<p>Schokolade im Wasserbad schmelzen.</p>
<p>Nachdem Eigelb und Eiwei&#xDF;</p>]]></description><link>https://blog.devndive.com/blog/2017/05/11/mousse-au-chocolat/</link><guid isPermaLink="false">64e89167c6af27537aa34f1c</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Thu, 11 May 2017 16:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Zutaten:</p>
<ul>
<li>2 Tafeln gute dunkle Schokolade, am besten Zartbitter</li>
<li>4 Eier</li>
<li>1 Becher Schlagsahne (250 ml)</li>
<li>Etwa 50 Gramm Zucker</li>
<li>2 bis 3 Essl&#xF6;ffel kochendes Wasser (Die Wassermenge kann nach Belieben durch Lik&#xF6;r, Cognac etc. ersetzt werden)</li>
</ul>
<p>Schokolade im Wasserbad schmelzen.</p>
<p>Nachdem Eigelb und Eiwei&#xDF; vorsichtig voneinander getrennt wurden, wird das Eiwei&#xDF; zun&#xE4;chst steif geschlagen.</p>
<p>Anschlie&#xDF;end muss auch die Sahne steif geschlagen werden.</p>
<p>Beides wird unabh&#xE4;ngig voneinander zun&#xE4;chst in den K&#xFC;hlschrank gestellt.</p>
<p>In der Zwischenzeit werden Eigelb, Zucker und Wasser in einer Sch&#xFC;ssel so lange verr&#xFC;hrt (Mixer), bis eine schaumartige Masse entstanden ist. Danach wird die geschmolzene Schokolade hinzugef&#xFC;gt und so lange vorsichtig einger&#xFC;hrt, bis eine z&#xE4;he braune Masse entstanden ist.</p>
<p>Damit die Mousse au Chocolate nicht erstarrt und sich keine Klumpen bilden, wird am besten mit einem Schneebesen weitergearbeitet und zuerst das Eiwei&#xDF; und danach die Sahne <em>behutsam</em> unter die Masse gehoben.</p>
<p>Die fertige Mousse au Chocolate hat ein hellbraunes schaumiges Aussehen und ist zun&#xE4;chst noch fl&#xFC;ssig. In Portionsgef&#xE4;&#xDF;e umgef&#xFC;llt wird die Masse in der Regel im K&#xFC;hlschrank innerhalb von 4 Stunden fest und verzehrfertig, dann steht dem Genuss der leckeren Mousse nichts mehr im Wege.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Anreise die 2te]]></title><description><![CDATA[<p>Bremen, 30.08.2016: Endlich geht auch f&#xFC;r mich die Reise los. Gestartet wird am Bremer Hauptbahnhof und auf gehts in Richtung Frankfurt. Eine Nacht verbringe ich in einem Hotel am Flughafen. Nach einem gem&#xFC;tlichen Fr&#xFC;hst&#xFC;ck geht es langsam auf zum Terminal.</p>]]></description><link>https://blog.devndive.com/blog/2016/09/07/anreise-die-2te/</link><guid isPermaLink="false">64e89167c6af27537aa34f12</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Wed, 07 Sep 2016 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/anreise-die-2te-featured.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.devndive.com/content/images/2023/01/anreise-die-2te-featured.jpg" alt="Anreise die 2te"><p>Bremen, 30.08.2016: Endlich geht auch f&#xFC;r mich die Reise los. Gestartet wird am Bremer Hauptbahnhof und auf gehts in Richtung Frankfurt. Eine Nacht verbringe ich in einem Hotel am Flughafen. Nach einem gem&#xFC;tlichen Fr&#xFC;hst&#xFC;ck geht es langsam auf zum Terminal.<br>Zum Gl&#xFC;ck macht der Check-In Schalter schon etwas fr&#xFC;her auf, so dass die Wartezeit nicht allzu lang ist.</p><p>Mein Flug soll eigentlich um 15:15 starten... W&#xE4;re nicht genau an dem Tag irgend so ein Depp der Meinung gewesen es ist eine super Idee sich in den abgesperreten Bereich eines Flughafens zu begeben, ohne sich vorher odnungsgem&#xE4;&#xDF; vom Flughafenpersonal checken zu lassen... Von dem ganzen Evakuierungsprozedere bekomme ich zum Gl&#xFC;ck nichts mit. Nur die Auswirkungen bekomme ich zu sp&#xFC;ren. Statt 15:15 steht pl&#xF6;tzlich 17:15 an meinem Abfluggate. Nach ca. einer Stunde warten ohne irgendwelche Infos gibt es dann eine Durchsage, dass der Flieger nach M&#xFC;nchen umgeleitet wurde und jetzt auf dem Weg nach Frankfurt sei. Naja mal abwarten, der Puffer in Dubai zum Umsteigen sollte auf jeden Fall locker reichen.</p><p>Um ca. 17:30 geht dann auch endlich das Boarding los und kurz danach ist der Flieger in der Luft.<br>In Dubai habe ich dann statt der eigentlichen 4 Stunden nur noch ca. 1 1/2 Stunden zum Umsteigen, was aber auch noch ohne Stress reicht. Der Flug nach Manila kann dann wegen technischer Probleme am Flughafen erst etwa eine halbe Stunde sp&#xE4;ter als geplant starten.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/IMG_0009.JPG" class="kg-image" alt="Anreise die 2te" loading="lazy" width="966" height="1288" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/IMG_0009.JPG 600w, https://blog.devndive.com/content/images/2023/01/IMG_0009.JPG 966w" sizes="(min-width: 720px) 720px"><figcaption>Sonnenuntergang vom Flugzeug aus</figcaption></figure><p>Nach einem wieder sehr ruhigen Flug lande ich dann endlich um ca. 17 Uhr Ortzeit am 01.09 in Manila. Dort werde ich von Yann in Empfang genommen.</p><p>Da es schon zu sp&#xE4;t ist um noch mit der schnellen Bootsverbindung nach Sabang Beach zu kommen und Yann noch eine Besorgung f&#xFC;r das Hotel machen muss bleiben wir f&#xFC;r eine Nacht in Manila. Die Besitzer des Hotels haben dort ein kleines Appartment, welches sie bei Bedarf ihren G&#xE4;sten zur Verf&#xFC;gung stellen. Leider m&#xFC;ssen wir am n&#xE4;chsten Morgen schon um 6:30 wieder los (irgendwas mit bestimmte Autos d&#xFC;rfen ab einer bestimmten Uhrzeit nicht mehr in der Stadt fahren). Also holt uns unser Fahrer ab und bringt uns au&#xDF;erhalb zu einem Einkaufszentrum (Yann muss ja noch was besorgen). Die Shops dort machen um 10:00 Uhr auf, wir sind um 7:00 Uhr dort. Zum Gl&#xFC;ck ist schon ein Cafe ge&#xF6;ffnet. Also irgendwie 3 Stunden mit Kaffee und Fr&#xFC;hst&#xFC;ck rumbekommen, dann kurz 5 Minuten die Besorgung erledigen und weiter gehts in Richtung Hotel.</p><p>Da Sabang Beach auf einer anderen Insel liegt als Manila, muss man wohl oder &#xFC;bel mit dem Boot fahren. Die hei&#xDF;en hier traditionell Bankas und sind etwas abenteuerlich. Zum Gl&#xFC;ck spielt das Wetter mit und es ist nicht allzu wellig.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/01_Anfahrt_Sabang_klein.jpg" class="kg-image" alt="Anreise die 2te" loading="lazy" width="1266" height="838" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/01_Anfahrt_Sabang_klein.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/01_Anfahrt_Sabang_klein.jpg 1000w, https://blog.devndive.com/content/images/2023/01/01_Anfahrt_Sabang_klein.jpg 1266w" sizes="(min-width: 720px) 720px"><figcaption>Anfahrt auf Sabang</figcaption></figure><p>Nach ca. 1 1/2 Stunden Boot fahren (inkl. einer Delfin Sichtung) bin ich endlich in Sabang Beach und dem Garden of Eden angekommen.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/07_Bar_klein.jpg" class="kg-image" alt="Anreise die 2te" loading="lazy" width="1019" height="664" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/07_Bar_klein.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/07_Bar_klein.jpg 1000w, https://blog.devndive.com/content/images/2023/01/07_Bar_klein.jpg 1019w" sizes="(min-width: 720px) 720px"><figcaption>Ausblick aus dem Restaurant</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Die ersten Eindrücke]]></title><description><![CDATA[<p>Ich bin hier. Es geht los. Naja, noch nicht so wirklich. Mehr als ein kaputtes Netzteil auswechseln und eine Software f&#xFC;r einen <a href="http://www.wxtide32.com/?ref=blog.devndive.com">Tidencalendar</a> installieren ist noch nicht zu tun.</p><p>So kann man erstmal in Ruhe ankommen. Tauchequipment ist jetzt auch vorbereitet. Der erste Tauchgang muss aber noch ein</p>]]></description><link>https://blog.devndive.com/blog/2016/08/19/die-ersten-eindruecke/</link><guid isPermaLink="false">64e89167c6af27537aa34f16</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Fri, 19 Aug 2016 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/die-ersten-eindruecke-featured.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://blog.devndive.com/content/images/2023/01/die-ersten-eindruecke-featured.jpg" alt="Die ersten Eindr&#xFC;cke"><p>Ich bin hier. Es geht los. Naja, noch nicht so wirklich. Mehr als ein kaputtes Netzteil auswechseln und eine Software f&#xFC;r einen <a href="http://www.wxtide32.com/?ref=blog.devndive.com">Tidencalendar</a> installieren ist noch nicht zu tun.</p><p>So kann man erstmal in Ruhe ankommen. Tauchequipment ist jetzt auch vorbereitet. Der erste Tauchgang muss aber noch ein wenig warten da gerade eine Gruppe aus Wien hier ist.</p><h5 id="der-bungalow">Der Bungalow</h5><p>Der Bungalow liegt auf einer Anh&#xF6;he.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/Bungalow-1-1.jpg" class="kg-image" alt="Die ersten Eindr&#xFC;cke" loading="lazy" width="979" height="1306" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/Bungalow-1-1.jpg 600w, https://blog.devndive.com/content/images/2023/01/Bungalow-1-1.jpg 979w" sizes="(min-width: 720px) 720px"><figcaption>Bungalow auf einer Anh&#xF6;he</figcaption></figure><p>Es sind schon einige Treppen die man erklimmen muss, daf&#xFC;r hat man einen sch&#xF6;nen Ausblick.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/Bungalow-2-1.jpg" class="kg-image" alt="Die ersten Eindr&#xFC;cke" loading="lazy" width="979" height="1306" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/Bungalow-2-1.jpg 600w, https://blog.devndive.com/content/images/2023/01/Bungalow-2-1.jpg 979w" sizes="(min-width: 720px) 720px"><figcaption>Treppen zum Bungalow</figcaption></figure><h3 id="essen">Essen</h3><p>Fr&#xFC;hst&#xFC;ck!</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/Fruehstueck.jpg" class="kg-image" alt="Die ersten Eindr&#xFC;cke" loading="lazy" width="1306" height="979" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/Fruehstueck.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/Fruehstueck.jpg 1000w, https://blog.devndive.com/content/images/2023/01/Fruehstueck.jpg 1306w" sizes="(min-width: 720px) 720px"><figcaption>Das Fr&#xFC;hst&#xFC;ck</figcaption></figure><p>Ausblick beim Abendessen - l&#xE4;uft.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.devndive.com/content/images/2023/01/Abendessen.jpg" class="kg-image" alt="Die ersten Eindr&#xFC;cke" loading="lazy" width="1306" height="979" srcset="https://blog.devndive.com/content/images/size/w600/2023/01/Abendessen.jpg 600w, https://blog.devndive.com/content/images/size/w1000/2023/01/Abendessen.jpg 1000w, https://blog.devndive.com/content/images/2023/01/Abendessen.jpg 1306w" sizes="(min-width: 720px) 720px"><figcaption>Ausblick beim Abendessen</figcaption></figure>]]></content:encoded></item><item><title><![CDATA[Die Anreise]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="esgehtlos">Es geht los</h3>
<p>Freitag, 12.08.2016<br>
Online Checkin</p>
<p>Samstag, 13.08.2016:<br>
12.03 CET - 12.55 CET Uhr - U-Bahn zum Flughafen<br>
15.15 CET - 23.35 GST Uhr - Flug von FRA nach DXB</p>
<p>Sonntag, 14.08.2016:<br>
Boarding f&#xFC;r den Flug nach</p>]]></description><link>https://blog.devndive.com/blog/2016/08/17/die-anreise/</link><guid isPermaLink="false">64e89167c6af27537aa34f15</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Wed, 17 Aug 2016 16:00:00 GMT</pubDate><media:content url="https://blog.devndive.com/content/images/2023/01/die-anreise-featured.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="esgehtlos">Es geht los</h3>
<img src="https://blog.devndive.com/content/images/2023/01/die-anreise-featured.jpg" alt="Die Anreise"><p>Freitag, 12.08.2016<br>
Online Checkin</p>
<p>Samstag, 13.08.2016:<br>
12.03 CET - 12.55 CET Uhr - U-Bahn zum Flughafen<br>
15.15 CET - 23.35 GST Uhr - Flug von FRA nach DXB</p>
<p>Sonntag, 14.08.2016:<br>
Boarding f&#xFC;r den Flug nach Manila beginnt laut Boardingpass und Anzeige um 2.45 Uhr morgens. F&#xFC;r Notf&#xE4;lle den Wecker gestellt auf 2.30 Uhr. Der Wecker klingelt p&#xFC;nktlich, Rucksack auf, ab zu den Toilette - Z&#xE4;hneputzen. Auf dem Weg dorthin, ca. 2.35 Uhr eine Durchsage - EK332 (mein Flug) Final Call! Erster Gedanke - <strong>FUCK</strong> - ab zum Gate! Am Gate angekommen stellt sich zum Gl&#xFC;ck heraus, dass das eine falsche Ansage war und das Boarding noch nicht begonnen hat. Ich bin wieder hellwach. Boarding beginnt regul&#xE4;r um 2.45 Uhr. Es geht weiter.</p>
<p>03.30 GST - 16.15 PHT Uhr - Flug von DXB nach MNL</p>
<p>Warten auf eine Gruppe die um 21.40 Uhr landen soll. Leider hat der Flug Versp&#xE4;tung - Landezeit 22.10 Uhr. Zeit bei Starbucks &#xFC;berbr&#xFC;ckt, zum Gl&#xFC;ck gibt es kostenloses WLAN, Pok&#xE9;stops, Lockmodule, Kaffee, Kekse, alles was man zum leben braucht.</p>
<p>Nachdem die Gruppe ihr Gep&#xE4;ck eingesammelt hat (ca. 22.40 Uhr) f&#xE4;hrt leider kein Boot mehr zur Insel Mindoro. Erst wieder ab ca. 5.00 Uhr...</p>
<p>Montag, 15.08.2016:<br>
Ankunft an einer gro&#xDF;en Rastst&#xE4;tte mit einigen Kaffees um ca. 0.00 Uhr. Von hier aus brauchen wir zum Hafen ca. 1,5 Stunden. Also Zeit bis 2.30 Uhr erschlagen. Besser hier als am Hafen, am Hafen gibt es nichts.</p>
<p>Abfahrt 2.30 Uhr. Am ersten Hafen sind die Wellen leider zu gro&#xDF;. Ab zum n&#xE4;chsten. Ankunft 4.45 Uhr. Boote noch nicht da. 5.30 Uhr, die Boote treffen ein. Gep&#xE4;ck wird verladen, alle 23 Personen steigen ein ... Abfahrt 6.30 Uhr.</p>
<p>1,5 Stunden sp&#xE4;ter, klitschnass und ein paar Wellen sp&#xE4;ter endlich Ankunft auf Mindoro im Garden of Eden.</p>
<p>Zum Fr&#xFC;hst&#xFC;ck erstmal Strammer Max und einen Kaffee. Um 10.00 Uhr bin ich erstmal auf dem Zimmer und komme zu Schlaf in einem richtigen Bett! Nach 38 Stunden Anreise, mehr als n&#xF6;tig!</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Vorbereitungen]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h3 id="habenwiranallesgedacht">Haben wir an alles Gedacht?</h3>
<p>Was muss man eigentlich tun wenn man f&#xFC;r ein l&#xE4;ngeren Zeitraum ins Ausland will? Gute Frage, n&#xE4;chste Frage. Am Anfang steht erstmal der &#xDC;berblick.</p>
<p>Hier mal ein paar Punkte als Beispiel</p>
<h5 id="laufendekostenundvertrge">Laufende Kosten und Vertr&#xE4;ge</h5>
<ul>
<li>Private</li></ul>]]></description><link>https://blog.devndive.com/blog/2016/08/16/vorbereitungen/</link><guid isPermaLink="false">64e89167c6af27537aa34f1f</guid><dc:creator><![CDATA[Yann Duval]]></dc:creator><pubDate>Tue, 16 Aug 2016 16:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h3 id="habenwiranallesgedacht">Haben wir an alles Gedacht?</h3>
<p>Was muss man eigentlich tun wenn man f&#xFC;r ein l&#xE4;ngeren Zeitraum ins Ausland will? Gute Frage, n&#xE4;chste Frage. Am Anfang steht erstmal der &#xDC;berblick.</p>
<p>Hier mal ein paar Punkte als Beispiel</p>
<h5 id="laufendekostenundvertrge">Laufende Kosten und Vertr&#xE4;ge</h5>
<ul>
<li>Private Altersvorsorge</li>
<li>Betriebliche Altersvorsorge</li>
<li>Zusatzkrankenversicherung</li>
<li>Zeitschriften Abos</li>
<li>Berufsunf&#xE4;higkeitsversicherung</li>
<li>Haftpflichtversicherung</li>
<li>Hausratversicherung</li>
<li>Mobilfunkvertr&#xE4;ge</li>
<li>Vereinsmitgliedschaften</li>
<li>Internet / Telefon</li>
<li>...</li>
</ul>
<h5 id="gesundheit">Gesundheit</h5>
<ul>
<li>Tauchtauglichkeit noch g&#xFC;ltig? (nur f&#xFC;r Taucher)</li>
<li>Impfungen n&#xF6;tig f&#xFC;r das Zielland?</li>
<li>Zahnarzt (f&#xFC;rs Bonusheft)</li>
<li>Auslandskrankenversicherung</li>
<li>...</li>
</ul>
<h5 id="diewohnung">Die Wohnung</h5>
<ul>
<li>Untervermieten</li>
<li>Aufl&#xF6;sen / Einlagern</li>
<li>...</li>
</ul>
<h5 id="sonstiges">Sonstiges</h5>
<ul>
<li>Ummeldung / Abmeldung</li>
<li>Eventuell den Vertragspartner eine neue Anschrift mitteilen</li>
<li>Bei limitiertem / unvorhersehbarem Cashflow ggf. Vertr&#xE4;ge k&#xFC;ndigen oder Beitragsfrei setzen</li>
</ul>
<p>Die Liste gibt nur einen kurzen &#xDC;berblick. Je nach Situation k&#xF6;nnen noch weitere Punkte dazu kommen oder wegfallen.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>