<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.5">Jekyll</generator><link href="https://gosein.de/feed.xml" rel="self" type="application/atom+xml" /><link href="https://gosein.de/" rel="alternate" type="text/html" /><updated>2024-03-11T13:29:48+01:00</updated><id>https://gosein.de/feed.xml</id><title type="html">Dom’s Blog</title><subtitle>A blog dedicated to software engineering, work and life.</subtitle><author><name>Domenic Gosein</name></author><entry><title type="html">Navigating the Chaos: My Inaugural Experience at CCC in Hamburg!</title><link href="https://gosein.de/37c3.html" rel="alternate" type="text/html" title="Navigating the Chaos: My Inaugural Experience at CCC in Hamburg!" /><published>2023-12-30T00:00:00+01:00</published><updated>2023-12-30T00:00:00+01:00</updated><id>https://gosein.de/37c3</id><content type="html" xml:base="https://gosein.de/37c3.html"><![CDATA[<p>Four exciting days at the 37C3 have come to an end, and it’s time to look back on some of the interesting things I saw and learned.
The Chaos Computer Club usually hosts a convention every year, but this year was special because it was the first in-person convention after the COVID pandemic, and it took place in the newly renovated Congress Center Hamburg.
<!--more--></p>

<p><img src="/assets/2023-12-30-37c3/37c3_rocket.jpg" alt="rocket" /></p>

<p>This is my first time at the congress, after many years of wanting to go, I finally made it wuhuu! Let’s start with the fact that it’s an overwhelming experience, I haven’t had so many new impressions and exciting things happening in such a short time in a long time. For me, the congress felt like a mix between a conference and a festival, the many gatherings and open spaces filled with everything you can imagine, plus the curated talks and self-organized session that left a lasting impression on me and allowed me to learn a lot, so here I want to share some of the talks I listened to. This is a random collection and there was/is still much more to explore, but this might give you some inspiration to start with.</p>

<p><img src="/assets/2023-12-30-37c3/37c3_castle.jpg" alt="castle" /></p>

<p><strong>First up is: <a href="https://media.ccc.de/v/camp2023-57307-cosmic_connectivity">“Cosmic Connectivity - Starlink, Satellite Swarms and the Hackers’ Final Frontier”</a></strong> - this talk was about LEO satellites that provide connectivity services like Starlink, besides the facts about the constellation of these small satellites, how they are stacked in multiple layers and the rockets used to transport them, the economic aspects were especially interesting. The presenter talked about the huge growth and valuation of Starlink and the huge gap for payload transportation as sending satellites into space becomes more popular. I guess this will make <em>someone</em> even richer if other companies don’t accelerate their development of rockets and space services.</p>

<p><strong>Next I would like to mention the <a href="https://media.ccc.de/v/37c3-11825-science_slam">Science Slam on day 2</a></strong> which was about saving the world with science if people listened to science, the talk contained a lot of memes and its best to see for yourself.</p>

<p><strong>The NGO behind Tor gave an interesting <a href="https://media.ccc.de/v/37c3-12040-tor_censorship_attempts_in_russia_iran_turkmenistan">technical talk about Tor</a></strong>, Tor censorship, and how they circumvent it in Russia, Iran, and Turkmenistan. The talk was also a bit amusing as the audience got a glimpse into the Russian censorship department, which apparently works with Excel lists to manually track and block Tor bridges.</p>

<p><strong>Social Engineering</strong>, now more important than ever, <a href="https://media.ccc.de/v/37c3-11721-social_engineering_geschichte_wirkung_massnahmen">find out how to protect yourself and your loved ones</a>.</p>

<p><strong>There was a lot to say about what happened in the last four years</strong> without a congress. Listen to some of the CCC people talk about it in the <a href="https://events.ccc.de/congress/2023/hub/de/event/vierjahresruckblick_des_ccc/">CCC Four Year Review</a>.</p>

<p><strong>Synthetic Sentience!</strong> The presenter spoke very fast and his topic is complex, it’s probably best if I don’t try to explain it and you <a href="https://media.ccc.de/v/37c3-12167-synthetic_sentience">watch it yourself</a>! But in short, it is about AGI and very futuristic!</p>

<p><strong>Perhaps my absolute favorite <em>performance</em>, the <a href="https://media.ccc.de/v/37c3-11689-heimlich-manover">Heimlich Manover</a></strong>. A super interesting talk about your right to make inquiries to the German public administration and the incredible platform that has been built to help you do that: <a href="https://fragdenstaat.de/">fragdenstaat.de</a>. The talk also included many cases in connection to the platform.</p>

<p><strong>Do you know what 4D cubes look like?</strong> Well, neither do I, but I got more confused and had a lot of fun with “<a href="https://events.ccc.de/congress/2023/hub/de/event/wondrous-mathematics-exploring-hypercomputation-wi/">Exploring hypercomputation with the effective topos</a>”. I loved the thought experiment where you imagine a 2D world with 2D beings, one of them is in prison, and now you as a 3D being visit this world, pick up the 2D being and put it on the other side of the prison, it was pretty wild to say the least.. but certainly one of my favorites, and it is a shame that I was not able to see more of the “Wondrous Mathematics” series.</p>

<p><strong>Last event I watched before my departure today was about the things you need to do to <a href="https://events.ccc.de/congress/2023/hub/de/event/oh_no_kuno_-_gesperrte_girocards_entsperren/">actually block your lost or stolen Girocard in Germany</a></strong>, you might think it is enough to call a number, but this talk revealed that you also need to go to the police to trigger the KUNO system, otherwise attackers might still be able to use your card with a signature.</p>

<p><strong>What else?</strong> Well, I’m still catching up as there’s so much going on at the same time, but here are some ideas of things I’ll be watching the recordings of, some of which we couldn’t get into as the halls were completely full, so they must be promising!</p>

