<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-08-24T20:41:51+00:00</updated><id>/feed.xml</id><title type="html">Spiral Architect</title><subtitle>A junior dev in a senior body.</subtitle><entry><title type="html">The takeaways from working in different fields</title><link href="/career,/work/experience/2026/08/24/the-takeaways-from-working-in-different-fields.html" rel="alternate" type="text/html" title="The takeaways from working in different fields" /><published>2026-08-24T20:00:00+00:00</published><updated>2026-08-24T20:00:00+00:00</updated><id>/career,/work/experience/2026/08/24/the-takeaways-from-working-in-different-fields</id><content type="html" xml:base="/career,/work/experience/2026/08/24/the-takeaways-from-working-in-different-fields.html"><![CDATA[<p>When reading about people that work in tech I’m often amazed on how straight forward their career path have been. Usually it goes a little bit like this: “I started programming when I was 12, then I went to university and got a degree in computer science, then I got a job at some company and now I’m a senior software engineer”. Voilá easy peasy, the road laid open and it was up there for the taking.</p>

<p>I wish I had have that kind of career path, but my mind works a little bit differently. In my late teens the last thing I wanted to do was to work with computers, I wanted to play music, skateboard and just do all the things that you do when you are young and have a brain constantly chasing dopamine. In a weird way tough, I was always drawn to computers and was the go to guy for fixing computers among friends, but beeing a developer, that sounded boring and absolutley something I would never perceive myself doing.</p>

<p>A few years later while zapping through the channels on TV i stumbled upon a documentary about the Magnum photographer Robert Capa. From that moment on I knew I was going to be a photographer. The only problem was that I didn’t have a camera and I didnt really know how to use one. For my birthday that year, both problems were solved, I got an Canon EOS 300 (yeah it was film back then), a couple of rolls of black and white and color positive film and a book about photography. From that point I shot everything, everyday and it didn’t take that long before I was starting to get some small assignments. Around the same time I started university and got a degree in litterature and theater (theory). I met some really cool people who was involved in free theather groups and started to shot their performances and events and I also started to review books and plays for different magazines. So I did the shooting and the writing, It became a job, it was odd hours, it was long days and it was a bit strange to work when everyone else got home from their 9-5 jobs. It didnt really feel like the thing I wanted to spend the rest of my life doing. Around this time was the first time I started to think about working with computers as a profession, maybe it would be cool to build stuff and be creative in a different way? But I still had a pretty negative (boring) image of what a developer were but I applied for a computer science course at the university and got in.</p>

<p>The summer went, I was almost to old to go to school (or at least I told myself that), all my friends where establishing themself in their careers and I was still a photographer, but out of blue came an oppertunity to work as a photography teacher for a semester at a school for kids age 12-16. I thought about going to school for another four years or start earning money and have “a real” job and landed on the teaching job. Teaching kids was ok, but I found out that I the kids I worked best with where the ones that where in special class because they had a hard time with attention and impulse control. Those were the kids I could connect with and I found it rewarding and the highs and lows were often extreme and could change during the same day. The next semester I was offered a position as a full time teacher so I took it and later started to study for a teachers degree while I was working. I felt after a couple of years that teaching wasn’t really my thing (I had never really felt that It was…) and that I couldn’t keep doing it much longer. I thought about what I really liked about the job and the one thing that stood out was my 10% (or 15%, dont really remeber) of my time that I had for fixing the school computers.</p>

<p>The good thing about beeing really impulsive and beeing really bad at consecquences is that I make shit happen (all other parts are just bad…). I quit my teaching job and went back to school for a 2-year developer bootcamp. So whitout a real income and with two kids I was back in school and started to learn how to code. I was a bit older than the other students, I didn’t know the difference between backend or frontend, but choose to learn backend development, because my cousin is a backend developer so I went for the same path. I took me two, maybe three days to realize that I had hit jackpot with this decision. I found out that I really liked backend development, I liked the problem solving, the logic and the fact that I could be creative in a different way. It was really the perfect blend of what I had learned from 30 years of skateboarding and from photography. Skateboarding isn’t really about making tricks, it’s more about wanting to do something, failing, trying again, failing again, trying until it sticks. Pretty much like learning to code. Photography is about seeing the world in a different way, finding the right angle, the right light and the right moment. It have some similarities with designing a system or a feature, thinking about a problem, seeing it from different angles before acting on it. The fact that I had spent some years teching and studying on how to learn didn’t hurt either. Coding became a gift that kept on giving. I later found the whole open source community which had such resemblence to the skateboarding and punk DIY community and got even more hooked.</p>

<p>This is my fourth year as a develper and I don’t think I ever felt this passionate about a job before. In a way it’s weird because I work with my hobby. The downside of that, beeing that in periods I’m having a hard time doing other stuff (which always bite you in the end), but I guess that’s more of a me problem than a job problem.</p>

<p>Finally some similiraties and dissemblies between the different fields:</p>

<hr />

<ul>
  <li>
    <p>Douche comment in software development: “I use arch btw”</p>
  </li>
  <li>
    <p>Douche comment in photography: “I use a Leica btw”</p>
  </li>
  <li>
    <p>Douche comment in teaching: “I used to teach at university btw”</p>
  </li>
</ul>

<hr />

<ul>
  <li>
    <p>Reality in software development: “These requirements are really unclear!?”</p>
  </li>
  <li>
    <p>Reality in photography: “These requirements are fucking impossible to meet without a proper budget!!”</p>
  </li>
  <li>
    <p>Reality in teaching: “These requirements are impossible to meet regardless of budget!!”</p>
  </li>
</ul>

<hr />

<ul>
  <li>
    <p>Perk of beeing in software development: “I can work from home, I can work from anywhere in the world”</p>
  </li>
  <li>
    <p>Perk of beeing in photography: “Nobody excpets anything from me, I’m a creative…”</p>
  </li>
  <li>
    <p>Perk of beeing in teaching: “June, July and August…”</p>
  </li>
</ul>

<hr />

<ul>
  <li>
    <p>Downside of beeing in software development: “Hey, you work with computers, can you have a look at my printer?”</p>
  </li>
  <li>
    <p>Downside of beeing in photography: “Hey, you’re a photographer, which camera should I buy?”</p>
  </li>
  <li>
    <p>Downside of beeing in teaching: “Hey, you’re a teacher, let me tell you everything that’s wrong with the education system even tough I haven’t set foot in a school in twenty years?”</p>
  </li>
</ul>]]></content><author><name></name></author><category term="Career," /><category term="Work" /><category term="Experience" /><summary type="html"><![CDATA[When reading about people that work in tech I’m often amazed on how straight forward their career path have been. Usually it goes a little bit like this: “I started programming when I was 12, then I went to university and got a degree in computer science, then I got a job at some company and now I’m a senior software engineer”. Voilá easy peasy, the road laid open and it was up there for the taking.]]></summary></entry><entry><title type="html">Optimizing Rider On Wayland</title><link href="/2026/07/29/optimizing-rider-on-wayland.html" rel="alternate" type="text/html" title="Optimizing Rider On Wayland" /><published>2026-07-29T00:00:00+00:00</published><updated>2026-07-29T00:00:00+00:00</updated><id>/2026/07/29/optimizing-rider-on-wayland</id><content type="html" xml:base="/2026/07/29/optimizing-rider-on-wayland.html"><![CDATA[<hr />
<p>layout: post
title: “Optimizing Rider on Wayland”
date: 2026-07-29 21:00:00 +0200
categories: Dotnet, Linux, Wayland, Ubuntu, Gnome</p>

<hr />

<p>Beeing a .NET developer on Linux is an awesome experiece, the days of .NET beeing a Windows only thing is long gone. For Linux (and Mac) users the go to places for writing .NET code is JetBrains Rider, Visual Studio Code and NeoVim. NeoVim and Visual Studio Code beeing more general and needing some tweaking for going from an texteditor to an actual IDE, the obivious choice for those of us seeking and IDE is therefore Rider. I’ve been using it on Linux for the last 4 years and it worked like a charm. But that said, there are of course ways in how we can make it even better.</p>

<h3 id="how-do-rider-run">How do Rider run?</h3>

<p>First thing first, Rider is a hybrid consisting of two different procceses where the UI runs on a modfied version on the JVM (Java virtual machine) called the JBR, JetBrains Runtime.
The analytic motor, ReSharper which is the motor that interprent and understands your code runs as a separate background process on .NET.
These two procceses work together when you type something the JVM process receives the input, draws the charatchers on screen and sends an IPC (inter-process communication) to the .NET proccese that does the syntax validation and other compiler related jobs and then sends it back to the JVM proccese to it to act on the result.</p>

<p>If curious check active proccesses with <code class="language-plaintext highlighter-rouge">pgrep -fa rider</code> and you will see the these two procceses running along with helper processes.</p>

<p>Since the JVM is a virtual machine and works as a sandbox on your maching we can configure the JVM for better perforomance. To do this we need to go to <code class="language-plaintext highlighter-rouge">Help -&gt; Edit Custom VM Options</code>.</p>

<h3 id="increasing-heapsize-give-rider-more-ram">Increasing heapsize (give Rider more RAM)</h3>

<p>The most appearant thing we can do is increasing the amount of memory Rider can consume. Depending on your machine you can set this to whatever see fit, the default value is 2048 MB. On my machine with 32 GB I have bumped it up to 6144 MB.</p>

<h3 id="change-the-garbage-collector">Change the garbage collector</h3>

<p>On a modern machine you can swap the garbage collector to G1GC. G1GC is optimized for doing the cleanup in shorter bursts, giving you a bit softer writing and scrolling experience under heavy load. The trade off beeing that it uses a bit more CPU, so again this is depending on the machine you have.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-Xmx6144m
</code></pre></div></div>

<h3 id="use-wayland">Use Wayland</h3>

<p>For us running Wayland, make sure the JVM uses Wayland and not X11 or else Rider will run a compability layer called Xwayland which translates X11 calls to Wayland.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-Dcom.jetbrains.use.wayland.toolkit=true
</code></pre></div></div>

<h3 id="use-hardware-acceleration-for-2d-rendering">Use hardware acceleration for 2D-rendering</h3>

<p>Instead of having the CPU drawing every UI element we can send it directly to the graphics card.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-Dsun.java2d.opengl=true
</code></pre></div></div>

<h3 id="summary">Summary</h3>

<p>So these simple changes can make Rider even better runing on Linxu with Wayland. My complete config looks like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-Dide.managed.by.toolbox=Path to toolbox
-Dtoolbox.notification.token=Toobox token
-Dtoolbox.notification.portFile= Even more toolbox shit...
-Xmx6144m
-Dcom.jetbrains.use.wayland.toolkit=true
-XX:+UseG1GC
-Dsun.java2d.opengl=true
</code></pre></div></div>

<p>To make sure everything is working as expected you can check your settings in <code class="language-plaintext highlighter-rouge">Help -&gt; About</code> and close and copy (yes, weird I know…) and paste it into a texteditor and check that the settings are there. If you have any other tips for optimizing Rider on Linux please let me know!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[layout: post title: “Optimizing Rider on Wayland” date: 2026-07-29 21:00:00 +0200 categories: Dotnet, Linux, Wayland, Ubuntu, Gnome]]></summary></entry><entry><title type="html">Railway Oriented Programming With Java</title><link href="/2026/02/16/railway-oriented-programming-with-java.html" rel="alternate" type="text/html" title="Railway Oriented Programming With Java" /><published>2026-02-16T00:00:00+00:00</published><updated>2026-02-16T00:00:00+00:00</updated><id>/2026/02/16/railway-oriented-programming-with-java</id><content type="html" xml:base="/2026/02/16/railway-oriented-programming-with-java.html"><![CDATA[<hr />
<p>layout: post
title: “Railway oriented programming with Java”
date: 2026-02-16 22:00:00 +0100
categories: Java, Patterns</p>

<hr />

<p>The term railway oriented programming have been around a while and you can (and should) check it out since there’s a lot of great resources
out <a href="https://fsharpforfunandprofit.com/posts/recipe-part2/">there</a>. But many of these examples are written in functional languages so I thought it would be fun to give some examples in Java.</p>

<p>First thing first, what is railway oriented programming?  In short it’s a way of handling the control flow in a more functional matter, think - less hard to follow control flow and a more conveyor belt like way of handling your applications flow. The railroad part is a great way of building a mental model, instead of
having our control flow like a busy main street with intersections and roundabouts we can think of it as a train track where we have our track
(our happy path) but it can be derailed leading to an exception. A close relative to this thought is a monad but lets not go there now ;)</p>

<h3 id="result">Result<T></T></h3>

<p>In the heart of our Java implementation we’re going to start with a interface that will look like this</p>

<pre><code class="language-Java">public sealed interface Result&lt;T&gt; permits Success, Failure {
}
</code></pre>

<p>Here we have a sealed interface that only permits Success and Failure. As you’ve probably guessed Success and Failure will be the two types that carries our result.</p>

<pre><code class="language-Java">public record Success&lt;T&gt;(T value) implements Result&lt;T&gt; {
}

</code></pre>

<p>Our Success record holds a value of T (bare with me if you’re allergic to Generics, you can implement a type but as you will see, there are huge benefits with sticking to Generics).</p>

<pre><code class="language-Java">public record Failure&lt;T&gt;(String error) implements Result&lt;T&gt; {
}
</code></pre>

<p>Our Failure record only hold a error message. So this far it’s really straight forward, but now we’re going to add some functionality to our Result<T> interface so we can use it to implement the railway pattern.</T></p>

<p>We start of with some static helpers so we can return success or failure, this is nice to haves and we could live without it, but it will come quite handy as you will see.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kd">static</span> <span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="nc">Result</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="nf">success</span><span class="o">(</span><span class="no">T</span> <span class="n">value</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nc">Success</span><span class="o">&lt;&gt;(</span><span class="n">value</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="kd">static</span> <span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="nc">Result</span><span class="o">&lt;</span><span class="no">T</span><span class="o">&gt;</span> <span class="nf">failure</span><span class="o">(</span><span class="nc">String</span> <span class="n">error</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="k">new</span> <span class="nc">Failure</span><span class="o">&lt;&gt;(</span><span class="n">error</span><span class="o">);</span>
    <span class="o">}</span>
</code></pre></div></div>

<p>The next step is to implement a fold method whose only job is to say:</p>

<ul>
  <li>if I’m success -&gt; return onSuccess</li>
  <li>if I’m failure -&gt; return onFailure</li>
</ul>

<p>To make it do this we create a method with a really shitty(or at least hard to read - sorry this was the best I could come up with) method signature.</p>

<pre><code class="language-Java">&lt;R&gt; R fold(Function&lt;? super T, ? extends R&gt; onSuccess,
                       Function&lt;? super String, ? extends R&gt; onFailure)
</code></pre>

<p>It basically takes two functions, one for success and one for failure and they both return the same type R.
With that reading pain out of the way we can look at the whole function:</p>

<pre><code class="language-Java"> default &lt;R&gt; R fold(Function&lt;? super T, ? extends R&gt; onSuccess,
                       Function&lt;? super String, ? extends R&gt; onFailure) {
        if (this instanceof Success&lt;?&gt; s) {
            T value = (T) s.value();
            return onSuccess.apply(value);
        }
        Failure&lt;?&gt; f = (Failure&lt;?&gt;) this;
        return onFailure.apply(f.error());
    }
</code></pre>

<p>Here we check if it’s an <code class="language-plaintext highlighter-rouge">instanceof</code> Success (remember the record), then run the onSuccess function. Otherwise run the onFailure function.</p>

<p>I don’t blame you if you’re confused now, but when we combine this with a bind function (sometimes called a flatMap) then it gets useful</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">default</span> <span class="o">&lt;</span><span class="no">U</span><span class="o">&gt;</span> <span class="nc">Result</span><span class="o">&lt;</span><span class="no">U</span><span class="o">&gt;</span> <span class="nf">bind</span><span class="o">(</span><span class="nc">Function</span><span class="o">&lt;?</span> <span class="kd">super</span> <span class="no">T</span><span class="o">,</span> <span class="o">?</span> <span class="kd">extends</span> <span class="nc">Result</span><span class="o">&lt;</span><span class="no">U</span><span class="o">&gt;&gt;</span> <span class="n">next</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="nf">fold</span><span class="o">(</span>
                <span class="n">next</span><span class="o">,</span>
                <span class="nl">Result:</span><span class="o">:</span><span class="n">failure</span>
        <span class="o">);</span>
    <span class="o">}</span>
</code></pre></div></div>

<p>So bind takes a success value (T) and returns another result with the help of fold. This makes it possible to chain methods together to create a chain (or a track).</p>

<p>Our complete Result<T> now looks like this</T></p>

<pre><code class="language-Java">public sealed interface Result&lt;T&gt; permits Success, Failure {

    static &lt;T&gt; Result&lt;T&gt; success(T value) {
        return new Success&lt;&gt;(value);
    }

    static &lt;T&gt; Result&lt;T&gt; failure(String error) {
        return new Failure&lt;&gt;(error);
    }

    default &lt;R&gt; R fold(Function&lt;? super T, ? extends R&gt; onSuccess,
                       Function&lt;? super String, ? extends R&gt; onFailure) {
        if (this instanceof Success&lt;?&gt; s) {
            T value = (T) s.value();
            return onSuccess.apply(value);
        }
        Failure&lt;?&gt; f = (Failure&lt;?&gt;) this;
        return onFailure.apply(f.error());
    }

    default &lt;U&gt; Result&lt;U&gt; bind(Function&lt;? super T, ? extends Result&lt;U&gt;&gt; next) {
        return fold(
                next,
                Result::failure
        );
    }
}

</code></pre>

<h3 id="so-what-should-i-do-with-this-then">So what should I do with this then?</h3>

<p>Sorry for my extremly bad imagination but lets say we have a really weird utility class that we use for checking if an Integer is positive. Instead of having a lot of if-checks we can simply use our Result<T> to create a railroad pattern</T></p>

<pre><code class="language-Java">public class PositiveIntegerUtil {

    public static Result&lt;Integer&gt; validate(Integer candidate){
        return isNull(candidate)
            .bind(PositiveIntegerUtil::isPositive);
    }

    private static Result&lt;Integer&gt; isNull(Integer candidate){
        return candidate == null
            ? Result.failure("Number cannot be null")
            : Result.success(candidate);
    }

    private static Result&lt;Integer&gt; isPositive(Integer candidate){
        return candidate &lt; 0
            ? Result.failure("Number must be positive")
            : Result.success(candidate);
    }

}
</code></pre>

<p>It’s a stupid example but lets pretend that we had more checks to do, it’s not that hard to see how this could be really useful to chain all the validation logic together with an easy short-circut if something breaks.</p>

<p>Just to get a clear sense of the usage we can write some tests to see</p>

<pre><code class="language-Java">package util;

import org.example.result.Failure;
import org.example.result.Success;
import org.example.util.PositiveIntegerUtil;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertInstanceOf;

public class PositiveIntegerUtilTest {

    @Test
    public void givenANegativeInteger_whenValidating_thenFailure() {
        var result = PositiveIntegerUtil.validate(-1);
        assertInstanceOf(Failure.class, result);

        var failure = (Failure&lt;Integer&gt;) result;
        assert(failure.error().contains("must be positive"));
    }

    @Test
    public void givenANullInteger_whenValidating_thenFailure() {
        var result = PositiveIntegerUtil.validate(null);
        assertInstanceOf(Failure.class, result);

        var failure = (Failure&lt;Integer&gt;) result;
        assert(failure.error().contains("Number cannot be null"));
    }

    @Test
    public void givenAPositiveInteger_whenValidating_thenSuccess() {
        var result = PositiveIntegerUtil.validate(1);
        assertInstanceOf(result.getClass(), result);

        var success = (Success&lt;Integer&gt;) result;
        assert(success.value() == 1);
    }
}

</code></pre>

<p>A real win we get from having our Result<T> interface is that we can reuse it for any type so if we want a new equally stupid String utility class we can create one
without changing anything on Result<T></T></T></p>

<pre><code class="language-Java">package org.example.util;

import org.example.result.Failure;
import org.example.result.Result;
import org.example.result.Success;

public class StringUtil {

    public static Result&lt;String&gt; validate(String candidate){
        return isNull(candidate)
            .bind(StringUtil::isEmpty);
    }

    private static Result&lt;String&gt; isEmpty(String candidate){
        return candidate.isEmpty()
            ? new Failure&lt;&gt;("String cannot be empty")
            : new Success&lt;&gt;(candidate);
    }

    private static Result&lt;String&gt; isNull(String candidate){
        return candidate == null
            ? new Failure&lt;&gt;("String cannot be null")
            : new Success&lt;&gt;(candidate);
    }
}

</code></pre>

<pre><code class="language-Java">package util;

import org.example.result.Failure;
import org.example.result.Success;
import org.example.util.StringUtil;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;

public class StringUtilTest {

    @Test
    public void givenAString_whenValidating_thenSuccess() {

        var result = StringUtil.validate("racecar");
        assertInstanceOf(Success.class, result);

        var success = (Success&lt;String&gt;) result;
        assertEquals("racecar", success.value());
    }

    @Test
    void givenNull_whenValidating_thenFailureWithMessage() {
        var result = StringUtil.validate(null);

        assertInstanceOf(Failure.class, result);
        var failure = (Failure&lt;String&gt;) result;
        assertEquals("String cannot be null", failure.error());
    }

    @Test
    void givenEmptyString_whenValidating_thenFailureWithMessage() {
        var result = StringUtil.validate("");

        assertInstanceOf(Failure.class, result);
        var failure = (Failure&lt;String&gt;) result;
        assertEquals("String cannot be empty", failure.error());
    }
}

</code></pre>

<h3 id="summary">Summary</h3>

<p>So should I never write a if statement again? Yes you probably should but this pattern can come really handy when the control flow starts to get a bit to nested and the logic get hard to follow. That’s all for this time, hope you found something useful!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[layout: post title: “Railway oriented programming with Java” date: 2026-02-16 22:00:00 +0100 categories: Java, Patterns]]></summary></entry><entry><title type="html">Null safety in Spring Boot 4</title><link href="/java,/springboot/2026/01/18/null-safety-in-spring-boot-4.html" rel="alternate" type="text/html" title="Null safety in Spring Boot 4" /><published>2026-01-18T21:10:00+00:00</published><updated>2026-01-18T21:10:00+00:00</updated><id>/java,/springboot/2026/01/18/null-safety-in-spring-boot-4</id><content type="html" xml:base="/java,/springboot/2026/01/18/null-safety-in-spring-boot-4.html"><![CDATA[<p>I’ve heard somewhere that the invention of the null reference in Java was a billion dollar misstake.
The reason for it beeing a “billion dollar misstake” would then be refering to all the crashes, NullPointerExceptions and overall
nastyness that this has caused production systems all over the world. And yeah, we’ve all been there, the NullPointerException hits you
like a rock in the head. The reason for this is how Java works with null where nullness is implicit. Meaning something may or may not
be null.</p>

<p>There are of course patterns to deal with this but what if you could just stop worrying alltogether? Well now we got a big step on the way towards that can 🎉</p>

<p>With Spring Boot 4 we get an implementation of <a href="https://jspecify.dev/docs/api/org/jspecify/annotations/package-summary.html#nullness">JSpecify</a>
we can now say thats it’s not null by default with @NullMarked annotation.</p>

<p>So how do you get this sweetness into your life?</p>

<p>It’s actualy pretty straight forward, add a new (or update your old) package-info.java file like:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@NullMarked</span>
<span class="kn">package</span> <span class="nn">com.your.path.here</span><span class="o">;</span>

<span class="kn">import</span> <span class="nn">org.jspecify.annotations.NullMarked</span><span class="o">;</span>

</code></pre></div></div>

<p>Something to remember here tough is that sub-packages doesn’t inherit the package-info file so they need to be declared per package.</p>

<p>Then if you need stuff to still possible return null</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@NullMarked</span>
<span class="nd">@Service</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">CanReturnNullService</span><span class="o">{</span>

    <span class="nd">@Nullable</span>
    <span class="kd">public</span> <span class="nc">Todo</span> <span class="nf">findById</span><span class="o">(</span><span class="nc">Long</span> <span class="n">id</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">todoRepository</span><span class="o">.</span><span class="na">findById</span><span class="o">(</span><span class="n">id</span><span class="o">).</span><span class="na">orElse</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
    <span class="o">}</span>

<span class="o">}</span>

</code></pre></div></div>

<p>You can even use this for input parameters and mark them with @Nullable.</p>

<h3 id="optional">Optional</h3>

<p>By now you’re probably wondering why you just can’t use Optional everywhere instad.
In my opinion it’s not an either or, have them both in your toolbelt but I think @NullMarked is specially good
in those cases where you don’t want to brake an existing contract. Changing a return type breaks it.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">@Service</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">CanReturnNullService</span><span class="o">{</span>

    <span class="c1">// Doesn't break any contract</span>
    <span class="nd">@Nullable</span>
    <span class="kd">public</span> <span class="nc">Todo</span> <span class="nf">findById</span><span class="o">(</span><span class="nc">Long</span> <span class="n">id</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">todoRepository</span><span class="o">.</span><span class="na">findById</span><span class="o">(</span><span class="n">id</span><span class="o">).</span><span class="na">orElse</span><span class="o">(</span><span class="kc">null</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="c1">// Breaks contract</span>
    <span class="c1">// if existing contract is</span>
    <span class="c1">// public Todo findById(Long id)</span>
    <span class="kd">public</span> <span class="nc">Optional</span><span class="o">&lt;</span><span class="nc">Todo</span><span class="o">&gt;</span> <span class="nf">findById</span><span class="o">(</span><span class="nc">Long</span> <span class="n">id</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">todoRepository</span><span class="o">.</span><span class="na">findById</span><span class="o">(</span><span class="n">id</span><span class="o">);</span>

  <span class="o">}</span>

<span class="o">}</span>

</code></pre></div></div>

<p>So use them both, they both have there place, on a new service/api/project I would probably use Optional
but since reality often involves existing contracts I think @NullMarked is a really good tool.</p>]]></content><author><name></name></author><category term="Java," /><category term="SpringBoot" /><summary type="html"><![CDATA[I’ve heard somewhere that the invention of the null reference in Java was a billion dollar misstake. The reason for it beeing a “billion dollar misstake” would then be refering to all the crashes, NullPointerExceptions and overall nastyness that this has caused production systems all over the world. And yeah, we’ve all been there, the NullPointerException hits you like a rock in the head. The reason for this is how Java works with null where nullness is implicit. Meaning something may or may not be null.]]></summary></entry><entry><title type="html">Handling Guids and nesting from LLM output</title><link href="/c%23,/llm/2025/08/16/handling-llm-output.html" rel="alternate" type="text/html" title="Handling Guids and nesting from LLM output" /><published>2025-08-16T15:00:00+00:00</published><updated>2025-08-16T15:00:00+00:00</updated><id>/c%23,/llm/2025/08/16/handling-llm-output</id><content type="html" xml:base="/c%23,/llm/2025/08/16/handling-llm-output.html"><![CDATA[<p>I’ve recently run into a bit off weird issues when trying to save my structured LLM outputs using C#. The issue comes when interacting with a LLM using Microsoft.Extensions.AI</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="kt">var</span> <span class="n">response</span> <span class="p">=</span> <span class="k">await</span> <span class="n">chatClient</span><span class="p">.</span><span class="n">GetResponseAsync</span><span class="p">&lt;</span><span class="n">MealPlan</span><span class="p">&gt;(</span><span class="n">chatHistory</span><span class="p">);</span>
</code></pre></div></div>

<p>In my particular use case a MealPlan is a model that holds recipes and are tied to a user. The recipe in it’s turn has a list of ingredients. 
Some off the issues i had was that the LLM (gpt-5-mini in my case) had a hard time with the nesting so I ended up with a graph tree that Entity Framework couldn’t save.</p>

<p>First thing I realized that I screwed up was that I allowed the LLM to create GUIDs which resulted in me getting faulty GUIDs for some properties. 
So I hade to let Entity Framework be in charge of that and use decorations to make shure it was database generated and ignored when parsing on all my Id properties that were affected.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="p">[</span><span class="n">JsonIgnore</span><span class="p">]</span>
    <span class="p">[</span><span class="n">Required</span><span class="p">]</span>
    <span class="p">[</span><span class="n">Key</span><span class="p">]</span>
    <span class="p">[</span><span class="nf">DatabaseGenerated</span><span class="p">(</span><span class="n">DatabaseGeneratedOption</span><span class="p">.</span><span class="n">Identity</span><span class="p">)]</span>
    <span class="k">public</span>  <span class="n">Guid</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="n">init</span><span class="p">;</span> <span class="p">}</span>
</code></pre></div></div>

<p>The second issue I had was with the relations where I would sometimes get meal plans without recipes and other times I would get loops of mealplans with recipes that had the mealplan inside them that had the recipe inside and so on resulting in a huge json payload (glad I hade the [NotMapped] decorator on affected entities in Entity Framework). And as first step I tried to be more precise in the prompt rules</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">new</span><span class="p">(</span><span class="n">ChatRole</span><span class="p">.</span><span class="n">System</span><span class="p">,</span> <span class="s">"""
</span>                                  <span class="n">You</span> <span class="n">are</span> <span class="n">a</span> <span class="n">friendly</span> <span class="n">assistant</span> <span class="n">that</span> <span class="n">plans</span> <span class="n">meals</span> <span class="k">for</span> <span class="n">a</span> <span class="n">family</span><span class="p">.</span> <span class="n">You</span> <span class="n">give</span> <span class="n">them</span><span class="p">:</span>

                                                                     <span class="m">1.</span> <span class="n">The</span> <span class="n">recipes</span> <span class="n">that</span> <span class="n">they</span> <span class="n">can</span> <span class="n">cook</span>
                                                                     <span class="m">2.</span> <span class="n">The</span> <span class="n">ingredients</span> <span class="n">that</span> <span class="n">they</span> <span class="n">can</span> <span class="n">use</span>

                                                                     <span class="n">Your</span> <span class="n">goal</span> <span class="k">is</span> <span class="n">to</span> <span class="n">always</span> <span class="n">bring</span> <span class="n">a</span> <span class="n">mix</span> <span class="n">of</span> <span class="n">easy</span> <span class="n">to</span> <span class="n">cook</span> <span class="n">meals</span><span class="p">,</span> <span class="n">that</span> <span class="n">are</span> <span class="n">affordable</span> <span class="n">and</span> <span class="n">also</span> <span class="n">nutritious</span><span class="p">.</span> 

                                                                     <span class="n">Output</span> <span class="n">a</span> <span class="n">single</span> <span class="n">JSON</span> <span class="kt">object</span> <span class="n">that</span> <span class="n">matches</span> <span class="n">the</span> <span class="n">MealPlan</span> <span class="n">schema</span> <span class="n">expected</span> <span class="k">by</span> <span class="n">the</span> <span class="n">app</span><span class="p">.</span>

                                                                     <span class="n">Rules</span><span class="p">:</span>
                                                                     <span class="p">-</span> <span class="n">Do</span> <span class="n">NOT</span> <span class="n">include</span> <span class="n">any</span> <span class="n">properties</span> <span class="n">named</span> <span class="s">"id"</span> <span class="n">or</span> <span class="n">ending</span> <span class="n">with</span> <span class="s">"Id"</span> <span class="p">(</span><span class="n">they</span> <span class="n">will</span> <span class="n">be</span> <span class="n">generated</span><span class="p">/</span><span class="n">assigned</span> <span class="n">server</span><span class="p">-</span><span class="n">side</span><span class="p">).</span>
                                                                     <span class="p">-</span> <span class="n">Do</span> <span class="n">NOT</span> <span class="n">include</span> <span class="n">navigation</span> <span class="nf">objects</span> <span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">g</span><span class="p">.,</span> <span class="k">do</span> <span class="n">not</span> <span class="n">embed</span> <span class="n">Recipe</span> <span class="n">inside</span> <span class="n">Ingredient</span><span class="p">).</span>
                                                                     <span class="p">-</span> <span class="n">Make</span> <span class="n">sure</span> <span class="n">that</span> <span class="n">recipes</span> <span class="n">and</span> <span class="n">ingredients</span> <span class="n">are</span> <span class="n">created</span> <span class="n">and</span> <span class="n">unique</span><span class="p">.</span>
                                  
                                 <span class="s">"""),
</span></code></pre></div></div>
<p>This made the output a lot better and I got it working pretty sweet. 
But I would still say that fixing issues like his can be pretty cumbersome since the LLM outputs are non determinitic by nature which makes it a lot harder
to predict the outcome. With that said beeing able to cast the output is a huge help.</p>]]></content><author><name></name></author><category term="C#," /><category term="LLM" /><summary type="html"><![CDATA[I’ve recently run into a bit off weird issues when trying to save my structured LLM outputs using C#. The issue comes when interacting with a LLM using Microsoft.Extensions.AI]]></summary></entry><entry><title type="html">The worst way to get a reminder</title><link href="/c%23,/azure/2025/07/23/the-worst-way-to-get-a-reminder.html" rel="alternate" type="text/html" title="The worst way to get a reminder" /><published>2025-07-23T09:00:00+00:00</published><updated>2025-07-23T09:00:00+00:00</updated><id>/c%23,/azure/2025/07/23/the-worst-way-to-get-a-reminder</id><content type="html" xml:base="/c%23,/azure/2025/07/23/the-worst-way-to-get-a-reminder.html"><![CDATA[<p>Ah vaccation, the perfect time to build something completely useless and impractical!</p>

<p>So the situation is that I recently bought a some new plants for indoor use and planted some seeds in my garden. All of this is great but whats the point of buying something if I can’t build something to go along with it 😉</p>

<p>I’ve previously built a small soil moisture sensor that I use to monitor the soil moisture for indoor plants. It works but now I needed something that I could leave outside and survive the weather. I could of course have but a ESP-32 in a waterproof box but I already know how to do that so whats the fun in that?</p>

<p>The most obvious solution and probably the best one would be to set an alarm on my phone or use a calendar app to remind me to water the plants. But again, where is the fun in that?</p>

<p>Instead I decided to use Azure Functions and a timer trigger to send me an email every day at 8:00 AM reminding me to water the plants. This is of course a very bad idea since I will get an email every day even if I don’t need to water the plants. But hey, I had never used Azure Functions before so why not?</p>

<p>I created a new Azure Function project and added a timer trigger function that runs every day at 8:00 AM. The code looks something like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">TimeFunc</span><span class="p">(</span><span class="n">ILoggerFactory</span> <span class="n">loggerFactory</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">ILogger</span> <span class="n">_logger</span> <span class="p">=</span> <span class="n">loggerFactory</span><span class="p">.</span><span class="n">CreateLogger</span><span class="p">&lt;</span><span class="n">WateringTimeFunc</span><span class="p">&gt;();</span>

    <span class="p">[</span><span class="nf">Function</span><span class="p">(</span><span class="s">"WateringTimeFunc"</span><span class="p">)]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Run</span><span class="p">([</span><span class="nf">TimerTrigger</span><span class="p">(</span><span class="s">"0 0 20 * * *"</span><span class="p">)]</span> <span class="n">TimerInfo</span> <span class="n">myTimer</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_logger</span><span class="p">.</span><span class="nf">LogInformation</span><span class="p">(</span><span class="s">"C# Timer trigger function executed at: {executionTime}"</span><span class="p">,</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">);</span>
       
    <span class="p">}</span>
<span class="p">}</span> 
</code></pre></div></div>

<p>The next step was sending a reminder email (I now this is so stupid, there are a hundred ways to do this better…), I previously used SendGrid to send emails so I decided to go with that. BUT…. Appearantly SendGrid didn’t have a free option (apart from a 60 day trial) so that went to shit. After some searching I found out that Azure has a service called Azure Communication Services that includes email capabilities and has a free tier. So I decided to give that a try.</p>

<p>I created a new Azure Communication Services resource in the Azure portal and obtained the connection string. Then I updated my Azure Function to use the Azure Communication Services SDK to send the email. The updated code looks like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">TimeFunc</span><span class="p">(</span><span class="n">ILoggerFactory</span> <span class="n">loggerFactory</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">ILogger</span> <span class="n">_logger</span> <span class="p">=</span> <span class="n">loggerFactory</span><span class="p">.</span><span class="n">CreateLogger</span><span class="p">&lt;</span><span class="n">WateringTimeFunc</span><span class="p">&gt;();</span>

    <span class="p">[</span><span class="nf">Function</span><span class="p">(</span><span class="s">"TimeFunc"</span><span class="p">)]</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Run</span><span class="p">([</span><span class="nf">TimerTrigger</span><span class="p">(</span><span class="s">"0 0 20 * * *"</span><span class="p">)]</span> <span class="n">TimerInfo</span> <span class="n">myTimer</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_logger</span><span class="p">.</span><span class="nf">LogInformation</span><span class="p">(</span><span class="s">"C# Timer trigger function executed at: {executionTime}"</span><span class="p">,</span> <span class="n">DateTime</span><span class="p">.</span><span class="n">Now</span><span class="p">);</span>
        <span class="kt">var</span> <span class="n">connectionString</span> <span class="p">=</span> <span class="n">Environment</span><span class="p">.</span><span class="nf">GetEnvironmentVariable</span><span class="p">(</span><span class="s">"EmailPrimary"</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="kt">string</span><span class="p">.</span><span class="nf">IsNullOrEmpty</span><span class="p">(</span><span class="n">connectionString</span><span class="p">))</span>
        <span class="p">{</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">InvalidOperationException</span><span class="p">(</span><span class="s">"Cant access connection string."</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="kt">var</span> <span class="n">senderAddress</span> <span class="p">=</span> <span class="n">Environment</span><span class="p">.</span><span class="nf">GetEnvironmentVariable</span><span class="p">(</span><span class="s">"SenderEmailAddress"</span><span class="p">);</span>
        <span class="kt">var</span> <span class="n">recipientAddress</span> <span class="p">=</span> <span class="n">Environment</span><span class="p">.</span><span class="nf">GetEnvironmentVariable</span><span class="p">(</span><span class="s">"RecipientEmailAddress"</span><span class="p">);</span>
        <span class="kt">var</span> <span class="n">emailClient</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">EmailClient</span><span class="p">(</span><span class="n">connectionString</span><span class="p">);</span>
        <span class="k">try</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">emailSendOperation</span> <span class="p">=</span> <span class="k">await</span> <span class="n">emailClient</span><span class="p">.</span><span class="nf">SendAsync</span><span class="p">(</span>
                <span class="n">wait</span><span class="p">:</span> <span class="n">WaitUntil</span><span class="p">.</span><span class="n">Completed</span><span class="p">,</span>
                <span class="n">senderAddress</span><span class="p">:</span> <span class="n">senderAddress</span><span class="p">,</span>
                <span class="n">recipientAddress</span><span class="p">:</span> <span class="n">recipientAddress</span><span class="p">,</span>
                <span class="n">subject</span><span class="p">:</span> <span class="s">"Dags att vattna blommorna"</span><span class="p">,</span>
                <span class="n">htmlContent</span><span class="p">:</span> <span class="s">"&lt;html&gt;&lt;body&gt;Vattna blommorna!&lt;/body&gt;&lt;/html&gt;"</span><span class="p">);</span>
            <span class="n">_logger</span><span class="p">.</span><span class="nf">LogInformation</span><span class="p">(</span><span class="s">"Email sent successfully with operation ID: {operationId}"</span><span class="p">,</span> <span class="n">emailSendOperation</span><span class="p">.</span><span class="n">Id</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">catch</span> <span class="p">(</span><span class="n">RequestFailedException</span> <span class="n">ex</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">_logger</span><span class="p">.</span><span class="nf">LogError</span><span class="p">(</span><span class="s">$"Email send operation failed with error code: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">ErrorCode</span><span class="p">}</span><span class="s">, message: </span><span class="p">{</span><span class="n">ex</span><span class="p">.</span><span class="n">Message</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span> 
</code></pre></div></div>

<p>Everything was smooth sailing from here, I deployed the function to Azure and set up the necessary environment variables for the connection string and email addresses. Now, every day at 8:00 AM, I receive an email reminding me to water my plants. I will probably be annoyed after a week or so and just turn it off, but hey, I learned something new and had some fun along the way!</p>]]></content><author><name></name></author><category term="C#," /><category term="azure" /><summary type="html"><![CDATA[Ah vaccation, the perfect time to build something completely useless and impractical!]]></summary></entry><entry><title type="html">Playing around with delegates</title><link href="/c%23/2025/03/22/playing-around-with-delegates.html" rel="alternate" type="text/html" title="Playing around with delegates" /><published>2025-03-22T20:21:00+00:00</published><updated>2025-03-22T20:21:00+00:00</updated><id>/c%23/2025/03/22/playing-around-with-delegates</id><content type="html" xml:base="/c%23/2025/03/22/playing-around-with-delegates.html"><![CDATA[<p>I recently played around with functional interfaces in Java. C# as you know, doesn’t have functional interfaces, the closest thing being delegates and lambdas. So how can you create something similar to</p>

<pre><code class="language-Java">@FunctionalInterface
interface CheckTwoObjects {
    boolean check(Object o1, Object o2);
}
</code></pre>

<p>In C# we can use Func&lt;T, T, T&gt;, Action<T> and lambdas to achive the same thing.</T></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="n">CompareTwoComparableObjects</span><span class="p">&lt;</span><span class="n">T1</span><span class="p">,</span> <span class="n">T2</span><span class="p">&gt;</span> <span class="p">(</span><span class="n">T1</span> <span class="n">t1</span><span class="p">,</span> <span class="n">T2</span> <span class="n">t2</span><span class="p">,</span>  <span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">,</span> <span class="kt">object</span><span class="p">,</span> <span class="kt">bool</span><span class="p">&gt;</span> <span class="n">comparison</span><span class="p">,</span> <span class="n">Func</span><span class="p">&lt;</span><span class="kt">object</span><span class="p">,</span> <span class="kt">object</span><span class="p">,</span> <span class="kt">bool</span><span class="p">&gt;</span> <span class="n">typeCheck</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nf">comparison</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="nf">typeCheck</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">);</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">AreEqual</span><span class="p">(</span><span class="kt">object</span> <span class="n">o1</span><span class="p">,</span> <span class="kt">object</span> <span class="n">o2</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">o1</span><span class="p">.</span><span class="nf">Equals</span><span class="p">(</span><span class="n">o2</span><span class="p">);</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">AreIntegers</span><span class="p">(</span><span class="kt">object</span> <span class="n">o1</span><span class="p">,</span> <span class="kt">object</span> <span class="n">o2</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="n">o1</span> <span class="k">is</span> <span class="kt">int</span> <span class="p">&amp;&amp;</span> <span class="n">o2</span> <span class="k">is</span> <span class="kt">int</span><span class="p">;</span>
</code></pre></div></div>

<p>Here we have three methods. The first one takes two generic objects and two functions that both takes two objects and return boleans. As you probably guessed we are going to put the last two methods in the first one like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">result</span> <span class="p">=</span> <span class="nf">CompareTwoComparableObjects</span><span class="p">(</span><span class="s">"someValue"</span><span class="p">,</span> <span class="s">"someOtherValue"</span><span class="p">,</span> <span class="n">AreEqual</span><span class="p">,</span> <span class="n">AreIntegers</span><span class="p">);</span>
</code></pre></div></div>

<p>This simple method makes it possible for us to create something very similar to Javas functional interfaces and we can use the method like:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="s">"x"</span><span class="p">;</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="m">5</span><span class="p">;</span>
<span class="kt">var</span> <span class="n">checkTheseTwo</span> <span class="p">=</span> <span class="nf">CompareTwoComparableObjects</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">AreEqual</span><span class="p">,</span> <span class="n">AreIntegers</span><span class="p">);</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"</span><span class="p">{</span><span class="n">a</span><span class="p">}</span><span class="s"> and </span><span class="p">{</span><span class="n">b</span><span class="p">}</span><span class="s"> have the same value and are numbers : </span><span class="p">{</span><span class="n">checkTheseTwo</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
</code></pre></div></div>

<p>You can of course write any combination of methods, I choose simple predicates just to keep it simple in this example but hey, go wild :)</p>]]></content><author><name></name></author><category term="C#" /><summary type="html"><![CDATA[I recently played around with functional interfaces in Java. C# as you know, doesn’t have functional interfaces, the closest thing being delegates and lambdas. So how can you create something similar to]]></summary></entry><entry><title type="html">Immediate or deferred execution</title><link href="/c%23,/linq/2024/11/02/immediate-or-deferred-execution.html" rel="alternate" type="text/html" title="Immediate or deferred execution" /><published>2024-11-02T18:00:00+00:00</published><updated>2024-11-02T18:00:00+00:00</updated><id>/c%23,/linq/2024/11/02/immediate-or-deferred-execution</id><content type="html" xml:base="/c%23,/linq/2024/11/02/immediate-or-deferred-execution.html"><![CDATA[<p>When I first started using LINQ I was a bit confused why I sometimes didn’t get back the result I expected. The thing I didn’t now was that LINQ uses <strong>deferred execution</strong>. This means that the query is not executed until the result is actually needed. This is a good thing because it allows us to build up complex queries without executing them until we actually need the result.</p>

<p>For someone coming from a different background this might be a bit confusing so lets have a look and see whats going on.</p>

<p>In our example we are creating something that can help us sort tarantulas in case they are poisonous or not. We start of with a class called Tarantulas that looks like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">Tarantula</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsNewWorld</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsPoisonous</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>If we then create a list of various tarantulas, and filter out the non venomous ones before printing the result we get something like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="n">tarantulas</span> <span class="p">=</span>
<span class="p">[</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Poecilotheria regalis"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">true</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Tarantula</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Aphonopelma chalcodes"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Brachypelma hamorii"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Tliltocatl albopilosus"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">}</span>
<span class="p">];</span>

<span class="kt">var</span> <span class="n">poisoniusTarantulas</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">spider</span> <span class="p">=&gt;</span> <span class="n">spider</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">);</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Dont pet: "</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">tarantula</span> <span class="k">in</span> <span class="n">poisoniusTarantulas</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">tarantula</span><span class="p">.</span><span class="n">Name</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>So far it’s all pretty straight forward. But what if we add a new tarantula to the list after we have filtered out the non venomous ones?</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">List</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="n">tarantulas</span> <span class="p">=</span>
<span class="p">[</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Poecilotheria regalis"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">true</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Tarantula</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Aphonopelma chalcodes"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Brachypelma hamorii"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Tliltocatl albopilosus"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">}</span>
<span class="p">];</span>

<span class="kt">var</span> <span class="n">poisoniusTarantulas</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">spider</span> <span class="p">=&gt;</span> <span class="n">spider</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">poisonius</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">GetPoisonousTarantulas</span><span class="p">();</span>
<span class="n">tarantulas</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Pelinobius muticus"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">true</span>
    <span class="p">});</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Dont pet: "</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">tarantula</span> <span class="k">in</span> <span class="n">poisoniusTarantulas</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">tarantula</span><span class="p">.</span><span class="n">Name</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>This will print</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Dont pet: 
Poecilotheria regalis
Pelinobius muticus
</code></pre></div></div>

<p>This is because the query is not executed until we actually need the result. If we want to execute the query immediately we can use the <code class="language-plaintext highlighter-rouge">ToList()</code> method.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">poisoniusTarantulas</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">spider</span> <span class="p">=&gt;</span> <span class="n">spider</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">).</span><span class="nf">ToList</span><span class="p">();</span>
</code></pre></div></div>
<p>and then our output will be</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Dont</span> <span class="n">pet</span><span class="p">:</span>
<span class="n">Poecilotheria</span> <span class="n">regalis</span>
</code></pre></div></div>
<p>Strange? Not really, just remember that LINQ uses deferred execution, think of it as lazy loading, query will not be called until needed.</p>

<p>To make it even more clear we can create an extension method that prints the name and then yield returns the poisonous tarantulas.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">SpiderExtensions</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="nf">GetPoisonousTarantulas</span><span class="p">(</span><span class="k">this</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="n">tarantulas</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">tarantula</span> <span class="k">in</span> <span class="n">tarantulas</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"</span><span class="p">{</span><span class="n">tarantula</span><span class="p">.</span><span class="n">Name</span><span class="p">}</span><span class="s"> is sorted here"</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">tarantula</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">yield</span> <span class="k">return</span> <span class="n">tarantula</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And then we can call it like this:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">poisonius</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">GetPoisonousTarantulas</span><span class="p">();</span>
</code></pre></div></div>

<p>this will print</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Aphonopelma chalcodes
Brachypelma hamorii is sorted here
Brachypelma hamorii
Tliltocatl albopilosus is sorted here
Tliltocatl albopilosus
Pelinobius muticus is sorted here
Pelinobius muticus
</code></pre></div></div>

<p>If we change it to use the <code class="language-plaintext highlighter-rouge">ToList()</code> method to execute the query immediately.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">poisonius</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">GetPoisonousTarantulas</span><span class="p">().</span><span class="nf">ToList</span><span class="p">();</span>
</code></pre></div></div>

<p>this will output</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Poecilotheria regalis is sorted here
Aphonopelma chalcodes is sorted here
Brachypelma hamorii is sorted here
Tliltocatl albopilosus is sorted here
Dont pet: 
Poecilotheria regalis
</code></pre></div></div>

<p>Finally we can use the both sorting methods but only call the list that didn’t use the extension method. We see that the extension method is never called since it doesn’t print anything.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">sealed</span> <span class="k">class</span> <span class="nc">Tarantula</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsNewWorld</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsPoisonous</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">SpiderExtensions</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="nf">GetPoisonousTarantulas</span><span class="p">(</span><span class="k">this</span> <span class="n">IEnumerable</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="n">tarantulas</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">tarantula</span> <span class="k">in</span> <span class="n">tarantulas</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"</span><span class="p">{</span><span class="n">tarantula</span><span class="p">.</span><span class="n">Name</span><span class="p">}</span><span class="s"> is sorted here"</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">tarantula</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="k">yield</span> <span class="k">return</span> <span class="n">tarantula</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="n">List</span><span class="p">&lt;</span><span class="n">Tarantula</span><span class="p">&gt;</span> <span class="n">tarantulas</span> <span class="p">=</span>
<span class="p">[</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Poecilotheria regalis"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">true</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Tarantula</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Aphonopelma chalcodes"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Brachypelma hamorii"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">},</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Tliltocatl albopilosus"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">true</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">false</span>
    <span class="p">}</span>
<span class="p">];</span>

<span class="kt">var</span> <span class="n">poisoniusTarantulas</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">Where</span><span class="p">(</span><span class="n">spider</span> <span class="p">=&gt;</span> <span class="n">spider</span><span class="p">.</span><span class="n">IsPoisonous</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">poisonius</span> <span class="p">=</span> <span class="n">tarantulas</span><span class="p">.</span><span class="nf">GetPoisonousTarantulas</span><span class="p">();</span>
<span class="n">tarantulas</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span>
    <span class="k">new</span> <span class="n">Tarantula</span>
    <span class="p">{</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"Pelinobius muticus"</span><span class="p">,</span>
        <span class="n">IsNewWorld</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span>
        <span class="n">IsPoisonous</span> <span class="p">=</span> <span class="k">true</span>
    <span class="p">});</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Dont pet: "</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">tarantula</span> <span class="k">in</span> <span class="n">poisoniusTarantulas</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">tarantula</span><span class="p">.</span><span class="n">Name</span><span class="p">);</span>
<span class="p">}</span>

</code></pre></div></div>

<p>Which will output</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Dont pet: 
Poecilotheria regalis
Pelinobius muticus
</code></pre></div></div>
<p>Hope use had some use of this post and just for the record, Pelinobius muticus isn’t that poisonous, but really defensive (and big) and I couldn’t think of any other tarantula that was poisonous :D</p>]]></content><author><name></name></author><category term="C#," /><category term="LINQ" /><summary type="html"><![CDATA[When I first started using LINQ I was a bit confused why I sometimes didn’t get back the result I expected. The thing I didn’t now was that LINQ uses deferred execution. This means that the query is not executed until the result is actually needed. This is a good thing because it allows us to build up complex queries without executing them until we actually need the result.]]></summary></entry><entry><title type="html">Stack and Queue data structures</title><link href="/datastructures/2024/11/02/stack-and-queue-structures.html" rel="alternate" type="text/html" title="Stack and Queue data structures" /><published>2024-11-02T09:40:00+00:00</published><updated>2024-11-02T09:40:00+00:00</updated><id>/datastructures/2024/11/02/stack-and-queue-structures</id><content type="html" xml:base="/datastructures/2024/11/02/stack-and-queue-structures.html"><![CDATA[<p>So you’ve just started out your programming journey and you probably heard about the stack in some way or another, maybe you’ve visited <a href="https://stackoverflow.com/">StackOverflow</a> and wondered about the name. Maybe you heard a term like call stack or even looked at one while debugging. In this post I thought it would be fun to look at two different data structures that are pretty foundational to how your computer handles memory, the stack and the queue data structures. I will have my examples in C# but the data structure itself isn’t tied to any programming language.</p>

<h2 id="the-stack-data-structure">The stack data structure</h2>

<p>If we imagine a stack of records (not a C# record but a vinyl record) and we have three vinyl records: at the bottom we have Miles Davis - Kind of blue, in the middle we have Nas - Illmatic and at the top we have Toots and the Maytals - In the dark. So far so good, but now we want to listen to Illamtic. Since it’s in the middle we first have to remove In the dark to access Illmatic. If we instead want to listen to Kind of blue we have to remove both In the dark and Illmatic since it’s at the bottom. This is the core principle of the stack! We can also put it as first in - first out <strong>FILO</strong>. Lets say we got a stack of numbers. Like 1, 2, 3, 4 and 5 and we want to access 3. Then we have to remove 5 and 4. so our new stack is 1, 2 and 3. The process of removing from a stack is called <strong>poping</strong> and if we add to the stack we call that <strong>pushing</strong>.</p>

<p>If we return to our stack of three vinyl records, lets say that we have built ourself some kind of vinyl record storage. Since we only had three records and we’re out of money we only build or storage for three records. One day a friend comes and gives us a fourth vinyl record. We try and put it in the storage but remember, we only built it for three vinyl records so when we add the fourht theres no room for it. Now we got a <strong>stack overflow</strong>.</p>

<p>If we instead would sell all of our vinyl records and then forgets about it and we go to our storage to get a vinyl record but it’s empty, then we got a <strong>stack underflow</strong>.</p>

<h2 id="stack-code-example">Stack code example</h2>

<p>For this example I worked with a linked list. A linked list is a list of nodes where each node has a value and a reference to the next node. If we have a linked list of three letters A, B and C.</p>

<p>The first node A has the value of A and a reference to B.</p>

<p>The second node has the value of B and a reference to C.</p>

<p>The third node has the value of C and a null reference.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">StackLinkedList</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_first</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">LinkedList</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">List</span> <span class="p">=</span> <span class="p">[];</span>
<span class="p">}</span>
</code></pre></div></div>

<p>as you can see our stack class consists of a linked list and a linked list node called _first that will serve as our reference to where we are in the stack. Lets add methods for pop and push operations on the stack</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    
    <span class="c1">// our Push method takes a value</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Push</span><span class="p">(</span><span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// we create a new node to hold our value</span>
        <span class="kt">var</span> <span class="n">newNode</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="k">value</span><span class="p">);</span>
        <span class="c1">// we assign our _first node the value</span>
        <span class="n">_first</span> <span class="p">=</span> <span class="n">newNode</span><span class="p">;</span> 

        <span class="c1">// and finally adds it to the stack</span>
        <span class="n">List</span><span class="p">.</span><span class="nf">AddLast</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
    <span class="p">}</span>
    

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Pop</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="c1">// we create a temporary node to print we value we remove (this is not neccessary if you dont care what is removed)</span>
        <span class="kt">var</span> <span class="n">temp</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>

        <span class="c1">// if _first is null and we try to remove we get a stack underflow</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span> 
        <span class="p">{</span> 
            <span class="c1">// we make the node behind first node the new first node (ideally we would like to check so there's an actual node behind too but I tried to make it as concise as possible )</span>
            <span class="n">_first</span> <span class="p">=</span> <span class="n">_first</span><span class="p">.</span><span class="n">Previous</span><span class="p">;</span>

            <span class="c1">// them we remove the last element of the stack</span>
            <span class="n">List</span><span class="p">.</span><span class="nf">RemoveLast</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="c1">// this is just for visualisation later on</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
          <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Removed element </span><span class="p">{</span><span class="n">temp</span><span class="p">.</span><span class="n">Value</span><span class="p">}</span><span class="s">);  
</span>        <span class="p">};</span>
    <span class="p">}</span>
    
</code></pre></div></div>

<p>Now we have implemented pop and push operations and our stack is pretty much complete. To make it easier to follow I will add a method to print our stack to the console.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   <span class="k">public</span> <span class="k">void</span> <span class="nf">PrintStack</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">currentNode</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">currentNode</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">currentNode</span><span class="p">?.</span><span class="n">Value</span><span class="p">);</span>
            <span class="n">currentNode</span> <span class="p">=</span> <span class="n">currentNode</span><span class="p">?.</span><span class="n">Previous</span><span class="p">;</span>
        <span class="p">}</span>
        
    <span class="p">}</span>
</code></pre></div></div>

<p>So lets look at our stack class</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">StackLinkedList</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_first</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">LinkedList</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">List</span> <span class="p">=</span> <span class="p">[];</span>
    
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Push</span><span class="p">(</span><span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">newNode</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="k">value</span><span class="p">);</span>
        <span class="n">_first</span> <span class="p">=</span> <span class="n">newNode</span><span class="p">;</span> 
        <span class="n">List</span><span class="p">.</span><span class="nf">AddLast</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Pop</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">temp</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span> 
        <span class="p">{</span>
            <span class="n">_first</span> <span class="p">=</span> <span class="n">_first</span><span class="p">.</span><span class="n">Previous</span><span class="p">;</span>
            <span class="n">List</span><span class="p">.</span><span class="nf">RemoveLast</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Removed element </span><span class="p">{</span><span class="n">temp</span><span class="p">.</span><span class="n">Value</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">PrintStack</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">currentNode</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">currentNode</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">currentNode</span><span class="p">?.</span><span class="n">Value</span><span class="p">);</span>
            <span class="n">currentNode</span> <span class="p">=</span> <span class="n">currentNode</span><span class="p">?.</span><span class="n">Previous</span><span class="p">;</span>
        <span class="p">}</span>
        
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We have a list that we can add (pop) and remove (push) from. Let’s see it in action.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">stackLinkedList</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">StackLinkedList</span><span class="p">();</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">Push</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">Push</span><span class="p">(</span><span class="m">2</span><span class="p">);</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">Push</span><span class="p">(</span><span class="m">3</span><span class="p">);</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">PrintStack</span><span class="p">();</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">Pop</span><span class="p">();</span>
<span class="n">stackLinkedList</span><span class="p">.</span><span class="nf">PrintStack</span><span class="p">();</span>
</code></pre></div></div>

<p>This will print</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>3
2
1
Removed element 3
2
1
</code></pre></div></div>

<p>As we see we always travel from front to back (or top to bottom). First in -&gt; Last out. This is the <strong>FILO</strong> principle.</p>

<h2 id="the-queue-data-structure">The queue data structure</h2>

<p>What if we rather would like to have a first in -&gt; first out order <strong>FIFO</strong>? Then we can use the queue structure. We can imagine a regular queue of people in a store. The first person in line will be the first to be served. If we have a queue of five people: Anna, Mohammed, Lisa, Shawn and Aila. For Lisa to be served we have to serve Anna and Mohammed first. If we add another person to our queue the we are doing an <strong>enqueue</strong> and if Anna has gotten served and is removed from the queue then have done a <strong>dequeue</strong>. Remember first in - first out. Just as the stack if our queue are full and we try to add another element then we get an overflow. If our queue are empty and we try to remove another item then we get an underflow.</p>

<h2 id="queue-code-example">Queue code example</h2>

<p>Once again we will work with a linked list to make it easy to follow.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">QueueLinkedList</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_first</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_last</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">LinkedList</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">List</span> <span class="p">=</span> <span class="p">[];</span>
<span class="p">}</span>
</code></pre></div></div>
<p>The difference here comapared to the stack is that we now has two references. The first and the last node of the queue.</p>

<p>To peform enqueue and dequeue operations we add two methods.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// we input the value we want to add</span>
<span class="k">public</span> <span class="k">void</span> <span class="nf">Enqueue</span><span class="p">(</span><span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// we create a new node to hold our value</span>
        <span class="kt">var</span> <span class="n">newNode</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="k">value</span><span class="p">);</span>

        <span class="c1">// if the first node is empty both first and last node will hold the same value</span>
        <span class="n">_first</span> <span class="p">??=</span> <span class="n">newNode</span><span class="p">;</span>
        <span class="n">_last</span> <span class="p">=</span> <span class="n">newNode</span><span class="p">;</span> 

        <span class="c1">// we add the node at the end of our list</span>
        <span class="n">List</span><span class="p">.</span><span class="nf">AddLast</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Dequeue</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="c1">// we create a temporary node for printing only so this isn't anything you need to do</span>
        <span class="kt">var</span> <span class="n">temp</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span> 
        <span class="p">{</span>
            <span class="c1">// here we also should check that we have a node second to first but to make it easier to follow I skiped that step instead we assign the second node as first</span>
            <span class="n">_first</span> <span class="p">=</span> <span class="n">_first</span><span class="p">.</span><span class="n">Next</span><span class="p">;</span>

            <span class="c1">// we remove the first node</span>
            <span class="n">List</span><span class="p">.</span><span class="nf">RemoveFirst</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="c1">// we print out the result</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Removed element </span><span class="p">{</span><span class="n">temp</span><span class="p">.</span><span class="n">Value</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>Finally we create a method to print out que.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">public</span> <span class="k">void</span> <span class="nf">PrintQueue</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">currentNode</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">currentNode</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">currentNode</span><span class="p">?.</span><span class="n">Value</span><span class="p">);</span>
            <span class="n">currentNode</span> <span class="p">=</span> <span class="n">currentNode</span><span class="p">?.</span><span class="n">Next</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>So our complete class will look like:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">QueueLinkedList</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_first</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">static</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;?</span> <span class="n">_last</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
    <span class="k">public</span> <span class="k">static</span> <span class="n">LinkedList</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="n">List</span> <span class="p">=</span> <span class="p">[];</span>
    
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Enqueue</span><span class="p">(</span><span class="kt">int</span> <span class="k">value</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">newNode</span> <span class="p">=</span> <span class="k">new</span> <span class="n">LinkedListNode</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;(</span><span class="k">value</span><span class="p">);</span>
        <span class="n">_first</span> <span class="p">??=</span> <span class="n">newNode</span><span class="p">;</span>
        <span class="n">_last</span> <span class="p">=</span> <span class="n">newNode</span><span class="p">;</span> 
        <span class="n">List</span><span class="p">.</span><span class="nf">AddLast</span><span class="p">(</span><span class="n">newNode</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Dequeue</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">temp</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">_first</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span> 
        <span class="p">{</span>
            <span class="n">_first</span> <span class="p">=</span> <span class="n">_first</span><span class="p">.</span><span class="n">Next</span><span class="p">;</span>
            <span class="n">List</span><span class="p">.</span><span class="nf">RemoveFirst</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"Removed element </span><span class="p">{</span><span class="n">temp</span><span class="p">.</span><span class="n">Value</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
    
    <span class="k">public</span> <span class="k">void</span> <span class="nf">PrintQueue</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">currentNode</span> <span class="p">=</span> <span class="n">_first</span><span class="p">;</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">currentNode</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">currentNode</span><span class="p">?.</span><span class="n">Value</span><span class="p">);</span>
            <span class="n">currentNode</span> <span class="p">=</span> <span class="n">currentNode</span><span class="p">?.</span><span class="n">Next</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>


</code></pre></div></div>

<p>Lets see it in action!</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">queueLinkedList</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">QueueLinkedList</span><span class="p">();</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">Enqueue</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">Enqueue</span><span class="p">(</span><span class="m">2</span><span class="p">);</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">Enqueue</span><span class="p">(</span><span class="m">3</span><span class="p">);</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">PrintQueue</span><span class="p">();</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">Dequeue</span><span class="p">();</span>
<span class="n">queueLinkedList</span><span class="p">.</span><span class="nf">PrintQueue</span><span class="p">();</span>
</code></pre></div></div>
<p>We set it up the same way as we did with the stack but now it will print</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1
2
3
Removed element 1
2
3
</code></pre></div></div>

<h2 id="summary">Summary</h2>
<p>So this was the stack and the queue structures. To summarize:</p>

<p>The stack works with <strong>FILO</strong> -&gt; first in, last out.</p>

<p>The Queue works with <strong>FIFO</strong> -&gt; first in, first out!</p>

<p>If we add to add stack we are <strong>pushing</strong>.</p>

<p>If we remove from the stack we are <strong>popping</strong>.</p>

<p>If we add to the queue we are doing an <strong>enqueue</strong>.</p>

<p>If we remove the from the queue we are doing an <strong>dequeue</strong>.</p>

<p>Until next time, tack care!</p>]]></content><author><name></name></author><category term="datastructures" /><summary type="html"><![CDATA[So you’ve just started out your programming journey and you probably heard about the stack in some way or another, maybe you’ve visited StackOverflow and wondered about the name. Maybe you heard a term like call stack or even looked at one while debugging. In this post I thought it would be fun to look at two different data structures that are pretty foundational to how your computer handles memory, the stack and the queue data structures. I will have my examples in C# but the data structure itself isn’t tied to any programming language.]]></summary></entry><entry><title type="html">Building multi agent AI systems with Semantic Kernel</title><link href="/ai,/c%23,/semantikernel,/llm/2024/09/15/building-multi-agent-ai-systems-copy.html" rel="alternate" type="text/html" title="Building multi agent AI systems with Semantic Kernel" /><published>2024-09-15T09:50:00+00:00</published><updated>2024-09-15T09:50:00+00:00</updated><id>/ai,/c%23,/semantikernel,/llm/2024/09/15/building-multi-agent-ai-systems%20copy</id><content type="html" xml:base="/ai,/c%23,/semantikernel,/llm/2024/09/15/building-multi-agent-ai-systems-copy.html"><![CDATA[<p>I have been playing around with <a href="https://learn.microsoft.com/en-us/semantic-kernel/overview/">Semantic Kernel</a>, Microsofts sdk for building AI agents and more recently been testing out what you can do with mulitple agents. Before we start it may be suitable to have some disclaimers. If you have never heard of Semantic Kernel, a good place to start is with <a href="https://learn.microsoft.com/en-us/semantic-kernel/get-started/quick-start-guide?pivots=programming-language-csharp">Microsofts quick start</a>. This post will assume that you have some experience with semantic kernel and that you know your way around C#. To code along with this example you also need an openAI api key (and some credits).</p>

<p>The second disclaimer is that some of the nuget packages I use in this post are in alpha or release-candidates so when you are reading this there may be newer releases with added functionality or breaking changes. With that said, lets jump in to how to create a multi agent system with Semantic Kernel.</p>

<p>If we are going to work with AI agents the first thing to do is to define what an AI agnent is in the Semantic Kernel context. Microsoft describes it pretty straigh forward as “Agents are software based entities that leverage AI models to do works for you. They are built to perform a wide range of tasks and called different names based on the jobs they do.” in their <a href="https://learn.microsoft.com/en-us/semantic-kernel/concepts/agents?pivots=programming-language-csharp">documentation</a>. They go on to list different examples like chatbots and copilots. But what does the agent consist of? An agent in Semantic Kernel is made up of three building blocks: plugins, planners and persona. A plugin is essentially a function and planners are execution plans for these functions. If you haven’t read my previous post about <a href="https://atenghamn.github.io/ai,/c%23,/semantickernel/2024/08/12/creating-planners-in-semantic-kernel.html">creating planners in Semantic Kernel</a> it may be a good idea to do that if you haven’t worked with planners, prompts or kernel functions before. Given an agent a persona sounds kind of creepy but it’s more in the lines of context. The persona is the part that communicate with the end user. Think of the chatGPT interface where you can have a conversational style of interacting with the model. This is the persona. Here we give the agent a context of what role it has and what we wish to achive.</p>

<p>Now that we now the lingo it’s time for some coding! I’ve made a simple demo project where the main idea is to build a photography helper that can help us create photo trips depending on what we want to shoot. Maybe not the most original idea but I needed something for this demo so it will do for this purpose.</p>

<h3 id="setting-up-semantic-kernel">Setting up Semantic Kernel</h3>
<p>First thing first let’s download the following nuget packages</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI <span class="nt">--version</span> 1.19.0
dotnet add package Microsoft.SemanticKernel.Agents.Core <span class="nt">--version</span> 1.19.0-alpha
dotnet add package Microsoft.SemanticKernel.Agents.Abstractions <span class="nt">--version</span> 1.19.0-alpha
dotnet add package Microsoft.SemanticKernel.Agents.OpenAI <span class="nt">--version</span> 1.19.0-alpha

</code></pre></div></div>
<p>As you can see the packages for working with agents are still in alpha so please keep in mind that this is pretty unstable and likely to change, it’s not something yoy want to take to production. For testing these packages at home, remeber to disable the warnings from Rozlyn with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#pragma warning disable SKEXP0110, SKEXP0001 

</code></pre></div></div>

<p>Once we downloaded all the nuget packages and disabled the warning it’s time to set up  Semantic Kernel.</p>
<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">var</span> <span class="n">kernel</span> <span class="p">=</span> <span class="n">Kernel</span><span class="p">.</span><span class="nf">CreateBuilder</span><span class="p">()</span>
    <span class="p">.</span><span class="nf">AddOpenAIChatCompletion</span><span class="p">(</span>
        <span class="n">modelId</span><span class="p">:</span> <span class="s">"gpt-4o"</span><span class="p">,</span>
        <span class="n">apiKey</span><span class="p">:</span> <span class="s">"your-api-key-here"</span>
    <span class="p">)</span>
    <span class="p">.</span><span class="nf">Build</span><span class="p">();</span>
</code></pre></div></div>

<p>Try out the model you like, I went with 4o but maybe you can go for a cheaper model.</p>

<h4 id="creating-agents">Creating agents</h4>

<p>Now it’s time for us to create some agents. I decided to go with three agent (you can go with as many or as few you like just remember that more agents often leads to a higher cost since every agent integrates with the LLM). In this example we are going to create three agents:</p>

<ul>
  <li>
    <p>The location scout 
 will scout photography locations for us based on our requrements and give us recommendatinos on where to shoot and also create a plan of how to get there with public transportation.</p>
  </li>
  <li>
    <p>The idea suggestor, the location scout will pass on the locations to the idea suggestor who will create ideas for photo shoots based on the locations given by the location scout.</p>
  </li>
  <li>
    <p>The manager, the idea suggestor will pass on the ideas and location to the manager who will review them and ensure our requirements are met. If they are met hte manager will approve this by just responding “approve”.</p>
  </li>
</ul>

<p>To create our agents we create a new agent and give them instructions and a kernel. In this example we use the same kernel for all of our agents but you can use diferent kernels for different agents if you want to. It’s perfectly fine to use OpenAi for some and maybe AzureOpenAi or Llama for others.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1">// Create instructions for each of the agents</span>
<span class="kt">var</span> <span class="n">locationScout</span> <span class="p">=</span> <span class="s">"""
</span><span class="n">You</span> <span class="n">are</span> <span class="n">a</span> <span class="n">photography</span> <span class="n">location</span> <span class="n">scout</span> <span class="n">which</span> <span class="n">will</span> <span class="n">take</span> <span class="n">the</span> <span class="n">requirement</span> <span class="n">and</span> <span class="n">create</span> <span class="n">a</span> <span class="n">plan</span> <span class="k">for</span> <span class="n">suggesting</span> <span class="n">photography</span> <span class="n">locations</span> <span class="k">in</span> <span class="n">Sk</span><span class="err">å</span><span class="n">ne</span><span class="p">,</span> <span class="n">Sweden</span><span class="p">.</span>
<span class="n">Location</span> <span class="n">scout</span> <span class="n">understands</span> <span class="n">the</span> <span class="n">requirements</span> <span class="n">and</span> <span class="n">form</span> <span class="n">the</span> <span class="n">location</span> <span class="n">documents</span> <span class="n">with</span> <span class="n">a</span> <span class="n">plan</span> <span class="k">on</span> <span class="n">were</span> <span class="n">to</span> <span class="n">photograph</span> <span class="n">and</span> <span class="n">how</span> <span class="n">to</span> <span class="k">get</span> <span class="n">there</span> <span class="k">by</span> <span class="k">public</span> <span class="n">transportation</span> <span class="k">from</span> <span class="n">Lund</span>
<span class="s">""";
</span>
<span class="kt">var</span> <span class="n">ideaSuggester</span> <span class="p">=</span> <span class="s">"You  are a idea suggester and your goal is to suggest ideas for photography shoots by taking into consideration all the requirements given by the location scout."</span><span class="p">;</span>

<span class="kt">var</span> <span class="n">manager</span> <span class="p">=</span> <span class="s">"""
</span><span class="n">You</span> <span class="n">are</span> <span class="n">the</span> <span class="n">manager</span> <span class="n">that</span> <span class="n">will</span> <span class="n">review</span> <span class="n">photographic</span> <span class="n">ideas</span> <span class="n">given</span> <span class="k">by</span> <span class="n">the</span> <span class="n">idea</span> <span class="n">suggester</span> <span class="n">and</span> <span class="n">make</span> <span class="n">sure</span> <span class="n">all</span> <span class="n">client</span> <span class="n">requirements</span> <span class="n">are</span> <span class="n">completed</span><span class="p">.</span>
<span class="n">Once</span> <span class="n">all</span> <span class="n">client</span> <span class="n">requirements</span> <span class="n">are</span> <span class="n">completed</span> <span class="n">you</span> <span class="n">can</span> <span class="n">approve</span> <span class="n">the</span> <span class="n">request</span> <span class="k">by</span> <span class="n">just</span> <span class="n">responding</span> <span class="s">"approve"</span><span class="p">.</span>
<span class="s">""";
</span>
<span class="c1">// Create a new agent</span>
<span class="n">ChatCompletionAgent</span> <span class="n">managerAgent</span> <span class="p">=</span> 
<span class="k">new</span><span class="p">()</span>
<span class="p">{</span>
    <span class="n">Instructions</span> <span class="p">=</span> <span class="n">manager</span><span class="p">,</span> <span class="c1">// Give it the instruction from above</span>
    <span class="n">Name</span> <span class="p">=</span> <span class="s">"ManagerAgent"</span><span class="p">,</span> <span class="c1">// Give it a name, this can be whatever</span>
    <span class="n">Kernel</span> <span class="p">=</span> <span class="n">kernel</span> <span class="c1">// Point to a kernel</span>
<span class="p">};</span>

<span class="n">ChatCompletionAgent</span> <span class="n">locationScoutAgent</span> <span class="p">=</span>
    <span class="k">new</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Instructions</span> <span class="p">=</span> <span class="n">locationScout</span><span class="p">,</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"LocationScout"</span><span class="p">,</span>
        <span class="n">Kernel</span> <span class="p">=</span> <span class="n">kernel</span>
    <span class="p">};</span>

<span class="n">ChatCompletionAgent</span> <span class="n">ideaSuggesterAgent</span> <span class="p">=</span>
    <span class="k">new</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">Instructions</span> <span class="p">=</span> <span class="n">ideaSuggester</span><span class="p">,</span>
        <span class="n">Name</span> <span class="p">=</span> <span class="s">"IdeaSuggester"</span><span class="p">,</span>
        <span class="n">Kernel</span> <span class="p">=</span> <span class="n">kernel</span>
    <span class="p">};</span>

</code></pre></div></div>

<h3 id="termination-strategy">Termination strategy</h3>
<p>If you look in the instructions for the manager the line below may seem a bit odd</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"Once all client requirements are completed you can approve the request by just responding "approve".
</code></pre></div></div>
<p>This is the termination strategy it’s purpose is to define a definiton of done for our agents. To create a termination strategy we create a new class that inherits from the <a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.semantickernel.agents.chat.terminationstrategy?view=semantic-kernel-dotnet">TerminationStrategy</a> class.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="k">using</span> <span class="nn">System.Diagnostics.CodeAnalysis</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.SemanticKernel</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.SemanticKernel.Agents</span><span class="p">;</span>
<span class="k">using</span> <span class="nn">Microsoft.SemanticKernel.Agents.Chat</span><span class="p">;</span>

<span class="k">namespace</span> <span class="nn">PhotographyHelpers</span><span class="p">;</span>

<span class="p">[</span><span class="nf">Experimental</span><span class="p">(</span><span class="s">"SKEXP0110"</span><span class="p">)]</span> <span class="c1">// Since it's in alpha this is an experimental feature so keep it out of production environments</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">ApprovalTerminationStrategy</span> <span class="p">:</span> <span class="n">TerminationStrategy</span>
<span class="p">{</span>
    <span class="k">protected</span> <span class="k">override</span> <span class="n">Task</span><span class="p">&lt;</span><span class="kt">bool</span><span class="p">&gt;</span> <span class="nf">ShouldAgentTerminateAsync</span><span class="p">(</span>
        <span class="n">Agent</span> <span class="n">agent</span><span class="p">,</span>
        <span class="n">IReadOnlyList</span><span class="p">&lt;</span><span class="n">ChatMessageContent</span><span class="p">&gt;</span> <span class="n">history</span><span class="p">,</span>
        <span class="n">CancellationToken</span> <span class="n">ct</span>
    <span class="p">)</span> <span class="p">=&gt;</span> <span class="n">Task</span><span class="p">.</span><span class="nf">FromResult</span><span class="p">(</span><span class="n">history</span><span class="p">[^</span><span class="m">1</span><span class="p">]</span>
                             <span class="p">.</span><span class="n">Content</span><span class="p">?.</span><span class="nf">Contains</span><span class="p">(</span><span class="s">"approve"</span><span class="p">,</span> <span class="n">StringComparison</span><span class="p">.</span><span class="n">OrdinalIgnoreCase</span><span class="p">)</span>
                         <span class="p">??</span> <span class="k">false</span><span class="p">);</span>
<span class="p">}</span>

</code></pre></div></div>

<p>This nothing fancy, the method is inherited from the TerminiationStrategy class and it evalutes the input messages from our chat to see if it meets our definition of done (our completion criteria). In this perticual case it takes the last message (first from the end) and check for the word “approve” since that is what we are looking for. If it’s found then true is returned.</p>

<h3 id="creating-a-group-chat">Creating a group chat</h3>

<p>Now it’s time to link everything together and we do that by creating a <a href="https://learn.microsoft.com/en-us/dotnet/api/microsoft.semantickernel.agents.agentgroupchat?view=semantic-kernel-dotnet">AgentGroupChat</a>. The name is pretty selfexplanatory and what you do is you give your agents as input and sets the termination strategy.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">AgentGroupChat</span> <span class="n">chat</span> <span class="p">=</span> <span class="k">new</span><span class="p">(</span><span class="n">managerAgent</span><span class="p">,</span> <span class="n">locationScoutAgent</span><span class="p">,</span> <span class="n">ideaSuggesterAgent</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">ExecutionSettings</span> <span class="p">=</span> <span class="k">new</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">TerminationStrategy</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">ApprovalTerminationStrategy</span><span class="p">()</span>
        <span class="p">{</span>
            <span class="n">Agents</span> <span class="p">=</span> <span class="p">[</span> <span class="n">managerAgent</span> <span class="p">],</span>
            <span class="n">MaximumIterations</span> <span class="p">=</span> <span class="m">6</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">};</span>

</code></pre></div></div>
<p>Here we give it the termination strategy we created earlier and explicitly say that it’s our managerAgent that can determine if the approval strategy has been fulfilled. I’ve set the maximum iterations to 6, you can set it to whatever you want and maybe 6 is a bit high in this case since it rarely needs all six attempts. The group chat holds our agents chat conversation and our conversation with the agents. All that’s left now is to tie it all together and create a really simple user interface so that we can interact with our agents.</p>

<h3 id="creating-the-terminal-interface">Creating the terminal interface</h3>

<p>Now we are going to create a simple command line interface so that we can interact with our agents and print the response from our agents.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">"Specify what and when you want to photography"</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="k">true</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">var</span> <span class="n">input</span> <span class="p">=</span> <span class="n">Console</span><span class="p">.</span><span class="nf">ReadLine</span><span class="p">();</span>
    <span class="n">chat</span><span class="p">.</span><span class="nf">AddChatMessage</span><span class="p">(</span><span class="k">new</span> <span class="nf">ChatMessageContent</span><span class="p">(</span><span class="n">AuthorRole</span><span class="p">.</span><span class="n">User</span><span class="p">,</span> <span class="n">input</span><span class="p">));</span>
    
    <span class="k">await</span> <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">content</span> <span class="k">in</span> <span class="n">chat</span><span class="p">.</span><span class="nf">InvokeAsync</span><span class="p">())</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"# </span><span class="p">{</span><span class="n">content</span><span class="p">.</span><span class="n">Role</span><span class="p">}</span><span class="s"> - </span><span class="p">{</span><span class="n">content</span><span class="p">.</span><span class="n">AuthorName</span> <span class="p">??</span> <span class="s">"*"</span><span class="p">}</span><span class="s">: </span><span class="p">{</span><span class="n">content</span><span class="p">.</span><span class="n">Content</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Here we start by presenting the user with a prompt to give the agents something to work with. Once we have a proimpt we add it as a chat message to the agents with the author role set to user. Our agents set of to work and we print each response by calling chat.InvokeAsync() and prinnting the response. Here you can alaborate freely to get the content that’s relevant for you.</p>

<p>Lets try it out by asking it to create a plan for a street photography shoot in Helsingborg for tomorrow! 
This is what we get:</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Specify</span><span class="w"> </span><span class="nx">what</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">when</span><span class="w"> </span><span class="nx">you</span><span class="w"> </span><span class="nx">want</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">photography</span><span class="w">
</span><span class="n">I</span><span class="w"> </span><span class="nx">want</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">do</span><span class="w"> </span><span class="nx">some</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">photography</span><span class="w"> </span><span class="nx">tomorrow</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w">

</span><span class="n">Assistant</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">ManagerAgent:</span><span class="w"> </span><span class="nx">That</span><span class="s1">'s a great idea! Could you provide any specific requirements or objectives you have in mind for your street photography session in Helsingborg? For instance, are there any particular subjects or themes you want to focus on, special locations you want to visit, or specific times you'</span><span class="nx">re</span><span class="w"> </span><span class="nx">aiming</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">capture</span><span class="nf">?</span><span class="w"> </span><span class="nx">This</span><span class="w"> </span><span class="nx">will</span><span class="w"> </span><span class="nx">help</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">ensuring</span><span class="w"> </span><span class="nx">all</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">requirements</span><span class="w"> </span><span class="nx">are</span><span class="w"> </span><span class="nx">met.</span><span class="w">

</span><span class="n">Assistant</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">LocationScout:</span><span class="w"> </span><span class="nx">Excellent</span><span class="w"> </span><span class="nx">choice</span><span class="o">!</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">offers</span><span class="w"> </span><span class="nx">diverse</span><span class="w"> </span><span class="nx">scenes</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">photography</span><span class="p">,</span><span class="w"> </span><span class="nx">ranging</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">bustling</span><span class="w"> </span><span class="nx">city</span><span class="w"> </span><span class="nx">streets</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">tranquil</span><span class="w"> </span><span class="nx">harbor</span><span class="w"> </span><span class="nx">views.</span><span class="w"> </span><span class="nx">Here</span><span class="s1">'s a detailed plan for your street photography session tomorrow morning, including suggestions on where to photograph and how to get there by public transportation from Lund.

### Suggested Locations in Helsingborg

1. **Kärnan Tower and Surrounding Area**
    - **Description:** Begin your day here for a panoramic view of the city and peaceful early-morning scenes in the nearby park. The medieval tower and its surrounding gardens offer excellent vantage points and interesting human activity.
    - **Photography Subjects:** Historic architecture, early-morning light, people walking their dogs, joggers, and tourists.
2. **Stortorget (The Great Square)**
    - **Description:** This is the heart of the city with vibrant street life, cafes, and historic buildings. It'</span><span class="nx">s</span><span class="w"> </span><span class="nx">perfect</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">capturing</span><span class="w"> </span><span class="nx">local</span><span class="w"> </span><span class="nx">life</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">urban</span><span class="w"> </span><span class="nx">architecture.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Street</span><span class="w"> </span><span class="nx">performers</span><span class="p">,</span><span class="w"> </span><span class="nx">locals</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">visitors</span><span class="w"> </span><span class="nx">interacting</span><span class="p">,</span><span class="w"> </span><span class="nx">architectural</span><span class="w"> </span><span class="nx">details.</span><span class="w">
</span><span class="mi">3</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Kullagatan</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Description:</span><span class="o">**</span><span class="w"> </span><span class="nx">One</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">Sweden</span><span class="s1">'s oldest pedestrian streets, filled with shops, cafes, and colorful facades. It'</span><span class="nx">s</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">fantastic</span><span class="w"> </span><span class="nx">spot</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">candid</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">photography.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Shoppers</span><span class="p">,</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">vendors</span><span class="p">,</span><span class="w"> </span><span class="nx">interesting</span><span class="w"> </span><span class="nx">shop</span><span class="w"> </span><span class="nx">windows</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">pedestrians.</span><span class="w">
</span><span class="mi">4</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="w"> </span><span class="nx">Area</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Description:</span><span class="o">**</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="nx">modern</span><span class="w"> </span><span class="nx">hub</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">mix</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">contemporary</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">classic</span><span class="w"> </span><span class="nx">design.</span><span class="w"> </span><span class="nx">It</span><span class="s1">'s busy in the mornings with commuters.
    - **Photography Subjects:** Commuters, travelers, reflections, and architectural contrasts.
5. **North Harbor (Norra Hamnen)**
    - **Description:** A modern waterfront area with boats, modern residential buildings, and walking paths. It'</span><span class="nx">s</span><span class="w"> </span><span class="nx">usually</span><span class="w"> </span><span class="nx">quieter</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">potential</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">serene</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">reflective</span><span class="w"> </span><span class="nx">compositions.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Boats</span><span class="p">,</span><span class="w"> </span><span class="nx">waterfront</span><span class="w"> </span><span class="nx">activities</span><span class="p">,</span><span class="w"> </span><span class="nx">reflections</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">modern</span><span class="w"> </span><span class="nx">architecture.</span><span class="w">

</span><span class="c">### How to Get There by Public Transportation from Lund</span><span class="w">

</span><span class="mi">1</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Lund</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="n">Take</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="err">Ö</span><span class="nx">resundst</span><span class="err">å</span><span class="nx">g</span><span class="w"> </span><span class="nx">train</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="o">**</span><span class="nx">Lund</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="o">**</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="o">**</span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="o">**.</span><span class="w"> </span><span class="nx">The</span><span class="w"> </span><span class="nx">journey</span><span class="w"> </span><span class="nx">takes</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">40-45</span><span class="w"> </span><span class="nx">minutes</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">frequent</span><span class="w"> </span><span class="nx">departures</span><span class="p">,</span><span class="w"> </span><span class="nx">especially</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">mornings.</span><span class="w">
</span><span class="mi">2</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Getting</span><span class="w"> </span><span class="nx">Around</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="n">Most</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">highlighted</span><span class="w"> </span><span class="nx">locations</span><span class="w"> </span><span class="nx">are</span><span class="w"> </span><span class="nx">within</span><span class="w"> </span><span class="nx">walking</span><span class="w"> </span><span class="nx">distance</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">each</span><span class="w"> </span><span class="nx">other</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="p">,</span><span class="w"> </span><span class="nx">making</span><span class="w"> </span><span class="nx">it</span><span class="w"> </span><span class="nx">convenient</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">explore</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="nx">foot.</span><span class="w">

</span><span class="c">### Detailed Itinerary</span><span class="w">

</span><span class="o">**</span><span class="mi">06</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Departure</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">Lund</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Arrive</span><span class="w"> </span><span class="nx">at</span><span class="w"> </span><span class="nx">Lund</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">6:00</span><span class="w"> </span><span class="nx">AM</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">catch</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="err">Ö</span><span class="nx">resundst</span><span class="err">å</span><span class="nx">g</span><span class="w"> </span><span class="nx">train</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Helsingborg.</span><span class="w">

</span><span class="o">**</span><span class="mi">07</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Arrive</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Arrive</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">around</span><span class="w"> </span><span class="nx">7:00</span><span class="w"> </span><span class="nx">AM.</span><span class="w">

</span><span class="o">**</span><span class="mi">07</span><span class="p">:</span><span class="mi">15</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">K</span><span class="err">ä</span><span class="nx">rnan</span><span class="w"> </span><span class="nx">Tower</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Walk</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">K</span><span class="err">ä</span><span class="nx">rnan</span><span class="w"> </span><span class="nx">Tower</span><span class="p">,</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">10-minute</span><span class="w"> </span><span class="nx">walk</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">around</span><span class="w"> </span><span class="nx">45</span><span class="w"> </span><span class="nx">minutes</span><span class="w"> </span><span class="nx">capturing</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">sunrise</span><span class="w"> </span><span class="nx">light</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">serene</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">atmosphere.</span><span class="w">

</span><span class="o">**</span><span class="mi">08</span><span class="p">:</span><span class="mi">15</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Stortorget</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Head</span><span class="w"> </span><span class="nx">towards</span><span class="w"> </span><span class="nx">Stortorget</span><span class="p">,</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">5-minute</span><span class="w"> </span><span class="nx">walk</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">K</span><span class="err">ä</span><span class="nx">rnan.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">hour</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Stortorget</span><span class="w"> </span><span class="nx">photographing</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">early</span><span class="w"> </span><span class="nx">bird</span><span class="w"> </span><span class="nx">locals</span><span class="p">,</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">performers</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">architectural</span><span class="w"> </span><span class="nx">elements.</span><span class="w">

</span><span class="o">**</span><span class="mi">09</span><span class="p">:</span><span class="mi">15</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Kullagatan</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Move</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Kullagatan</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">some</span><span class="w"> </span><span class="nx">busy</span><span class="w"> </span><span class="nx">pedestrian</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">scenes.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">around</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">hour</span><span class="w"> </span><span class="nx">photographing</span><span class="w"> </span><span class="nx">here.</span><span class="w">

</span><span class="o">**</span><span class="mi">10</span><span class="p">:</span><span class="mi">15</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="w"> </span><span class="nx">Area</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Circle</span><span class="w"> </span><span class="nx">back</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="w"> </span><span class="nx">area</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">focus</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="nx">commuter</span><span class="w"> </span><span class="nx">activities.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">around</span><span class="w"> </span><span class="nx">30-45</span><span class="w"> </span><span class="nx">minutes</span><span class="w"> </span><span class="nx">here.</span><span class="w">

</span><span class="o">**</span><span class="mi">11</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">North</span><span class="w"> </span><span class="nx">Harbor</span><span class="w"> </span><span class="p">(</span><span class="n">Norra</span><span class="w"> </span><span class="nx">Hamnen</span><span class="p">)</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Walk</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">North</span><span class="w"> </span><span class="nx">Harbor</span><span class="w"> </span><span class="p">(</span><span class="n">around</span><span class="w"> </span><span class="nx">10-15</span><span class="w"> </span><span class="nx">minutes</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="p">)</span><span class="o">.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="kr">End</span><span class="w"> </span><span class="n">your</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">session</span><span class="w"> </span><span class="nx">capturing</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">tranquil</span><span class="w"> </span><span class="nx">scenes</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">water</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">unique</span><span class="w"> </span><span class="nx">modern</span><span class="w"> </span><span class="nx">architecture.</span><span class="w">

</span><span class="o">**</span><span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Conclusion</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Option</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">grab</span><span class="w"> </span><span class="nx">lunch</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">review</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">photos</span><span class="p">,</span><span class="w"> </span><span class="nx">or</span><span class="w"> </span><span class="nx">head</span><span class="w"> </span><span class="nx">back</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Lund</span><span class="w"> </span><span class="nx">by</span><span class="w"> </span><span class="nx">catching</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="err">Ö</span><span class="nx">resundst</span><span class="err">å</span><span class="nx">g</span><span class="w"> </span><span class="nx">train</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station.</span><span class="w">

</span><span class="c">### Tips for a Successful Street Photography Session</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Early</span><span class="w"> </span><span class="nx">Start:</span><span class="o">**</span><span class="w"> </span><span class="nx">Early</span><span class="w"> </span><span class="nx">mornings</span><span class="w"> </span><span class="nx">provide</span><span class="w"> </span><span class="nx">soft</span><span class="w"> </span><span class="nx">light</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">fewer</span><span class="w"> </span><span class="nx">crowds.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Blend</span><span class="w"> </span><span class="nx">In:</span><span class="o">**</span><span class="w"> </span><span class="nx">Dress</span><span class="w"> </span><span class="nx">casually</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">avoid</span><span class="w"> </span><span class="nx">drawing</span><span class="w"> </span><span class="nx">too</span><span class="w"> </span><span class="nx">much</span><span class="w"> </span><span class="nx">attention.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Mind</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Weather:</span><span class="o">**</span><span class="w"> </span><span class="nx">Check</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">forecast</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">dress</span><span class="w"> </span><span class="nx">accordingly.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Gear:</span><span class="o">**</span><span class="w"> </span><span class="nx">Bring</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">versatile</span><span class="w"> </span><span class="nx">lens</span><span class="w"> </span><span class="p">(</span><span class="n">e.g.</span><span class="p">,</span><span class="w"> </span><span class="nx">35mm</span><span class="w"> </span><span class="nx">or</span><span class="w"> </span><span class="nx">50mm</span><span class="p">)</span><span class="w"> </span><span class="kr">for</span><span class="w"> </span><span class="n">varied</span><span class="w"> </span><span class="nx">shots.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Stay</span><span class="w"> </span><span class="nx">Safe:</span><span class="o">**</span><span class="w"> </span><span class="nx">Keep</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">eye</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">surroundings</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">gear.</span><span class="w">

</span><span class="n">Enjoy</span><span class="w"> </span><span class="nx">your</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">photography</span><span class="w"> </span><span class="nx">adventure</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="o">!</span><span class="w">

</span><span class="n">Assistant</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">IdeaSuggester:</span><span class="w"> </span><span class="nx">Sounds</span><span class="w"> </span><span class="nx">fantastic</span><span class="o">!</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">has</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">lot</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">offer</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">photography</span><span class="w"> </span><span class="nx">session.</span><span class="w"> </span><span class="nx">Here</span><span class="s1">'s a well-rounded plan to capture the essence of the city:

### Suggested Locations in Helsingborg

1. **Kärnan Tower and Surrounding Area**
    - **Description:** Start with the iconic Kärnan Tower, a medieval tower offering panoramic views. The surrounding park is perfect for catching the early morning light.
    - **Photography Subjects:** Historic architecture, morning joggers, and the serene ambiance of the park.
2. **Stortorget (The Great Square)**
    - **Description:** A lively square in the heart of Helsingborg. It'</span><span class="nx">s</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">great</span><span class="w"> </span><span class="nx">place</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">capture</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">hustle</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">bustle</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">city</span><span class="w"> </span><span class="nx">life.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Early</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">vendors</span><span class="p">,</span><span class="w"> </span><span class="nx">commuters</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">cafes</span><span class="w"> </span><span class="nx">setting</span><span class="w"> </span><span class="nx">up</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">day.</span><span class="w">
</span><span class="mi">3</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Kullagatan</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Description:</span><span class="o">**</span><span class="w"> </span><span class="nx">One</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">Sweden</span><span class="s1">'s oldest pedestrian streets. It'</span><span class="nx">s</span><span class="w"> </span><span class="nx">lined</span><span class="w"> </span><span class="nx">with</span><span class="w"> </span><span class="nx">shops</span><span class="p">,</span><span class="w"> </span><span class="nx">cafes</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">colorful</span><span class="w"> </span><span class="nx">facades.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Shoppers</span><span class="p">,</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">vendors</span><span class="p">,</span><span class="w"> </span><span class="nx">interesting</span><span class="w"> </span><span class="nx">shop</span><span class="w"> </span><span class="nx">windows</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">pedestrians.</span><span class="w">
</span><span class="mi">4</span><span class="o">.</span><span class="w"> </span><span class="o">**</span><span class="n">Sofiero</span><span class="w"> </span><span class="nx">Castle</span><span class="w"> </span><span class="nx">Gardens</span><span class="o">**</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Description:</span><span class="o">**</span><span class="w"> </span><span class="nx">A</span><span class="w"> </span><span class="nx">bit</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">walk</span><span class="w"> </span><span class="nx">or</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">short</span><span class="w"> </span><span class="nx">bus</span><span class="w"> </span><span class="nx">ride</span><span class="p">,</span><span class="w"> </span><span class="nx">but</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">gardens</span><span class="w"> </span><span class="nx">are</span><span class="w"> </span><span class="nx">splendid</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">morning</span><span class="w"> </span><span class="nx">light.</span><span class="w">
    </span><span class="o">-</span><span class="w"> </span><span class="o">**</span><span class="n">Photography</span><span class="w"> </span><span class="nx">Subjects:</span><span class="o">**</span><span class="w"> </span><span class="nx">Garden</span><span class="w"> </span><span class="nx">landscapes</span><span class="p">,</span><span class="w"> </span><span class="nx">flowers</span><span class="w"> </span><span class="nx">in</span><span class="w"> </span><span class="nx">bloom</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">castle</span><span class="s1">'s architectural details.
5. **Helsingborg Central Station Area**
    - **Description:** Modern design mixed with classic elements, a busy hub especially during morning rush hours.
    - **Photography Subjects:** Travelers, architectural details, and the movement of trains.

### Detailed Itinerary

**06:00 AM - Departure from Lund**

- Arrive at Lund Central Station by 6:00 AM and catch an early Öresundståg train to Helsingborg.
- Travel Time: Approximately 40 minutes.

**07:00 AM - Arrive in Helsingborg**

- Arrive at Helsingborg Central Station.

**07:15 AM - Kärnan Tower**

- Walk to Kärnan Tower, roughly a 10-minute walk from the station.
- Spend around 45 minutes capturing the morning light and the tower'</span><span class="nx">s</span><span class="w"> </span><span class="nx">surroundings.</span><span class="w">

</span><span class="o">**</span><span class="mi">08</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Stortorget</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Head</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Stortorget</span><span class="p">,</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">5-minute</span><span class="w"> </span><span class="nx">walk</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">K</span><span class="err">ä</span><span class="nx">rnan.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">hour</span><span class="w"> </span><span class="nx">capturing</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">early</span><span class="w"> </span><span class="nx">city</span><span class="w"> </span><span class="nx">life</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">architectural</span><span class="w"> </span><span class="nx">splendor.</span><span class="w">

</span><span class="o">**</span><span class="mi">09</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Kullagatan</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Move</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">Kullagatan</span><span class="w"> </span><span class="nx">for</span><span class="w"> </span><span class="nx">some</span><span class="w"> </span><span class="nx">vibrant</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">scenes.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">about</span><span class="w"> </span><span class="nx">an</span><span class="w"> </span><span class="nx">hour</span><span class="w"> </span><span class="nx">photographing</span><span class="w"> </span><span class="nx">here.</span><span class="w">

</span><span class="o">**</span><span class="mi">10</span><span class="p">:</span><span class="mi">00</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Helsingborg</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Circle</span><span class="w"> </span><span class="nx">back</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">capture</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">bustling</span><span class="w"> </span><span class="nx">station</span><span class="w"> </span><span class="nx">area.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Spend</span><span class="w"> </span><span class="nx">around</span><span class="w"> </span><span class="nx">30-45</span><span class="w"> </span><span class="nx">minutes.</span><span class="w">

</span><span class="o">**</span><span class="mi">10</span><span class="p">:</span><span class="mi">45</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">North</span><span class="w"> </span><span class="nx">Harbor</span><span class="w"> </span><span class="p">(</span><span class="n">Norra</span><span class="w"> </span><span class="nx">Hamnen</span><span class="p">)</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="n">Walk</span><span class="w"> </span><span class="nx">to</span><span class="w"> </span><span class="nx">North</span><span class="w"> </span><span class="nx">Harbor</span><span class="p">,</span><span class="w"> </span><span class="nx">approximately</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">10-15</span><span class="w"> </span><span class="nx">minute</span><span class="w"> </span><span class="nx">walk</span><span class="w"> </span><span class="nx">from</span><span class="w"> </span><span class="nx">the</span><span class="w"> </span><span class="nx">Central</span><span class="w"> </span><span class="nx">Station.</span><span class="w">
</span><span class="o">-</span><span class="w"> </span><span class="n">Capture</span><span class="w"> </span><span class="nx">waterfront</span><span class="w"> </span><span class="nx">activities</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">modern</span><span class="w"> </span><span class="nx">architecture.</span><span class="w">

</span><span class="o">**</span><span class="mi">11</span><span class="p">:</span><span class="mi">30</span><span class="w"> </span><span class="n">AM</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nx">Sofiero</span><span class="w"> </span><span class="nx">Castle</span><span class="w"> </span><span class="nx">Gardens</span><span class="w"> </span><span class="p">(</span><span class="n">Optional</span><span class="p">)</span><span class="o">**</span><span class="w">

</span><span class="o">-</span><span class="w"> </span><span class="kr">If</span><span class="w"> </span><span class="n">you</span><span class="s1">'re up for it, take a short bus ride or drive to Sofiero Castle Gardens.
- Spend about an hour capturing the peaceful garden scenes.

**12:30 PM - Conclusion**

- Head back towards the central area for lunch and review your shots.
- Return to Lund by catching the Öresundståg train from Helsingborg Central Station.

### Tips for Success

- **Check the Weather:** Dress accordingly and be prepared for potential changes in conditions.
- **Blend In:** Dress in a way that helps you blend into the environment, avoiding attracting unwanted attention.
- **Keep Gear Light:** A versatile zoom lens and a lightweight tripod can be very handy.
- **Stay Safe:** Be aware of your surroundings, especially in busy areas.

Enjoy capturing the charm and vibrancy of Helsingborg!

Assistant - ManagerAgent: Your plan covers a great mix of locations that showcase Helsingborg'</span><span class="nx">s</span><span class="w"> </span><span class="nx">diverse</span><span class="w"> </span><span class="nx">scenes</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">atmospheres.</span><span class="w"> </span><span class="nx">All</span><span class="w"> </span><span class="nx">client</span><span class="w"> </span><span class="nx">requirements</span><span class="w"> </span><span class="nx">have</span><span class="w"> </span><span class="nx">been</span><span class="w"> </span><span class="nx">considered:</span><span class="w"> </span><span class="nx">starting</span><span class="w"> </span><span class="nx">early</span><span class="p">,</span><span class="w"> </span><span class="nx">capturing</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">blend</span><span class="w"> </span><span class="nx">of</span><span class="w"> </span><span class="nx">historic</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">modern</span><span class="w"> </span><span class="nx">settings</span><span class="p">,</span><span class="w"> </span><span class="nx">focusing</span><span class="w"> </span><span class="nx">on</span><span class="w"> </span><span class="nx">street</span><span class="w"> </span><span class="nx">life</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">architectural</span><span class="w"> </span><span class="nx">details</span><span class="p">,</span><span class="w"> </span><span class="nx">and</span><span class="w"> </span><span class="nx">incorporating</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="nx">picturesque</span><span class="w"> </span><span class="nx">garden.</span><span class="w">

</span><span class="n">approve</span><span class="w">
</span></code></pre></div></div>
<p>As you can see the location scout start by giving us locations in Helsingborg and passing them on to the idea suggestor who gives us plans for what to photograph on the given locations. Finaly the manager looks at the plan and approves it. We have some tweaks we could do like telling the ideasuggestor not to repeat everything the location scout has said but instead just add to it. Our manager could instead respond with the whole plan before approving or we could introduce a fourth agent between the idea suggestor and manager that handels the packaging of the end user message so that everything we see would be the final plan. But that would require finetuning our loop with the Console.WriteLine so that it only printed the message from the agent that presents the finished plan.</p>

<h3 id="summary">Summary</h3>
<p>So this was a quick introduction introduction on bulding multi agents systems in Semantic Kernel. I hope it can be a stepping stone and inspiration for you to do your own experiments with Semantic Kernel. Until next time, take care!</p>]]></content><author><name></name></author><category term="ai," /><category term="c#," /><category term="semantikernel," /><category term="llm" /><summary type="html"><![CDATA[I have been playing around with Semantic Kernel, Microsofts sdk for building AI agents and more recently been testing out what you can do with mulitple agents. Before we start it may be suitable to have some disclaimers. If you have never heard of Semantic Kernel, a good place to start is with Microsofts quick start. This post will assume that you have some experience with semantic kernel and that you know your way around C#. To code along with this example you also need an openAI api key (and some credits).]]></summary></entry></feed>