<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: klyse</title>
    <description>The latest articles on DEV Community by klyse (@klyse).</description>
    <link>https://dev.to/klyse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F175781%2F181dfe37-5879-4263-8aec-f21111388de4.jpeg</url>
      <title>DEV Community: klyse</title>
      <link>https://dev.to/klyse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/klyse"/>
    <language>en</language>
    <item>
      <title>What do you think of ASP.net core minimal apis?</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Thu, 18 Aug 2022 16:04:43 +0000</pubDate>
      <link>https://dev.to/klyse/what-do-you-think-of-aspnet-core-minimal-apis-2f1n</link>
      <guid>https://dev.to/klyse/what-do-you-think-of-aspnet-core-minimal-apis-2f1n</guid>
      <description>&lt;p&gt;I’ve been working with asp.net core since dotnet core 2.2. Wrote many different services with it.&lt;br&gt;
Lately I’ve been trying out the “new” minimal apis and I’m very happy about them. What’s your opinion?&lt;/p&gt;

&lt;p&gt;By the way:&lt;br&gt;
There is a great video from Nick Chapsas about how to get started: &lt;a href="https://m.youtube.com/watch?v=eRJFNGIsJEo"&gt;https://m.youtube.com/watch?v=eRJFNGIsJEo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>webdev</category>
      <category>api</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Dopper + direnv == "&lt;3"</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Wed, 17 Aug 2022 06:18:00 +0000</pubDate>
      <link>https://dev.to/klyse/dopper-direnv--2ip7</link>
      <guid>https://dev.to/klyse/dopper-direnv--2ip7</guid>
      <description>&lt;p&gt;I'm using React to build &lt;a href="https://cl3rk.io"&gt;cl3rk.io&lt;/a&gt;. The SPA needs some configuration like OAuth Client ID, Auth0 Domain,  and backend URL. I try not to commit any configuration in the git repo so I have two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a .env file on every machine I'm working on&lt;/li&gt;
&lt;li&gt;outsource the configuration to a configuration provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are plenty of configuration providers out there like &lt;a href="https://azure.microsoft.com/en-us/services/app-configuration"&gt;Azure App Configuration&lt;/a&gt;. A few months ago I found Doppler, which by definition is not a configuration manager BUT a secret store with some neat features. In this post, I'm showing you how I use doppler with direnv.&lt;/p&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This will only work on Linux/Mac OS&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.doppler.com/docs/install-cli"&gt;Doppler shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://direnv.net"&gt;direnv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Doppler
&lt;/h2&gt;

&lt;p&gt;Doppler has a generous free offering (5 users for free!🎉) - that's very important for me as I'm using doppler for cl3rk which is not yet making any money as well as personal projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tt4Pn1JF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fy2p9i73nb8siayt4ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tt4Pn1JF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fy2p9i73nb8siayt4ew.png" alt="The Doppler dashboard" width="880" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Noticeable in the top left I'm in the cl3rk workspace. Each user can have multiple workspaces. I have a workspace for each product or prototype I'm working on.&lt;/p&gt;

&lt;p&gt;Each Workspace has multiple projects. I use projects in two ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make configuration available to other projects via &lt;a href="https://www.doppler.com/changes/secrets-referencing"&gt;secrets referencing&lt;/a&gt;. In the screenshot, the &lt;code&gt;azure&lt;/code&gt; project is an example of this. It holds the credentials to talk to azure.&lt;/li&gt;
&lt;li&gt;Per logical unit of the project: frontend and potentially backend / API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K9BxmDI0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwsisq1zbx2k2imakco3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K9BxmDI0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cwsisq1zbx2k2imakco3.png" alt="Doppler stages" width="839" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In each project, there are stages to represent different instances of the configuration for different deployments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--myMmOKz6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzte1m4grd48m75ogkgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--myMmOKz6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lzte1m4grd48m75ogkgn.png" alt="Doppler secrets" width="847" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each of the stages contains its own set of secrets and configurations.&lt;/p&gt;

&lt;p&gt;There is much more to explore so head over to &lt;a href="https://www.doppler.com"&gt;Doppler&lt;/a&gt; and try it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  direnv
&lt;/h2&gt;

&lt;p&gt;The link from the Doppler config and React is still missing and I'm using &lt;a href="https://direnv.net"&gt;direnv&lt;/a&gt; to do that.&lt;/p&gt;

&lt;p&gt;With direnv you can place an instruction file (&lt;code&gt;.envrc&lt;/code&gt;) in each folder and as soon as the terminal enters the folder the &lt;code&gt;.envrc&lt;/code&gt; is executed. This is helpful to set additional env variables or to add executables to the path.&lt;/p&gt;

&lt;p&gt;example &lt;code&gt;.envrc&lt;/code&gt; to read the .env file and adds its content to the environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotenv
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;Hi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dev.to"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shell output when entering the directory / applying &lt;code&gt;direnv allow .&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;direnv: loading ~/projects/cl3rk/.envrc                                                        
direnv: &lt;span class="nb"&gt;export&lt;/span&gt; +DOPPLER_TOKEN +Hi
~/projects/cl3rk main&lt;span class="k"&gt;*&lt;/span&gt; ❯ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two vars are being set &lt;code&gt;DOPPLER_TOKEN&lt;/code&gt; comes from the .env file and &lt;code&gt;Hi&lt;/code&gt; from the .envrc&lt;/p&gt;