<ul>
  <li><a href="https://events.ccc.de/congress/2023/hub/de/event/hirne_hacken_hackback_edition/">Hirne hacken: Hackback Edition</a></li>
  <li>
    <p><a href="https://media.ccc.de/v/37c3-11828-how_to_build_a_submarine_and_survive">How to build a submarine and survive</a> (see the submarine exhibition below)
<img src="/assets/2023-12-30-37c3/37c3_sub.jpg" alt="sub" /></p>
  </li>
  <li><a href="https://media.ccc.de/v/37c3-12144-back_in_the_driver_s_seat_recovering_critical_data_from_tesla_autopilot_using_voltage_glitching">Back in the Driver’s Seat: Recovering Critical Data from Tesla Autopilot Using Voltage Glitching</a></li>
  <li>..and many more, check out <a href="https://media.ccc.de/">media.ccc.de</a></li>
</ul>

<p>On day 3, I loved the entertainment that took place at midnight that day: <strong>The Prompt Battle</strong>. In this battle, which was hosted by two awesome moderators who made it really fun to watch, the contestants had to enter prompts for DALLE to create the best image given a scenario. This was then judged by the audience, here is an example from last night.</p>

<p><img src="/assets/2023-12-30-37c3/37c3_prompt_battle.jpg" alt="prompt battle" /></p>

<p>Sadly this was not recorded and was only enjoyable in the moment and what better way to end this blog post if not by a DALLE 2 generated picture of my <del>impression</del> <em>prompt</em> of the congress this year.</p>

<p><img src="/assets/2023-12-30-37c3/DALLE_37C3.png" alt="37C3 DALLE" /></p>

<p>And with that, I’m calling it a year and I wish you a fantastic new year and hope to see you at 38C3!</p>

<p><em>This post may get some updates in the future- so come back later</em></p>]]></content><author><name>Domenic Gosein</name></author><category term="hacking" /><category term="chaos" /><category term="computer" /><category term="club" /><category term="ccc" /><category term="37c3" /><category term="conference" /><category term="congress" /><category term="hamburg" /><summary type="html"><![CDATA[Four exciting days at the 37C3 have come to an end, and it’s time to look back on some of the interesting things I saw and learned. The Chaos Computer Club usually hosts a convention every year, but this year was special because it was the first in-person convention after the COVID pandemic, and it took place in the newly renovated Congress Center Hamburg.]]></summary></entry><entry><title type="html">JupyterHub Image Building: A Layered Approach for Customized User Environments</title><link href="https://gosein.de/layered-image-builds.html" rel="alternate" type="text/html" title="JupyterHub Image Building: A Layered Approach for Customized User Environments" /><published>2023-12-03T00:00:00+01:00</published><updated>2023-12-03T00:00:00+01:00</updated><id>https://gosein.de/layered-image-builds</id><content type="html" xml:base="https://gosein.de/layered-image-builds.html"><![CDATA[<p>I gave <a href="https://stackoverflow.com/a/77595025/11422992">this answer</a> about image management for JupyterHub on StackOverflow today and thought I’d turn it into a short blog post, with some code thrown in.</p>

<!--more-->

<p>When things get complex, it is not feasible to have only one image for all users. JupyterHub allows you to specify profiles with different images that a user can choose from when logging in. Check the Customizing User Environment section in the Jupyterhub documentation for that. Here is an example that uses an additional <code class="language-plaintext highlighter-rouge">ConfigMap</code> in K8s to store profile information:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">ConfigMap</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">jhub-profiles</span>
  <span class="na">namespace</span><span class="pi">:</span> <span class="s">jhub</span>
<span class="na">data</span><span class="pi">:</span>
  <span class="na">values.yaml</span><span class="pi">:</span> <span class="pi">|</span>
    <span class="s">singleuser:</span>
      <span class="s">profileList:</span>
        <span class="s">- display_name: "Default environment"</span>
          <span class="s">description: "some description"</span>
          <span class="s">default: True</span>
        <span class="s">- display_name: "Default environment - python 3.8"</span>
          <span class="s">description: "Same environment as the default but ..."</span>
          <span class="s">kubespawner_override:</span>
            <span class="s">image: &lt;custom-image&gt;</span>
</code></pre></div></div>

<p>You can the use e.g. Flux to merge the above when applied:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="na">valuesFrom</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">kind</span><span class="pi">:</span> <span class="s">ConfigMap</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">jhub-profiles</span>
      <span class="na">valuesKey</span><span class="pi">:</span> <span class="s">values.yaml</span>
</code></pre></div></div>

<p>One approach to building these images is in layers, starting with a base layer that contains only a base OS image and some configurations and installations that apply to all other images, for example, ca-certificates or tools like wget.</p>

<p>So if you already have an image that contains everything, it might be a good idea to reverse engineer it into several layers of images that you can then stack on top of each other to create specific user images without dependency conflicts. Look at how the <a href="https://github.com/jupyter/docker-stacks">Jupyter community itself manages its images</a>, or <a href="https://github.com/vre-hub/environments">this project</a> I’ve been personally involved in. Both use GitHub Actions to build and publish their images and in the second project I linked, we also involved users on GitHub to suggest and implement features in the images.</p>

<p>Depending on how complex you want to get with this process, you can also work with variables, where you specify different versions or packages when building the images. Jinja is also useful in this context as a templating engine.</p>]]></content><author><name>Domenic Gosein</name></author><category term="stackoverflow" /><category term="jupyterhub" /><category term="docker" /><category term="github-actions" /><category term="github" /><category term="build" /><category term="images" /><category term="configmap" /><category term="k8s" /><category term="jupyter" /><category term="profiles" /><summary type="html"><![CDATA[I gave this answer about image management for JupyterHub on StackOverflow today and thought I’d turn it into a short blog post, with some code thrown in.]]></summary></entry><entry><title type="html">TIL: Unlocking Internal URLs with SSH Proxy</title><link href="https://gosein.de/til-ssh-proxy.html" rel="alternate" type="text/html" title="TIL: Unlocking Internal URLs with SSH Proxy" /><published>2023-12-02T00:00:00+01:00</published><updated>2023-12-02T00:00:00+01:00</updated><id>https://gosein.de/til-ssh-proxy</id><content type="html" xml:base="https://gosein.de/til-ssh-proxy.html"><![CDATA[<p><a href="/til-today-i-learned.html">What is a TIL?</a></p>

