<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Speaking on Nicola Iarocci</title>
    <link>https://nicolaiarocci.com/tags/speaking/</link>
    <description>Recent content in Speaking on Nicola Iarocci</description>
    <generator>Hugo -- 0.143.1</generator>
    <language>en</language>
    <copyright>Produced / Written / Maintained by Nicola Iarocci since 2010</copyright>
    <lastBuildDate>Fri, 05 Dec 2025 10:07:42 +0100</lastBuildDate>
    <atom:link href="https://nicolaiarocci.com/tags/speaking/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Code from my session at WPC 2025</title>
      <link>https://nicolaiarocci.com/code-from-my-session-at-wpc-2025/</link>
      <pubDate>Fri, 05 Dec 2025 10:07:42 +0100</pubDate>
      <guid>https://nicolaiarocci.com/code-from-my-session-at-wpc-2025/</guid>
      <description>&lt;p&gt;On Wednesday, I held a session  titled &amp;ldquo;Feature Flags and Dynamic Configurations in C#&amp;rdquo; at &lt;a href=&#34;https://www.wpc.education/&#34;&gt;WPC 2025&lt;/a&gt;. It went well, at least judging by the offline questions that came in at the end of the session and which almost made us late for lunch.&lt;/p&gt;
&lt;p&gt;Attending WPC is always exciting. The audience is large, the rooms are big and well-equipped, the energy is just right, and there&amp;rsquo;s always a chance to catch up with friends and colleagues. I especially enjoy seeing fellow Microsoft MVPs and speakers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Wednesday, I held a session  titled &ldquo;Feature Flags and Dynamic Configurations in C#&rdquo; at <a href="https://www.wpc.education/">WPC 2025</a>. It went well, at least judging by the offline questions that came in at the end of the session and which almost made us late for lunch.</p>
<p>Attending WPC is always exciting. The audience is large, the rooms are big and well-equipped, the energy is just right, and there&rsquo;s always a chance to catch up with friends and colleagues. I especially enjoy seeing fellow Microsoft MVPs and speakers.</p>
<p>As promised, here is a <a href="https://github.com/nicolaiarocci/featureflags">link to the repository</a> with the code I demonstrated; just read the README to get your bearings. Oh, and as expected, someone in the audience got nerd-sniped by that <code>cj</code> bash function <a href="/curl-and-jq-go-to-a-conference/">I mentioned</a>.</p>
<figure>
    <img loading="lazy" src="/images/wpc2025.jpeg"
         alt="Snagged this one on LinkedIn. I expect the slides and video to be released soon by the fine folks at WPC."/> <figcaption>
            <p>Snagged this one on LinkedIn. I expect the slides and video to be released soon by the fine folks at WPC.</p>
        </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>My session on MCP servers at .NET Conference Italia 2025</title>
      <link>https://nicolaiarocci.com/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/</link>
      <pubDate>Wed, 26 Nov 2025 16:24:38 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-session-on-mcp-servers-at-dotnet-conference-italia-2025/</guid>
      <description>&lt;p&gt;I presented a session at the &lt;a href=&#34;https://www.aspitalia.com/eventi/97/.NET-Conference-Italia-2025-Milano.aspx&#34;&gt;.NET Conference Italia 2025&lt;/a&gt; in Milan a couple of weeks ago. The title was &amp;ldquo;Integrating our applications with LLMs and AI via MCP Servers&amp;rdquo;. It was well received; there were good questions throughout the talk and in the hall afterward. Surprisingly, live coding and demos went relatively smoothly.&lt;/p&gt;
&lt;p&gt;The fine guys at ASP Italia just published the &lt;a href=&#34;https://media.aspitalia.com/events/netconf25-LLM-dotNET-AI-MCP.media&#34;&gt;video&lt;/a&gt; in case someone is interested.&lt;/p&gt;
&lt;p&gt;Yeah, it is in Italian. I got a transcript from MacWhisper and then asked Claude to translate and clean it up. It did a pretty good job, so let me know if there&amp;rsquo;s any interest in an English transcript; I might post it here.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I presented a session at the <a href="https://www.aspitalia.com/eventi/97/.NET-Conference-Italia-2025-Milano.aspx">.NET Conference Italia 2025</a> in Milan a couple of weeks ago. The title was &ldquo;Integrating our applications with LLMs and AI via MCP Servers&rdquo;. It was well received; there were good questions throughout the talk and in the hall afterward. Surprisingly, live coding and demos went relatively smoothly.</p>
<p>The fine guys at ASP Italia just published the <a href="https://media.aspitalia.com/events/netconf25-LLM-dotNET-AI-MCP.media">video</a> in case someone is interested.</p>
<p>Yeah, it is in Italian. I got a transcript from MacWhisper and then asked Claude to translate and clean it up. It did a pretty good job, so let me know if there&rsquo;s any interest in an English transcript; I might post it here.</p>
<p>Speaking of English, I&rsquo;ve started submitting to international events again, without any luck so far. The conference landscape has changed quite a bit, especially since the COVID break. I still get invited to local ones, while internationals have been elusive. I suspect my change in technology stack plays a role. It was relatively easy to speak abroad when I was into Python. With .NET, not so much. But again, I was into Python in the pre-COVID era, so it is hard to tell which factors are at play and what their weight is.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Curl and jq go to a conference</title>
      <link>https://nicolaiarocci.com/curl-and-jq-go-to-a-conference/</link>
      <pubDate>Fri, 21 Nov 2025 16:57:44 +0100</pubDate>
      <guid>https://nicolaiarocci.com/curl-and-jq-go-to-a-conference/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m presenting at the &lt;a href=&#34;https://www.wpc.education&#34;&gt;WPC 2025 Conference&lt;/a&gt; on December 3rd in Milan. My session topic is Feature Flag Management and Dynamic Configurations in C#.&lt;/p&gt;