&lt;p&gt;Whenever we leave the folder all added variables are removed again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;direnv: unloading
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a real world example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
│   .envrc
│   .env                 # contains the doppler access token    
│   ...
└───IaC                  # contains all code for Infrastructure as Code
│   │   .envrc           # updated .envrc file to point to the correct Doppler project (infrastructure) and stage (dev by default)
│   │   main.tf
└───Web_Frontend
    │   .envrc           # updated .envrc file to point to the correct Doppler project (backend) and stage (dev by default
    │   package.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;./.envrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotenv &lt;span class="c"&gt;# only read the .env file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;./.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DOPPLER_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dp.pt.***"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;IaC/.envrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;source_up                               &lt;span class="c"&gt;# also scan top-level folders for .envrc files and run them as well&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOPPLER_PROJECT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;infrastructure   &lt;span class="c"&gt;# use the infrastructure project&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOPPLER_CONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev               &lt;span class="c"&gt;# and the dev stage&lt;/span&gt;
&lt;span class="c"&gt;# download all the secrets to your shell and remove them&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;doppler secrets download &lt;span class="nt"&gt;--no-file&lt;/span&gt; &lt;span class="nt"&gt;--format&lt;/span&gt; env-no-quotes&lt;span class="si"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever you lose your notebook just regenerate your Doppler token and no secret is left behind on your pc. On top of that you can share the configuration easily with colleagues without copying the .env file. As soon as you enter one of the directories the .envrc code gets executed and Doppler injects secrets as environment variables which you can use in your projects. Pretty neat. What do you think?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>The problem(s) with Azure Functions</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Tue, 16 Aug 2022 19:43:00 +0000</pubDate>
      <link>https://dev.to/klyse/the-problems-with-azure-functions-2j48</link>
      <guid>https://dev.to/klyse/the-problems-with-azure-functions-2j48</guid>
      <description>&lt;p&gt;I’m a curious person. Trying out new things makes me happy. I strongly believe in learning by doing. That’s the only way for me to make progress and learn new programming languages, technologies or frameworks. One might say I love to overengineer things ;). I've been working on &lt;a href="https://cl3rk.io" rel="noopener noreferrer"&gt;cl3rk.io&lt;/a&gt; for a while and spend most of the time researching technologies and trying out new stuff. A few weeks ago I decided to take the project a bit more serious and am now working with warp speed on getting the first version out there.&lt;/p&gt;

&lt;p&gt;Before that, I spend a ton of time testing &lt;a href="https://azure.microsoft.com/en-us/services/functions/" rel="noopener noreferrer"&gt;Azure Functions&lt;/a&gt; and stumbled over a few &lt;del&gt;rocks&lt;/del&gt; mountains 🗻.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7tmrelrheq1z6px9m4x.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs7tmrelrheq1z6px9m4x.jpg" alt="Azure Functions Mountain I stumbled over"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wrote already a couple of Azure Functions in the past to interact with Telegram bots for example and was always happy with them. So I immediately started my first PoC with C#. Here is why I ended up moving away from Azure Functions:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Authentication and Authorization
&lt;/h2&gt;

&lt;p&gt;Functions can be triggered in multiple ways: HTTP, Queue, Db, Blob Storage Change and many more. More on this can be found &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-http-webhook" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This was one of the major reasons why I thought Azure Functions are great. I mostly needed the HTTP and Queue trigger. With HTTP functions comes also the requirement for Authentication and Authorization. I'm using &lt;a href="https://auth0.com" rel="noopener noreferrer"&gt;Auth0&lt;/a&gt; as an authentication provider. The implementation is usually straightforward. The frontend obtains an access token and the API validates the token and authenticates the request. OpenID connect is well documented and somewhat easy to use in asp.net core for example. Not with Azure Functions I googled for days, opened an &lt;a href="https://github.com/Azure/azure-functions-host/issues/8536" rel="noopener noreferrer"&gt;issue&lt;/a&gt; and tried everything I could think of and came to the conclusion: Microsoft doesn’t provide you with proper SDKs to handle authentication adequately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Expected:
&lt;/h3&gt;