<p>Today I learned a neat trick: if your institution doesn’t support VPN, you can still access internal URLs using an SSH proxy. Here are the steps:
<!--more--></p>
<ol>
  <li>Open a terminal and run <code class="language-plaintext highlighter-rouge">ssh -ND 9999 user@hostname.domain</code>.</li>
  <li>In Firefox, change the SOCKS settings to localhost, port 9999 and SOCKS v5.</li>
</ol>

<p>Voila! No VPN? No problem. Access internal URLs easily with this SSH proxy workaround.</p>]]></content><author><name>Domenic Gosein</name></author><category term="ssh" /><category term="proxy" /><category term="url" /><category term="internal" /><category term="firefox" /><category term="socks" /><summary type="html"><![CDATA[What is a TIL? Today I learned a neat trick: if your institution doesn’t support VPN, you can still access internal URLs using an SSH proxy. Here are the steps:]]></summary></entry><entry><title type="html">GitHub Action for Monitoring Workflow Billing with Custom Metrics in Datadog</title><link href="https://gosein.de/datadog-custom-metric.html" rel="alternate" type="text/html" title="GitHub Action for Monitoring Workflow Billing with Custom Metrics in Datadog" /><published>2023-12-01T00:00:00+01:00</published><updated>2023-12-01T00:00:00+01:00</updated><id>https://gosein.de/datadog-custom-metric</id><content type="html" xml:base="https://gosein.de/datadog-custom-metric.html"><![CDATA[<p>Some time ago, I crafted a <a href="https://github.com/marketplace/actions/workflow-usage-datadog-custom-metric">GitHub Actions for a custom Datadog metric</a> to meticulously monitor GitHub minutes usage for a substantial project. The primary objective was to gain a precise understanding of how many minutes per workflow were consumed within the billing period, enabling us to pinpoint areas for improvement.
<!--more-->
The workflow triggers a <a href="https://docs.github.com/en/rest/actions/workflows?apiVersion=2022-11-28#get-workflow-usage">GitHub API call to fetch the current billing minutes</a> for the workflow. Subsequently, this value undergoes conversion and is transmitted to the <a href="https://docs.datadoghq.com/metrics/custom_metrics/">Datadog API</a>. The outcome? You can elegantly display it, perhaps as a time series or table, showcasing the total usage throughout the ongoing billing cycle.</p>

<p>Here’s the YAML action configuration:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">name</span><span class="pi">:</span> <span class="s">Workflow Usage Datadog Custom Metric</span>

<span class="na">author</span><span class="pi">:</span> <span class="s">Domenic Gosein</span>

<span class="na">description</span><span class="pi">:</span> <span class="s">GitHub Action to send minutes usage per workflow to a custom metric in Datadog.</span>

<span class="na">branding</span><span class="pi">:</span>
  <span class="na">icon</span><span class="pi">:</span> <span class="s1">'</span><span class="s">clock'</span>  
  <span class="na">color</span><span class="pi">:</span> <span class="s1">'</span><span class="s">orange'</span>

<span class="na">inputs</span><span class="pi">:</span>
  <span class="na">api_key</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Datadog</span><span class="nv"> </span><span class="s">API</span><span class="nv"> </span><span class="s">key</span><span class="nv"> </span><span class="s">e.g.</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">GitHub</span><span class="nv"> </span><span class="s">Actions</span><span class="nv"> </span><span class="s">Secrets'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">app_key</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Datadog</span><span class="nv"> </span><span class="s">Application</span><span class="nv"> </span><span class="s">Key</span><span class="nv"> </span><span class="s">e.g.</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">GitHub</span><span class="nv"> </span><span class="s">Actions</span><span class="nv"> </span><span class="s">Secrets.'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">repo_path</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Repository</span><span class="nv"> </span><span class="s">path</span><span class="nv"> </span><span class="s">e.g.</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">standard</span><span class="nv"> </span><span class="s">variable.'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">wf</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Workflow</span><span class="nv"> </span><span class="s">name</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">strategy</span><span class="nv"> </span><span class="s">matrix.'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">tag_workflow_id</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Workflow</span><span class="nv"> </span><span class="s">name</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">strategy</span><span class="nv"> </span><span class="s">matrix.'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">github_tk</span><span class="pi">:</span>
    <span class="na">description</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Github</span><span class="nv"> </span><span class="s">Actions</span><span class="nv"> </span><span class="s">Token</span><span class="nv"> </span><span class="s">from</span><span class="nv"> </span><span class="s">GitHub</span><span class="nv"> </span><span class="s">Actions</span><span class="nv"> </span><span class="s">Secrets.'</span>
    <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>