&lt;p&gt;I will use a Web API as an example project, and since I&amp;rsquo;ll be using curl live to query it, I&amp;rsquo;ll need to pipe responses through &lt;a href=&#34;https://jqlang.org&#34;&gt;jq&lt;/a&gt; to obtain nicely formatted JSON for the audience.&lt;/p&gt;
&lt;p&gt;The problem with jq is that it crashes on 400s or 500s because the response body is empty in those cases. Error responses are inherent to the demo, and crashes are not the most desirable thing during a presentation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m presenting at the <a href="https://www.wpc.education">WPC 2025 Conference</a> on December 3rd in Milan. My session topic is Feature Flag Management and Dynamic Configurations in C#.</p>
<p>I will use a Web API as an example project, and since I&rsquo;ll be using curl live to query it, I&rsquo;ll need to pipe responses through <a href="https://jqlang.org">jq</a> to obtain nicely formatted JSON for the audience.</p>
<p>The problem with jq is that it crashes on 400s or 500s because the response body is empty in those cases. Error responses are inherent to the demo, and crashes are not the most desirable thing during a presentation.</p>
<p>I cooked up a quick bash function that enhances curl and jq. It is called cj (curl + jq) and prevents crashes on errors, displays HTTP status codes with color-coded output (green for success, red for errors), and prettifies JSON responses.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>As I fully expect someone in the audience to raise their hand and ask what the hell &ldquo;cj&rdquo; is, I&rsquo;m posting it for reference so I can point them here if needed (Hi there!).</p>
<p>The function looks like this:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cj() {
</span></span><span style="display:flex;"><span>    local response http_code body
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    response=<span style="font-weight:bold">$(</span>curl -s -w <span style="font-style:italic">&#34;\n%{http_code}&#34;</span> <span style="font-style:italic">&#34;</span>$@<span style="font-style:italic">&#34;</span><span style="font-weight:bold">)</span>
</span></span><span style="display:flex;"><span>    http_code=<span style="font-weight:bold;font-style:italic">${</span>response##*<span style="font-style:italic">$&#39;\n&#39;</span><span style="font-weight:bold;font-style:italic">}</span>
</span></span><span style="display:flex;"><span>    body=<span style="font-weight:bold;font-style:italic">${</span>response%<span style="font-style:italic">$&#39;\n&#39;</span>*<span style="font-weight:bold;font-style:italic">}</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">if</span> [[ $http_code =~ ^2[0-9][0-9]$ ]]; <span style="font-weight:bold">then</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;32mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>        echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span> | jq 2&gt;/dev/null || echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">else</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31m</span>$body<span style="font-style:italic">\033[0m&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">fi</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>It currently sits at the bottom of my .zshrc file. I might turn it into a script in the future, but it&rsquo;s probably going to be short-lived, so I&rsquo;m happy with its current residence.</p>
<p>It&rsquo;s pretty straightforward, but let&rsquo;s break it down line by line.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cj() {
</span></span></code></pre></div><p>Defines a function named cj (short for &ldquo;curl with jq&rdquo;), which will wrap the standard curl command with automatic JSON formatting and colored output.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>local response http_code body
</span></span></code></pre></div><p>Declares three local variables scoped to this function: <code>response</code> will store the full curl output, <code>http_code</code> will contain the HTTP status code, and <code>body</code> will hold the response body.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>response=<span style="font-weight:bold">$(</span>curl -s -w <span style="font-style:italic">&#34;\n%{http_code}&#34;</span> <span style="font-style:italic">&#34;</span>$@<span style="font-style:italic">&#34;</span><span style="font-weight:bold">)</span>
</span></span></code></pre></div><p>Executes curl with the <code>-s</code> flag for silent mode (no progress bar), <code>-w &quot;\n%{http_code}&quot;</code> to append a newline and the HTTP status code at the end of the output, and <code>&quot;$@&quot;</code> to forward all arguments passed to the function. The entire output is captured in the response variable.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>http_code=<span style="font-weight:bold;font-style:italic">${</span>response##*<span style="font-style:italic">$&#39;\n&#39;</span><span style="font-weight:bold;font-style:italic">}</span>
</span></span></code></pre></div><p>Extracts the HTTP status code using Bash parameter expansion. The <code>##*$'\n'</code> pattern removes everything up to and including the last newline, leaving only the status code. This is faster than using external commands like tail.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>body=<span style="font-weight:bold;font-style:italic">${</span>response%<span style="font-style:italic">$&#39;\n&#39;</span>*<span style="font-weight:bold;font-style:italic">}</span>
</span></span></code></pre></div><p>Extracts the response body using parameter expansion. The <code>%$'\n'*</code> pattern removes the last newline and everything after it (the status code), leaving only the body content. This is more efficient than using, say, sed.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="font-weight:bold">if</span> [[ $http_code =~ ^2[0-9][0-9]$ ]]; <span style="font-weight:bold">then</span>
</span></span></code></pre></div><p>Checks if the HTTP status code matches the pattern for success responses (2xx). The regex <code>^2[0-9][0-9]$</code> matches any three-digit number starting with 2.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo -e <span style="font-style:italic">&#34;\033[0;32mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>Prints the HTTP status code in green color. The <code>-e</code> flag enables interpretation of backslash escapes, <code>\033[0;32m</code> is the ANSI code for green text, and <code>\033[0m</code> resets the color back to default.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span> | jq 2&gt;/dev/null || echo <span style="font-style:italic">&#34;</span>$body<span style="font-style:italic">&#34;</span>
</span></span></code></pre></div><p>This one was fun. Attempts to format the response body as JSON using jq. If jq is not installed or the body isn&rsquo;t valid JSON, stderr is redirected to <code>/dev/null</code> and the <code>||</code> operator triggers the fallback, which simply prints the raw body.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="font-weight:bold">else</span>
</span></span><span style="display:flex;"><span>        echo -e <span style="font-style:italic">&#34;\033[0;31mHTTP Code: </span>$http_code<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>For non-2xx responses (errors), prints the HTTP status code in red color using the ANSI code <code>\033[0;31m</code>.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo -e <span style="font-style:italic">&#34;\033[0;31m</span>$body<span style="font-style:italic">\033[0m&#34;</span>
</span></span></code></pre></div><p>Prints the error response body also in red color, making errors immediately visible during the demo.</p>
<p>And that is all.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I could of course update the API to return valid JSON even on errors, but that&rsquo;s boring.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Why arent people going to conferences anymore?</title>
      <link>https://nicolaiarocci.com/why-arent-people-going-to-conferences-anymore/</link>
      <pubDate>Tue, 02 Sep 2025 17:18:49 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-arent-people-going-to-conferences-anymore/</guid>
      <description>&lt;p&gt;Brent Ozar&amp;rsquo;s article below resonates with my post-COVID experience as a conference speaker. From big national and international conferences to local meetups like the one I run, attendance has been dwindling following the hiatus. Of all the proposed reasons, I believe &amp;ldquo;people switched how they&amp;rsquo;re learning&amp;rdquo; is crucial; just think about YouTube, LLMs, and the plethora of free and paid online courses.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.brentozar.com/archive/2025/08/why-arent-people-going-to-local-and-regional-in-person-events-anymore/&#34;&gt;Why Aren’t People Going to Local and Regional In-Person Events Anymore?&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brent Ozar&rsquo;s article below resonates with my post-COVID experience as a conference speaker. From big national and international conferences to local meetups like the one I run, attendance has been dwindling following the hiatus. Of all the proposed reasons, I believe &ldquo;people switched how they&rsquo;re learning&rdquo; is crucial; just think about YouTube, LLMs, and the plethora of free and paid online courses.</p>
<p><a href="https://www.brentozar.com/archive/2025/08/why-arent-people-going-to-local-and-regional-in-person-events-anymore/">Why Aren’t People Going to Local and Regional In-Person Events Anymore?</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>I&#39;m speaking at DevMarche Summer AI Afternoon</title>
      <link>https://nicolaiarocci.com/im-speaking-at-devmarche-summer-ai-afternoon/</link>
      <pubDate>Tue, 08 Jul 2025 10:59:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/im-speaking-at-devmarche-summer-ai-afternoon/</guid>
      <description>&lt;p&gt;On Thursday, I will be conducting an MCP Server session at the &lt;a href=&#34;https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419&#34;&gt;Summer AI Afternoon&lt;/a&gt; event organized by &lt;a href=&#34;https://dev.marche.it&#34;&gt;DevMarche&lt;/a&gt; in collaboration with &lt;a href=&#34;https://devromagna.org&#34;&gt;DevRomagna&lt;/a&gt;, the neighbouring development communities. There are more than 50 people signed up already, and I&amp;rsquo;m so looking forward to meeting old and new friends down South.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Thursday, I will be conducting an MCP Server session at the <a href="https://www.eventbrite.it/e/summer-ai-afternoon-tickets-1428458029419">Summer AI Afternoon</a> event organized by <a href="https://dev.marche.it">DevMarche</a> in collaboration with <a href="https://devromagna.org">DevRomagna</a>, the neighbouring development communities. There are more than 50 people signed up already, and I&rsquo;m so looking forward to meeting old and new friends down South.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Marp, the markdown presentation ecosystem</title>
      <link>https://nicolaiarocci.com/marp-the-markdown-presentation-ecosystem/</link>
      <pubDate>Tue, 17 Jun 2025 09:59:26 +0200</pubDate>
      <guid>https://nicolaiarocci.com/marp-the-markdown-presentation-ecosystem/</guid>
      <description>&lt;p&gt;Today, I learned about &lt;a href=&#34;https://marp.app&#34;&gt;Marp&lt;/a&gt;, the &amp;ldquo;Markdown Presentation Ecosystem,&amp;rdquo; which comes with an enticing promise: &lt;em&gt;to create beautiful slide decks using an intuitive Markdown experience.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;For my &lt;a href=&#34;https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/&#34;&gt;latest presentation&lt;/a&gt;, I utilized the Slides Extended Obsidian plugin, which is based on reveal.js—an excellent option for keeping slide decks within one&amp;rsquo;s Obsidian vault  (I keep all notes, work and personal journals, and knowledge in Obsidian.)&lt;/p&gt;
&lt;p&gt;Marp could be a viable alternative to the plugin, as Obsidian notes are just markdown files. The advantage here is that I can further elaborate or iterate on my slides, for example, from the command line, as Marp comes with a dedicated &lt;a href=&#34;https://github.com/marp-team/marp-cli/&#34;&gt;CLI tool&lt;/a&gt; that lets you export to PDF, HTML, and more. Additionally, Marp is not based on reveal.js, a tool that has given me headaches in the past.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today, I learned about <a href="https://marp.app">Marp</a>, the &ldquo;Markdown Presentation Ecosystem,&rdquo; which comes with an enticing promise: <em>to create beautiful slide decks using an intuitive Markdown experience.</em></p>
<p>For my <a href="/mcp-or-connecting-our-apps-to-llms/">latest presentation</a>, I utilized the Slides Extended Obsidian plugin, which is based on reveal.js—an excellent option for keeping slide decks within one&rsquo;s Obsidian vault  (I keep all notes, work and personal journals, and knowledge in Obsidian.)</p>
<p>Marp could be a viable alternative to the plugin, as Obsidian notes are just markdown files. The advantage here is that I can further elaborate or iterate on my slides, for example, from the command line, as Marp comes with a dedicated <a href="https://github.com/marp-team/marp-cli/">CLI tool</a> that lets you export to PDF, HTML, and more. Additionally, Marp is not based on reveal.js, a tool that has given me headaches in the past.</p>
<p>My understanding is that Marp is more geared toward producing &ldquo;static&rdquo; slides intended for PDF or other outputs (HTML included, though). In contrast, reveal-based solutions allow for more advanced features, such as animated slides, which I don&rsquo;t like and use anyway.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MCP or connecting our apps to LLMs</title>
      <link>https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/</link>
      <pubDate>Thu, 12 Jun 2025 09:23:46 +0200</pubDate>
      <guid>https://nicolaiarocci.com/mcp-or-connecting-our-apps-to-llms/</guid>
      <description>&lt;p&gt;Last night, I presented a session titled &lt;a href=&#34;https://www.meetup.com/devromagna/events/308179204/&#34;&gt;MCP or Connecting our Apps to LLMs&lt;/a&gt; at DevRomagna, our local developer&amp;rsquo;s community, and I think it went well.&lt;/p&gt;
&lt;p&gt;I had intended to record the audio with the idea of transcribing it with MacWhisper and then publishing it here on my site, but I forgot to do so, which is a pity.&lt;/p&gt;
&lt;p&gt;The session lasted almost two hours (I had thought it would take less time), during which I deviated somewhat from the script, using slides as a guide that were essentially an adaptation of the notes I had taken during my experiments. I showed the code for the MCP servers I created (stdio and streamable HTTP transports), demonstrated the various ways to link them with LLMs (Claude Desktop, Claude Code, and VS Code), and then shared my thoughts on the entire matter.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last night, I presented a session titled <a href="https://www.meetup.com/devromagna/events/308179204/">MCP or Connecting our Apps to LLMs</a> at DevRomagna, our local developer&rsquo;s community, and I think it went well.</p>
<p>I had intended to record the audio with the idea of transcribing it with MacWhisper and then publishing it here on my site, but I forgot to do so, which is a pity.</p>
<p>The session lasted almost two hours (I had thought it would take less time), during which I deviated somewhat from the script, using slides as a guide that were essentially an adaptation of the notes I had taken during my experiments. I showed the code for the MCP servers I created (stdio and streamable HTTP transports), demonstrated the various ways to link them with LLMs (Claude Desktop, Claude Code, and VS Code), and then shared my thoughts on the entire matter.</p>
<p>I received quite a bit of feedback, both in the room and afterward, when we moved to a pub where we stayed quite late by my standards, discussing AI, LLMs, and their impact on our daily work, which we can certainly define as significant, if not massive. Everyone uses LLMs&rsquo; UIs at their job to some extent, but very few are currently into agentic coding (the idea of a future session on that topic is tempting).</p>
<p>One remarkable tool that surfaced during the pub chat is <a href="https://github.com/Cinnamon/kotaemon">Kotaemon</a>, <em>&ldquo;an open-source RAG-based tool for chatting with your documents.&rdquo;</em>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>It is moments like this</title>
      <link>https://nicolaiarocci.com/it-is-moments-like-this/</link>
      <pubDate>Sat, 12 Apr 2025 07:54:25 +0200</pubDate>
      <guid>https://nicolaiarocci.com/it-is-moments-like-this/</guid>
      <description>&lt;p&gt;I presented at &lt;a href=&#34;https://www.dotnetconf.it&#34;&gt;.NET Conf Rome 2025&lt;/a&gt; yesterday, and it went very well, or at least that was my impression. I enjoyed myself, and the reception seemed great, from the organizers, the other speakers (most of whom are fellow MVPs), and the audience.&lt;/p&gt;
&lt;p&gt;But the kicker was just before the session when, at the coffee break, an attendant approached me to shake hands and tell me he had known me for a long time because he discovered and used &lt;a href=&#34;https://python-eve.org&#34;&gt;Eve&lt;/a&gt; in a research project he was working on years ago. As I recall, he had attended one of my Eve sessions at EuroPython, maybe in Berlin in 2014. As is often the case, he had no immediate need for my project and shelved it as &amp;ldquo;interesting, and cool that it&amp;rsquo;s by an Italian author, but I don&amp;rsquo;t need really it&amp;rdquo;. Then, a couple of years later, in a time of need, he recalled that little presentation of mine, and, long story short, Eve ended up being adopted by a big, unnamed corp or research institute. I thanked him from the bottom of my heart and told him it was worth preparing for the talk, waking up at 4 am and travelling to Rome to meet him and hear his story. It&amp;rsquo;s moments like this that make it all worth it. Also, hearing such a Python story at a .NET event was unexpected.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I presented at <a href="https://www.dotnetconf.it">.NET Conf Rome 2025</a> yesterday, and it went very well, or at least that was my impression. I enjoyed myself, and the reception seemed great, from the organizers, the other speakers (most of whom are fellow MVPs), and the audience.</p>
<p>But the kicker was just before the session when, at the coffee break, an attendant approached me to shake hands and tell me he had known me for a long time because he discovered and used <a href="https://python-eve.org">Eve</a> in a research project he was working on years ago. As I recall, he had attended one of my Eve sessions at EuroPython, maybe in Berlin in 2014. As is often the case, he had no immediate need for my project and shelved it as &ldquo;interesting, and cool that it&rsquo;s by an Italian author, but I don&rsquo;t need really it&rdquo;. Then, a couple of years later, in a time of need, he recalled that little presentation of mine, and, long story short, Eve ended up being adopted by a big, unnamed corp or research institute. I thanked him from the bottom of my heart and told him it was worth preparing for the talk, waking up at 4 am and travelling to Rome to meet him and hear his story. It&rsquo;s moments like this that make it all worth it. Also, hearing such a Python story at a .NET event was unexpected.</p>
<p>Nothing gratifies me more than seeing my open-source work appreciated and actively used in the wild.</p>
<p>Special thanks to Fabio Spaziani and the whole DotNetCode team for accomodating for my &ldquo;daily commuter from afar&rdquo; special needs.</p>
<p><img loading="lazy" src="/images/dotnetconf2025.jpg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>On C# and .NET quick release cycle</title>
      <link>https://nicolaiarocci.com/on-csharp-and-dotnet-quick-release-cycle/</link>
      <pubDate>Mon, 09 Dec 2024 17:31:18 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-csharp-and-dotnet-quick-release-cycle/</guid>
      <description>&lt;p&gt;&lt;em&gt;I sat to jot down a quick introduction to my &lt;a href=&#34;https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/&#34;&gt;C# 13 What&amp;rsquo;s New and Interesting&lt;/a&gt; session next week, and what I ended up with instead is a long rant or, should I dare, stream of consciousness that is certainly inappropriate for a five-minute introduction. I&amp;rsquo;ll have to cut most of it down, especially on the personal story part, but my site might be a good place to host it in all its completeness. I may reference this post at the start of the session on Monday for those few poor souls who might be interested.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>I sat to jot down a quick introduction to my <a href="/speaking-at-the-dotnet-conference-italia-2024/">C# 13 What&rsquo;s New and Interesting</a> session next week, and what I ended up with instead is a long rant or, should I dare, stream of consciousness that is certainly inappropriate for a five-minute introduction. I&rsquo;ll have to cut most of it down, especially on the personal story part, but my site might be a good place to host it in all its completeness. I may reference this post at the start of the session on Monday for those few poor souls who might be interested.</em></p>
<p>Exactly one year ago we were here, in this same room, at the same conference, presenting C# 12. Some of you in the audience were present back then. If so, please raise your hands. Twelve months later, here we are again, looking at a new version of C#. It&rsquo;s the new normal; this has been happening, give or take, since the advent of .NET Core and C# 8 in 2019. Previously, C# had a new release every 2–3 years, so the release rate has doubled or even tripled recently. Is this good news? If you&rsquo;ve followed forums or social media, you might have noticed some controversy about the topic. The main complaint is that the language is changing too quickly, &ldquo;chasing trends,&rdquo; with no valuable addition to its core.</p>
<p>Most of these complaints come from old-timers around my age (maybe even ten years younger because I&rsquo;m seasoned) and have been in the .NET environment for many, perhaps too many years. There&rsquo;s always a certain inertia, a form of resistance to change, especially when it&rsquo;s rapid. But I&rsquo;m seasoned enough to remember when complaints went in the opposite direction: back then, the .NET Framework (the historical, monolithic, Windows-only version) moved like a dinosaur while the world was racing ahead. New languages were blooming. Old competitors were evolving at double or triple the speed, constantly innovating, and—this is key—attracting hordes of developers. There was a critical moment when this attraction became so intense that more and more developers set aside .NET and C# to explore new directions. I know because I was one of them.</p>
<p>Around 2010–11, I was set to create a new, rather complex platform of REST services, and instead of reaching out for my usual .NET toolchain, I chose Python. That marked the beginning of an adventure that lasted years and included the unexpected release of some reasonably successful open-source Python projects. The reasons I decided to abandon .NET and C# were several—not least the frustration with the lack of transparency and a clear path for the .NET ecosystem, its languages, with oh-so-many frameworks enthusiastically presented and then abandoned, changes of direction, and above all, in my case, it all being closed source, which didn&rsquo;t allow me to dig deeper and understand why certain things didn&rsquo;t work as expected. I clearly remember when I was writing my first REST service in Python and realized that in this new ecosystem if I didn&rsquo;t understand what was happening behind the scenes (in my case, with the Flask framework), I could quickly look at what was going on because the entire Flask source code, like Python&rsquo;s for that matter, was available not only for consumption but it was also open to contribution. Coming from the enterprise closed-source world, it was an empowering sensation.</p>
<p>The discovery of Flask was an absolute revelation, not for its intrinsic features (which were great) but because it was just one of the many options. In Python space, there were dozens of web frameworks at varying stages of maturity. There was a choice and often many different approaches to solve the same problem. I could experiment freely and decide what was best for my use case. Not only was I facing a vast and diverse world, but I could also use the operating system I wanted. Linux was much less demanding, let alone less expensive, for deployment than Windows, and behold! I could use a Mac for development. Open-source, cross-platform, with a vast community not only adopting the language and the standard library but constantly forging new solutions, making them available to the same community, almost always for free. It was the way forward.</p>
<p>I envied that such a thing was unthinkable in my world. But unbeknownst to many, Microsoft was watching and taking notes. To the best of my knowledge, it was mainly the developers inside the corp —the dev team—who, glancing out of the ivory tower, began a campaign of internal lobbying, initially scattered and disorganized and later increasingly coordinated, which in turn led to endless meetings, discussions at coffee machines, and gradually, slowly and then more rapidly, to the advent of the .NET Core project. The metaphor of a snowball slowly rolling down a slope until it becomes an unstoppable avalanche perfectly applies here.</p>
<p>So, years after my departure (not an actual departure—I still worked in .NET for our legacy products), a new and unexpected .NET appeared on the scene. It was open-source, cross-platform, and open to external contributions. We could and perhaps should have a lengthy discussion on the openness to external contributions, but we can all agree that a revolution occurred and was historic in scale. At the same time, Microsoft opened up to other stacks, mainly because of Azure. I was shocked when I was proposed for a Microsoft MVP Award for my work on Python, not C#, at a time when Python had little to nothing to do with Microsoft. It made sense, as there was an urgent need to speak to developers outside its ecosystem—and perhaps even more so to those like me who had left: <em>Hey, look, we&rsquo;re back, we&rsquo;re on track, and we&rsquo;re not evil anymore</em>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> </p>
<p>And there I was, finding my old stack (which I secretly, I admit, considered only museum-worthy) back to relevance, competing on equal footing with the rest of the scene. The delay was costly, though. Even today, I meet colleagues who think modern .NET is just a new version, if not a simple rebranding of the Windows framework of old, and C# is more or less the same, way behind the new kids on the block. It&rsquo;s a shame, and there are responsibilities. Some choices could have been bolder and more disruptive, starting with naming the new framework—but that&rsquo;s another story.</p>
<p>Today, I create REST services with Minimal APIs on my Mac and deploy them on Linux via Docker at zero or near-zero cost, just as I would with Python, JavaScript, Rust, Go, or any other stack. The performance is far better than Python&rsquo;s (C# REST services make circles around Python&rsquo;s), and the toolchain is rich and powerful, especially around the command line, while many think .NET is still a GUI/Windows thing. Quick release cycles are essential to compensate for lost time (and there was lots of it) and stay on the cutting edge, sending a continuous signal that the platform is alive, thriving, and constantly expanding.</p>
<p>Aldus Manutius, the renowned Venetian printer and publisher of the Renaissance, adopted the Latin motto <em>Festina lente</em>, which translates to <em>Make haste slowly</em> or <em>Hasten slowly</em>. This paradoxical phrase encapsulates achieving careful, deliberate progress quickly and precisely, balancing urgency with caution. I feel that, consciously or not, the .NET team is on track with Manuzio&rsquo;s goal: they iterate rapidly to achieve progress, balancing urgency with caution.</p>
<p>Nowadays, both .NET and C# focus on performance and while there&rsquo;s room for growth, the current achievements are extraordinary. We&rsquo;re competitive with most stacks, if not significantly ahead of them. Frequent, more minor C# releases allow for quick adjustments. Attentive developers adopt them continuously. Meanwhile, those who aren&rsquo;t in a rush (probably most of Microsoft&rsquo;s long-time customers, slow-moving conglomerates and the like) benefit from performance gains and technological advantages (multi-platform deployment!) at a low cost because, while the framework and language evolve, great effort is put into preserving backward compatibility. In most cases, migrating to .NET Core and newer versions of C# requires minimal effort.</p>
<p>C# 12 introduced two significant features: primary constructors and collection expressions, with the latter being predominant in terms of syntactic, semantic, and performance importance. They weren&rsquo;t the only new features but certainly the key ones. C# 13 innovates further but subtly—there&rsquo;s less syntax and more semantics, building on last year&rsquo;s new features. The improvements may be less flashy but guide developers in the right direction, often ensuring better performance at zero cost, sometimes even without us having to do anything. As we shall see, it happens because in recent releases—let&rsquo;s say the last two or three— features were introduced primarily to improve the framework, which is also written in C#. Our higher-level applications benefit from all of this. It is a pattern we&rsquo;ll observe repeatedly throughout this presentation.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you think we&rsquo;re talking about the same company that had its CEO infamously pronounce the &ldquo;Linux is a cancer&rdquo; quote, please consider that it happened on <a href="https://www.theregister.com/2001/06/02/ballmer_linux_is_a_cancer/">June 1, 2001</a>. That was 23 (twenty-three!) years ago at the time of this writing. Take your time to process that. That happened like a couple of technological eras ago. I know it&rsquo;s a distant past because I was there. Things have moved forward. Get over it. Of course, one must stay vigilant; things can change, but this is where we are now, and it is a good position to be in.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Speaking at the .NET Conference Italia 2024</title>
      <link>https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/</link>
      <pubDate>Sat, 07 Dec 2024 08:36:26 +0100</pubDate>
      <guid>https://nicolaiarocci.com/speaking-at-the-dotnet-conference-italia-2024/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m speaking at the &lt;a href=&#34;https://www.dotnetconference.it&#34;&gt;.NET Conference Italia 2024&lt;/a&gt; on Dec 16th in Milan at the Microsoft House. My session is titled &lt;a href=&#34;https://www.dotnetconference.it/e/sessione/3589/C-13-e-NET-9-cosa-c%E2%80%99e-di-nuovo-e-interessante&#34;&gt;C# 13 What&amp;rsquo;s New and Interesting&lt;/a&gt; and will be on the latest iteration of the C# language. We&amp;rsquo;ll also briefly touch on .NET 9, which was also just released. Hope to see you there (make sure to come to me to say Hi!)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;m speaking at the <a href="https://www.dotnetconference.it">.NET Conference Italia 2024</a> on Dec 16th in Milan at the Microsoft House. My session is titled <a href="https://www.dotnetconference.it/e/sessione/3589/C-13-e-NET-9-cosa-c%E2%80%99e-di-nuovo-e-interessante">C# 13 What&rsquo;s New and Interesting</a> and will be on the latest iteration of the C# language. We&rsquo;ll also briefly touch on .NET 9, which was also just released. Hope to see you there (make sure to come to me to say Hi!)</p>
]]></content:encoded>
    </item>
    <item>
      <title>The video of my OAuth2 session at WebDay 2024 is online</title>
      <link>https://nicolaiarocci.com/the-video-of-my-oauth2-session-at-webday-2024-is-online/</link>
      <pubDate>Thu, 23 May 2024 09:30:54 +0200</pubDate>
      <guid>https://nicolaiarocci.com/the-video-of-my-oauth2-session-at-webday-2024-is-online/</guid>
      <description>&lt;p&gt;The video my OAuth2 and OpenID Connect session at WebDay 2024 Milan is
&lt;a href=&#34;https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8&#34;&gt;available
online&lt;/a&gt;.
It is in Italian, and you need to login or register in order to see it (sorry, I
don’t have control over it.)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The video my OAuth2 and OpenID Connect session at WebDay 2024 Milan is
<a href="https://www.improove.tech/videos/3376/Oauth2-e-Open-ID-Connect-con-ASP-NET-Core-8">available
online</a>.
It is in Italian, and you need to login or register in order to see it (sorry, I
don’t have control over it.)</p>
]]></content:encoded>
    </item>
    <item>
      <title>C# 12 Collection Expressions</title>
      <link>https://nicolaiarocci.com/csharp-collection-expressions/</link>
      <pubDate>Fri, 10 May 2024 17:39:02 +0200</pubDate>
      <guid>https://nicolaiarocci.com/csharp-collection-expressions/</guid>
      <description>&lt;p&gt;This is a follow-up post to &lt;a href=&#34;https://nicolaiarocci.com/csharp-primary-constructors&#34;&gt;C# 12 Primary
Constructors&lt;/a&gt;. Like that article, this one
originates from the preparation notes for my presentation at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Dotnet
Conference 2024&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I love collection expressions. Like primary constructors, collection
expressions will see a significant adoption in the long run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Collection expressions introduce a new way to initialize common collection
values in a terse, unified syntax.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is how we initialize collections today:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-cs&#34; data-lang=&#34;cs&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;var&lt;/span&gt; x1 = &lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;&#34;&gt;int&lt;/span&gt;[] { 1, 2, 3, 4 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;&#34;&gt;var&lt;/span&gt; x2 = Array.Empty&amp;lt;&lt;span style=&#34;&#34;&gt;int&lt;/span&gt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WriteByteArray(&lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt;[] { (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)1, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)2, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)3 });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;List&amp;lt;&lt;span style=&#34;&#34;&gt;int&lt;/span&gt;&amp;gt; x3 = &lt;span style=&#34;font-weight:bold&#34;&gt;new&lt;/span&gt;() { 1, 2, 3, 4 };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Span&amp;lt;DateTime&amp;gt; dates = &lt;span style=&#34;font-weight:bold&#34;&gt;stackalloc&lt;/span&gt; DateTime[] { GetDate(0), GetDate(1) };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WriteByteSpan(&lt;span style=&#34;font-weight:bold&#34;&gt;stackalloc&lt;/span&gt;[] { (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)1, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)2, (&lt;span style=&#34;&#34;&gt;byte&lt;/span&gt;)3 });
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice how the code is diverse depending on the type and the context. It is also
verbose. Look at how we initialize an empty &lt;code&gt;int&lt;/code&gt; array (second line); it&amp;rsquo;s
lengthy and starkly contrasts with the previous line, where we initialize the
same type with some actual values.  In many situations, casting is needed;
again, take a look at the &lt;code&gt;WriteByteArray&lt;/code&gt; and &lt;code&gt;WriteByteSpan&lt;/code&gt; calls.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>This is a follow-up post to <a href="/csharp-primary-constructors">C# 12 Primary
Constructors</a>. Like that article, this one
originates from the preparation notes for my presentation at the <a href="https://abp.io/conference/2024">ABP Dotnet
Conference 2024</a>.</p>
<ul>
<li>
<p>I love collection expressions. Like primary constructors, collection
expressions will see a significant adoption in the long run.</p>
</li>
<li>
<p>Collection expressions introduce a new way to initialize common collection
values in a terse, unified syntax.</p>
</li>
<li>
<p>This is how we initialize collections today:</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">var</span> x1 = <span style="font-weight:bold">new</span> <span style="">int</span>[] { 1, 2, 3, 4 };
</span></span><span style="display:flex;"><span><span style="">var</span> x2 = Array.Empty&lt;<span style="">int</span>&gt;();
</span></span><span style="display:flex;"><span>WriteByteArray(<span style="font-weight:bold">new</span>[] { (<span style="">byte</span>)1, (<span style="">byte</span>)2, (<span style="">byte</span>)3 });
</span></span><span style="display:flex;"><span>List&lt;<span style="">int</span>&gt; x3 = <span style="font-weight:bold">new</span>() { 1, 2, 3, 4 };
</span></span><span style="display:flex;"><span>Span&lt;DateTime&gt; dates = <span style="font-weight:bold">stackalloc</span> DateTime[] { GetDate(0), GetDate(1) };
</span></span><span style="display:flex;"><span>WriteByteSpan(<span style="font-weight:bold">stackalloc</span>[] { (<span style="">byte</span>)1, (<span style="">byte</span>)2, (<span style="">byte</span>)3 });
</span></span></code></pre></div><p>Notice how the code is diverse depending on the type and the context. It is also
verbose. Look at how we initialize an empty <code>int</code> array (second line); it&rsquo;s
lengthy and starkly contrasts with the previous line, where we initialize the
same type with some actual values.  In many situations, casting is needed;
again, take a look at the <code>WriteByteArray</code> and <code>WriteByteSpan</code> calls.</p>
<ul>
<li>With collection expressions, it becomes like this:</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">int</span>[] x4 = [1, 2, 3, 4];
</span></span><span style="display:flex;"><span><span style="">int</span>[] x5 = [];
</span></span><span style="display:flex;"><span>WriteByteArray([1, 2, 3]);
</span></span><span style="display:flex;"><span>List&lt;<span style="">int</span>&gt; x6 = [1, 2, 3, 4];
</span></span><span style="display:flex;"><span>Span&lt;DateTime&gt; dates1 = [GetDate(0), GetDate(1)];
</span></span><span style="display:flex;"><span>WriteByteSpan([1, 2, 3]);
</span></span></code></pre></div><p>We enclose items within square brackets, and that&rsquo;s all. An empty collection is
empty brackets. We can, of course, call functions or use variables.</p>
<ul>
<li>
<p>In many scenarios, the compiler will perform several optimizations. It can
allocate the correct capacity or avoid copying data when unnecessary. The
compiler can do that because the supported collection types are well-known and
have been for a long time. We get these performance boosts for free when we switch to
collection expressions.</p>
</li>
<li>
<p>Let&rsquo;s look at that <code>WriteByteArray</code> call. Let&rsquo;s say that at some
point, maybe months or years after it&rsquo;s been used in many places, we decide to
refactor the method and change the argument type from <code>byte[]</code> to <code>int[].</code> We&rsquo;d
have to refactor the old-style caller to eliminate the casting, which is now an
error. We don&rsquo;t need to do any fix with collection expressions as they come with
enhanced inference that will resolve the casting for us.</p>
</li>
<li>
<p>On the first line, we&rsquo;re initializing a new array (we aren&rsquo;t calling a method
with a signature), so with collection expressions, if we try to use <code>var,</code> it
won&rsquo;t work. In that case, we need to be explicit about the type.</p>
</li>
<li>
<p>The spread operator allows us to insert variables and constants and to sort of
&ldquo;unroll&rdquo; another collection within the new one, and it does so with optimal
performance.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="">int</span>[] numbers1 = [1, 2, 3];
</span></span><span style="display:flex;"><span><span style="">int</span>[] numbers2 = [4, 5, 6];
</span></span><span style="display:flex;"><span><span style="">int</span>[] moreNumbers = [.. numbers1, .. numbers2, 7, 8, 9];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-weight:bold">foreach</span>(<span style="">var</span> number <span style="font-weight:bold">in</span> moreNumbers)
</span></span><span style="display:flex;"><span>    Console.WriteLine(number);
</span></span></code></pre></div><p>It would be nice if lambdas were allowed in collection expressions,
like in other languages (Python), but that&rsquo;s not yet an option.</p>
<ul>
<li>What about custom collections? But let&rsquo;s imagine I have built a <code>LineBuffer</code>
class that inherits from <code>IEnumrable&lt;chrar&gt;</code>; it offers some custom features
over its base class. I get an error if I try to use collection expression syntax
on it. It is not a common .NET type, and the compiler doesn&rsquo;t know how to go
around it.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">LineBuffer</span> : IEnumerable&lt;<span style="">char</span>&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">private</span> <span style="font-weight:bold">readonly</span> <span style="">char</span>[] _buffer = <span style="font-weight:bold">new</span> <span style="">char</span>[80];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> LineBuffer(ReadOnlySpan&lt;<span style="">char</span>&gt; buffer)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="">int</span> number = (_buffer.Length &lt; buffer.Length) ? _buffer.Length : buffer.Length;
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">for</span> (<span style="">int</span> i = 0; i &lt; number; i++)
</span></span><span style="display:flex;"><span>            _buffer[i] = buffer[i];
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> IEnumerator&lt;<span style="">char</span>&gt; GetEnumerator() =&gt; _buffer.AsEnumerable&lt;<span style="">char</span>&gt;().GetEnumerator();
</span></span><span style="display:flex;"><span>    IEnumerator IEnumerable.GetEnumerator() =&gt; _buffer.GetEnumerator();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-style:italic">// etc</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-style:italic">// this causes a compile error</span>
</span></span><span style="display:flex;"><span>LineBuffer line = [<span style="font-style:italic">&#39;H&#39;</span>, <span style="font-style:italic">&#39;e&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;o&#39;</span>, <span style="font-style:italic">&#39; &#39;</span>, <span style="font-style:italic">&#39;W&#39;</span>, <span style="font-style:italic">&#39;o&#39;</span>, <span style="font-style:italic">&#39;r&#39;</span>, <span style="font-style:italic">&#39;l&#39;</span>, <span style="font-style:italic">&#39;d&#39;</span>, <span style="font-style:italic">&#39;!&#39;</span>];
</span></span></code></pre></div><ul>
<li>We can support collection expressions in our custom types, though. It&rsquo;s a
two-step process. First, we implement a builder method, then decorate the class
(or struct) with a <code>CollectionBuilderAttribute.</code> The attribute maps our type to
the builder method.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span>[CollectionBuilder(typeof(LineBuffer), nameof(Create))]
</span></span><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">LineBuffer</span> : IEnumerable&lt;<span style="">char</span>&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">private</span> <span style="font-weight:bold">readonly</span> <span style="">char</span>[] _buffer = <span style="font-weight:bold">new</span> <span style="">char</span>[80];
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> LineBuffer(ReadOnlySpan&lt;<span style="">char</span>&gt; buffer)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="">int</span> number = (_buffer.Length &lt; buffer.Length) ? _buffer.Length : buffer.Length;
</span></span><span style="display:flex;"><span>        <span style="font-weight:bold">for</span> (<span style="">int</span> i = 0; i &lt; number; i++)
</span></span><span style="display:flex;"><span>            _buffer[i] = buffer[i];
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> IEnumerator&lt;<span style="">char</span>&gt; GetEnumerator() =&gt; _buffer.AsEnumerable&lt;<span style="">char</span>&gt;().GetEnumerator();
</span></span><span style="display:flex;"><span>    IEnumerator IEnumerable.GetEnumerator() =&gt; _buffer.GetEnumerator();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">internal</span> <span style="font-weight:bold">static</span> LineBuffer Create(ReadOnlySpan&lt;<span style="">char</span>&gt; values) =&gt; <span style="font-weight:bold">new</span> LineBuffer(values);
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>The official documentation says the builder must be named &ldquo;Create,&rdquo; but that&rsquo;s
false. We can name it however we want as long as it matches the attribute (it&rsquo;s
probably still worth adhering to the suggested practice.)</p>
<ul>
<li>
<p>Adding collection expression support to custom types is helpful in your
codebase, even more so if you&rsquo;re a library author.</p>
</li>
<li>
<p>The syntax of collection expressions is symmetric with that of slicing and
pattern matching, a nice touch that keeps the language tidy and coherent. Take a
look at this pattern matching switch:</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> Grade GPA =&gt; Grades <span style="font-weight:bold">switch</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    [] =&gt; 4.0m,
</span></span><span style="display:flex;"><span>    [var grade] =&gt; grade,
</span></span><span style="display:flex;"><span>    [.. var all] =&gt; all.Average()
</span></span><span style="display:flex;"><span>};
</span></span></code></pre></div><ul>
<li>
<p>Visual Studio, VS Code, JetBrains Rider and most other IDEs offer full support
for refactoring old-style collection initializations to collection expressions.</p>
</li>
<li>
<p>What about dictionary expressions? They are common in other languages (again,
Python). When asked, Kathrine Dollard of the C# design team answered that
they&rsquo;re thinking about it, mostly trying to understand the best design, so
there&rsquo;s a chance that we&rsquo;ll see dictionary expressions in the language in the
future.</p>
</li>
</ul>
<p>Also see: <a href="/csharp-primary-constructors/">C# 12 Primary Constructors</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>C# 12 Primary Constructors</title>
      <link>https://nicolaiarocci.com/csharp-primary-constructors/</link>
      <pubDate>Thu, 09 May 2024 18:04:39 +0200</pubDate>
      <guid>https://nicolaiarocci.com/csharp-primary-constructors/</guid>
      <description>&lt;p&gt;I wrapped up my C# 12 session at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Dotnet Conference 2024&lt;/a&gt;, and I wanted to share the take-home points, at least about the most relevant features in this language version. Posting the slides made no sense as they were minimal; all the content was packed in the live demo.&lt;/p&gt;
&lt;p&gt;In a follow-up post, I plan to address Collection Expressions (&lt;a href=&#34;https://nicolaiarocci.com/csharp-collection-expressions&#34;&gt;done&lt;/a&gt;) and maybe &amp;ldquo;type any aliases&amp;rdquo;; this is about Primary Constructors.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I wrapped up my C# 12 session at the <a href="https://abp.io/conference/2024">ABP Dotnet Conference 2024</a>, and I wanted to share the take-home points, at least about the most relevant features in this language version. Posting the slides made no sense as they were minimal; all the content was packed in the live demo.</p>
<p>In a follow-up post, I plan to address Collection Expressions (<a href="/csharp-collection-expressions">done</a>) and maybe &ldquo;type any aliases&rdquo;; this is about Primary Constructors.</p>
<ul>
<li>
<p>We can now add a list of parameters to a struct or class declaration. This way, we avoid writing an explicit constructor method, sparing us some boilerplate code.</p>
</li>
<li>
<p>What I refer to as &lsquo;primary parameters&rsquo; are unique in that they are in scope throughout the type definition; this means they can be used anywhere within the type.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="font-weight:bold">struct</span> <span style="font-weight:bold">Distance</span>(<span style="">double</span> dx, <span style="">double</span> dy)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="">double</span> Magnitude { <span style="font-weight:bold">get</span>; } = Math.Sqrt(dx * dx + dy * dy);
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">readonly</span> <span style="">double</span> Direction { <span style="font-weight:bold">get</span>; } = Math.Atan2(dy, dx);
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="font-weight:bold">override</span> <span style="">string</span> ToString() =&gt; <span style="font-style:italic">$&#34;{nameof(Magnitude)}: {Magnitude}, {nameof(Direction)}: {Direction}&#34;</span>;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="">double</span> Dx { <span style="font-weight:bold">get</span>; } = dx;
</span></span><span style="display:flex;"><span>    <span style="font-weight:bold">public</span> <span style="">double</span> Dy { <span style="font-weight:bold">get</span>; } = dy;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li>
<p>It&rsquo;s important to note that primary constructor parameters are not class members; therefore, <code>this.</code> cannot be used on them. They can be considered static values, but unlike typical static values, they can also be used in non-static methods, offering a unique advantage (some black magic happens behind the scenes.)</p>
</li>
<li>
<p>We no longer need to define and assign a type-level field; the compiler will do that behind the scenes when needed; if a behind-the-scenes backing field is unnecessary, it won&rsquo;t be created.</p>
</li>
<li>
<p>Primary constructor parameters don&rsquo;t become properties and are inaccessible outside the instance. We can create properties to expose their values if needed. Record types are an exception. Constructor parameters become properties with records, and it makes sense because records are generally used as DTOs, whereas we want the option with class and structs.</p>
</li>
<li>
<p>Secondary and parameterless constructors can be added to a primary constructor. They must invoke the primary, passing its values along.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> Distance() : <span style="font-weight:bold">this</span>(0, 0) { }
</span></span></code></pre></div><ul>
<li>With primary constructors, we do not have a method body; how do we handle argument validation? One pattern is to perform validation at property assignation.</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="">string</span> AccountID { <span style="font-weight:bold">get</span>; } = ValidAccountNumber(accountID)
</span></span><span style="display:flex;"><span>    ? accountID
</span></span><span style="display:flex;"><span>    : <span style="font-weight:bold">throw</span> <span style="font-weight:bold">new</span> ArgumentException(<span style="font-style:italic">&#34;Invalid account number&#34;</span>, nameof(accountID));
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">static</span> <span style="">bool</span> ValidAccountNumber(<span style="">string</span> accountID) =&gt; accountID?.Length == 10 &amp;&amp; accountID.All(c =&gt; <span style="">char</span>.IsDigit(c));
</span></span></code></pre></div><ul>
<li>
<p>I like this pattern because it brings property declaration and validation close to each other, making it easier to process and reason about the domain logic. When we perform argument validation in an old-style constructor method, we tend to separate validation and declaration, making it difficult to reconcile the two aspects, especially when we have hundreds of lines between constructor code and property declaration.</p>
</li>
<li>
<p>Derived types can have a primary constructor, too; it must invoke the base class&rsquo; primary constructor.</p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-cs" data-lang="cs"><span style="display:flex;"><span><span style="font-weight:bold">public</span> <span style="font-weight:bold">class</span> <span style="font-weight:bold">CheckingAccount</span>(<span style="">string</span> accountID, <span style="">string</span> owner, <span style="">decimal</span> overdraftLimit = 0) : BankAccount(accountID, owner)
</span></span></code></pre></div><ul>
<li>
<p>Old-style derived types can still derive from a primary constructor type; a regular constructor will invoke the base primary, as we&rsquo;ve always been doing.</p>
</li>
<li>
<p>Regarding inheritance, we can mix and match primary constructor types with old-style types, making it easy to refactor our libraries to use primary constructors. We know that adopters will have no problem deriving from our refactored types.</p>
</li>
<li>
<p>Watch out for &ldquo;nested captures&rdquo; of primary parameter values in derived types. If both the derived and the base type capture them, and one (or both) change their captured values, we may end up with non-aligned instance values. Roslyn&rsquo;s analyzer will raise a warning so we can fix our code or mute the alert with a pragma.</p>
</li>
<li>
<p>Visual Studio and Visual Studio code offer built-in support for primary constructors (refactorings, etc.) That&rsquo;s true for JetBrains Rider or any other IDEs leveraging Roslyn.</p>
</li>
<li>
<p>The primary constructor&rsquo;s original implementation dates back to C# 6 in 2015. It was publicly available in one of those version previews for a short period. Then, it was taken back to the drawing board, only to resurface with record types in C# 9 (?) and custom types in C# 12.</p>
</li>
</ul>
<p>Also see: <a href="/csharp-collection-expressions/">C# 12 Collection Expressions</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at ABP Dotnet Conf&#39;24</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-abp-dotnet-conf24.md/</link>
      <pubDate>Mon, 15 Apr 2024 15:01:12 +0200</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-abp-dotnet-conf24.md/</guid>
      <description>&lt;p&gt;&lt;img alt=&#34;Nicola Iarocci: C#12 What&amp;rsquo;s new and Interesting session at ABP Dotnet Conf&#39;24&#34; loading=&#34;lazy&#34; src=&#34;https://nicolaiarocci.com/images/abp-dotnet-conf24.png&#34;&gt;&lt;/p&gt;
&lt;p&gt;I am thrilled to have the opportunity to present at an international conference once again. On May 9th, I will speak at the &lt;a href=&#34;https://abp.io/conference/2024&#34;&gt;ABP Donet Conf&#39;24&lt;/a&gt;. My session, titled C #12: What&amp;rsquo;s New and Interesting, is on a topic I&amp;rsquo;m passionate about.&lt;/p&gt;
&lt;p&gt;With the alignment of C# and Dotnet Core release cycles, the C# release cadence has increased (we&amp;rsquo;re on a yearly cycle now), while feature quantity has reduced for individual releases, which is good. The faster, smaller iterations allow for quicker course corrections, and introducing fewer new features makes it easier to embrace the changes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><img alt="Nicola Iarocci: C#12 What&rsquo;s new and Interesting session at ABP Dotnet Conf'24" loading="lazy" src="/images/abp-dotnet-conf24.png"></p>
<p>I am thrilled to have the opportunity to present at an international conference once again. On May 9th, I will speak at the <a href="https://abp.io/conference/2024">ABP Donet Conf'24</a>. My session, titled C #12: What&rsquo;s New and Interesting, is on a topic I&rsquo;m passionate about.</p>
<p>With the alignment of C# and Dotnet Core release cycles, the C# release cadence has increased (we&rsquo;re on a yearly cycle now), while feature quantity has reduced for individual releases, which is good. The faster, smaller iterations allow for quicker course corrections, and introducing fewer new features makes it easier to embrace the changes.</p>
<p>The ABP Dotnet Conf'24<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> will be held online on 8-9th May; the <a href="https://abp.io/conference/2024#agenda">lineup and agenda</a> look great, so reserve a ticket before they are sold out, and see you there!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I love what the conference organizers are doing with the subtle product name change. Did you catch that? #dropthedot&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Why I speak at conferences</title>
      <link>https://nicolaiarocci.com/why-i-speak-at-conferences/</link>
      <pubDate>Thu, 11 Apr 2024 11:46:48 +0200</pubDate>
      <guid>https://nicolaiarocci.com/why-i-speak-at-conferences/</guid>
      <description>&lt;p&gt;Among the essential reasons I continue to make presentations at various conferences is that the preparation required to deliver good content forces me to learn and comprehend a topic in greater depth. I always try to talk about the stuff I am working on: the commitment to explaining what I am learning in public forces me into a higher level of knowledge.&lt;/p&gt;
&lt;p&gt;In the past few weeks, I have spoken about OAuth2 at &lt;a href=&#34;https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/&#34;&gt;two different conferences&lt;/a&gt;, and OAuth2 has been precisely the subject of my work for the past few months, and it still is now. It goes like this: I study and implement things, and while doing that, I say to myself, hey, this could be an exciting topic for other devs, too. I let the idea cool down for a few days, and then, if it still seems good, I start looking for a fitting call for papers. Magic happens if the proposal is accepted: I am forced to turn from a superficial connoisseur to someone close to a field expert. That&amp;rsquo;s the level of competence to aim for if one wants to talk publicly, especially on a technical topic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Among the essential reasons I continue to make presentations at various conferences is that the preparation required to deliver good content forces me to learn and comprehend a topic in greater depth. I always try to talk about the stuff I am working on: the commitment to explaining what I am learning in public forces me into a higher level of knowledge.</p>
<p>In the past few weeks, I have spoken about OAuth2 at <a href="https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/">two different conferences</a>, and OAuth2 has been precisely the subject of my work for the past few months, and it still is now. It goes like this: I study and implement things, and while doing that, I say to myself, hey, this could be an exciting topic for other devs, too. I let the idea cool down for a few days, and then, if it still seems good, I start looking for a fitting call for papers. Magic happens if the proposal is accepted: I am forced to turn from a superficial connoisseur to someone close to a field expert. That&rsquo;s the level of competence to aim for if one wants to talk publicly, especially on a technical topic.</p>
<p>Something new happened yesterday. As I was writing the OAuth2 documentation for the next iteration of our APIs, I realized I could reuse some of the material from my live sessions. In the talk, it made sense to dedicate a few minutes to explain the <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-4.1">OAuth2 Authorization Code Flow</a>, so I used <a href="https://obsidian.md/canvas">Obsidian Canvas</a> to draw two diagrams, one with a high-level view of the flow while the other would zoom into the details. I could now take the first one, streamline and simplify it, and then include it in our official documentation. And that&rsquo;s what I did.</p>
<figure>
    <img loading="lazy" src="/images/why-i-speak-at-conferences.png"
         alt="Our documentation now includes the flow chart I conceived for the conference."/> <figcaption>
            <p>Our documentation now includes the flow chart I conceived for the conference.</p>
        </figcaption>
</figure>

<p>That presentation took a while to prepare, but the delivery was good. It took me to a new level of expertise, and part of that work landed in our product. It was all well worth the effort.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am presenting on OAuth2 at two conferences this month</title>
      <link>https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/</link>
      <pubDate>Tue, 05 Mar 2024 10:36:21 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-presenting-on-oauth2-at-two-conferences-this-month/</guid>
      <description>&lt;p&gt;I am speaking about OAuth2 and Open ID Connect with ASP.NET Core 8 at &lt;a href=&#34;https://www.dotnetconf.it&#34;&gt;Rome .NET
Conference 2024&lt;/a&gt; on March 22 and then, less than a
week later, at &lt;a href=&#34;https://www.webdayconf.it&#34;&gt;WebDay 2024&lt;/a&gt; in Milan.&lt;/p&gt;
&lt;p&gt;I am always particularly excited when I can present the stuff I&amp;rsquo;m currently
working on. Being forced to share as I learn encourages me to go deeper into the
topic to reinforce my comprehension and better explain it to the audience—a
win-win situation.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am speaking about OAuth2 and Open ID Connect with ASP.NET Core 8 at <a href="https://www.dotnetconf.it">Rome .NET
Conference 2024</a> on March 22 and then, less than a
week later, at <a href="https://www.webdayconf.it">WebDay 2024</a> in Milan.</p>
<p>I am always particularly excited when I can present the stuff I&rsquo;m currently
working on. Being forced to share as I learn encourages me to go deeper into the
topic to reinforce my comprehension and better explain it to the audience—a
win-win situation.</p>
<p>While the Rome conference is free, if you are considering <a href="https://www.webdayconf.it">WebDay in
Milan</a> (you should), feel free to use my speaker
coupon P-SPEAKER10 for a 20% discount.  If you come to any, don&rsquo;t be shy and
come to say Hi!</p>
<p><img loading="lazy" src="/images/dotnet-conference-rome-2024.jpeg"></p>
]]></content:encoded>
    </item>
    <item>
      <title>Video of my C# 12 session at .NET Conference Italia 2023</title>
      <link>https://nicolaiarocci.com/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/</link>
      <pubDate>Fri, 26 Jan 2024 15:39:31 +0100</pubDate>
      <guid>https://nicolaiarocci.com/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/</guid>
      <description>&lt;p&gt;The video and slides of my C# 12 session at .NET Conference Italia 2023 is
finally &lt;a href=&#34;https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante&#34;&gt;available
online&lt;/a&gt;.
Unfortunately it&amp;rsquo;s just my voice and my laptop screen, and that&amp;rsquo;s too bad
because the location was as cool as it can get, and the room was packed.&lt;/p&gt;
&lt;p&gt;It is in Italian&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and you need to login in order to see it (sorry, I
don&amp;rsquo;t have control over it.)&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I also submitted to several international conferences; let&amp;rsquo;s see what
happens. Since the COVID hiatus, I&amp;rsquo;ve had no luck with international events.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The video and slides of my C# 12 session at .NET Conference Italia 2023 is
finally <a href="https://www.ugidotnet.org/e/sessione/3295/C-12-Cosa-c-e-di-nuovo-e-interessante">available
online</a>.
Unfortunately it&rsquo;s just my voice and my laptop screen, and that&rsquo;s too bad
because the location was as cool as it can get, and the room was packed.</p>
<p>It is in Italian<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and you need to login in order to see it (sorry, I
don&rsquo;t have control over it.)</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I also submitted to several international conferences; let&rsquo;s see what
happens. Since the COVID hiatus, I&rsquo;ve had no luck with international events.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at the .NET Conference Italia 2023</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-the-dotnet-conference-italia-2023/</link>
      <pubDate>Thu, 23 Nov 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-the-dotnet-conference-italia-2023/</guid>
      <description>&lt;p&gt;In a few days, on Monday, December 4, at 10 a.m., I will present at the .NET Conference Italia 2023, which will be held
at the Microsoft House in Milan. My session is titled &amp;ldquo;C#12 What&amp;rsquo;s new and interesting&amp;rdquo; and is part of a &lt;a href=&#34;https://dotnetconference.it/e/3281/dotNET-Conference-Italia-2023&#34;&gt;rich agenda&lt;/a&gt;
focused on the recent release of .NET 8.&lt;/p&gt;
&lt;p&gt;I presented on the same subject at a &lt;a href=&#34;https://www.meetup.com/it-IT/devromagna/&#34;&gt;DevRomagna&lt;/a&gt; meetup a few months ago when C# 12 was in preview and still had
several moving parts. Now that the final release is out, it will be interesting to return to the topic to consolidate my
knowledge. I suspect that of the many reasons I challenge myself to speak publicly, enriching my knowledge is prevalent.
As the adage goes, for learning a subject, nothing beats explaining it in front of a knowledgeable audience.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In a few days, on Monday, December 4, at 10 a.m., I will present at the .NET Conference Italia 2023, which will be held
at the Microsoft House in Milan. My session is titled &ldquo;C#12 What&rsquo;s new and interesting&rdquo; and is part of a <a href="https://dotnetconference.it/e/3281/dotNET-Conference-Italia-2023">rich agenda</a>
focused on the recent release of .NET 8.</p>
<p>I presented on the same subject at a <a href="https://www.meetup.com/it-IT/devromagna/">DevRomagna</a> meetup a few months ago when C# 12 was in preview and still had
several moving parts. Now that the final release is out, it will be interesting to return to the topic to consolidate my
knowledge. I suspect that of the many reasons I challenge myself to speak publicly, enriching my knowledge is prevalent.
As the adage goes, for learning a subject, nothing beats explaining it in front of a knowledgeable audience.</p>
<p>If you will attend the conference (you should!), remember to meet me and say hi!</p>
<p><em>Update:</em> the session is now <a href="/video-of-my-csharp-12-session-at-dotnet-conference-italia-2023/">available online</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I am speaking at WebDay 2023</title>
      <link>https://nicolaiarocci.com/i-am-speaking-at-webday-2023/</link>
      <pubDate>Mon, 13 Mar 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/i-am-speaking-at-webday-2023/</guid>
      <description>&lt;p&gt;On Thursday, I will be speaking in Milan at &lt;a href=&#34;https://www.webdayconf.it/&#34;&gt;WebDay 2023&lt;/a&gt;. Mine is a hands-on session on building a reliable and
continuous end-to-end testing environment for web apps using Microsoft Playwright. If you attended my &lt;a href=&#34;https://nicolaiarocci.com/my-session-at-wpc-2022/&#34;&gt;introductory
Playwright session at WPC&lt;/a&gt; last year, Thursday&amp;rsquo;s session would be the ideal follow-up to that one, as I
only briefly touched on CI deployments there.&lt;/p&gt;
&lt;p&gt;Drawing from my experience doing the whole thing in production, I&amp;rsquo;ll essentially be live testing a Blazor app, then take
the entire thing to remote CI via GitHub Actions. In the process, I&amp;rsquo;ll show some of the issues we faced, share how we
solved them, and offer some practices we adopted.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On Thursday, I will be speaking in Milan at <a href="https://www.webdayconf.it/">WebDay 2023</a>. Mine is a hands-on session on building a reliable and
continuous end-to-end testing environment for web apps using Microsoft Playwright. If you attended my <a href="https://nicolaiarocci.com/my-session-at-wpc-2022/">introductory
Playwright session at WPC</a> last year, Thursday&rsquo;s session would be the ideal follow-up to that one, as I
only briefly touched on CI deployments there.</p>
<p>Drawing from my experience doing the whole thing in production, I&rsquo;ll essentially be live testing a Blazor app, then take
the entire thing to remote CI via GitHub Actions. In the process, I&rsquo;ll show some of the issues we faced, share how we
solved them, and offer some practices we adopted.</p>
<p>WebDay 2023 will be a hybrid event, with over 380 in-person attendees and almost 1300 registered for live streaming.
After the exhilarating experience of being back on an actual stage at WPC a few months ago, I&rsquo;m excited to speak once
again in front of a real crowd.</p>
]]></content:encoded>
    </item>
    <item>
      <title>On the state of developer conferences</title>
      <link>https://nicolaiarocci.com/on-the-state-of-developer-conferences/</link>
      <pubDate>Thu, 23 Feb 2023 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/on-the-state-of-developer-conferences/</guid>
      <description>&lt;p&gt;Brian Rinaldi has an insightful post on &lt;a href=&#34;https://remotesynthesis.com/blog/developer-conferences/&#34;&gt;his blog&lt;/a&gt; about the current state of
developer conferences, where &amp;lsquo;current state&amp;rsquo; means post-COVID pandemic. Brian
is well-positioned to reason about this space as a long-time conference
organizer. I appreciate that he also takes the time to explain how the
developer conference business works. The core of his blog is about
post-pandemic conference attendance, which has plunged.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;independent, in-person developer conferences are hurting. Based on my own
observation as well as talks with organizers and sponsors that I have come to
know over the years, the average independent in-person event is still down
30-40% from pre-pandemic attendance levels. And often it seems to require
massive discounts or even giveaways to get to this level.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Brian Rinaldi has an insightful post on <a href="https://remotesynthesis.com/blog/developer-conferences/">his blog</a> about the current state of
developer conferences, where &lsquo;current state&rsquo; means post-COVID pandemic. Brian
is well-positioned to reason about this space as a long-time conference
organizer. I appreciate that he also takes the time to explain how the
developer conference business works. The core of his blog is about
post-pandemic conference attendance, which has plunged.</p>
<blockquote>
<p>independent, in-person developer conferences are hurting. Based on my own
observation as well as talks with organizers and sponsors that I have come to
know over the years, the average independent in-person event is still down
30-40% from pre-pandemic attendance levels. And often it seems to require
massive discounts or even giveaways to get to this level.</p></blockquote>
<p>And he offers an interesting theory on why that is:</p>
<blockquote>
<p>My hypothesis is that we’ve bifurcated the audience somewhat. The folks that
were there almost exclusively for the content have decided that they can do
so more cheaply and efficiently online via virtual conferences or recordings.
The folks that went for the networking as a primary driver, on the other
hand, are largely eschewing online events as not fulfilling their needs.
[&hellip;] So ultimately what we are left with is a lower in-person audience and a
lower virtual audience.</p></blockquote>
<p>As a conference speaker and meetup organizer, I noticed that online events saw
low attendance during the pandemic, and they still do today. When available,
recordings partially compensate, but only in audience terms. The problem is
online events are not conferences. &lsquo;Conference&rsquo; originates from the late Latin
&ldquo;conferentia,&rdquo; itself a derivative of &ldquo;conferre,&rdquo; a synonym for the collation
of &ldquo;bring together&rdquo;<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. A conference is a meeting to discuss some topics. The
get-together element is missing in online events, and networking is next to
impossible (live chats and &lsquo;virtual after-parties&rsquo; are just poor palliatives.)
In my book, hybrid events are even worse, as live streaming and recordings
discourage live attendance (at the <a href="https://www.meetup.com/it-IT/DevRomagna">DevRomagna meetups</a>, we often get asked
if live streaming or recordings will be available, and the answer is no -
either we do live streaming - and we sometimes do - or we do an in-person
event, but never a mix of the two.)</p>
<p>Going back to Brian&rsquo;s musings, I think I subscribe to them. I am not sure
attendance will ever get back to old numbers. I am afraid a good portion of
those who were regulars became disaffected, and gaining their attention back is
a hard gamble. YouTube and Twitch, I think, are phenomenal competitors, and the
pandemic hiatus threw a ton of fresh new viewers at them.</p>
<p>PS: Coincidentally, we&rsquo;re running an in-person meetup at DevRomagna <a href="https://nicolaiarocci.com/heading-to-go-a-look-at-building-a-video-encoder-meetup/">today</a>.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>According to <a href="https://www.treccani.it/vocabolario/ricerca/conferenza/">Treccani</a>
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[m]: <a href="https://fosstodon.org/@nicola">https://fosstodon.org/@nicola</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My session at WPC 2022</title>
      <link>https://nicolaiarocci.com/my-session-at-wpc-2022/</link>
      <pubDate>Wed, 19 Oct 2022 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-session-at-wpc-2022/</guid>
      <description>&lt;p&gt;Yesterday I was at &lt;a href=&#34;https://www.wpc2022.it/&#34;&gt;WPC 2022&lt;/a&gt;, &amp;ldquo;the most important Italian conference on
Microsoft technologies&amp;rdquo;, where I presented a one-hour session titled &amp;ldquo;Reliable
end-to-end testing for modern web apps with Microsoft Playwright.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Attendance was great and there was a lot of excitement up in the air; it was
evident that people were happy to meet and interact in person again. After the
forced two years hiatus, it was great to be back at a big on-site conference,
let alone speak at it. I delivered my talk to a packed-full room of nodding,
smiling and questioning attendees, which felt fantastic.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I was at <a href="https://www.wpc2022.it/">WPC 2022</a>, &ldquo;the most important Italian conference on
Microsoft technologies&rdquo;, where I presented a one-hour session titled &ldquo;Reliable
end-to-end testing for modern web apps with Microsoft Playwright.&rdquo;</p>
<p>Attendance was great and there was a lot of excitement up in the air; it was
evident that people were happy to meet and interact in person again. After the
forced two years hiatus, it was great to be back at a big on-site conference,
let alone speak at it. I delivered my talk to a packed-full room of nodding,
smiling and questioning attendees, which felt fantastic.</p>
<p><img loading="lazy" src="/images/wpc2022-1.jpg"></p>
<p>I think I&rsquo;m satisfied with my delivery, although I managed to screw up a few
things, most notably showing my Twitter password live (that was a funny
moment)<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I also forgot to mention a couple of things.</p>
<ul>
<li>I demoed CLI usage on Bash, but the kind people working on Playwright also
provide full Powershell support; the website defaults to Powershell for their
demo scripts;</li>
<li>I never mentioned the obvious: as you&rsquo;re testing your front-end application
with Playwright, you&rsquo;re actually performing a complete end-to-end test
involving your backend. There is great value in end-to-end testing. Several
times we caught subtle things that weren&rsquo;t a direct front-end issue but more
the result of the interaction with the backend. And yes (thanks to the guy who
asked), your testing environment must support the whole stack.</li>
</ul>
<p>The slide deck contains most of the code and bash commands I demoed live on
stage. It&rsquo;s nothing too original; I reproduced the examples on the official
website with a few variations and additions.






<div id="adobe-dc-view" style="border:0; display:block;padding: 0.6em 0;position:relative;left:50%;transform:translateX(-50%);height: 450px; width: 800px;"></div>
<script src="https://documentcloud.adobe.com/view-sdk/viewer.js"></script>
<script type="text/javascript">
	document.addEventListener("adobe_dc_view_sdk.ready", function(){ 
		var adobeDCView = new AdobeDC.View({clientId: "", divId: "adobe-dc-view"});
		adobeDCView.previewFile({
                content:{location: {url: "https://nicolaiarocci.com/pdf\/reliable-end-to-end-testing-of-modern-web-apps-with-microsoft-playwright.pdf"}},
			metaData:{fileName: "reliable-end-to-end-testing-of-modern-web-apps-with-microsoft-playwright.pdf"}
		}, {embedMode: "SIZED_CONTAINER", showDownloadPDF: false, showPrintPDF: false});
	});
</script>
</p>
<p>I had fun performing again in front of a real, live crowd. Perhaps the induced
break, unexpected and undesirable for many reasons, did me good.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Having two-factor authentication up made it all less stressful.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>My Playwright session at WebDay 2022</title>
      <link>https://nicolaiarocci.com/my-playwright-session-at-webday-2022/</link>
      <pubDate>Fri, 01 Apr 2022 06:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/my-playwright-session-at-webday-2022/</guid>
      <description>&lt;p&gt;If you understand Italian, the recording of my Playwright session at
UGIdotNET&amp;rsquo;s &lt;a href=&#34;https://www.ugidotnet.org/e/2840/Web-Day-2022&#34;&gt;WebDay 2022&lt;/a&gt; is now available on YouTube&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. Playwright is
a phenomenal cross-browser, cross-platform, cross-language, single-API,
mobile-friendly front-end testing tool.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m looking forward to giving the same session in English sooner or later, but
I should first win my laziness and start looking for exciting events with open
CFPs. If you happen to know one, please let me know.&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; allowfullscreen=&#34;allowfullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/BaY9WIHUwFc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;
    &lt;/div&gt;

&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A couple weeks later I also presented at &lt;a href=&#34;https://www.meetup.com/it-IT/DevRomagna/events/284626987/&#34;&gt;DevRomagna&lt;/a&gt;, the local meetup I run.
[rss]: &lt;a href=&#34;https://nicolaiarocci.com/index.xml&#34;&gt;https://nicolaiarocci.com/index.xml&lt;/a&gt;
[tw]: &lt;a href=&#34;http://twitter.com/nicolaiarocci&#34;&gt;http://twitter.com/nicolaiarocci&lt;/a&gt;
[nl]: &lt;a href=&#34;https://buttondown.email/nicolaiarocci&#34;&gt;https://buttondown.email/nicolaiarocci&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If you understand Italian, the recording of my Playwright session at
UGIdotNET&rsquo;s <a href="https://www.ugidotnet.org/e/2840/Web-Day-2022">WebDay 2022</a> is now available on YouTube<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. Playwright is
a phenomenal cross-browser, cross-platform, cross-language, single-API,
mobile-friendly front-end testing tool.</p>
<p>I&rsquo;m looking forward to giving the same session in English sooner or later, but
I should first win my laziness and start looking for exciting events with open
CFPs. If you happen to know one, please let me know.</p>
<div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="allowfullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/BaY9WIHUwFc?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>A couple weeks later I also presented at <a href="https://www.meetup.com/it-IT/DevRomagna/events/284626987/">DevRomagna</a>, the local meetup I run.
[rss]: <a href="https://nicolaiarocci.com/index.xml">https://nicolaiarocci.com/index.xml</a>
[tw]: <a href="http://twitter.com/nicolaiarocci">http://twitter.com/nicolaiarocci</a>
[nl]: <a href="https://buttondown.email/nicolaiarocci">https://buttondown.email/nicolaiarocci</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Seven years ago at FOSDEM</title>
      <link>https://nicolaiarocci.com/seven-years-ago-at-fosdem/</link>
      <pubDate>Mon, 15 Feb 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/seven-years-ago-at-fosdem/</guid>
      <description>&lt;p&gt;About seven years ago, I presented the Eve Framework in a very crowded Python
room at FOSDEM 2014 in Brussels. If you don&amp;rsquo;t know about FOSDEM, well, you
should check it out. Every year thousands of developers who recognize
themselves with the free and open-source movement gather in Brussels from all
over the world. And I mean thousands of them. According to Wikipedia, since
2011, the meeting hosts about 4,000 visitors every year. It&amp;rsquo;s huge, and it&amp;rsquo;s
a one of its kind.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>About seven years ago, I presented the Eve Framework in a very crowded Python
room at FOSDEM 2014 in Brussels. If you don&rsquo;t know about FOSDEM, well, you
should check it out. Every year thousands of developers who recognize
themselves with the free and open-source movement gather in Brussels from all
over the world. And I mean thousands of them. According to Wikipedia, since
2011, the meeting hosts about 4,000 visitors every year. It&rsquo;s huge, and it&rsquo;s
a one of its kind.</p>
<p>In 2021, FOSDEM was held online. I already <a href="/upcoming-speaking-engagements-with-ramblings/">mentioned</a> how I miss live events. In
that post, I also wrote:</p>
<blockquote>
<p>Any conference junkie will tell you that she/he attends for the people first,
and only then for the sessions themselves. At these events, the most exciting
stuff happens in the corridors, usually during breaks.</p></blockquote>
<p>At that FOSDEM seven years ago, I experienced one of those corridor moments. It
did not really happen in a corridor, however.</p>
<p>I was at the Delirium Cafe one night, with my good friend (and exceptionally
skilled Pythonista) <a href="https://www.amazon.com/Alessandro-Molina/e/B07F8CTSHW?ref_=dbs_p_ebk_r00_abau_000000">Alessandro Molina</a> at my side. Many other conference
attendees were there, and we were all having fun doing what nerds do when they
gather for a night in the pub. We were sitting at this big round table, me,
Alessandro, and three other guys I did not know yet. We all started chatting,
enjoying ourselves over a few rounds of tasty Belgian beer. In front of me was
sitting this friendly, obviously brilliant (if a little shy) guy from
Switzerland. At some point, I don&rsquo;t remember why, we were talking about PyPy,
and getting technical about it. This guy was giving me a rundown on the
ins-and-outs of PyPy, and well, I was surprised at how profound his knowledge
was. In passing, I said that Alessandro and I knew one guy from the core team,
Antonio Cuni. Then I mentioned the original author of the project, Armin Rigo,
I think complimenting him on that significant achievement. The guy in front of
me nodded and then smiled at me. And then came this weird, jarring moment of
silence. That&rsquo;s when my friend Alessandro nudged me and whispered, &ldquo;Hey man,
that&rsquo;s Armin Rigo sitting there. Right in front of you.&rdquo; We all had a good
laugh. The next round was on me.</p>
<p>It&rsquo;s small moments like these that make attending (and presenting at)
conferences worth it.</p>
<p>PS. I had all the hints—the brilliant guy from Switzerland who knows PyPy like
the back of his hand. Someone wasn&rsquo;t so smart on that night.</p>
<figure>
    <img loading="lazy" src="/images/fosdem2014_python_room.jpg"
         alt="The Python room at FOSDEM 2014"/> <figcaption>
            <p><em>The Python room at FOSDEM 2014</em></p>
        </figcaption>
</figure>

<figure>
    <img loading="lazy" src="/images/fosdem2014.jpg"
         alt="With Alessandrio at FOSDEM 2014"/> <figcaption>
            <p><em>With Alessandro at FOSDEM 2014</em></p>
        </figcaption>
</figure>

]]></content:encoded>
    </item>
    <item>
      <title>Upcoming speaking engagements, with ramblings</title>
      <link>https://nicolaiarocci.com/upcoming-speaking-engagements-with-ramblings/</link>
      <pubDate>Fri, 29 Jan 2021 07:05:25 +0100</pubDate>
      <guid>https://nicolaiarocci.com/upcoming-speaking-engagements-with-ramblings/</guid>
      <description>&lt;p&gt;I am presenting at two different events in February next month. Given the
