<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>queil.net</title>
    <link>https://queil.net/</link>
    <description>Recent content on queil.net</description>
    <generator>Hugo</generator>
    <language>en-uk</language>
    <lastBuildDate>Fri, 09 Oct 2026 13:15:21 +0200</lastBuildDate>
    <atom:link href="https://queil.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Weir: language impossible</title>
      <link>https://queil.net/2026/10/weir/</link>
      <pubDate>Fri, 09 Oct 2026 13:15:21 +0200</pubDate>
      <guid>https://queil.net/2026/10/weir/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; I&amp;rsquo;ve been making an experimental language: &lt;a href=&#34;https://weir.sh&#34;&gt;weir&lt;/a&gt;. Why? I wanted a fast, typed, functional, cross-platform shell scripting language.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;what-is-weir&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#what-is-weir&#34;&gt;What is weir?&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Weir is an interpreted, statically-typed functional language with syntax heavily inspired by F# but with the ergonomics of a shell language (see it in the &lt;a href=&#34;https://weir.sh/showcase/&#34;&gt;showcase&lt;/a&gt;). Its main goal is scripting, but it also has a decent interactive mode. Weir is shipped as a single native binary (no runtime to install; on Linux it only needs glibc). It is available on all major platforms. The binary houses the runtime, the checker, the interactive REPL, the canonical formatter, and the LSP server. Additionally, there are &lt;a href=&#34;https://weir.sh/docs/editors/&#34;&gt;integrations&lt;/a&gt; available for a few editors. &lt;a href=&#34;https://weir.sh&#34;&gt;Try it out&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Evaluate Nu for Scripting: can it beat F#?</title>
      <link>https://queil.net/2025/02/evaluate-nu-for-scripting/</link>
      <pubDate>Sun, 16 Feb 2025 12:26:30 +0000</pubDate>
      <guid>https://queil.net/2025/02/evaluate-nu-for-scripting/</guid>
      <description>&lt;p&gt;TLDR: No, nushell as a scripting language is not strict enough for a functional programming zealot. It seems I am not&#xA;the only one waiting for improvements: &lt;a href=&#34;https://github.com/nushell/nushell/issues/11108&#34;&gt;https://github.com/nushell/nushell/issues/11108&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-context&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#the-context&#34;&gt;The context&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I am far from the mainstream on my scripting habits. I&amp;rsquo;ve been using F# as a language of choice with a number of custom-built tools to improve the experience. It&amp;rsquo;s mostly ok but recently Nushell got my attention. Not really as a shell but as a scripting language. One can sense a strong Rust influence which is no surprise given the shell itself is indeed written in it. I wanted to determine if it could solve my pain points with F# and what the trade-offs would be.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hot-reloading with busybox httpd</title>
      <link>https://queil.net/2023/01/hot-reloading-with-busybox-httpd/</link>
      <pubDate>Thu, 19 Jan 2023 14:32:16 +0000</pubDate>
      <guid>https://queil.net/2023/01/hot-reloading-with-busybox-httpd/</guid>
      <description>&lt;h2 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been recently working on a simple static website&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;. I quickly noticed previewing it by browsing &lt;code&gt;index.html&lt;/code&gt; is far from perfect.&#xA;I needed a local server to host it. Ubuntu comes with &lt;a href=&#34;https://openwrt.org/docs/guide-user/services/webserver/http.httpd&#34;&gt;busybox httpd&lt;/a&gt; by default so I decided to give it a go.&lt;/p&gt;&#xA;&lt;p&gt;The server can host files form the current dir (&lt;code&gt;-f&lt;/code&gt; makes it run in foreground rather than as a daemon):&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busybox httpd -f -p &lt;span class=&#34;m&#34;&gt;8090&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It worked great until I got tired with hitting &lt;code&gt;F5&lt;/code&gt; to reload the page. I needed hot-reloading.&lt;/p&gt;</description>
    </item>
    <item>
      <title>F# - an introduction for my colleagues</title>
      <link>https://queil.net/2022/12/fsharp-an-introduction-for-my-colleagues/</link>
      <pubDate>Wed, 14 Dec 2022 03:20:00 +0000</pubDate>
      <guid>https://queil.net/2022/12/fsharp-an-introduction-for-my-colleagues/</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was originally published on the &lt;a href=&#34;https://www.accounttechnologies.com/blog/f-an-introduction-for-my-colleagues&#34;&gt;Account Technologies Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;motivation&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#motivation&#34;&gt;Motivation&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Having used quite a few programming languages in numerous projects(C#, Powershell, TypeScript, Groovy, and others), my favourite so far is F#. In this article, I want to present to you the unique traits of F# as a pragmatic functional-first language. Hopefully, this article is a mild and concise introduction to F# for people using other languages.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;what-is-f&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#what-is-f&#34;&gt;What is F#&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;F# is a pragmatic general-purpose programming language. Its core design goals were:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Get IServiceCollection From Host Builder in .NET 6</title>
      <link>https://queil.net/2022/06/get-iservicecollection-from-host-builder/</link>
      <pubDate>Wed, 08 Jun 2022 08:35:29 +0100</pubDate>
      <guid>https://queil.net/2022/06/get-iservicecollection-from-host-builder/</guid>
      <description>&lt;h2 id=&#34;problem&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#problem&#34;&gt;Problem&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Neither .NET generic host&amp;rsquo;s &lt;code&gt;HostBuilder&lt;/code&gt; nor &lt;code&gt;IHost&lt;/code&gt; exposes &lt;code&gt;IServiceCollection&lt;/code&gt;. You can resolve services via the &lt;code&gt;IHost.Services&lt;/code&gt; property but there is no obvious way of accessing dependency registration metadata.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;solution&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#solution&#34;&gt;Solution&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;It can be done using a custom service provider factory:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ExposeServiceCollectionFactory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IServiceProviderFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IServiceCollection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DefaultServiceProviderFactory&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_defaultFactory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DefaultServiceProviderFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IServiceCollection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;?&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ServiceCollection&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IServiceCollection&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CreateBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IServiceCollection&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;n&#34;&gt;ServiceCollection&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_defaultFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CreateBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IServiceProvider&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;CreateServiceProvider&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IServiceCollection&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;containerBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_defaultFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CreateServiceProvider&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;containerBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then the factory can be used as follows:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;builder&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;HostBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;factory&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ExposeServiceCollectionFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UseServiceProviderFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// your configuration here&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;services&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;factory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ServiceCollection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;WriteLine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;$&amp;#34;Got {services.Count} services here&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h2 id=&#34;why-would-you-need-that&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#why-would-you-need-that&#34;&gt;Why would you need that&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Usually you wouldn&amp;rsquo;t. It may come handy when you have a library consuming an &lt;code&gt;IServiceCollection&lt;/code&gt; but you&#xA;have lots of extensions methods for &lt;code&gt;IHostBuilder&lt;/code&gt; rather than &lt;code&gt;IServiceCollection&lt;/code&gt;. This way you can&#xA;reuse your extension methods and pass the resulting &lt;code&gt;IServiceCollection&lt;/code&gt; to the library.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gmox Grpc Mock Server</title>
      <link>https://queil.net/2021/12/gmox-grpc-mock-server/</link>
      <pubDate>Sun, 26 Dec 2021 13:06:58 +0000</pubDate>
      <guid>https://queil.net/2021/12/gmox-grpc-mock-server/</guid>
      <description>&lt;p&gt;TLDR: I created &lt;a href=&#34;https://github.com/queil/gmox&#34;&gt;Gmox&lt;/a&gt; - a .NET-friendly gRPC mock server.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;what-is-gmox&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#what-is-gmox&#34;&gt;What is Gmox&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;It is a gRPC mock server similar to &lt;a href=&#34;https://github.com/tokopedia/gripmock&#34;&gt;grip-mock&lt;/a&gt; but written in F# and distributed as a dotnet cli tool and a dotnet template.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;why-create-one-if-other-implementations-already-exist&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#why-create-one-if-other-implementations-already-exist&#34;&gt;Why create one if other implementations already exist&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I wanted to create something easy to use for (my fellow- and all other) .NET developers.&lt;/p&gt;&#xA;&lt;p&gt;I had the following scenarios in mind:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Development - enable developers to quickly spin up a mock server instance from local proto files.&lt;/li&gt;&#xA;&lt;li&gt;Testing - enable testers to deploy a mock server as a part of a test scenario and control it during a test run.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Also I had the following requirements:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dependency Trees With Fable and Sutil</title>
      <link>https://queil.net/2021/12/dependency-trees-with-fable-and-sutil/</link>
      <pubDate>Sat, 04 Dec 2021 15:04:33 +0000</pubDate>
      <guid>https://queil.net/2021/12/dependency-trees-with-fable-and-sutil/</guid>
      <description>&lt;h1 id=&#34;motivation&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#motivation&#34;&gt;Motivation&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;One of my colleagues has recently mentioned they can hardly follow the dependency tree of YAML-configured systems like &lt;a href=&#34;https://kustomize.io/&#34;&gt;kustomize&lt;/a&gt; or &lt;a href=&#34;https://docs.gitlab.com/ee/ci/&#34;&gt;GitLab CI&lt;/a&gt;. Both mentioned technologies enable configuration reuse via&#xA;composition and inheritance. Obviously the reuse comes with an increased complexity which may be overwhelming for a newcomer. To lower the learning curve I wanted to create a tool that would allow an ad-hoc tree traversal and visualisation. I am excited as it requires reaching beyond my comfort zone. Straight to the realm of front-end.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embedding F# Compiler: Fsc-Host NuGet</title>
      <link>https://queil.net/2021/10/embedding-fsharp-compiler-fsc-host-nuget/</link>
      <pubDate>Sat, 16 Oct 2021 12:12:10 +0100</pubDate>
      <guid>https://queil.net/2021/10/embedding-fsharp-compiler-fsc-host-nuget/</guid>
      <description>&lt;p&gt;I have created a NuGet package that lets you easily use F# scripting in your apps.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;NuGet: &lt;a href=&#34;https://www.nuget.org/packages/Queil.FSharp.FscHost&#34;&gt;https://www.nuget.org/packages/Queil.FSharp.FscHost&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Source: &lt;a href=&#34;https://github.com/queil/fsc-host&#34;&gt;https://github.com/queil/fsc-host&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 id=&#34;what-is-this-all-about&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#what-is-this-all-about&#34;&gt;What is this all about?&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In two previous posts (&lt;a href=&#34;https://queil.net/2021/05/embedding-fsharp-compiler/&#34;&gt;1&lt;/a&gt;, &lt;a href=&#34;https://queil.net/2021/06/embedding-fsharp-compiler-nuget-references/&#34;&gt;2&lt;/a&gt;) I showed you how to host the F# compiler in your own applications.&#xA;This time I wanted to reveal the result of those experiments.&#xA;I wanted to enable F# scripting in a few of my apps. This requirement made me create the &lt;a href=&#34;https://github.com/queil/fsc-host&#34;&gt;Fsc Host&lt;/a&gt; project. The goal was to create a light-weight reusable abstraction over &lt;code&gt;FSharp.Compiler.Service&lt;/code&gt; focused on compiling scripts and consuming them by the hosting application. The NuGet package is &lt;a href=&#34;https://www.nuget.org/packages/Queil.FSharp.FscHost&#34;&gt;available here&lt;/a&gt;. The project is still in the experimental phase (version 0) so the API and available features may change, (and the changes may be breaking so bear that in mind before using it in your projects).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embedding F# Compiler: NuGet References</title>
      <link>https://queil.net/2021/06/embedding-fsharp-compiler-nuget-references/</link>
      <pubDate>Fri, 04 Jun 2021 08:52:26 +0100</pubDate>
      <guid>https://queil.net/2021/06/embedding-fsharp-compiler-nuget-references/</guid>
      <description>&lt;p&gt;UPDATE: If you are looking for a ready to use solution please check out my &lt;a href=&#34;https://github.com/queil/fsc-host&#34;&gt;fsc-host&lt;/a&gt; NuGet package. Also I wrote a &lt;a href=&#34;https://queil.net/2021/10/embedding-fsharp-compiler-fsc-host-nuget/&#34;&gt;blog post&lt;/a&gt; about it.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://queil.net/2021/05/embedding-fsharp-compiler/&#34;&gt;previous post&lt;/a&gt; I showed how to extend an F# application with scripting capabilities. This time I want to extend the previous example with the &lt;a href=&#34;https://docs.microsoft.com/en-us/dotnet/fsharp/tools/fsharp-interactive/#referencing-packages-in-f-interactive&#34;&gt;#r directive&lt;/a&gt; support and resolving NuGet dependencies.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;how-to&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#how-to&#34;&gt;How to&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;On high level we need to extract NuGet packages information from the script and pass it to the compiler as additional arguments. Before compiling we also need to dynamically load the referenced dlls to the host application. I first took the naive approach of parsing and extracting the directives from AST and feeding them into &lt;code&gt;FSharpDependencyManager&lt;/code&gt;. It worked to an extent. Luckily, &lt;code&gt;FsChecker&lt;/code&gt; comes with a built-in solution. We can use &lt;code&gt;GetProjectOptionsFromScript&lt;/code&gt; and subsequently &lt;code&gt;ParseAndCheckProject&lt;/code&gt; methods. That way we can retrieve &lt;code&gt;DependencyFiles&lt;/code&gt; and extract resolved dlls&amp;rsquo; paths.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Embedding F# Compiler</title>
      <link>https://queil.net/2021/05/embedding-fsharp-compiler/</link>
      <pubDate>Sat, 29 May 2021 10:03:24 +0100</pubDate>
      <guid>https://queil.net/2021/05/embedding-fsharp-compiler/</guid>
      <description>&lt;p&gt;UPDATE: If you are looking for a ready to use solution please check out my &lt;a href=&#34;https://github.com/queil/fsc-host&#34;&gt;fsc-host&lt;/a&gt; NuGet package. Also I wrote a &lt;a href=&#34;https://queil.net/2021/10/embedding-fsharp-compiler-fsc-host-nuget/&#34;&gt;blog post&lt;/a&gt; about it.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;motivation&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#motivation&#34;&gt;Motivation&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Embedded scripting is one of the ways of providing flexibility to compiled applications. It is not free from problems (performance penalty, security issues, additional tooling is required). But if your goal is a ceremony-free flexibility for the end-user then scripting is a very robust way&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; . F# comes with great capabilities in this area. I want to show you how you can extend your otherwise statically compiled program with scripting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docs for Your Open Source Project in 5 minutes</title>
      <link>https://queil.net/2020/10/docs-for-your-open-source-project-in-5-minutes/</link>
      <pubDate>Sun, 25 Oct 2020 11:57:16 +0000</pubDate>
      <guid>https://queil.net/2020/10/docs-for-your-open-source-project-in-5-minutes/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; for a while and it also powers this blog. However, for my tiny &lt;a href=&#34;https://github.com/queil/yzl&#34;&gt;Yzl&lt;/a&gt; project I wanted GitHub Pages docs that look like &lt;a href=&#34;https://argoproj.github.io/argo-cd/getting_started/&#34;&gt;this&lt;/a&gt;. I&amp;rsquo;ve seen it in numerous open-source projects and I liked the material design look. If you like it too, please keep reading.&lt;/p&gt;&#xA;&#xA;&lt;h1 id=&#34;what-is-it&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#what-is-it&#34;&gt;What is it?&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;After a quick research I have found out that the tool is &lt;a href=&#34;https://www.mkdocs.org/&#34;&gt;mkdocs&lt;/a&gt; and the theme I want is &lt;a href=&#34;https://github.com/squidfunk/mkdocs-material&#34;&gt;squidfunk/mkdocs-material&lt;/a&gt;. 2 minutes later I started playing with mkdocs. In the root of my repo I created &lt;code&gt;docs&lt;/code&gt; folder with a placeholder &lt;code&gt;index.md&lt;/code&gt; and ran:&lt;/p&gt;</description>
    </item>
    <item>
      <title>My F# Toolbox for DevOps</title>
      <link>https://queil.net/2020/03/my-fsharp-toolbox-for-devops/</link>
      <pubDate>Mon, 30 Mar 2020 20:50:33 +0100</pubDate>
      <guid>https://queil.net/2020/03/my-fsharp-toolbox-for-devops/</guid>
      <description>&lt;p&gt;My &lt;em&gt;go-to&lt;/em&gt; free open-source packages I use in devops projects. Highly recommended if you&#xA;enjoy rapid prototyping and like getting stuff working quickly.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;suave&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#suave&#34;&gt;Suave&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://suave.io/&#34;&gt;Project site&lt;/a&gt; | Apache 2.0 license&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Suave is a simple web development F# library providing a lightweight web server and a set of combinators to manipulate route flow and task composition.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Suave is a swiss army knife for getting various types of APIs up and running without spending half a day digging through Microsoft documentation. It&amp;rsquo;s a set of low-level composable building blocks&#xA;letting you put together a working thing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Implicit Domain Models</title>
      <link>https://queil.net/ideas/2020/implicit-domain-models/</link>
      <pubDate>Mon, 30 Mar 2020 08:20:57 +0100</pubDate>
      <guid>https://queil.net/ideas/2020/implicit-domain-models/</guid>
      <description>&lt;h1 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Whether you realise it or not, any non-trivial piece of code you write models a domain. Whether the model was deliberately designed and implemented or not, it is there. Its quality&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;, or lack thereof, shapes the future&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h1 id=&#34;implicit-domain-models&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#implicit-domain-models&#34;&gt;Implicit domain models&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;One of the results of writing code without a strong thought process are &lt;em&gt;implicit domain models (IDMs)&lt;/em&gt;. They&amp;rsquo;re are domain models that were neither deliberately designed nor expressed.&lt;/p&gt;&#xA;&lt;p&gt;IDMs usually:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dotnet Test and Jenkins</title>
      <link>https://queil.net/2019/10/dotnet-test-and-jenkins/</link>
      <pubDate>Thu, 24 Oct 2019 08:25:00 +0100</pubDate>
      <guid>https://queil.net/2019/10/dotnet-test-and-jenkins/</guid>
      <description>&lt;h2 id=&#34;problem&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#problem&#34;&gt;Problem&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;How to get &lt;code&gt;dotnet test&lt;/code&gt; results collected by Jenkins?&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;solution&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#solution&#34;&gt;Solution&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Make &lt;code&gt;dotnet test&lt;/code&gt; create logs:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dotnet &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt; --logger trx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In console output you should now see messages like:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Results File: ...\TestResults\a_long_file_name.trx&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Make Jenkins collect the results:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://wiki.jenkins.io/display/JENKINS/MSTest+Plugin&#34;&gt;MSTest&lt;/a&gt; is the plugin that can consume &lt;code&gt;trx&lt;/code&gt; files. Make sure it&amp;rsquo;s installed.&lt;/p&gt;&#xA;&lt;p&gt;Add this line to your &lt;code&gt;Jenkinsfile&lt;/code&gt; below your tests execution:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-groovy&#34; data-lang=&#34;groovy&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;mstest&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;testResultsFile:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;**/*.trx&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;keepLongStdio:&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h1 id=&#34;notes&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#notes&#34;&gt;Notes&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;You can run &lt;code&gt;dotnet test&lt;/code&gt; on the whole solution. It generates a &lt;code&gt;trx&lt;/code&gt; file per test project. The MSTest plugin collects all the files and creates an aggregated report accessible in Jenkins. This method is test-framework agnostic. I tested it with NUnit 3.&lt;/p&gt;</description>
    </item>
    <item>
      <title>F# vs C#: Anonymous Records</title>
      <link>https://queil.net/2019/10/fsharp-vs-csharp-anonymous-records/</link>
      <pubDate>Wed, 23 Oct 2019 08:40:07 +0100</pubDate>
      <guid>https://queil.net/2019/10/fsharp-vs-csharp-anonymous-records/</guid>
      <description>&lt;h1 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Anonymous types have been in C# since version 3.0 which makes it quite a mature and classic feature. On the contrary, anonymous records are in F# only since version 4.6 (which has only been released earlier this year). Both features serve a similar purpose. They enable developer to bundle a bunch of read-only properties into an ad-hoc inline-declared type.&lt;/p&gt;&#xA;&#xA;&lt;h1 id=&#34;usage-examples&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#usage-examples&#34;&gt;Usage examples&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Full examples can be found &lt;a href=&#34;https://github.com/queil/queil.net-examples/tree/master/2019/fsharp-vs-csharp-anonymous-records&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;projection&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#projection&#34;&gt;Projection&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Selecting a subset of available properties.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Reasons to Run Code</title>
      <link>https://queil.net/ideas/2019/the-reasons-to-run-code/</link>
      <pubDate>Tue, 01 Oct 2019 07:48:37 +0100</pubDate>
      <guid>https://queil.net/ideas/2019/the-reasons-to-run-code/</guid>
      <description>&lt;p&gt;There are only two reasons to run code:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;return a value&lt;/li&gt;&#xA;&lt;li&gt;cause a side-effect&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Seamless Debugging of NuGet Packages</title>
      <link>https://queil.net/2019/08/seamless-debugging-of-nuget-packages/</link>
      <pubDate>Wed, 14 Aug 2019 18:15:52 +0100</pubDate>
      <guid>https://queil.net/2019/08/seamless-debugging-of-nuget-packages/</guid>
      <description>&lt;h2 id=&#34;introduction&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#introduction&#34;&gt;Introduction&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Sharing and reusing code between developers and teams has always been a serious challenge. Done badly it may gravely impede development and result with mediocre quality. Sharing source code per se has lots of problems on its own. Therefore, virtually every technology stack has a way of distributing versioned binaries instead. NuGet is the standard for sharing binaries in the .NET world. In open-source communities it&amp;rsquo;s natural to be able to view source code of a binary package. The next step is an ability to debug third-party binaries if debugging symbols are present. This, however, requires the source code to be downloaded and the debugger to be pointed to it. &lt;a href=&#34;https://github.com/dotnet/sourcelink&#34;&gt;Source Link&lt;/a&gt; is an attempt to make the whole experience seamless. Essentially, it works by enriching packages&amp;rsquo; metadata with source control specific information which then can be used on debug time to automatically download and display required source code.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Thinking</title>
      <link>https://queil.net/ideas/2019/thinking/</link>
      <pubDate>Sun, 16 Jun 2019 10:52:57 +0100</pubDate>
      <guid>https://queil.net/ideas/2019/thinking/</guid>
      <description>&lt;p&gt;Thinking is the vital part of software development process. It raises questions. It is the &lt;em&gt;fail fast&lt;/em&gt; principle taken to the extreme. I&amp;rsquo;d extend the popular &amp;ldquo;&lt;em&gt;code the right thing&lt;/em&gt;&amp;rdquo; to &amp;ldquo;&lt;strong&gt;define what the right thing is, determine if code is the best solution in the first place, and then, if the answer is &lt;em&gt;yes&lt;/em&gt;, build a solid mental model, and finally start coding the right thing&lt;/strong&gt;&amp;rdquo;. Building a mental model may, (and often does), involve coding, and usually it&amp;rsquo;s an iterative process. Especially, when we explore an unknown domain and the model rapidly evolves. However, code is treated here as a &lt;em&gt;thinking tool&lt;/em&gt; rather than the final product. It could be compared to sketching before putting any paint on the canvas. It&amp;rsquo;s easy and cheap to modify a sketch where is much more difficult to alter a ready painting.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building Scala Projects for Ignorants</title>
      <link>https://queil.net/2019/02/building-scala-projects-for-ignorants/</link>
      <pubDate>Sat, 23 Feb 2019 16:25:02 +0000</pubDate>
      <guid>https://queil.net/2019/02/building-scala-projects-for-ignorants/</guid>
      <description>&lt;h2 id=&#34;why&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#why&#34;&gt;Why?&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;As you know I am a rather .NET-orientated developer but with adoption of Kafka you realise lots of tools are written in Java or Scala. This time I needed to get built and deployed &lt;a href=&#34;https://github.com/zalando-incubator/remora&#34;&gt;Remora&lt;/a&gt; - a Kafka lag monitoring tool from Zalando. In the Docker world you&amp;rsquo;d just use the provided Docker image. However, if you want an old-fashioned deployment you need to build it yourself.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;the-obvious-you-do-not-know&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#the-obvious-you-do-not-know&#34;&gt;The obvious you do not know&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;You need to understand a couple of things before building Scala projects.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pure Functions in C#</title>
      <link>https://queil.net/2018/11/pure-functions-in-csharp/</link>
      <pubDate>Tue, 27 Nov 2018 08:50:13 +0100</pubDate>
      <guid>https://queil.net/2018/11/pure-functions-in-csharp/</guid>
      <description>&lt;h2 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Having some recent experience with F# I realised some of the functional programming principles could also be successfully used in C#. One could go completely crazy and create/use library like &lt;a href=&#34;https://github.com/louthy/language-ext&#34;&gt;language-ext&lt;/a&gt;. However, I would like to focus on the way of writing code rather than utilizing any libraries. The idea I would like to introduce in this article is pure functions.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;pure-has-no-side-effects&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#pure-has-no-side-effects&#34;&gt;Pure has no side effects&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;In a non-functional mindset there is a common misconception that side effects are something unwanted in good code. I guess it comes from the medical definition of side effects&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; where indeed any other than healing effects are undesirable. However, in the functional mindset we define side effects as changes to any external state. External i.e. not exclusively owned by the function. Here are a few examples of side effects:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dotnet Templating Cheat Sheet</title>
      <link>https://queil.net/2018/07/dotnet-templating-cheat-sheet/</link>
      <pubDate>Tue, 10 Jul 2018 07:00:01 +0000</pubDate>
      <guid>https://queil.net/2018/07/dotnet-templating-cheat-sheet/</guid>
      <description>&lt;p&gt;A few tips/examples on &lt;code&gt;dotnet new&lt;/code&gt; templating. The snippets should be put in the &lt;a href=&#34;https://github.com/dotnet/templating/wiki/Reference-for-template.json&#34;&gt;template.json&lt;/a&gt; file of your template. All the text in UNDERSCORE_CASE you should replace.&lt;/p&gt;&#xA;&#xA;&lt;h3 id=&#34;excluding-files&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#excluding-files&#34;&gt;Excluding files&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sources&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;modifiers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exclude&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;**/*.nuspec&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;replacing-text-in-file-names&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#replacing-text-in-file-names&#34;&gt;Replacing text in file names&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;symbols&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;parameter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAMETER_DESCRIPTION&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replaces&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;isRequired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;FileRename&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED_IN_FILE_NAMES&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;input-parameter&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#input-parameter&#34;&gt;Input parameter&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;symbols&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;parameter&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAMETER_DESCRIPTION&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replaces&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;isRequired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;transformed-parameter-text-after-the-last-dot&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#transformed-parameter-text-after-the-last-dot&#34;&gt;Transformed parameter (text after the last dot)&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;symbols&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;derived&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;valueSource&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;SOURCE_PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;valueTransform&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AfterLastDot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replaces&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Forms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AfterLastDot&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;identifier&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replace&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;^.*\\.(?=[^\\.]+$)&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replacement&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;transformed-patrameter-to-lower-case&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#transformed-patrameter-to-lower-case&#34;&gt;Transformed patrameter (to lower case)&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;symbols&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;derived&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;valueSource&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;SOURCE_PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;valueTransform&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ToLower&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replaces&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Forms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ToLower&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;identifier&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;lowerCase&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#xA;&lt;h3 id=&#34;generated-port-number-parameter&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#generated-port-number-parameter&#34;&gt;Generated port number parameter&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;symbols&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;PARAM_NAME&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;generated&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;generator&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;port&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;parameters&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;{&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;low&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;LOW_PORT_NUMBER,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;high&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;l&#34;&gt;HIGH_PORT_NUMBER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;}&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;replaces&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;TEXT_TO_BE_REPLACED&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;}&lt;span class=&#34;w&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Webhook receivers in AspNetCore</title>
      <link>https://queil.net/2018/07/webhook-receivers-in-asp-net-core/</link>
      <pubDate>Tue, 03 Jul 2018 20:07:00 +0100</pubDate>
      <guid>https://queil.net/2018/07/webhook-receivers-in-asp-net-core/</guid>
      <description>&lt;p&gt;&lt;em&gt;DISCLAIMER: The code in this post is by no means production ready. Please treat it as a research rather that anything else. Also please note this is based on a preview of the functionality rather than on an official release.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Although &lt;a href=&#34;https://github.com/aspnet/WebHooks/tree/master/src/Microsoft.AspNetCore.WebHooks.Receivers&#34;&gt;webhooks receivers&lt;/a&gt; didn&amp;rsquo;t make it into AspNetCore 2.1, the library is already in a pretty good shape. It works on top of the well-known AspNetCore.Mvc framework and greatly facilitates building your own receivers. In this article I am using the &lt;a href=&#34;https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.AspNetCore.WebHooks.Receivers/1.0.0-preview3-final&#34;&gt;Microsoft.AspNetCore.WebHooks.Receivers.1.0.0-preview3-final&lt;/a&gt; version. The library comes with some out-of-the-box receivers for common webhooks providers like Dropbox, GitHub, WordPress, or Slack just to name the most popular. If you need to consume webhooks from those companies you&amp;rsquo;re already home. If you need a custom receiver please keep reading. Before we start coding I&amp;rsquo;d like to establish some background.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kafka for Mere Mortals #2</title>
      <link>https://queil.net/2018/06/kafka-for-mere-mortals-2/</link>
      <pubDate>Sun, 03 Jun 2018 22:30:50 +0100</pubDate>
      <guid>https://queil.net/2018/06/kafka-for-mere-mortals-2/</guid>
      <description>&lt;p&gt;&lt;em&gt;I recommend to start with &lt;a href=&#34;https://queil.net/2017/10/kafka-for-mere-mortals-1/&#34;&gt;the previous part&lt;/a&gt; of the series before going ahead unless you have already read it.&lt;/em&gt;&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;kafka-as-a-distributed-system&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#kafka-as-a-distributed-system&#34;&gt;Kafka as a distributed system&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Kafka is designed as a distributed system to achieve horizontal scalability, high availability (HA), and data redundancy. Horizontal scalability means we can keep adding more and more nodes to a cluster to handle virtually any imaginable load&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;. High availability describes a system that is always operational even if some of its components fail or get disconnected. Data redundancy is employed to ensure there is no data loss or corruption.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Give it a try: Safe</title>
      <link>https://queil.net/2018/05/give-it-a-try-safe/</link>
      <pubDate>Wed, 16 May 2018 07:46:11 +0100</pubDate>
      <guid>https://queil.net/2018/05/give-it-a-try-safe/</guid>
      <description>&lt;h2 id=&#34;intro&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#intro&#34;&gt;Intro&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve recently learnt about the &lt;a href=&#34;https://safe-stack.github.io/&#34;&gt;SAFE Stack&lt;/a&gt;. It&amp;rsquo;s F# all the way from the client to the server side. It&amp;rsquo;s a fantastic news for back-end people (knowing F#). There is no need of learning intricacies of JavaScript. You can focus on productivity instead. In this post I just want to show you how quickly you can start developing.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;first-safe-app&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#first-safe-app&#34;&gt;First SAFE app&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&#xA;&lt;h4 id=&#34;prerequisites&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#prerequisites&#34;&gt;Prerequisites&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;.Net Core 2, Node.js, Yarn. Make sure you&amp;rsquo;ve got it all. Then just open shell and let&amp;rsquo;s type.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Finding references in C# code with Roslyn and F#</title>
      <link>https://queil.net/2018/02/finding-references-in-csharp-code-with-roslyn-and-fsharp/</link>
      <pubDate>Tue, 20 Feb 2018 19:58:29 +0000</pubDate>
      <guid>https://queil.net/2018/02/finding-references-in-csharp-code-with-roslyn-and-fsharp/</guid>
      <description>&lt;h2 id=&#34;introduction&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#introduction&#34;&gt;Introduction&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;The most of .NET developers use &lt;a href=&#34;https://github.com/dotnet/roslyn&#34;&gt;Roslyn&lt;/a&gt; (the .NET Compiler) everyday. But apart from compiling code it comes with a versatile APIs used for syntax highlighting, analyzers, navigation tools just to name the most typical ones. I want to show you how to use it in your own tools. This time I want a tiny tool that finds all usages of a class&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; in a solution&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 id=&#34;lets-code&#34; class=&#34;anchor-link&#34;&gt;&lt;a href=&#34;#lets-code&#34;&gt;Let&amp;rsquo;s code&lt;span class=&#34;pilcrow&#34;&gt;&amp;nbsp;¶&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;em&gt;I picked F# as my language of choice for this post. The code is easily translatable to C# though. All the code from the article you can &lt;a href=&#34;https://github.com/queil/Queil.CodeRules.Analysis&#34;&gt;access here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kafka for Mere Mortals #1</title>
      <link>https://queil.net/2017/10/kafka-for-mere-mortals-1/</link>
      <pubDate>Sun, 01 Oct 2017 23:31:44 +0100</pubDate>
      <guid>https://queil.net/2017/10/kafka-for-mere-mortals-1/</guid>
      <description>&lt;p&gt;&lt;em&gt;This series of posts is an attempt to explain what Apache Kafka is and to show some benefits of using it side by side with a relational database in a .NET (or really any) distributed solution. I am by no means expert in any of those technologies so take all of that with a pinch of salt. I am assuming you will have a basic knowledge of relational databases and some experience in building applications.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slack Deployment Notifications</title>
      <link>https://queil.net/2017/09/slack-deployment-notifications/</link>
      <pubDate>Sun, 17 Sep 2017 20:39:47 +0100</pubDate>
      <guid>https://queil.net/2017/09/slack-deployment-notifications/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve got a simple ASP.NET Core 2 web application setup hosted in AWS. My environment is built of 3 servers (build, web, and db). I want to minimize all AWS costs so I keep the servers off most of the time. Whenever turned on they get random public IP addresses from the AWS pool. I&amp;rsquo;ve got a really simple build and deployment process which apart from the usual elements also has the following step:&lt;/p&gt;</description>
    </item>
    <item>
      <title>License</title>
      <link>https://queil.net/license/</link>
      <pubDate>Sun, 17 Sep 2017 12:50:10 +0100</pubDate>
      <guid>https://queil.net/license/</guid>
      <description>&lt;pre&gt;&lt;code&gt;                             Apache License&#xA;                       Version 2.0, January 2004&#xA;                    http://www.apache.org/licenses/&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Definitions.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;License&amp;rdquo; shall mean the terms and conditions for use, reproduction,&#xA;and distribution as defined by Sections 1 through 9 of this document.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Licensor&amp;rdquo; shall mean the copyright owner or entity authorized by&#xA;the copyright owner that is granting the License.&lt;/p&gt;&#xA;&lt;p&gt;&amp;ldquo;Legal Entity&amp;rdquo; shall mean the union of the acting entity and all&#xA;other entities that control, are controlled by, or are under common&#xA;control with that entity. For the purposes of this definition,&#xA;&amp;ldquo;control&amp;rdquo; means (i) the power, direct or indirect, to cause the&#xA;direction or management of such entity, whether by contract or&#xA;otherwise, or (ii) ownership of fifty percent (50%) or more of the&#xA;outstanding shares, or (iii) beneficial ownership of such entity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://queil.net/about/</link>
      <pubDate>Sat, 16 Sep 2017 23:11:23 +0100</pubDate>
      <guid>https://queil.net/about/</guid>
      <description>&lt;p&gt;Welcome to my personal professional blog. I am technical architect, developer, and researcher based in London. I am specialized in .NET (F#/C#), devops, and back-end development. Enthusiast of maths, linguistics, guitars, and notebooks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Need for Blog</title>
      <link>https://queil.net/2017/09/need-for-blog/</link>
      <pubDate>Sun, 10 Sep 2017 14:41:13 +0100</pubDate>
      <guid>https://queil.net/2017/09/need-for-blog/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve had a few attempts to start my own dev blog or website. However I would have always been pushed away by cumbersomeness of blogging platforms. To be fair I&amp;rsquo;ve never liked web interfaces. Needed a more dev-centric way of publishing own content. And finally I have discovered one that works for me (better later than never). It&amp;rsquo;s called &lt;a href=&#34;https://www.staticgen.com/&#34;&gt;static websites generation&lt;/a&gt; and it isn&amp;rsquo;t anything new whatsoever. Static websites are as old as the internet itself however thanks to evolution of web technologies (namely JavaScript, CSS, HTML, web browsers) it has been brought to a completely new level. The idea is to generate your web site in advance removing a need of a complex server environment (like databases or server-side processing). Obviously it has its limitations but I believe it works for blog-like websites very well.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