<span class="na">runs</span><span class="pi">:</span>
  <span class="na">using</span><span class="pi">:</span> <span class="s1">'</span><span class="s">composite'</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Get latest timing trough GitHub API request</span>
      <span class="na">uses</span><span class="pi">:</span> <span class="s">octokit/request-action@v2.1.0</span>
      <span class="na">id</span><span class="pi">:</span> <span class="s">get_latest_timing</span>
      <span class="na">with</span><span class="pi">:</span>
        <span class="na">route</span><span class="pi">:</span> <span class="s">GET /repos/$/actions/workflows/$/timing</span>
      <span class="na">env</span><span class="pi">:</span>
        <span class="na">GITHUB_TOKEN</span><span class="pi">:</span> <span class="s">$</span>

    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Value check received from API request</span>
      <span class="na">shell</span><span class="pi">:</span> <span class="s">bash</span>
      <span class="na">run</span><span class="pi">:</span> <span class="s">echo $</span>

    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Calculate and post latest timing in minutes to Datatdog as a Custom Metric</span>
      <span class="na">shell</span><span class="pi">:</span> <span class="s">bash</span>
      <span class="na">id</span><span class="pi">:</span> <span class="s">post_latest_timing</span>
      <span class="na">run</span><span class="pi">:</span> <span class="pi">|</span>
          <span class="s">min=$(($latest_total_ms_ubuntu / 60000))</span>
          <span class="s">echo $min</span>
          <span class="s">export NOW="$(date +%s)"</span>
          <span class="s">curl -X POST "https://api.datadoghq.eu/api/v1/series" \</span>
          <span class="s">-H "Content-Type: text/json" \</span>
          <span class="s">-H "DD-API-KEY: $DD_API_KEY" \</span>
          <span class="s">-d @- &lt;&lt; EOF</span>
          <span class="s">{</span>
            <span class="s">"series": [</span>
              <span class="s">{</span>
                <span class="s">"metric": "github.actions.minutes",</span>
                <span class="s">"points": [[${NOW}, $min]],</span>
                <span class="s">"tags": "workflow:$tag_workflow_id",</span>
                <span class="s">"type": "gauge"</span>
              <span class="s">}</span>
            <span class="s">]</span>
          <span class="s">}</span>
          <span class="s">EOF</span>
      <span class="na">env</span><span class="pi">:</span>
        <span class="na">DD_API_KEY</span><span class="pi">:</span> <span class="s">$</span>
        <span class="na">DD_APP_KEY</span><span class="pi">:</span> <span class="s">$</span>
        <span class="na">latest_total_ms_ubuntu</span><span class="pi">:</span> <span class="s">$</span>
        <span class="na">tag_workflow_id</span><span class="pi">:</span> <span class="s">$</span>
</code></pre></div></div>

<p>And here’s an exemplary configuration where workflows are defined in a matrix:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">on</span><span class="pi">:</span>
  <span class="na">workflow_run</span><span class="pi">:</span>
    <span class="na">workflows</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">Worfklow One</span><span class="pi">,</span> <span class="nv">Workflow Two</span><span class="pi">]</span> <span class="c1"># Runs when one of the workflow defined in the brackets is run and completed</span>
    <span class="na">types</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="s">completed</span>
  <span class="na">schedule</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">cron</span><span class="pi">:</span> <span class="s">30 23 * * 1,3,5</span> <span class="c1"># At 23:30 on Monday, Wednesday, and Friday</span>
  <span class="na">workflow_dispatch</span><span class="pi">:</span>

<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">updateWorkflowTimings</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">strategy</span><span class="pi">:</span>
      <span class="na">matrix</span><span class="pi">:</span>
        <span class="na">WFs</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">workflow_one.yml</span><span class="pi">,</span> <span class="nv">workflow_two.yml</span><span class="pi">]</span> <span class="c1"># Runs for each workflow defined in the brackets</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Use my action</span>
        <span class="na">uses</span><span class="pi">:</span> <span class="s">goseind/datadog-gh-actions@v1.0.0</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">api_key</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">app_key</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">repo_path</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">tag_workflow_id</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">wf</span><span class="pi">:</span> <span class="s">$</span>
          <span class="na">github_tk</span><span class="pi">:</span> <span class="s">$</span>
</code></pre></div></div>

<p>This is how it would manifest in a Datadog Notebook with a neat visualization of the GitHub actions minutes:</p>

<p><img src="../assets/2023-12-01-datadog-custom-metric/example_datadog.png" alt="Datadog Notebook" /></p>]]></content><author><name>Domenic Gosein</name></author><category term="datadog" /><category term="github" /><category term="api" /><category term="guthub-actions" /><category term="actions" /><category term="workflow" /><category term="metric" /><category term="monitoring" /><summary type="html"><![CDATA[Some time ago, I crafted a GitHub Actions for a custom Datadog metric to meticulously monitor GitHub minutes usage for a substantial project. The primary objective was to gain a precise understanding of how many minutes per workflow were consumed within the billing period, enabling us to pinpoint areas for improvement.]]></summary></entry><entry><title type="html">ReCreate: Bridging Nature and Technology for Sustainable Renaturation</title><link href="https://gosein.de/recreate-renaturation-robotics.html" rel="alternate" type="text/html" title="ReCreate: Bridging Nature and Technology for Sustainable Renaturation" /><published>2023-11-29T00:00:00+01:00</published><updated>2023-11-29T00:00:00+01:00</updated><id>https://gosein.de/recreate-renaturation-robotics</id><content type="html" xml:base="https://gosein.de/recreate-renaturation-robotics.html"><![CDATA[<p>I’ve been meaning to share this update on the ReCreate project, a collaborative initiative that unfolded in 2021/22 at <a href="https://inno-space.de/projects/gtg/">inno-space Mannheim</a> in partnership with CERN. The project’s mission was to employ design thinking and various methodologies to ideate and prototype a solution addressing challenges within the <a href="https://sdgs.un.org/goals">UN Sustainable Development Goals</a>, specifically focusing on <a href="https://sdgs.un.org/goals/goal15">Goal 15 - Life on Land</a>, which states: <em>“Protect, restore and promote sustainable use of terrestrial ecosystems, sustainably manage forests, combat desertification, and halt and reverse land degradation and halt biodiversity loss”</em>. Without further ado, let me present the outcome and pitch the resulting idea to you.<br />
<!--more-->
<img src="../assets/2023-11-30-recreate-renaturation-robotics/ReNate_and_SeDrone.jpg" alt="ReNate and SeDrone" /></p>

<p>In the intricate web of environmental conservation and technological innovation, ReCreate emerges as a comprehensive system composed of three pivotal components: ReNate, SeDrone, and VeDA. This collective ensemble works synergistically to investigate and evaluate abandoned landscapes, formulating a tailored renaturation strategy precisely attuned to each unique terrain.</p>