current COVID situation, that is entirely unexpected. In 2020 I only gave &lt;a href=&#34;https://nicolaiarocci.com/speaking&#34;&gt;four
talks&lt;/a&gt;, three of which were virtual. I am not holding my breath for 2021.
Conferences are going virtual all year-long. Next year too, most likely.&lt;/p&gt;
&lt;p&gt;There are some clear advantages in going virtual, but the final result is a net
negative. Any conference junkie will tell you that she/he attends for the
people first, and only then for the sessions themselves. At these events, the
most exciting stuff happens in the corridors, usually during breaks. A little
story here. You might know that I run a motorcycle club. Well, the very idea of
founding it was actually ignited by a corridor chat, few minutes after
I delivered a session. Replicating this kind of in-person interaction online
is, well, next to impossible.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I am presenting at two different events in February next month. Given the
current COVID situation, that is entirely unexpected. In 2020 I only gave <a href="/speaking">four
talks</a>, three of which were virtual. I am not holding my breath for 2021.
Conferences are going virtual all year-long. Next year too, most likely.</p>
<p>There are some clear advantages in going virtual, but the final result is a net
negative. Any conference junkie will tell you that she/he attends for the
people first, and only then for the sessions themselves. At these events, the
most exciting stuff happens in the corridors, usually during breaks. A little
story here. You might know that I run a motorcycle club. Well, the very idea of
founding it was actually ignited by a corridor chat, few minutes after
I delivered a session. Replicating this kind of in-person interaction online
is, well, next to impossible.</p>
<p>As a speaker, I miss presenting live. A simple glance at the audience helps me
assess how&rsquo;s going and eventually adjust my talk direction. The Q&amp;A session at
the end? That is often a matter of eye contact and body language. Not to
mention the &ldquo;offline session&rdquo; that follows if your presentation had any degree
of success. With online delivery, that&rsquo;s all lost.</p>
<p>Also, I suspect not many online attendees actually pay due attention, not
compared to the same session presented in-person.  I know that&rsquo;s true for me.
When I&rsquo;m comfortably sitting at my desk, too many things compete for my
attention. Every possible distraction is just one click away. And then there&rsquo;s
the family. And my cat, of course.</p>
<p>Speaking of attendance, I would not be surprised to find that many people who
sign up for the event won&rsquo;t actually show up. Again, I know because it
happens to me all the time.  The commitment I have to put in for attending an
in-person conference is much higher, making it more likely that I will actually
participate.</p>
<p>Organizers, on the other hand, are incredible. They do a fantastic job in
attempting to provide an experience as close as possible to the real one. They
are the true heroes of this kind of event. They always have been, even more so
now that we&rsquo;re forced to go virtual. Remember to always have a word of
gratitude for your fellow organizer. She/he deserves that.</p>
<p>Alright, enough with the rambling. Here&rsquo;s where I&rsquo;m presenting next month:</p>
<ul>
<li><strong>Python REST APIs for Humans</strong> at <a href="https://codegen2021.azurewebsites.net/">CloudGen 2021</a></li>
<li><strong>Introduction to F# and functional languages</strong> at <a href="https://scottishsummit.com/">Scottish Summit 2021</a></li>
</ul>
<p>One significant advantage of virtual conferences is that anybody can take part
no matter where she/he lives on the planet. So, maybe you will fancy join us?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una mattinata con MongoDB</title>
      <link>https://nicolaiarocci.com/una-mattinata-con-mongodb/</link>
      <pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/una-mattinata-con-mongodb/</guid>
      <description>&lt;p&gt;Il prossimo 24 ottobre sarò a Milano per &lt;!-- raw HTML omitted --&gt;A Morning with MongoDB&lt;!-- raw HTML omitted --&gt;, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e &lt;!-- raw HTML omitted --&gt;registrazione&lt;!-- raw HTML omitted --&gt; sono gratuite: cosa aspettate?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il prossimo 24 ottobre sarò a Milano per <!-- raw HTML omitted -->A Morning with MongoDB<!-- raw HTML omitted -->, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e <!-- raw HTML omitted -->registrazione<!-- raw HTML omitted --> sono gratuite: cosa aspettate?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sviluppare una RESTful Web API con Python, Flask e MongoDB</title>
      <link>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</link>
      <pubDate>Mon, 09 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;La scorsa settimana a &lt;!-- raw HTML omitted --&gt;EuroPython 2012&lt;!-- raw HTML omitted --&gt; ho tenuto un talk intitolato &lt;!-- raw HTML omitted --&gt;Sviluppare una RESTful Web API con Python, Flask e MongoDB&lt;!-- raw HTML omitted --&gt;. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).&lt;/p&gt;