&lt;p&gt;I add the &lt;code&gt;[Authorize]&lt;/code&gt; attribute on an Azure Function and configure the validation in the startup method for example. This is the well-known way to use OpenIDConnect in asp.net core apps. The user context is then injected via &lt;code&gt;HttpRequest&lt;/code&gt; and accessible when the code needs it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Authorize&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CreatePersonalTask"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;CosmosDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"personal_tasks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"personal_tasks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CosmosDBConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;PersonalTask&lt;/span&gt; &lt;span class="n"&gt;personalTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Create Personal Task"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;personalTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PersonalTask&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"yolo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// get userid from HttpRequest&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;personalTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Reality:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You can authenticate on a service level (Azure takes care of OpenID connect and validates the access token before the function is executed) BUT this only works when the function is deployed. Testing locally becomes difficult as the local runtime does not come with this authentication layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Azure Function docs do not show how to overcome this problem. I ended up creating a &lt;a href="https://github.com/Azure/azure-functions-host/issues/8536" rel="noopener noreferrer"&gt;Github issue&lt;/a&gt; to understand if I'm the only guy with this problem or if it's just not well supported. Turns out the latter one is true😢&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are &lt;a href="https://github.com/fmichellonet/AzureFunctions.Extensions.OpenIDConnect" rel="noopener noreferrer"&gt;some libraries&lt;/a&gt; that workaround this problem BUT they are not well maintained and potentially &lt;a href="https://github.com/Azure/azure-functions-host/issues/8536#issuecomment-1205682012" rel="noopener noreferrer"&gt;use preview code&lt;/a&gt; that might never make it to the new Out Of Process runtime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can write the validation logic yourself and call custom code at the beginning of your function BUT who wants to maintain that?&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;FunctionName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CreatePersonalTask"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;HttpTrigger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"post"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;HttpRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;CosmosDB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"personal_tasks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"personal_tasks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CosmosDBConnection"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;out&lt;/span&gt; &lt;span class="n"&gt;PersonalTask&lt;/span&gt; &lt;span class="n"&gt;personalTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ILogger&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// validate the token in every function. This is messy if you have many functions&lt;/span&gt;

    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogInformation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Create Personal Task"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;personalTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PersonalTask&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Guid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewGuid&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;ToString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"yolo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;UserId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;// get userid from HttpRequest&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OkObjectResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;personalTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its a real bummer that authentication with JWT tokens does not work out of the box. This is a dealbreaker to me💁🏼‍♂️&lt;/p&gt;

&lt;h2&gt;
  
  
  2. CI/CD
&lt;/h2&gt;

&lt;p&gt;I work as a DevOps guy so I strive to automate as much as I can to avoid errors and free up my time for development. The Github Action was working before I realized the authentication debacle. With the CD pipeline I quickly realized one flaw: whenever a new function version is deployed a &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-how-to-github-actions" rel="noopener noreferrer"&gt;zip file is uploaded&lt;/a&gt; to the mandatory Storage Account on Azure. Soon I had a few dozens of zip files in the storage account and had no overview of what's deployed and what is not deployed. That's messy if you need to debug or roll back a version.&lt;/p&gt;

&lt;p&gt;This is not a major problem but worth keeping in mind when using dotnet and Azure Functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. In-process or Isolated process
&lt;/h2&gt;

&lt;p&gt;If all of that was not enough Azure Functions can be written in two flavours: &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library" rel="noopener noreferrer"&gt;in-Process&lt;/a&gt; or &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide" rel="noopener noreferrer"&gt;isolated process&lt;/a&gt;. Basically, this is how functions are hosted. More info on that can be found &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/dotnet-isolated-process-guide#benefits-of-running-out-of-process" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The in-process way has better binding support and a faster startup time. Isolated process hosting is newer and allows you to target a different dotnet version than the function runtime itself. It also has less dependency &lt;a href="https://bryanknox.github.io/2022/07/15/functionsskipcleanoutput-and-functionspreserveddependencies.html" rel="noopener noreferrer"&gt;collisions&lt;/a&gt; as your app is separated from the function runtime. I decided to roll with in-process for my PoC because of the &lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-triggers-bindings?tabs=csharp" rel="noopener noreferrer"&gt;awesome binding support&lt;/a&gt;. I wanted to use dotnet 7 when released but I feared that might only work when using isolated process Azure Functions (Unless Microsoft offers the in-process runtime with dotnet 7 too). Unfortunately, some code is different between in-process and out-of-process so one may not easily switch between the two hosting options.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion:
&lt;/h2&gt;

&lt;p&gt;Azure Functions are great if you have a small project that does not need authentication. Make sure to carefully decide between in-process and isolated process hosting. If you have a larger project you can check out &lt;a href="https://azure.microsoft.com/en-us/services/container-apps/" rel="noopener noreferrer"&gt;Azure Container Apps&lt;/a&gt; as an alternative. That's what I'm using right now and I'm very impressed with it so far. I hope to share some details on how I'm doing that soon in another post.&lt;br&gt;
All in all I can say that I learned a lot when working with Azure Functions and I'd love to use them in the future again. But only when I find a great use case without authentication ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  cl3rk
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cl3rk.io" rel="noopener noreferrer"&gt;cl3rk&lt;/a&gt; is a new, innovative and easy-to-use document management app. We all know document management is a pain. Have you tried finding the documents you need for tax declaration? I struggle with that every year. cl3rk's goal is to take this pain away from every user with AI. Keeping the documents secure cl3rk aims to provide reasonable reminders on chores like renewing car insurance each user has to stay on top of. This way nothing will get forgotten.&lt;/p&gt;

&lt;p&gt;Let me know what you think of Azure Functions and cl3rk. If you want you can signup the email list (no spam - I promise) or reach out at &lt;a href="mailto:klaus@cl3rk.io"&gt;klaus@cl3rk.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
      <category>dotnet</category>
      <category>programming</category>
    </item>
    <item>
      <title>Advent Of Code 2020</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Wed, 18 Nov 2020 12:38:48 +0000</pubDate>
      <link>https://dev.to/klyse/advent-of-code-2020-2c04</link>
      <guid>https://dev.to/klyse/advent-of-code-2020-2c04</guid>
      <description>&lt;p&gt;A couple of days ago the &lt;a href="https://adventofcode.com/" rel="noopener noreferrer"&gt;Advent of Code website&lt;/a&gt; switched from the 2019 edition to the &lt;strong&gt;2020 edition&lt;/strong&gt;. Finally 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Advent of Code?