<p>At its core, ReCreate embraces a blend of autonomy and human involvement, epitomizing a harmonious partnership between cutting-edge technology and human intellect. Let’s delve into the key constituents of this transformative system:</p>

<ol>
  <li>
    <p><strong>ReNate:</strong> This element serves as the guiding intelligence, orchestrating the initial reconnaissance of deserted lands. ReNate’s role extends beyond mere data collection; it analyzes environmental parameters, identifies ecological imbalances, and lays the foundation for a targeted renaturation approach.</p>
  </li>
  <li>
    <p><strong>SeDrone:</strong> Taking to the skies, SeDrone is the aerial counterpart that complements ReNate’s ground-level insights. Equipped with advanced sensors, SeDrone provides a bird’s-eye perspective, capturing critical data to enhance the overall understanding of the landscape. This synergy of ground and aerial perspectives ensures a comprehensive assessment.</p>
  </li>
  <li>
    <p><strong>VeDA:</strong> As the brainchild of ReCreate, VeDA synthesizes the amassed data and formulates a renaturation strategy tailored to the specific needs of the identified area. This analytical engine leverages machine learning algorithms, ecological models, and historical data to predict and optimize the restoration process.</p>
  </li>
</ol>

<p>While ReCreate operates as a partially autonomous system, it is imperative to recognize the indispensable role of human expertise in its functionality. Humans play a pivotal part in the planning and execution phases, bringing a nuanced understanding of local ecosystems, cultural considerations, and ethical dimensions. The collaborative effort between technology and human insight amplifies the effectiveness and sustainability of the renaturation initiatives.</p>

<p>In essence, ReCreate exemplifies a holistic approach to environmental stewardship, seamlessly integrating the precision of technology with the wisdom of human experience. As we navigate the complex terrain of ecological restoration, ReCreate stands as a beacon, demonstrating that the future of sustainable ecosystems lies in the convergence of nature and cutting-edge innovation.</p>

<p>This video illustrates the system in operation.</p>

<iframe title="vimeo-player" src="https://player.vimeo.com/video/708193510?h=33977d2a6d" width="640" height="360" frameborder="0" allowfullscreen=""></iframe>

<p><strong>Discover additional details about the project <a href="https://cbi.dfm.org.au/project/gtg/">here</a>!</strong></p>]]></content><author><name>Domenic Gosein</name></author><category term="renaturation" /><category term="drone" /><category term="robot" /><category term="robotics" /><category term="system" /><summary type="html"><![CDATA[I’ve been meaning to share this update on the ReCreate project, a collaborative initiative that unfolded in 2021/22 at inno-space Mannheim in partnership with CERN. The project’s mission was to employ design thinking and various methodologies to ideate and prototype a solution addressing challenges within the UN Sustainable Development Goals, specifically focusing on Goal 15 - Life on Land, which states: “Protect, restore and promote sustainable use of terrestrial ecosystems, sustainably manage forests, combat desertification, and halt and reverse land degradation and halt biodiversity loss”. Without further ado, let me present the outcome and pitch the resulting idea to you.]]></summary></entry><entry><title type="html">TIL: Automated Python Script Reloading with Watchdog</title><link href="https://gosein.de/til-python-watchdog.html" rel="alternate" type="text/html" title="TIL: Automated Python Script Reloading with Watchdog" /><published>2023-11-28T17:21:00+01:00</published><updated>2023-11-28T17:21:00+01:00</updated><id>https://gosein.de/til-python-watchdog</id><content type="html" xml:base="https://gosein.de/til-python-watchdog.html"><![CDATA[<p><a href="/til-today-i-learned.html">What is a TIL?</a></p>

<p>Today I learnt about <a href="https://pypi.org/project/watchdog/">watchdog</a>, a Python utility that allows you to monitor file system events, useful for example if you want to restart a script when changes are made to it. I used it with Docker Compose to run a Python program every time I changed the file.
<!--more-->
Create a small bash script to run <em>watchmedo</em>, specifying the directory, pattern or single file you want to watch (in this case using the <code class="language-plaintext highlighter-rouge">$1</code> variable to pass the specific file from the Docker Compose later):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#!/bin/bash</span>
<span class="nb">echo</span> <span class="s2">"Starting '</span><span class="nv">$1</span><span class="s2">' with auto-restart on file change ..."</span>
watchmedo auto-restart <span class="nt">--directory</span><span class="o">=</span>./ <span class="nt">--pattern</span><span class="o">=</span><span class="k">*</span>.py <span class="nt">--recursive</span> <span class="nt">--</span> python3 <span class="nv">$1</span>
</code></pre></div></div>

<p>Add the file and pip package to your <em>Dockerfile</em> (make sure it has the right permissions):</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># install pip packages</span>
RUN pip <span class="nb">install </span>watchdog
<span class="c"># setup scripts and entrypoint</span>
COPY ./watchdog.sh /
RUN <span class="nb">chmod</span> +x watchdog.sh
</code></pre></div></div>

<p>In your Docker Compose, you can now run the script and specify a file to track:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">services</span><span class="pi">:</span>
  <span class="na">svc</span><span class="pi">:</span>
    <span class="na">build</span><span class="pi">:</span> <span class="s">.</span>
    <span class="na">command</span><span class="pi">:</span> <span class="s">/watchdog.sh test.py</span> <span class="c1"># replace this with any file you want to update and restart</span>
</code></pre></div></div>