&lt;p&gt;Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->La scorsa settimana a <!-- raw HTML omitted -->EuroPython 2012<!-- raw HTML omitted --> ho tenuto un talk intitolato <!-- raw HTML omitted -->Sviluppare una RESTful Web API con Python, Flask e MongoDB<!-- raw HTML omitted -->. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).</p>
<p>Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.</p>
<p>Per quanto riguarda le registrazioni video potete andare su YouTube o sulla pagina ufficiale di EuroPython (<!-- raw HTML omitted -->english track<!-- raw HTML omitted --> e <!-- raw HTML omitted -->italian track<!-- raw HTML omitted -->). Ammetto di essere più soddisfatto della versione inglese nella quale – complice anche l’esperienza italiana del giorno prima – credo di essere stato più sintetico ed efficace. Qui mi limito a proporvi le slide:</p>
<h2 id="ringraziamenti">Ringraziamenti</h2>
<p>Un immenso grazie ai ragazzi dello staff di EuroPython che veramente hanno fatto di tutto per rendere questa manifestazione un evento straordinario – e ci sono riusciti  (una settimana di talk su cinque tracce parallele, sprint, hands-on, corsi, cibo di ottima qualità e credo oltre 800 partecipanti).</p>
<p>Vi racconto un episodio giusto per darvi l’idea di quanto questi ragazzi, tutti volontari, si diano da fare e ci mettano passione vera. Nella sessione italiana ho ‘sforato’ (capita anche ai migliori, mi dicono!) e così mi son trovato a sorvolare su un certo numero di slide. Ebbene il mio talk manager e il suo assistente mi hanno proposto di loro iniziativa di tenere una sessione pomeridiana straordinaria per consentirmi di portare a termine la mia relazione. Non capita tutti i giorni, credetemi. Per mia fortuna gran parte delle persone che avevano assistito alla sessione mattutina sono poi tornate per quella del pomeriggio, altrimenti sai che figura!</p>
<p>Se siete pythonisti o vorreste diventarlo non perdetevi la prossima edizione di questo evento internazionale che, con tutta probabilità, si terrà di nuovo a Firenze l’anno prossimo.</p>]]></content:encoded>
    </item>
    <item>
      <title>Offline / Online: superare la crisi anche grazie alla rete</title>
      <link>https://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/</link>
      <pubDate>Mon, 23 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/offline-online-superare-la-crisi-anche-grazie-alla-rete/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;La scorsa settimana ho partecipato come relatore alla prima edizione del &lt;!-- raw HTML omitted --&gt;Ravenna CNA Barcamp&lt;!-- raw HTML omitted --&gt; sulla cultura d’impresa 2.0. &lt;!-- raw HTML omitted --&gt;Offline / Online&lt;!-- raw HTML omitted --&gt; è il racconto di una esperienza vissuta sul campo; un case study su come il mercato del software si è evoluto nel corso degli anni passando dalla classica filiera lunga sul territorio, tipica degli anni ’90 e della prima metà dei 2000, alla vendita online dei giorni nostri. La crisi economica degli ultimi anni si è innestata in un processo evolutivo già in atto e inarrestabile, perlomeno per quanto riguarda il nostro settore:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->La scorsa settimana ho partecipato come relatore alla prima edizione del <!-- raw HTML omitted -->Ravenna CNA Barcamp<!-- raw HTML omitted --> sulla cultura d’impresa 2.0. <!-- raw HTML omitted -->Offline / Online<!-- raw HTML omitted --> è il racconto di una esperienza vissuta sul campo; un case study su come il mercato del software si è evoluto nel corso degli anni passando dalla classica filiera lunga sul territorio, tipica degli anni ’90 e della prima metà dei 2000, alla vendita online dei giorni nostri. La crisi economica degli ultimi anni si è innestata in un processo evolutivo già in atto e inarrestabile, perlomeno per quanto riguarda il nostro settore:</p>