&lt;/h2&gt;

&lt;p&gt;Every day from December 1st to December 25th a new coding challenge is released. Solve it ASAP to help the Elves save Christmas. &lt;a href="https://adventofcode.com/2019/day/1" rel="noopener noreferrer"&gt;Here&lt;/a&gt; is the challenge from 1st December 2019 to give you a better idea about the challenges. Usually they get more difficult with each day. What I like about AoC is that the challenges only rarely rely on math IMHO. Instead you are required to demonstrate an open mindset, debugging skills, some logic and a lot of googling to solve the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why should I join?
&lt;/h2&gt;

&lt;p&gt;Advent of code is a great way to challenge your collogues and improve your coding skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  What programming language should I use?
&lt;/h2&gt;

&lt;p&gt;That's completely up to you. I personally use C#. Here is my GitHub repo of last years event:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/klyse" rel="noopener noreferrer"&gt;
        klyse
      &lt;/a&gt; / &lt;a href="https://github.com/klyse/AdventOfCode2019" rel="noopener noreferrer"&gt;
        AdventOfCode2019
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Repository for advent of code
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Advent Of Code 2019&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This is my repository containing the alogithms for AoC 2019.&lt;/p&gt;
&lt;p&gt;I use unit tests to debug the solution. I was able to obtain a total of 30 stars :)&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Authors&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Klyse: &lt;a href="https://github.com/klyse/" rel="noopener noreferrer"&gt;@Klyse&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/klyse/AdventOfCode2019" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Do I need to solve each days challenge?
&lt;/h2&gt;

&lt;p&gt;Nope you don't. You solve as many challenges as you can / want. Be warned, some of them are really difficult! Don't give up if you find no solution for one day, the next day might be completely different and more accessible for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Private Leaderboard
&lt;/h2&gt;

&lt;p&gt;Don't forget to create your private leaderboard. This way you can challenge your friends and compare the coding results.&lt;/p&gt;

&lt;p&gt;There is only one last thing to say:&lt;br&gt;
Code humans, Code!&lt;/p&gt;

&lt;h1&gt;
  
  
  🎄🎄🎄🎄🎄🎄🎄🎄🎄🎄
&lt;/h1&gt;

</description>
      <category>programming</category>
      <category>watercooler</category>
      <category>challenge</category>
      <category>news</category>
    </item>
    <item>
      <title>Where would you use the new C# 9 Record Type</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Wed, 18 Nov 2020 07:09:54 +0000</pubDate>
      <link>https://dev.to/klyse/where-would-you-use-the-new-c-9-record-type-1i3m</link>
      <guid>https://dev.to/klyse/where-would-you-use-the-new-c-9-record-type-1i3m</guid>
      <description>&lt;p&gt;I found a great post by wrijugh.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__481437"&gt;
    &lt;a href="/wrijugh" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F481437%2F74a29f2d-cb10-4cef-bd77-2f0e2c1a602e.jpeg" alt="wrijugh image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/wrijugh"&gt;Wriju's Blog&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/wrijugh"&gt;Cloud Architect and a Software Developer&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Wriju explains the new C# Record Type.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/wrijugh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F481437%2F74a29f2d-cb10-4cef-bd77-2f0e2c1a602e.jpeg" alt="wrijugh"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="/wrijugh/c-9-0-record-type-1lid" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;C# 9.0 - Record Type&lt;/h2&gt;
      &lt;h3&gt;Wriju's Blog ・ Nov 13 '20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#csharp9&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#net5&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;I am excited about this feature, but I'm not 100% sure when I should use it and when I should stick to a class. Mads Torgersen provided some insights there in his presentation on C# 9 during the .net conference but I'm actually more interested in the practical side.&lt;/p&gt;

&lt;p&gt;How do you plan on using this new feature? Do you think there are issues one has to think about when one uses the new Record Type? Do you think Record Types should be used for deserialization of a json string? Are you going to migrate from classes to Record Types?&lt;/p&gt;

&lt;p&gt;Let me know in the comments :)!&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My G815 Keyboard is on Steroids (Shortcut helper)</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Sat, 29 Aug 2020 17:11:48 +0000</pubDate>
      <link>https://dev.to/klyse/my-g815-keyboard-is-on-steroids-31fl</link>
      <guid>https://dev.to/klyse/my-g815-keyboard-is-on-steroids-31fl</guid>
      <description>&lt;h1&gt;
  
  
  Logitech G815 Shortcut Helper
&lt;/h1&gt;