<p>That’s it!</p>]]></content><author><name>Domenic Gosein</name></author><category term="python" /><category term="watchdog" /><category term="watchmedo" /><category term="pip" /><category term="docker" /><category term="compose" /><category term="bash" /><category term="file" /><category term="system" /><category term="update" /><summary type="html"><![CDATA[What is a TIL? Today I learnt about watchdog, a Python utility that allows you to monitor file system events, useful for example if you want to restart a script when changes are made to it. I used it with Docker Compose to run a Python program every time I changed the file.]]></summary></entry><entry><title type="html">Launch of the TIL - Today I Learned blog post series</title><link href="https://gosein.de/til-today-i-learned.html" rel="alternate" type="text/html" title="Launch of the TIL - Today I Learned blog post series" /><published>2023-11-28T17:20:00+01:00</published><updated>2023-11-28T17:20:00+01:00</updated><id>https://gosein.de/til-today-i-learned</id><content type="html" xml:base="https://gosein.de/til-today-i-learned.html"><![CDATA[<p>TILs, or “Today I Learned” entries, are concise snippets with code examples designed to quickly share recent learnings. I find this approach particularly appealing for blog posts as it significantly lowers the hurdle to write and publish. While I have a backlog of ideas and drafts waiting to be completed, sometimes it’s challenging to bring them to fruition. TILs offer a solution by enabling me to publish brief blog posts about things I’ve learned more swiftly and in a more structured manner.<br />
<!--more-->
I first came across this concept on <a href="https://betatim.github.io/posts/til-explained/">betatim’s Blog</a> and traced its origin back to <a href="https://github.com/thoughtbot/til">thoughtbot</a>.</p>]]></content><author><name>Domenic Gosein</name></author><category term="learning" /><summary type="html"><![CDATA[TILs, or “Today I Learned” entries, are concise snippets with code examples designed to quickly share recent learnings. I find this approach particularly appealing for blog posts as it significantly lowers the hurdle to write and publish. While I have a backlog of ideas and drafts waiting to be completed, sometimes it’s challenging to bring them to fruition. TILs offer a solution by enabling me to publish brief blog posts about things I’ve learned more swiftly and in a more structured manner.]]></summary></entry><entry><title type="html">Mastering Mobile Magic: Crafting a Seamless React Native Experience with Expo</title><link href="https://gosein.de/react-native-expo-app.html" rel="alternate" type="text/html" title="Mastering Mobile Magic: Crafting a Seamless React Native Experience with Expo" /><published>2023-11-13T00:00:00+01:00</published><updated>2023-11-13T00:00:00+01:00</updated><id>https://gosein.de/react-native-expo-app</id><content type="html" xml:base="https://gosein.de/react-native-expo-app.html"><![CDATA[<p>In this post, we’ll delve into the structured process of creating React Native apps with Expo.</p>

<p>Expo is a set of tools, libraries, and services built around React Native to simplify the development process. It provides a set of pre-built components and a development environment that eliminates the need for setting up and configuring native build tools. Expo also offers a range of services, such as a cloud build service, which allows you to build and deploy your app without the need for Xcode or Android Studio. Expo is particularly helpful for developers who want to focus on the JavaScript side of their application and reduce the complexity of native development tasks.
<!--more-->
Now, let’s dive in and build.</p>

<p>The easiest way to get started is with <a href="https://snack.expo.dev">Snack</a>, a convenient online platform provided by Expo that allows developers to experiment with and share React Native code in a browser-based environment including Android and iOS emulators powered by <a href="https://appetize.io/">Appetize</a>.</p>

<p><img src="../assets/2023-11-13-react-native-app/snack.png" alt="Snack" /></p>

<p>This allows you to draft a simple version of your new app without having to worry about installing and configuring things. Once you have a minimal working version of your app you can move to a more sophisticated setup and start working with <a href="https://docs.expo.dev/build/introduction/">EAS CLI tools to build and later submit your app</a>.</p>

<p>With preview APK builds, configured through the <code class="language-plaintext highlighter-rouge">eas.json</code> file in your project, you can share and download them directly on any device once finished, you’ll be provided with a QR code.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"cli"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"&gt;= 5.6.0"</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"submit"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"production"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"android"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"track"</span><span class="p">:</span><span class="w"> </span><span class="s2">"internal"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"releaseStatus"</span><span class="p">:</span><span class="w"> </span><span class="s2">"draft"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="nl">"build"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"preview"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"distribution"</span><span class="p">:</span><span class="w"> </span><span class="s2">"internal"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"android"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"buildType"</span><span class="p">:</span><span class="w"> </span><span class="s2">"apk"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p><img src="../assets/2023-11-13-react-native-app/apk_build.png" alt="Alt text" /></p>

<p>With the submitted production profile also listed in the example above you can automatically build ABBs for Google Play Store and submit them there.</p>

<p>This can also be nicely automated with <a href="https://docs.expo.dev/eas-update/github-actions/">GitHub Actions</a>.</p>

<p>More to follow..</p>]]></content><author><name>Domenic Gosein</name></author><category term="react" /><category term="react-native" /><category term="expo" /><category term="javascript" /><category term="cicd" /><category term="github-actions" /><summary type="html"><![CDATA[In this post, we’ll delve into the structured process of creating React Native apps with Expo. Expo is a set of tools, libraries, and services built around React Native to simplify the development process. It provides a set of pre-built components and a development environment that eliminates the need for setting up and configuring native build tools. Expo also offers a range of services, such as a cloud build service, which allows you to build and deploy your app without the need for Xcode or Android Studio. Expo is particularly helpful for developers who want to focus on the JavaScript side of their application and reduce the complexity of native development tasks.]]></summary></entry><entry><title type="html">Understandable Diagrams of Software System Architecture</title><link href="https://gosein.de/nice-diagrams.html" rel="alternate" type="text/html" title="Understandable Diagrams of Software System Architecture" /><published>2023-08-13T00:00:00+02:00</published><updated>2023-08-13T00:00:00+02:00</updated><id>https://gosein.de/nice-diagrams</id><content type="html" xml:base="https://gosein.de/nice-diagrams.html"><![CDATA[<p>In my search for an understandable and intuitive model for designing a software system architecture, I recently came across the C4 model. The C4 model makes use of Shneiderman’s mantra, which is a simple concept for data visualisation and can be summarised as: “Overview first, zoom and filter, then detail on demand”. I would like to demonstrate the use of the C4 model by illustrating the architecture of the <a href="https://gosein.de/autonomous-robot.html">Autonomous Robot</a> described in a previous blog post.
<!--more-->
We start with what is called a system context diagram, which shows how the software fits into its environment, including user and system dependencies. For larger environments, the model provides a landscape view. The context clearly shows the two software systems, the containers running on the computer and the bot.</p>