<p>Non sono molto soddisfatto della mia relazione: troppo da dire nel poco tempo a disposizione. Mi auguro di aver comunicato bene almeno un paio di cose:</p>
<ul>
<li>Ciò che oggi funziona alla grande domani potrebbe non funzionare affatto. Siate pronti a rimettere in discussione voi stessi e il vostro modello di business in qualunque momento.</li>
<li>Non fatevi ingannare dai fatturati milionari sbandierati ovunque ai quattro venti. Ciò che conta davvero è quel che vi rimane in tasca.</li>
</ul>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Per una città come Ravenna questo BarCamp è una novità benvenuta e necessaria, come dimostrano gli stessi numeri ottenuti: 170 presenze in sala, 400 spettatori collegati alla diretta streaming, 26 relatori. Complimenti alla CNA per averci creduto accettando una sfida dai risultati non scontati. Grazie di cuore e complimenti vivissimi a <!-- raw HTML omitted -->Lidia Marongiu<!-- raw HTML omitted -->, che ha organizzato e diretto l’evento con tenacia e grande professionalità.</p>]]></content:encoded>
    </item>
    <item>
      <title>Speaker a EuroPython 2012</title>
      <link>https://nicolaiarocci.com/speaker-a-europython-2012/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/speaker-a-europython-2012/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Date un’occhiata al &lt;!-- raw HTML omitted --&gt;sito ufficiale&lt;!-- raw HTML omitted --&gt; per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta &lt;em&gt;early bird&lt;/em&gt; per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.</p>
<!-- raw HTML omitted -->
<p>Date un’occhiata al <!-- raw HTML omitted -->sito ufficiale<!-- raw HTML omitted --> per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta <em>early bird</em> per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