&lt;p&gt;I wrote a small shortcut helper in GoLang that helps me to remember the most useful shortcuts for IntelliJ based products tested with &lt;strong&gt;Rider&lt;/strong&gt; and &lt;strong&gt;GoLand&lt;/strong&gt; and a QWERTZ keyboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X3O6KW-c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/blob/master/Images/example2.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X3O6KW-c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/blob/master/Images/example2.gif%3Fraw%3Dtrue" alt="" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I recently bought a &lt;a href="https://www.logitechg.com/en-us/products/gaming-keyboards/g815-low-profile-rgb-mechanical-gaming-keyboard.html"&gt;Logitech G815&lt;/a&gt; which turned out to be a great decision for multiple reasons. The obvious one being that it's a great keyboard ✨. The other one is that I found out Logitech provides an SDK for the keyboard =&amp;gt; 👌.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sKS-_9Rs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://resource.logitechg.com/w_1800%2Cc_limit%2Cf_auto%2Cq_auto:best%2Cf_auto%2Cdpr_auto/content/dam/gaming/en/products/g815/g815-intro-desktop.png%3Fv%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sKS-_9Rs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://resource.logitechg.com/w_1800%2Cc_limit%2Cf_auto%2Cq_auto:best%2Cf_auto%2Cdpr_auto/content/dam/gaming/en/products/g815/g815-intro-desktop.png%3Fv%3D1" alt="" width="880" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  RGB Keys
&lt;/h3&gt;

&lt;p&gt;The keyboard supports RGB background lighting for each key. There are plenty of integrated functions such as a color wave which looks great🌟. The keyboard is made for gaming purposes and yes it does integrate with a lot of games but I didn't try any myself🙈.&lt;/p&gt;

&lt;h1&gt;
  
  
  SDK
&lt;/h1&gt;

&lt;p&gt;The Logitech SDK can be found on this website: &lt;a href="https://www.logitechg.com/en-us/innovation/developer-lab.html"&gt;https://www.logitechg.com/en-us/innovation/developer-lab.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was particularly interested in the LED Illumination SDK.&lt;/p&gt;

&lt;p&gt;The SKD is written in C++ and provides the .lib, .h, .dll, and some examples and is &lt;strong&gt;windows only&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration with GO
&lt;/h2&gt;

&lt;p&gt;I'm currently learning &lt;strong&gt;GoLang&lt;/strong&gt; and I wanted to program this in go and not in C++ or C#.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calling native C++ functions from GO
&lt;/h3&gt;

&lt;p&gt;I found a great way to call native C++ functions from Go using the &lt;code&gt;sys&lt;/code&gt; module.&lt;/p&gt;

&lt;p&gt;Original repo: &lt;a href="https://github.com/golang/go/wiki/WindowsDLLs"&gt;https://github.com/golang/go/wiki/WindowsDLLs&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;LogiKeyboard&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dll&lt;/span&gt;                             &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LazyDLL&lt;/span&gt;
    &lt;span class="n"&gt;ledInit&lt;/span&gt;                         &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LazyProc&lt;/span&gt;
    &lt;span class="c"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;LogiKeyboard&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogiKeyboard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// initialization of the dll&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;windows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewLazyDLL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"LogitechLedEnginesWrapper.dll"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// assign the function&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledInit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewProc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"LogiLedInit"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;//...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// wrapper for the init function&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="n"&gt;LogiKeyboard&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledInit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Call&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Already initialized"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Additionally, I had to translate the .h file in go syntax. This helps to have all the constants (like defines) in one place and reduce code duplication. &lt;a href="https://github.com/klyse/LogitechKeyboardLED/blob/master/LogiKeyboardTypes/KeyboardTypes.go"&gt;Here&lt;/a&gt; is the file.&lt;/p&gt;
&lt;h1&gt;
  
  
  Integration with Windows
&lt;/h1&gt;

&lt;p&gt;I needed a slim and easy way to catch Windows keystrokes. Turns out there is a great module for that as well: &lt;a href="https://github.com/moutend/go-hook"&gt;github.com/moutend/go-hook&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;main.go:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shortcuts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shortcuts&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shortcut&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Buffer size is depends on your need. The 100 is placeholder value.&lt;/span&gt;
    &lt;span class="n"&gt;keyboardChan&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;KeyboardEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Install&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyboardChan&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;signalChan&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signalChan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Interrupt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Minute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received timeout signal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;signalChan&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received shutdown signal"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;keyboardChan&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
            &lt;span class="c"&gt;// check if shortcut modifiers are pressed and set RGB color&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Those few lines of code are everything you need to create a keylogger in go. Isn't that crazy?&lt;/p&gt;
&lt;h1&gt;
  
  
  Shortcuts
&lt;/h1&gt;

&lt;p&gt;Shortcuts can be modified in &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;shortcuts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shortcut&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// if the left shift key is presed:&lt;/span&gt;
    &lt;span class="c"&gt;// F6 will start blinking red&lt;/span&gt;
    &lt;span class="c"&gt;// F9 will change the color to blue&lt;/span&gt;
    &lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateWithKey&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VKCode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VK_LSHIFT&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShortcutKey&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateKeyColorEffect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogiKeyboardTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;F6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Blinking&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateKeyColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LogiKeyboardTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;F9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="c"&gt;//...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Integration with Logitech GHub
&lt;/h1&gt;

&lt;p&gt;The keyboard has five G keys and each key can be assigned with a different task. One task is to launch an application =&amp;gt; great :). The downside of this function is that an application can be started but not stopped. I wanted to start and stop the shortcut helper with the same key just like a toggle.&lt;/p&gt;

&lt;p&gt;As always there is a workaround in PowerShell😂:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;Set-Location&lt;/span&gt; &lt;span class="nf"&gt;-Path&lt;/span&gt; &lt;span class="nf"&gt;C:\Projects\LogitechKeyboardLED&lt;/span&gt;