<p><img src="/assets/2023-08-13-nice-diagrams/structurizr-85399-SystemContext-001.png" alt="" /></p>

<p>Zooming in on the container diagram shows the individual components of each software system in scope and their interactions across systems.</p>

<p><img src="/assets/2023-08-13-nice-diagrams/structurizr-85399-Container-001.png" alt="" />
<img src="/assets/2023-08-13-nice-diagrams/structurizr-85399-Container-002.png" alt="" /></p>

<p>The cool thing is that C4 is a DSL and you can save all of the above as code, e.g. along with your source code of the systems.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>workspace "Ball Schubser" "A robot that pushes a ball" {

    model {
        ballschubser = softwareSystem "Ball Schubser" "Software System for Ball-Schubser" {
            cockpit = container "Cockpit" "Webpage with robots camera and status in real-time" {
            }
            detectnode = container "Object Detection Node" "Real-time object detection with YOLO" {
            }
            navnode = container "Navigation Node" "Publisher for navigation instructions" {
            }
            ros = container "ROS Core" "Roboter Operating System Master" {
            }
        }
        bot = softwareSystem "Turtlebot" "Bot with camera and Raspberry Pi with WiFi module" {
            rosbot = container "ROS Robot Node"
            camera = container "Camera"
            controller = container "Robot Controller"
    }
    camera -&gt; rosbot "raw image"
    rosbot -&gt; ros "raw image"
    ros -&gt; detectnode "raw image"
    detectnode -&gt; ros "image with detections"
    detectnode -&gt; ros "ball position"
    ros -&gt; navnode "ball position"
    ros -&gt; cockpit "mission status"
    ros -&gt; cockpit "image with detections"
    navnode -&gt; ros "instructions"
    ros -&gt; rosbot "instructions"
    rosbot -&gt; controller "instructions"
}
</code></pre></div></div>

<p>I find this a very practical approach to architecture design, and it has helped me a lot as it provides an easy and fast way to create the first draft but then allows you to build on that and create more sophisticated diagrams and look at them with different views to understand how things interact.</p>

<p>For more information about C4 and the many ways you can use it, click here:</p>

<ul>
  <li><a href="https://c4model.com/">C4 Model</a></li>
  <li><a href="https://github.com/structurizr/dsl/tree/master/docs/cookbook">Structurizr DSL cookbook</a></li>
  <li><a href="https://github.com/structurizr/dsl/blob/master/docs/language-reference.md">Language reference</a></li>
</ul>

<p>I can also recommend <a href="https://structurizr.com/">Structurizr</a>, a dedicated platform with an online DSL editor and diagram download and embed.</p>]]></content><author><name>Domenic Gosein</name></author><category term="software" /><category term="architecture" /><category term="model" /><category term="diagrams" /><category term="views" /><category term="engineering" /><category term="c4" /><category term="systems" /><category term="design" /><summary type="html"><![CDATA[In my search for an understandable and intuitive model for designing a software system architecture, I recently came across the C4 model. The C4 model makes use of Shneiderman’s mantra, which is a simple concept for data visualisation and can be summarised as: “Overview first, zoom and filter, then detail on demand”. I would like to demonstrate the use of the C4 model by illustrating the architecture of the Autonomous Robot described in a previous blog post.]]></summary></entry><entry><title type="html">Insights from JupyterCon 2023 in Paris</title><link href="https://gosein.de/jupytercon-2023-paris.html" rel="alternate" type="text/html" title="Insights from JupyterCon 2023 in Paris" /><published>2023-05-16T00:00:00+02:00</published><updated>2023-05-16T00:00:00+02:00</updated><id>https://gosein.de/jupytercon-2023-paris</id><content type="html" xml:base="https://gosein.de/jupytercon-2023-paris.html"><![CDATA[<p><strong><em>This articel has also appeared in the <a href="https://computing-blog.web.cern.ch/2023/05/insights-from-jupytercon-2023-in-paris/">CERN Computing Blog</a></em></strong></p>

<p>Project Jupyter and IPython have no doubt revolutionized the way scientific computing is done. Today CERN and many other major organisations around the globe are using them to do their research. This article gives you the newest insights into Project Jupyter from its biggest community gathering in 2023 in Paris - the JupyterCon!</p>

<p><img src="/assets/2023-05-16-jupytercon-2023-paris/JupyterCon2023_Talk.jpeg" alt="" />
<!--more-->
Project Jupyter is a large open-source project born out of the IPython project for interactive data science and scientific computing with an international community. Jupyter products are used by many large institutes and corporations like NYU, MIT, Harvard, Berkeley, NASA, Netflix, AWS, and Google (and of course CERN) for their scientific and educational needs as well as many science experiments from various disciplines across the globe. Since its start in 2014, it has grown bigger by the year and revolutionized the way science is done.</p>

<p><img src="/assets/2023-05-16-jupytercon-2023-paris/labpreview.jpg" alt="" /></p>

<p><em>Source: https://jupyter.org/, 05/2023</em></p>

<p>At JupyterCon this international community comes together once a year to present and discuss their advancements, use cases and products in and around the expanding Jupyter Ecosystem. The experience is enriched by insightful keynotes, in-depth training and networking events. The conference had several tracks ranging from Community Tools and Practices to Enterprise Jupyter Infrastructure, Data Science, Education and Research and Scientific Computing. This year’s conference took place at Cité des sciences et de l’industrie - an amazing venue in Paris - with around 300 attendees.</p>

<p><img src="/assets/2023-05-16-jupytercon-2023-paris/JupyterCon2023_Venue.jpeg" alt="" /></p>

<p>Throughout the conference, there were many opportunities to network with other attendees, many of whom are facing the same challenges in their domains as we at CERN. Open science, data preservation and reproducibility are pressing topics in science and the conference provided a good opportunity to discuss these with researchers from MIT,  NASA, the Memorial University of Newfoundland working with NASA TOPS on open science as well as the Leibniz Institute for Information Infrastructure in Germany.
Apart from the above, there were many more fruitful conversations with maintainers, admins and users of the Jupyter Ecosystem.</p>

<p>The conference was packed with interesting talks, here are just some of the key takeaways I found particularly interesting also in the context of CERN:
The new major release of the JupyterHub subproject brings with itself:</p>
<ul>
  <li>Advanced testing against K8s with CI/CD workflows
    <ul>
      <li>Ready to use Grafana Dashboards for monitoring of Jupyter services</li>
      <li>Advances build in user management with groups for e. g. resources limitation</li>
      <li>Real-time collaboration on Jupyter Notebooks</li>
      <li>pytest-jupyterhub package for lightweight local JupyterHub development</li>
    </ul>
  </li>
  <li>Paul Romer, a University Professor at NYU and co-recipient of the 2018 Nobel Prize in Economics Sciences talked in his keynote about scientific publications, reproducibility and signing and preservation of Jupyter Notebooks. <a href="https://cfp.jupytercon.com/2023/talk/T8HH8K/">Link to this talk</a></li>
  <li>2i2c is a non-profit organisation which designs, develops, and operates JupyterHubs in the cloud for communities of practice in research &amp; education. It builds and supports open-source infrastructure that serves these communities and has a lot of experience and infrastructure code to discuss and explore. <a href="https://github.com/2i2c-org">Link to their GitHub Orga</a> as well as their <a href="https://cfp.jupytercon.com/2023/talk/GESWGK/">talk</a></li>
  <li>Alyssa Goodman who is the Robert Wheeler Willson Professor of Applied Astronomy at Harvard University and a Research Associate at the Smithsonian Institution talked in her keynote about glue, a package which combines data, graphs and tools for the context of astronomy and other fields, with an upcoming package for Jupyter called glupyter. <a href="https://scholar.harvard.edu/agoodman/presentations/seeing-universe-more-clearly-glue-glupyter">Find more info here</a></li>
  <li>Github presented its integration of Jupyter into GitHub Codespaces as a native environment for users to open notebooks with, Jupyter has its own sponsored service for that called BinderHub, more info can be found <a href="https://docs.google.com/presentation/d/e/2PACX-1vShtgk4eq1FmGvrAjaCNI72QJXCwYAXzJsEE0FTlE3s-vGrV_mCJzTLCk20KvkFc6yVD54CHBqGBDcH/pub?start=false&amp;loop=false&amp;delayms=5000#slide=id.geb5b66dfde_2_11">here</a> and <a href="https://jupyter.org/binder">here</a></li>
  <li>New JupyterLite, a Jupyter Notebook running entirely in the browser, making it easier to set up and share notebooks and comes with a dedicated repository spawner called repo2jupyterlite. More info can be found <a href="https://jupyterlite.readthedocs.io/en/latest/">here</a></li>
  <li>Sliver is a hacking tool to explore vulnerabilities in software systems and a talk at the conference gave a brief introduction to it, more details <a href="https://github.com/BishopFox/sliver">here</a></li>
  <li>A Dask tutorial for distributed computing can be found <a href="https://github.com/mrocklin/dask-tutorial">here</a>
Real-time collaboration for Jupyter users, more info <a href="https://jupyterhub.readthedocs.io/en/stable/tutorial/collaboration-users.html">here</a></li>
  <li>Effective Practices for Community Management from an experienced user experience researcher for sustainable software. Her talk can be found <a href="https://cfp.jupytercon.com/2023/talk/MZPLPL/">here</a></li>
</ul>

<p>These are just an excerpt of the many presentations, lightning talks and poster sessions given, the full schedule and soon the recording should be available on the JupyterCon website <a href="https://cfp.jupytercon.com/2023/schedule/">here</a></p>

<p>During the conference I had the chance to present our project, the Virtual Research Environment/Data Lake, a European effort under the EOSC Future project with a team of maintainers here at CERN.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/JGQpdivaNtI?start=1030" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>

<p>Additionally, development sprints took place where developers and other project members could sit together to solve issues and think about new features and general ideas on how to move the project forward. I attended one of these sprints to help resolve issues and get help and feedback on some of the issues we have in our project.
These sprints are super useful and are the perfect place to have in-depth technical discussions and find solutions for problems, but also to connect to the community.</p>

<p><img src="/assets/2023-05-16-jupytercon-2023-paris/JupyterCon2023_Sprint.jpg" alt="" /></p>

<p>CERN with the EOSC Future project is a big user and beneficiary of the IPython and Jupyter products and is planning to get more involved with the upstream project. In case you are interested in collaborating or simply exploring ideas feel free to reach out to me!</p>]]></content><author><name>Domenic Gosein</name></author><category term="openscience" /><category term="datascience" /><category term="jupyter" /><category term="jupyternotebooks" /><category term="jupyterhub" /><category term="jupyterlab" /><category term="paris" /><category term="tech" /><category term="event" /><category term="community" /><category term="cern" /><category term="eosc" /><summary type="html"><![CDATA[This articel has also appeared in the CERN Computing Blog Project Jupyter and IPython have no doubt revolutionized the way scientific computing is done. Today CERN and many other major organisations around the globe are using them to do their research. This article gives you the newest insights into Project Jupyter from its biggest community gathering in 2023 in Paris - the JupyterCon!]]></summary></entry></feed>