&lt;span class="nf"&gt;$ProcessActive&lt;/span&gt; &lt;span class="nf"&gt;=&lt;/span&gt; &lt;span class="s"&gt;(Get-Process logitechKeyboardLed -ErrorAction SilentlyContinue)&lt;/span&gt;&lt;span class="nf"&gt;.Id&lt;/span&gt;
&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="s"&gt;($null -eq $ProcessActive)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Start-Process&lt;/span&gt; &lt;span class="nf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;/logitechKeyboardLed.exe&lt;/span&gt; &lt;span class="nf"&gt;-NoNewWindow&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;else&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Stop-Process&lt;/span&gt; &lt;span class="nf"&gt;$ProcessActive&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Configure the G key using the &lt;code&gt;Launch Application&lt;/code&gt; option:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lHAa3xmz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/raw/master/Images/GHubConfig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lHAa3xmz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/raw/master/Images/GHubConfig.png" alt="" width="880" height="484"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Shortcuthelper in action
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T4scwGI6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/raw/master/Images/example.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T4scwGI6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/raw/master/Images/example.gif" alt="" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Github Repo
&lt;/h1&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--566lAguM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/klyse"&gt;
        klyse
      &lt;/a&gt; / &lt;a href="https://github.com/klyse/LogitechKeyboardLED"&gt;
        LogitechKeyboardLED
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Logitech G815 / G915 LED control written in GO
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Logitech G815 ⌨️ Rider and GoLand Shortcut helper&lt;/h1&gt;
&lt;p&gt;This is a little shortcut helper written in GO 👨‍💻. The software can be started using one of the &lt;code&gt;G&lt;/code&gt; keys. Once started the process profiles every keystroke made on the keyboard. If a certain combination ex. &lt;code&gt;SHIFT+CTRL&lt;/code&gt; is pressed the most important shortcuts for Rider / GoLang are visualized on the keyboard using the RGB key background lightning 💡.&lt;/p&gt;
&lt;p&gt;Here's a quick example (sorry for the bad quality, the keys are shining bright and clear in reality🙈):&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/klyse/LogitechKeyboardLED/Images/example.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IU8W_I0c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/Images/example.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here's another one:&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/klyse/LogitechKeyboardLED/Images/example2.gif"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gj5vATFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/Images/example2.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
How to install 💻
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repo&lt;/li&gt;
&lt;li&gt;Build the source code &lt;code&gt;go build -o LogitechKeyboardLED.exe ./&lt;/code&gt;  (win only)&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;code&gt;GHub&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add a new launch command with the following params:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/klyse/LogitechKeyboardLED/Images/GHubConfig.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--blpGIGPd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/klyse/LogitechKeyboardLED/Images/GHubConfig.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The script checks the state of the process and starts it if the process is stopped, and stops it if the process is running. This way…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/klyse/LogitechKeyboardLED"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Thanks for reading :)&lt;/p&gt;

</description>
      <category>go</category>
      <category>productivity</category>
      <category>watercooler</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The miracle tools that help me to develop software</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Thu, 16 Jul 2020 16:22:09 +0000</pubDate>
      <link>https://dev.to/klyse/the-miracle-tools-that-help-me-to-develop-software-1igc</link>
      <guid>https://dev.to/klyse/the-miracle-tools-that-help-me-to-develop-software-1igc</guid>
      <description>&lt;p&gt;I love to solve problems by writing some code and in my opinion, great software starts with the right tools. So here is a list of tools I use professionally to write (hopefully 🙀) great software:&lt;/p&gt;

&lt;p&gt;Some might be pretty obvious ;)&lt;/p&gt;

&lt;h1&gt;
  
  
  Git &lt;em&gt;&lt;a href="https://git-scm.com"&gt;https://git-scm.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;version control&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  GitHub &lt;em&gt;&lt;a href="https://github.com"&gt;https://github.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Issues&lt;/li&gt;
&lt;li&gt;great octocat images:
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fl36Fk3W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://octodex.github.com/images/daftpunktocat-thomas.gif" alt="" width="880" height="880"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  AzureDevOps &lt;em&gt;&lt;a href="https://azure.microsoft.com/en-us/services/devops"&gt;https://azure.microsoft.com/en-us/services/devops&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Boards &lt;em&gt;&lt;a href="https://azure.microsoft.com/en-us/services/devops/boards"&gt;https://azure.microsoft.com/en-us/services/devops/boards&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  JetBrains Suite &lt;em&gt;&lt;a href="https://www.jetbrains.com/products.html"&gt;https://www.jetbrains.com/products.html&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Toolbox
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;update and install JetBrains products&lt;/li&gt;
&lt;li&gt;launch projects from the "Projects" tab 🌟
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HfQGm2Yl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.jetbrains.com/toolbox-app/img/4a.png" alt="" width="880" height="1398"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Rider
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;for C# development&lt;/li&gt;
&lt;li&gt;(really, give it a try. It's Visual Studio on steroids)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EJONqona--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.jetbrains.com/rider/features/screenshots/img/code_completion%402x.png" alt="" width="880" height="470"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  PHP Storm
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;you guessed it, its made for PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  GoLand
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;for go (what a surprise)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  DataGrip
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;for SQL connections to various databases (MySQL, MongoDB, MsSql, MariaDB, MySql)&lt;/li&gt;
&lt;li&gt;learn one tool =&amp;gt; rule them all&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Visual Studio &lt;em&gt;&lt;a href="https://visualstudio.microsoft.com"&gt;https://visualstudio.microsoft.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;C++ development (I have some issues with CLion here)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Li0IyiVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://visualstudio.microsoft.com/wp-content/uploads/2019/06/combined-gif2sl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Li0IyiVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://visualstudio.microsoft.com/wp-content/uploads/2019/06/combined-gif2sl.gif" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  GitKraken Git GUI &lt;em&gt;&lt;a href="https://www.gitkraken.com/git-client"&gt;https://www.gitkraken.com/git-client&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;It's great UI and easy structure help me get my head around git pretty well :D&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_4Kf2K4n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.gitkraken.com/img/index/gk-product-2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_4Kf2K4n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.gitkraken.com/img/index/gk-product-2.png" alt="" width="880" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Postman &lt;em&gt;&lt;a href="https://www.postman.com"&gt;https://www.postman.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;REST requests&lt;/li&gt;
&lt;li&gt;documentation

&lt;ul&gt;
&lt;li&gt;by importing the swagger OpenAPI Specification 3.x &amp;lt;= this is love 💗&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_vMRAaWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.postman.com/assets/response-screenshot.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_vMRAaWo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.postman.com/assets/response-screenshot.svg" alt="" width="880" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  NOSQLBooster for MongoDB &lt;em&gt;&lt;a href="https://nosqlbooster.com"&gt;https://nosqlbooster.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pYXLTvmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://nosqlbooster.com/s3/img/home-intellisense.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pYXLTvmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://nosqlbooster.com/s3/img/home-intellisense.gif" alt="" width="880" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  MongoDB Compass &lt;em&gt;&lt;a href="https://www.mongodb.com/products/compass"&gt;https://www.mongodb.com/products/compass&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;I use multiple tools to access MongoDB because I haven't (yet) found the tool with all features I want :D&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tgpzwIfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://webassets.mongodb.com/_com_assets/cms/movies-o2aafiup8h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tgpzwIfl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://webassets.mongodb.com/_com_assets/cms/movies-o2aafiup8h.png" alt="" width="880" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Windows Terminal &lt;em&gt;&lt;a href="https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701"&gt;https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;restored my love for Windows&lt;/li&gt;
&lt;li&gt;PowerShell 7 is also very nice! &lt;em&gt;&lt;a href="https://github.com/PowerShell/PowerShell"&gt;https://github.com/PowerShell/PowerShell&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PAPtF9ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://store-images.s-microsoft.com/image/apps.64156.13926773940052066.16e93a5b-b25f-4aaf-8a38-77375e237879.00013886-8351-473f-9acd-7fcce9ee7388%3Fw%3D1399%26h%3D792%26q%3D90%26format%3Djpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PAPtF9ax--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://store-images.s-microsoft.com/image/apps.64156.13926773940052066.16e93a5b-b25f-4aaf-8a38-77375e237879.00013886-8351-473f-9acd-7fcce9ee7388%3Fw%3D1399%26h%3D792%26q%3D90%26format%3Djpg" alt="" width="880" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  PowerToys &lt;em&gt;&lt;a href="https://github.com/microsoft/PowerToys"&gt;https://github.com/microsoft/PowerToys&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;h3&gt;
  
  
  PowerToys Run &lt;code&gt;ALT&lt;/code&gt; + &lt;code&gt;SPACE&lt;/code&gt; opens a run window &lt;em&gt;&lt;a href="https://github.com/microsoft/PowerToys/wiki/PowerToys-Run-Overview"&gt;https://github.com/microsoft/PowerToys/wiki/PowerToys-Run-Overview&lt;/a&gt;&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LpflrLYh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/microsoft/PowerToys/wiki/images/Launcher/QuickStart.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LpflrLYh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://github.com/microsoft/PowerToys/wiki/images/Launcher/QuickStart.gif" alt="" width="880" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  FancyZones
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;to arrange windows on my 21:9 Philips Monitor (yep, the wide screens are worth the price!) &lt;em&gt;&lt;a href="https://github.com/microsoft/PowerToys/wiki/FancyZones-Overview"&gt;https://github.com/microsoft/PowerToys/wiki/FancyZones-Overview&lt;/a&gt;&lt;/em&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qoBc16Jl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/microsoft/PowerToys/wiki/images/fancyzones/WindowEditor.png" alt="" width="880" height="495"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  LockHunter &lt;em&gt;&lt;a href="https://lockhunter.com"&gt;https://lockhunter.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;A small tool that shows me what process locks a file if I want to delete it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wYwIvN7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lockhunter.com/assets/screenshots/mainScreenshotFull.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wYwIvN7a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://lockhunter.com/assets/screenshots/mainScreenshotFull.png" alt="" width="801" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Docker &lt;em&gt;&lt;a href="https://www.docker.com/"&gt;https://www.docker.com/&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;With WSL 2 enabled =&amp;gt; Developer Love &lt;em&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-index"&gt;https://docs.microsoft.com/en-us/windows/wsl/wsl2-index&lt;/a&gt;&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  VS Code &lt;em&gt;&lt;a href="https://code.visualstudio.com"&gt;https://code.visualstudio.com&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Markdown editing, file editing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Kze_beZH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1487073/58344409-70473b80-7e0a-11e9-8570-b2efc6f8fa44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Kze_beZH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/1487073/58344409-70473b80-7e0a-11e9-8570-b2efc6f8fa44.png" alt="" width="880" height="661"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  nomacs | Image Lounge &lt;em&gt;&lt;a href="https://nomacs.org"&gt;https://nomacs.org&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Great image viewer, definitely better than the windows default image viewer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eegH-9fu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nomacs.org/wp-content/uploads/2014/11/nomacs-gestures.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eegH-9fu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://nomacs.org/wp-content/uploads/2014/11/nomacs-gestures.png" alt="" width="880" height="747"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  SpeedCrunch &lt;em&gt;&lt;a href="https://speedcrunch.org/"&gt;https://speedcrunch.org/&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;a great alternative for the windows calculator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uy4YSKOA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://speedcrunch.org/_static/advanced_features.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uy4YSKOA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://speedcrunch.org/_static/advanced_features.png" alt="" width="567" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Winmerge &lt;em&gt;&lt;a href="https://winmerge.org"&gt;https://winmerge.org&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;compare different files (old, but gold)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EgosXuT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://winmerge.org/screenshots/filecmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EgosXuT6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://winmerge.org/screenshots/filecmp.png" alt="" width="880" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Grammarly &lt;em&gt;&lt;a href="https://app.grammarly.com/"&gt;https://app.grammarly.com/&lt;/a&gt;&lt;/em&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;because my grammar sucks&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Dev.To&lt;/strong&gt;
&lt;/h1&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Because I ❤️ the community 🧍🧍‍♀️
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;And now it's your turn. What tools enable you to write great software?&lt;br&gt;
What tools do you particularly like and how do you use them?&lt;br&gt;
Let me know in the comments!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>tooling</category>
      <category>tips</category>
    </item>
    <item>
      <title>How to handle BigData?</title>
      <dc:creator>klyse</dc:creator>
      <pubDate>Thu, 29 Aug 2019 19:33:27 +0000</pubDate>
      <link>https://dev.to/klyse/how-to-handle-bigdata-a0o</link>
      <guid>https://dev.to/klyse/how-to-handle-bigdata-a0o</guid>
      <description>&lt;h1&gt;
  
  
  Abstract
&lt;/h1&gt;

&lt;p&gt;I'm currently working on a new (exciting 🤩) project. The project contains data storage💾 and analyzation. One of the most important characteristics of this BigData project is data integrity.&lt;br&gt;
Here are the hard facts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I'm using MongoDB as data storage&lt;/li&gt;
&lt;li&gt;asp.net core as web service framework&lt;/li&gt;
&lt;li&gt;.net core to analyze/collect the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are a few so-called collectors that harvest information from different sources. Those collectors are written in c# and send data to the so-called Raw.Api🌐. The Raw.Api handles the information and takes care to make inserts into the MongoDb collections. Since data integrity is crucial to this project I devided the operations in three steps:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--59VGFNRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/4/46/BigData_2267x1146_white.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--59VGFNRi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/4/46/BigData_2267x1146_white.png" alt="" width="880" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Transaction scopes
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The first transaction scope is: every collector must never send incomplete information. As soon as the data is transferred to the API all information must be written all at once into the database collections. Partial inserts are never allowed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second transaction scope is: as soon as the data is dumped into a temporary collection a background worker starts and writes information to the final collection(s). This must again happen in a DB transaction. Partial updates are not allowed. MongoDB 4.2 supports ACID across multiple collections as far as I know.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The third transaction scope is: the analyzer must read all data at once and work on the information. A partial refresh is not allowed because the data might have been updated in the meantime and this would lead to inconsistent information.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Handle the data⚙️
&lt;/h1&gt;

&lt;p&gt;There are multiple collectors and every collector sends information every now and then. For example every 5 minutes. One transaction of data consists of approximately 40mb. 40mb x 12 transactions per hour * 24 hours * 365 = ~4tb. That's too much data📚. Therefore every dataset has a specific Data Save Interval for example daily, hourly, etc.&lt;br&gt;
Every new request replaces all the data from the previous request as long as the request is within the same Data Save Interval.&lt;br&gt;
Every document is stored with a "Data Scope" and a collection date time stamp. A "Data Scope" is, for example, a set of data that can be uniquely identified. This could be a domain (&lt;a href="http://www.google.com"&gt;www.google.com&lt;/a&gt;). The first step of writing information from the temporary collection to the history collection is to delete every document in the same "Data Scope" and in the same "Data Save Interval". This guarantees that if less information was transmitted by the collector (because someone deleted data which is an allowed scenario) the "old" information is deleted. Then every document is inserted into the History collection. The same happens for a Current collection to make sure that access to the current information is faster.&lt;/p&gt;

&lt;h1&gt;
  
  
  Analysis
&lt;/h1&gt;

&lt;p&gt;The analysis happens on a base of rules and I'm not yet sure how to do that yet. Is there a great tool or programming language to archive that?&lt;/p&gt;

&lt;p&gt;Any ideas or suggestions for this project? I'm happy to discuss 😜&lt;/p&gt;

</description>
      <category>bigdata</category>
      <category>csharp</category>
      <category>mongodb</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
