<?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: Sogeti</title>
    <description>The latest articles on DEV Community by Sogeti (@sogeti).</description>
    <link>https://dev.to/sogeti</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%2Forganization%2Fprofile_image%2F1166%2Fd99d1134-36ef-42c6-95b7-630c91ff7eab.png</url>
      <title>DEV Community: Sogeti</title>
      <link>https://dev.to/sogeti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sogeti"/>
    <language>en</language>
    <item>
      <title>Is low code replacing traditional development?</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Mon, 20 Jul 2020 06:12:59 +0000</pubDate>
      <link>https://dev.to/sogeti/is-low-code-replacing-traditional-development-41a7</link>
      <guid>https://dev.to/sogeti/is-low-code-replacing-traditional-development-41a7</guid>
      <description>&lt;p&gt;&lt;small&gt;&lt;em&gt;Originally posted on SogetiLabs: &lt;a rel="noreferrer noopener" href="https://labs.sogeti.com/is-low-code-replacing-traditional-development/"&gt;&lt;/a&gt;&lt;a href="https://labs.sogeti.com/is-low-code-replacing-traditional-development/"&gt;https://labs.sogeti.com/is-low-code-replacing-traditional-development/&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Spoiler alert; no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Low code vs Traditional Dev
&lt;/h2&gt;

&lt;p&gt;My colleague, friend and SogetiLabs Fellow &lt;a href="https://labs.sogeti.com/experts/daniel-laskewitz/"&gt;Daniel Laskewitz&lt;/a&gt; and I frequently talk about this topic. His field of expertise as Microsoft MVP covers the Microsoft PowerPlatform including low code systems like Power Automate (formerly Flow).&lt;/p&gt;

&lt;p&gt;All too often people see a division between low code and traditional development using languages like C#, Java, TypeScript and Go.&lt;br&gt;&lt;br&gt;
In the real world however, these systems work together perfectly.&lt;/p&gt;

&lt;p&gt;Most of the times, you cannot solve a problem with &lt;em&gt;only&lt;/em&gt; low code. Think about scenario’s where you should link to old legacy systems or complex API calls. In those cases low code without any enhancement cannot natively connect to those systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Behold custom connectors
&lt;/h2&gt;

&lt;p&gt;In the Microsoft ecosystems, &lt;a href="https://docs.microsoft.com/en-us/connectors/custom-connectors/"&gt;custom connectors&lt;/a&gt; allow you to bridge this gap. This way, the low code system can interact with any system you write a connector for. This may be common knowledge, but the fact is that most developers do not see how big this really is.&lt;/p&gt;

&lt;p&gt;This means you can link any PowerApp, Microsoft Flow, or LogicApps to your custom connector, and reuse those within your entire organisation.&lt;br&gt;&lt;br&gt;
You could even publicly publish these if you have a service you want to expose. So if you are an ISV, this can help you get more traction on your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging the gap
&lt;/h2&gt;

&lt;p&gt;In the end it all comes down to developers of any system and language understanding the capabilities of the platforms they and their companies are using. For low code developers this means sometimes calling in the help of traditional developers. And more importantly, this also means traditional developers should learn that these low code systems can help you simplify (and thus speed up!) your development by using ready-to-roll systems and connectors available to you.&lt;/p&gt;

&lt;p&gt;As there are &lt;a href="https://docs.microsoft.com/en-us/connectors/connector-reference/"&gt;over 325 connectors&lt;/a&gt; available, that should really speed making connections up!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started!
&lt;/h2&gt;

&lt;p&gt;Want to explore custom connectors? Look at &lt;a href="https://docs.microsoft.com/en-us/connectors/custom-connectors/samples"&gt;these resources&lt;/a&gt; or feel free to contact me or Daniel, we strongly believe bridging this gap between low code and traditional dev is key for succes in the future of development!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cicd</category>
      <category>serverless</category>
      <category>sogetilabs</category>
    </item>
    <item>
      <title>Education in a 5 feet economy</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Wed, 22 Apr 2020 08:01:00 +0000</pubDate>
      <link>https://dev.to/sogeti/education-in-a-5-feet-economy-19fi</link>
      <guid>https://dev.to/sogeti/education-in-a-5-feet-economy-19fi</guid>
      <description>&lt;p&gt;&lt;small&gt;&lt;em&gt;Originally posted on SogetiLabs: &lt;a href="https://labs.sogeti.com/education-in-a-5-feet-economy/" rel="nofollow"&gt;&lt;/a&gt;&lt;a href="https://labs.sogeti.com/education-in-a-5-feet-economy/"&gt;https://labs.sogeti.com/education-in-a-5-feet-economy/&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Our Prime Minister Mark Rutte prepared us; the &lt;a href="https://nos.nl/artikel/2329866-1-5-meter-samenleving-als-nieuwe-normaal-blijf-updaten-en-wees-duidelijk.html"&gt;5 feet economy could be here for a while&lt;/a&gt;. How does that work in education? And what problems do we see around us?&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology Leaders
&lt;/h3&gt;

&lt;p&gt;I (try to) teach coworkers and clients on a regular basis, and do this mostly on-site to get the interaction going between everyone in the room, and also to get a sense of how people react to my presentation or my talk. I personally find it hard to get the same feedback while working remotely.&lt;/p&gt;

&lt;p&gt;Mind you; we are &lt;a href="https://www.youtube.com/watch?v=kN4FWkz0hwE"&gt;‘Technology Leaders&lt;/a&gt;‘ and are capable of doing our job and all sessions remotely. We have the tech, but do we really have the same impact? At this moment, we do not have a choice, and have to do things online.&lt;/p&gt;

&lt;h3&gt;
  
  
  Education Online
&lt;/h3&gt;

&lt;p&gt;As a father-of-three, I see these issues also on the side of education. Kids in pre-school really learn a lot in the classroom, and also from their friends in class. Want to be engaging and keep the attention of your coworkers? Try doing that for 6 or 7-year-olds…&lt;/p&gt;

&lt;p&gt;My belief is that, especially for children, learning from each other is key. This cannot be replaced by an online tool. Still, in these ‘5 feet times,’ you have to make concessions. Digital skills are important, so make sure your kids and your friends can work online.&lt;/p&gt;

&lt;p&gt;I see schools struggle with Microsoft Teams, Skype, with MOOC environments and with technology in general. I see this as a fail from IT companies; We always talk about inclusion, but it is still difficult to get everyone online working together. We have done a very good job making sure ‘we’ the IT people can do everything online, but we see educators or parents in general struggling with technology.&lt;/p&gt;

&lt;h3&gt;
  
  
  Help the educators, help each other
&lt;/h3&gt;

&lt;p&gt;Big things start small; My door is always open, and I (time permitting) am always available for a quick tip or some help. Keep in mind that using Teams or Skype or Zoom is second-nature to ‘us’, for some parents or teachers this can be challenging. By helping another parent, simply by explaining how a tool works, you already have &lt;strong&gt;one more&lt;/strong&gt; person that uses the tool. Maybe you can lend out a spare laptop for someone not having those resources. Maybe you can fix their internet, or setup their environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Small things count, we can make a difference together.&lt;/strong&gt;
&lt;/h3&gt;

</description>
      <category>sogetilabs</category>
    </item>
    <item>
      <title>Does language matter?</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Wed, 18 Mar 2020 07:31:53 +0000</pubDate>
      <link>https://dev.to/sogeti/does-language-matter-4597</link>
      <guid>https://dev.to/sogeti/does-language-matter-4597</guid>
      <description>&lt;p&gt;&lt;small&gt;&lt;em&gt;Originally posted on SogetiLabs: &lt;a href="https://labs.sogeti.com/does-language-matter/" rel="nofollow"&gt;&lt;/a&gt;&lt;a href="https://labs.sogeti.com/does-language-matter/"&gt;https://labs.sogeti.com/does-language-matter/&lt;/a&gt;&lt;/em&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;In my previous blog I stated my learning goal for 2020: Learning (or getting a better understanding) of the &lt;a href="https://golang.org/"&gt;Go language&lt;/a&gt;. Currently I’m studying various courses, and have to give huge credits to &lt;a href="https://www.linkedin.com/in/tamcleod/"&gt;Todd McLeod&lt;/a&gt; for his excellent work on courses on this subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with what you were given
&lt;/h2&gt;

&lt;p&gt;In many cases I have to work what is given. If I am helping a client running Java with Docker, I cannot simply move them to another language or framework, just because that seems a better technical solution. I have to keep in mind that people and companies have invested in a language or framework, and sometimes it seems almost a religious feud (Windows vs Linux) instead of an objective view on the subject. So in a way, a language does not matter in my work as a consultant or architect. I have my preferences, but cannot force them onto a group just for sake of my own reasons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Go! (pun intended)
&lt;/h2&gt;

&lt;p&gt;Go is a very elegant and fast language. Testing is built right into the language, as is documentation. It pretty much runs on any OS, and does that really fast.&lt;/p&gt;

&lt;p&gt;The authors (Robert Griesemer, Rob Pike, and Ken Thompson) wanted to address criticism of other languages in use at Google, but keep their useful characteristics (&lt;a href="https://en.wikipedia.org/wiki/Go_(programming_language)"&gt;Wikipedia&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;static typing and run-time efficiency (like C++)&lt;/li&gt;
&lt;li&gt;readability and usability (like Python or JavaScript)&lt;/li&gt;
&lt;li&gt;high-performance networking and multiprocessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Go everything revolves around &lt;strong&gt;ease of programming&lt;/strong&gt; and frankly, it is just plain fun coding in Go! I’m amazed with the speed of coding and simplicity of concurrency. Numerous IDE’s are available, making it easy to start with the language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What language do you choose?
&lt;/h2&gt;

&lt;p&gt;If you are in a greenfield environment, or want to create services that have the need for speed; think beyond your comfort zone. Experiment with languagues and frameworks. See what fits for your purpose.&lt;/p&gt;

&lt;p&gt;In any case, take a look at Go with your team, and let me know what you think of it!&lt;/p&gt;

</description>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>2020: Keep on learning</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Wed, 01 Jan 2020 19:32:33 +0000</pubDate>
      <link>https://dev.to/sogeti/2020-keep-on-learning-lmm</link>
      <guid>https://dev.to/sogeti/2020-keep-on-learning-lmm</guid>
      <description>&lt;p&gt;&lt;em&gt;This blog was originally posted under &lt;a href="https://labs.sogeti.com/2020-keep-on-learning/"&gt;https://labs.sogeti.com/2020-keep-on-learning/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As the new year starts, many of us have New Year’s resolutions, and many of those will eventually perish within a month or two.&lt;/p&gt;

&lt;h2&gt;
  
  
  New Year, New Technology
&lt;/h2&gt;

&lt;p&gt;I don’t have any resolutions. The only thing I try to do each year is to learn a new technique or language. &lt;em&gt;Please note that &lt;strong&gt;new&lt;/strong&gt; means&lt;/em&gt; _ &lt;strong&gt;new to me&lt;/strong&gt; _ &lt;em&gt;and not necessarily a brand new technique&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Why? In my day-job I focus on designing cloud native systems and architecture, and most of my ‘programming’ is done in Visio and PowerPoint. As my roots are in Software Engineering, I keep myself up-to-date by learning new languages and techniques.&lt;/p&gt;

&lt;p&gt;For the upcoming year I’ve already made my choice. I started out with the following short-list.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://golang.org/"&gt;Go&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Creating the short-list
&lt;/h2&gt;

&lt;p&gt;The reason I chose these techniques is not random. In my work as an external examiner for the University of Applied Sciences Avans and Fontys in the Netherlands, I see the work of many students each year. They inspire me to look at specific techniques that normally do not cross my path. In my day-to-day work, the most used languages are C#, TypeScript, Java, and JavaScript languages and frameworks like Angular.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scala
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Scala is a general-purpose programming language providing support for functional programming and a strong static type system. Designed to be concise, many of Scala’s design decisions aimed to address criticisms of Java.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Wikipedia&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Functional programming is something that I do not see often in my day-to-day job, so I was intrigued by the capabilities of this language. Also, some very fast and popular software is written in Scala. Examples are: Apache Kafka, Apache Spark and Akka.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Rust
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Rust is a multi-paradigm system programming language focused on safety, especially safe concurrency. Rust is syntactically similar to C++, but is designed to provide better memory safety while maintaining high performance.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Wikipedia&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Originally invented by Mozilla and used within Firefox and Dropbox. Rust has been the “most loved programming language” in the Stack Overflow Developer Survey every year since 2016, so that drew my attention.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Go
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Go, also known as Golang, is a statically typed, compiled programming language designed at Google by Robert Griesemer, Rob Pike, and Ken Thompson. Go is syntactically similar to C, but with memory safety, garbage collection, structural typing, and CSP-style concurrency.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Wikipedia&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Go has been around for quite some time, and has an &lt;a href="https://en.wikipedia.org/wiki/Go_(programming_language)#Applications"&gt;impressive list&lt;/a&gt; of applications that were built with the language. Kubernetes, OpenShift, Docker and the list goes on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing my 2020 technique
&lt;/h2&gt;

&lt;p&gt;For an internal project, we were looking for a tool to provides us programmability against a multitude of APIs. Instead of grabbing an off-the-shelve product, I investigated tools and frameworks that could help us build an MVP, fast and reliably. This eventually made me look into Terraform Custom Providers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Terraform, a Provider is the logical abstraction of an upstream API. This guide details how to build a custom provider for Terraform.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;a href="https://www.terraform.io/docs/extend/writing-custom-providers.html" rel="noreferrer noopener"&gt;&lt;/a&gt;&lt;a href="https://www.terraform.io/docs/extend/writing-custom-providers.html"&gt;https://www.terraform.io/docs/extend/writing-custom-providers.html&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Terraform will let you wrap &lt;strong&gt;any&lt;/strong&gt; API, so it will enable us to wrap our ITSM tooling, Monitoring tooling and what have you not.&lt;/p&gt;

&lt;p&gt;As Terraform and the custom providers are written in Go, that was my main reason to dive into this language. I’ve created a Github repo with an example custom provider, &lt;a href="https://github.com/prombouts/terraform-provider-test"&gt;find it here on Github&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep on learning
&lt;/h2&gt;

&lt;p&gt;I’m curious if any of you are also keen on ‘staying relevant’ and want to keep up with new techniques and languages. And, what techniques and languages do you try out and investigate? Please feel free to let me know, and contact me on &lt;a href="https://www.linkedin.com/in/peterrombouts78/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="https://twitter.com/prombouts/"&gt;Twitter&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Infrastructure-as-Code with Pulumi</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Mon, 16 Dec 2019 14:49:36 +0000</pubDate>
      <link>https://dev.to/sogeti/infrastructure-as-code-with-pulumi-86g</link>
      <guid>https://dev.to/sogeti/infrastructure-as-code-with-pulumi-86g</guid>
      <description>&lt;p&gt;Using a public cloud like Microsoft Azure or Amazon AWS? Chances are you’ve been using templates like &lt;a href="https://docs.microsoft.com/en-us/azure/azure-resource-manager/template-tutorial-create-first-template?tabs=azure-powershell"&gt;ARM&lt;/a&gt; or &lt;a href="https://aws.amazon.com/cloudformation/"&gt;CloudFormation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hashicorp has done a terrific job making &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; with the ability to template &lt;strong&gt;any&lt;/strong&gt; API, and deploy and manage stacks in Azure, AWS and many, many more.&lt;/p&gt;

&lt;p&gt;I’ve been following &lt;a href="https://www.pulumi.com/"&gt;Pulumi&lt;/a&gt;for a while, and their approach is a bit different than the previous stated tools.&lt;/p&gt;

&lt;p&gt;Pulumi states their product as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Modern Infrastructure as Code.&lt;/p&gt;

&lt;p&gt;Declare cloud infrastructure using real languages. Enable developers and operators to work better together.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With ‘real’ languages they mean programming languages. At JavaScript, TypeScript, Python, Go, or any .NET language, including C#, F#, and VB are  supported. I did some testing with C#, and although it is in preview, it works great:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lLkjLT1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_0_languages.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lLkjLT1w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_0_languages.png%3Fw%3D840" alt="Pulumi_0_Languages"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Pulumi
&lt;/h2&gt;

&lt;p&gt;The install is pretty simple. &lt;a href="https://www.pulumi.com/docs/get-started/install/"&gt;This page&lt;/a&gt; will get you up and running in no time. I personally used Chocolatey but you can download the tool for Windows, MacOS and Linux if you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started with Azure
&lt;/h2&gt;

&lt;p&gt;The getting started guides work great. The only thing you need (in my example for Azure) is an account. The page &lt;a href="https://www.pulumi.com/docs/get-started/azure/"&gt;https://www.pulumi.com/docs/get-started/azure/&lt;/a&gt; show you a step-by-step guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying resources
&lt;/h3&gt;

&lt;p&gt;I’ve picked a simple setup, having one resource group in Azure, with one Storage Account. To deploy the stack to Azure, a simple ‘pulumi up’ command fires up Pulumi. Just like Terraform, you can see what will happen if you deploy this command. In this case you see that a Stack in Pulumi is created, and a resourceGroup and storage account will be setup in Azure:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bTJJ-sEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_1_deployfirsttime.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bTJJ-sEb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_1_deployfirsttime.png%3Fw%3D840" alt="Pulumi_1_deployfirsttime"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After choosing ‘yes’, you will see Pulumi actually deploying your stack. In the picture below the account has been created, and we see the output plus duration (don’t worry, the storage account has been deleted so the key not valid anymore):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UOGVyI2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_2_deploymentcreated.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UOGVyI2r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_2_deploymentcreated.png%3Fw%3D840" alt="Pulumi_2_deploymentcreated"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating resources
&lt;/h3&gt;

&lt;p&gt;The next step shows what happens if we update something in the stack. In this case, we have updated that the storage account only allows HTTPS traffic. The pulumi up command shows us the expected changes, and shows us it will update the storage account:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JnKcCZ8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_3_incrementalupdate.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JnKcCZ8y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_3_incrementalupdate.png%3Fw%3D840" alt="Pulumi_3_incrementalupdate"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After choosing yes, the update will start, and it will display the next image. As you can see, 1 resource was updated, and 2 were unchanged:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zOkdnD3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_4_incrementcompleted.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zOkdnD3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_4_incrementcompleted.png%3Fw%3D840" alt="Pulumi_4_incrementcompleted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Destroying resources
&lt;/h3&gt;

&lt;p&gt;To destroy your resources, pulumi destroy will tear down everything, up until the stack in Pulumi itself:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7VIg_rnP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumi_5_destroy.png%3Fw%3D840" alt="Pulumi_5_destroy"&gt;
&lt;/h3&gt;

&lt;h2&gt;
  
  
  Wait, Pulumi Stack?
&lt;/h2&gt;

&lt;p&gt;Pulumi defines stacks of your deploys. To quote them on this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every Pulumi program is deployed to a stack. A stack is an isolated, independently configurable instance of a Pulumi program. Stacks are commonly used to denote different phases of development (such as development, staging and production) or feature branches (such as feature-x-dev, jane-feature-x-dev).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, you can look at these like your set of resources. You can group them under Projects so it can be easier to manage. The webinterface of Pulumi is clean, and you can inspect all of your stacks and settings there:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yRCB5BSt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumistack.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yRCB5BSt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/pulumistack.png%3Fw%3D840" alt="PulumiStack"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This short blog is just to show you that there is more than the standard way of working with the cloud. Obviously you can use various APIs, SDKs or templates, but these sometimes can be a bit overwhelming for developers. Pulumi lets you choose your language, and makes sure your developers do not need to learn another language and still use the modern infrastructure-as-code techniques!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuredevops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Sync your Outlook 365 calendar to Google Calendar with LogicApps</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Wed, 04 Dec 2019 18:18:42 +0000</pubDate>
      <link>https://dev.to/sogeti/sync-your-outlook-365-calendar-to-google-calendar-with-logicapps-542f</link>
      <guid>https://dev.to/sogeti/sync-your-outlook-365-calendar-to-google-calendar-with-logicapps-542f</guid>
      <description>&lt;p&gt;Sometimes it is hard to keep your spouse up-to-date on all the sessions and events work-related. Most of the times I’ve been able to duplicate calendar items that are relevant for my ‘better half’.&lt;/p&gt;

&lt;p&gt;Obviously manual work makes me sad and I forget to sync some events causing a collision in the calendars. If, like me, you have kids you’ll understand this results in hoping your babysitter can make time because you forgot to add some items in your calendar &lt;strong&gt;&lt;em&gt;manually&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  LogicApps to the rescue
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/logic-apps/"&gt;LogicApps&lt;/a&gt; (and also &lt;a href="https://flow.microsoft.com/"&gt;Microsoft Flow&lt;/a&gt;) have connectors to both Office 365 and Google. Seems like a sure bet to get my sync going!&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup Google Calendar
&lt;/h3&gt;

&lt;p&gt;First of all, I’ve created a &lt;strong&gt;new&lt;/strong&gt; calendar in Google. I want to separate my personal items from work, and want the ability to enable/disable the view. A new calendar is the easiest way of doing this. Also if you share your Work calendar, the people you share your calendars with, can easily differentiate between what is work and private. Google has an excellent manual, click on &lt;a href="https://support.google.com/calendar/answer/37095?hl=en"&gt;this link to follow the setup&lt;/a&gt; of your new calendar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup LogicApp
&lt;/h3&gt;

&lt;p&gt;First, you will have to setup your LogicApp. If you don’t know how, follow &lt;a href="https://docs.microsoft.com/en-us/azure/logic-apps/quickstart-create-first-logic-app-workflow#sign-in-to-the-azure-portal"&gt;this tutorial from Microsoft&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The first step is to add the trigger for Outlook. I’ve used the following trigger: &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oS1Mbsej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/11/calendaro365.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oS1Mbsej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/11/calendaro365.png%3Fw%3D840" alt="CalendarO365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will allow me to react on added, updated and deleted events. I check this every hour, and track upcoming events 300 days in the future. Because I don’t really care about days in the past, I set that to 5 days. Adjust these to facilitate your own needs. I’ve set the interval to 15 minutes, which works for me. If you have a long interval, you could get 429 errors from Google because you’re pushing too many changes to the Calendar at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling events
&lt;/h3&gt;

&lt;p&gt;The LogicApp receives adds, updates and deletions. In my very simple sync, I add the Outlook ID to the description field of the event. Because I’m not interested (or lazy) in the actual updated info, I’ll just delete all events with the incoming ID, and create the event as new:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QM-cJ2V3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/listanddelete.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QM-cJ2V3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/listanddelete.png%3Fw%3D840" alt="ListAndDelete"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So at this point any item created from Outlook is deleted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insert Google Calendar items
&lt;/h3&gt;

&lt;p&gt;Because we deleted the existing calendar item, we do not care if this is a update or create. The only events we can ignore are the &lt;strong&gt;deleted&lt;/strong&gt; ones as we already deleted the calendar items. We use a switch for this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MSRKBloc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/switch.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSRKBloc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/switch.png%3Fw%3D840" alt="Switch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, the default action is to create an event, and in the &lt;strong&gt;deleted&lt;/strong&gt; case we simply do nothing.&lt;/p&gt;

&lt;p&gt;The events of Outlook differ a tiny bit from the events in Google. If we zoom in on the event creation, please notice the &lt;strong&gt;Z&lt;/strong&gt; behind the datetimes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8QtkhP3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/createevent.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8QtkhP3e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/createevent.png%3Fw%3D840" alt="CreateEvent"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do not add those, Google will not accept the JSON as it will give an error on invalid data. Also seen here is the &lt;strong&gt;Outlook ID&lt;/strong&gt; I use to identify the events coming in from Outlook 365.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finishing up
&lt;/h3&gt;

&lt;p&gt;At this moment you can save the logic app and you are done! You can obviously do more fancypants stuff like adding more info to the events, or handling CRUD more elegantly than me, but the basics are there for you to play with!&lt;/p&gt;

&lt;p&gt;Below is an example of my personal calendars, and the newly synced black work calendar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yubIkDxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/resultcalendar.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yubIkDxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/resultcalendar.png%3Fw%3D840" alt="ResultCalendar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Costs
&lt;/h3&gt;

&lt;p&gt;But wait; This stuff costs money right? Absolutely. But if I look at the forecast in Azure, I see the following forecast:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a5jJQc6K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/costslogicapp.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a5jJQc6K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/12/costslogicapp.png%3Fw%3D840" alt="CostsLogicApp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is safe to say that for less than one euro, you get alot of bang per buck!&lt;/p&gt;

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

&lt;p&gt;It is easy to sync your calendar using LogicApps or Flow. Using the connectors the possibilities are virtually limitless! If you have any manual operations you want to automate, look at the connectors and create your own app for automation. Have any other ideas, please share them with the community!&lt;/p&gt;

&lt;p&gt;For the code of this app, &lt;a href="https://gist.github.com/prombouts/1af788011900ff0bb7d8ad548eabd8e3"&gt;click here to view the gist&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Software Maintainability in the Cloud Era</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Mon, 14 Oct 2019 07:33:17 +0000</pubDate>
      <link>https://dev.to/sogeti/software-maintainability-in-the-cloud-era-kci</link>
      <guid>https://dev.to/sogeti/software-maintainability-in-the-cloud-era-kci</guid>
      <description>&lt;p&gt;The shift to cloud, and with that, to PaaS services or low code alternatives like &lt;a href="https://azure.microsoft.com/en-us/services/logic-apps/"&gt;LogicApps&lt;/a&gt; push the actual code developers see and use to the background.&lt;/p&gt;

&lt;p&gt;There is an &lt;a href="https://www.iso.org/standard/35733.html"&gt;ISO standard&lt;/a&gt; on software quality, and the maintenance best practices are well written and explained in the book &lt;a href="https://www.amazon.com/Building-Maintainable-Software-Guidelines-Future-Proof/dp/1491954523"&gt;Building Maintainable Software&lt;/a&gt;. Within low code systems, applying these guidelines can be less obvious and it can be a difficult task automating and testing the quality of your code with tools like &lt;a href="https://www.sonarqube.org/"&gt;SonarQube&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Should we even worry about the underlying code? Absolutely. The principles still adhere and creating a spaghetti of your low code systems can cause major issues on maintenance or adding new features.&lt;/p&gt;

&lt;p&gt;Let’s focus on three points of the maintainability guidelines:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write code once&lt;/li&gt;
&lt;li&gt;Couple architecture components loosely&lt;/li&gt;
&lt;li&gt;Automate development pipeline and tests&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In &lt;strong&gt;no way&lt;/strong&gt; these are the most important items, but for this example an easy entry into the low code space.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Write code once
&lt;/h2&gt;

&lt;p&gt;Just like any other audit of software, you still can avoid writing duplicate code. In a platform like LogicApps it can be easy to repeat a custom call to something like a custom HTTP API.&lt;/p&gt;

&lt;p&gt;In traditional languages like C#, you have many options to reuse your code. You could create a library, or you can create a package and make it available via NuGet. Within low code systems, these same packaging mechanisms not always exist.&lt;/p&gt;

&lt;p&gt;Taking the example of LogicApps, the solution could be to create &lt;a href="https://docs.microsoft.com/en-us/connectors/custom-connectors/"&gt;Custom Connectors&lt;/a&gt;. These will wrap your custom API calls into a reusable component you can share within your organisation, or even outside.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Couple architecture components loosely
&lt;/h2&gt;

&lt;p&gt;If your components are tightly coupled, it can be troublesome to replace or refactor your components. The impact will be on each and every other component that has a high coupling with your part.&lt;/p&gt;

&lt;p&gt;Again taking the LogicApps for example, let’s state our LogicApp calls another component directly using HTTP. The Azure Portal gives you this out of the box, letting you call &lt;a href="https://azure.microsoft.com/en-us/services/functions/"&gt;Azure Functions&lt;/a&gt; directly from your LogicApp.&lt;/p&gt;

&lt;p&gt;This goes agains the principle of loosely coupling. The reason is that your call is directly bound to that function, so changing the interface or location of your function, impacts the LogicApp directly. In this case, it would simply break and stop working.&lt;/p&gt;

&lt;p&gt;To solve this problem, a simple solution is to decouple the LogicApp and the Azure Function using a queueing mechanism. This way, the message to the Azure Function is put on a queue by the LogicApp, and the Azure Function listens on a queue. Now, if the developer of the Azure Function changes location or even use another platform, there is no need to change the LogicApp.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Obviously this would require you to make an agreement on the contents of the messages on the queue.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Automate development pipeline and test
&lt;/h2&gt;

&lt;p&gt;Automating your CICD pipelines allows you to more easily build, test and deploy your code. In case of a language like C# or Java, you can easily run tests, build your code, and create packages or deployments. A tool like &lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure DevOps&lt;/a&gt; can combine these steps and lets you create a wealth of quality gates, checks and processes to guide your team.&lt;/p&gt;

&lt;p&gt;When using low code platforms, it can be cumbersome to get the code into your version control systems. Nevertheless, many of those platforms do give you the tooling. LogiApps for example has &lt;a href="https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-create-azure-resource-manager-templates"&gt;template creators&lt;/a&gt;, and systems like OutSystems have their own CICD ecosystem.&lt;/p&gt;

&lt;p&gt;In the end the automation allows you to more easily add steps to your CICD process, and allow you to deploy more frequently without any hassle. The addition of automated testing will absolutely be beneficial to the overall quality of your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluding
&lt;/h2&gt;

&lt;p&gt;Treat your low code just like you would any other codebase. Almost all guidelines of mainainability can be mapped to your product. Some can may require a bit more investment, but in the end I truly believe it will help building a maintainable and high-quality (low) code base.&lt;/p&gt;

&lt;p&gt;If you want to expand on the process part of high-quality software, please also take a look at the follow-up book of this series: &lt;a href="https://www.amazon.com/Building-Software-Teams-Practices-Development/dp/149195177X"&gt;Building Software Teams&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>azuredevops</category>
      <category>cicd</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Migrating from Jira to Azure DevOps</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Fri, 09 Aug 2019 08:27:32 +0000</pubDate>
      <link>https://dev.to/sogeti/migrating-from-jira-to-azure-devops-2aed</link>
      <guid>https://dev.to/sogeti/migrating-from-jira-to-azure-devops-2aed</guid>
      <description>&lt;p&gt;As far as I’m concerned, a team can use any tool they want to track their work items and planning. But, my personal favourite is &lt;a href="https://azure.microsoft.com/en-us/services/devops/"&gt;Azure DevOps&lt;/a&gt;. Currently I’m helping some teams moving their Jira projects to DevOps and this blog explains how you can do this too!&lt;/p&gt;

&lt;h2&gt;
  
  
  Uniformity and standards
&lt;/h2&gt;

&lt;p&gt;For several reasons it can be frustrating if teams use multiple tools for the same purpose. For sake of uniformity, I believe it is best to have standards within your company. In the case of my current customer, that standard is Azure DevOps.&lt;/p&gt;

&lt;p&gt;Obviously you want to migrate your work from the old to the new platform. Azure DevOps has the ability to use APIs to ingest data, and you can export Jira as well. To do this manually and figure out all the moving parts, you will have quite a challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter Solidify
&lt;/h2&gt;

&lt;p&gt;I was pointed to a really great tool by the team of &lt;a href="https://www.solidify.se/"&gt;Solidify&lt;/a&gt;, the &lt;a href="https://github.com/solidify/jira-azuredevops-migrator"&gt;Jira to Azure DevOps work item migration tool&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The Jira to Azure DevOps work item migration tool lets you export data from Jira and import it as work items in Azure DevOps or Microsoft Team Foundation Server&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sounds exactly like what we need! Because every project is different, it can be tricky setting up all the mapping of statuses, and figuring out how to connect to the correct instances.&lt;/p&gt;

&lt;p&gt;The documentation of the tool is great, but this blog will give a step-by-step approach on how to do a migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the tool
&lt;/h2&gt;

&lt;p&gt;The Github link in the beginning of this post is the starting point for all documentation of the tool. To download the release directly, point your browser to &lt;a href="https://github.com/solidify/jira-azuredevops-migrator/releases"&gt;solidify/jira-azuredevops-migrator/releases&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing for your Jira export
&lt;/h2&gt;

&lt;p&gt;The Github repo contains samples at &lt;a href="https://github.com/solidify/jira-azuredevops-migrator/blob/master/docs/Samples/config-scrum.json"&gt;this location&lt;/a&gt;. Worth noting is that the setup of the configuration file is essential. See the first few lines of the file below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"source-project": "MyJiraProject", "target-project": "DevOps Project Name", "query": "project = 'MyJiraProject'", "workspace": "C:\\Temp\\JiraExport\\", "epic-link-field": "Epic Link", "sprint-field": "Sprint", "download-options": 7, "batch-size": 20, "log-level": "Info", "attachment-folder": "Attachments", "user-mapping-file": "", "base-area-path": "", "base-iteration-path": "", "ignore-failed-links": true, "process-template": "Agile",
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see, the source and target fields correspond with your data in Jira and DevOps respectively. The process-template field corresponds to what you have setup in DevOps, like CMMI, Scrum or Agile (or Basic).&lt;/p&gt;

&lt;p&gt;Next to setup, are the mappings. As you might know, some tasks, statuses or other properties differ in Jira and DevOps. Let’s say you have a Task in Jira with status &lt;strong&gt;Review&lt;/strong&gt;. You might not have the same status in DevOps, so you want to &lt;strong&gt;map&lt;/strong&gt; that to another status type. The same goes for types like ‘User Story’ or ‘Epic’:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"type": [{ "source": "Feature", "target": "Feature" }, { "source": "Epic", "target": "Epic" }, { "source": "Story", "target": "User Story" }, { "source": "Bug", "target": "Bug" }, { "source": "Task", "target": "User Story" }, { "source": "Sub-task", "target": "Task" }]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Within the configuration file, you should specify all these mappings. If you fail to add one, the export tool will generate an error, so you can add the missing mapping and re-export Jira.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Jira Export tool
&lt;/h2&gt;

&lt;p&gt;If the config file is setup, you can run the tool using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jira-export.exe -u p.rombouts@yourdomain.com -p api-token-here --url https://yourinstance.atlassian.net --config config.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see I’ve setup the command using the API token. Please refer to &lt;a href="https://github.com/solidify/jira-azuredevops-migrator/blob/master/docs/overview.md"&gt;this page&lt;/a&gt; on how to get an API token for Jira. In theory a password should work, but it did not work in my case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting the export results
&lt;/h2&gt;

&lt;p&gt;When the tool runs, you will see results directly in your CLI interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ jira-export.exe -u username -p apitoken --url https://something.atlassian.net --config config.json Jira Exporter v2.2.25 Copyright (c) Solidify Wow, there's a newer release out (v2.2.31)! We recommend downloading it for latest features and fixes. [I][10:12:11] Connecting to Jira... [I][10:12:11] Retrieving Jira fields... [I][10:12:12] Retrieving Jira link types... [I][10:12:12] Export started. Exporting 705 items. [I][10:12:13] Initializing Jira field mapping... [I][10:12:14] Processing 1/705 - 'Item-790'. [W][10:12:14] Could not find user 'someuser1@yourdomain.com' identity in user map. Using original identity 'someuser1@yourdomain.com'. [W][10:12:15] Could not find user 'someuser2@yourdomain.com' identity in user map. Using original identity 'someuser2@yourdomain.com'. [I][10:12:15] Processing 2/705 - 'Item-789'.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As seen in the above start of the export, some users could not be found in the mapping. This is done on purpose by me; I want the exact same users from Jira to be used in Azure DevOps. Optionally you could create a users.txt file, and map users in Jira to different users in Azure DevOps. If any fields or mappings are missing, you will also see this in your console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus&lt;/strong&gt; : In the export directory specified in the config tool, the output is also saved to a file called something like &lt;strong&gt;jira-export-log-190809-101211.txt&lt;/strong&gt;. So you do not need to save the output yourself and just let it roll!. The export can take quite some time, so sit back and grab a coffee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Azure DevOps Import tool
&lt;/h2&gt;

&lt;p&gt;If the previous step completed without any mishaps, and all looks OK in the log file, you can import your Jira exported data into Azure DevOps.&lt;/p&gt;

&lt;p&gt;Again using the same config file, you can run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wi-import --token personal-access-token-here --url https://yourorganisation.visualstudio.com --config config.json --force
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;As you can see I’ve setup the command using the Personal Access Token. Please refer to &lt;a href="https://github.com/solidify/jira-azuredevops-migrator/blob/master/docs/overview.md"&gt;this page&lt;/a&gt; on how to get one for Azure DevOps.&lt;/p&gt;

&lt;p&gt;Again this tool will provide you with verbose information, and will also dump a logfile to the same folder as where the Jira export resided.&lt;/p&gt;

&lt;p&gt;If everything went OK; you are now good to go in Azure DevOps!&lt;/p&gt;

&lt;h2&gt;
  
  
  Finalizing and cleaning up
&lt;/h2&gt;

&lt;p&gt;Process wise it is smart to plan this ahead, with your team. You should have a cut-over date, and make sure that access to the old Jira project is read-only, or turned off, after you’re done exporting/importing. You do &lt;strong&gt;not&lt;/strong&gt; want to maintain two boards for a team!&lt;/p&gt;

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

&lt;p&gt;Hope you find this manual useful, the tool helped me out a great deal. The documentation is excellent and it is actively maintained by the fabulous team of Solidify. Can’t thank you guys enough!&lt;/p&gt;

</description>
      <category>azuredevops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Scanning Blob storage for viruses with Azure Functions and Docker</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Mon, 15 Apr 2019 19:00:00 +0000</pubDate>
      <link>https://dev.to/sogeti/scanning-blob-storage-for-viruses-with-azure-functions-and-docker-1ph9</link>
      <guid>https://dev.to/sogeti/scanning-blob-storage-for-viruses-with-azure-functions-and-docker-1ph9</guid>
      <description>&lt;p&gt;While working on a side project, someone asked me how to scan for viruses in a cloud native and serverless landscape. That made me think about a project I did a couple of years back. During that project we used &lt;a href="https://www.clamav.net/"&gt;ClamAV&lt;/a&gt; that was installed on a VM. We scanned files that end-users uploaded within an ASP.NET application, and everything was hosted on datacenter VMs somewhere in the Netherlands.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ClamAV® is an open source antivirus engine for detecting trojans, viruses, malware &amp;amp; other malicious threats.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this blogpost I will show a proof of concept using a Docker image and Azure Functions to create a simple automated virusscanner for Azure Blob storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Docker image
&lt;/h2&gt;

&lt;p&gt;First of all some prerequisites. In this demo I’m running Docker for Windows on my Desktop, and coding in Visual Studio 2019 with local Azure Functions. I’ve already setup a Azure Storage account that I can use as a trigger in my Functions.&lt;/p&gt;

&lt;p&gt;First, let’s find a Docker image with &lt;a href="https://www.clamav.net/"&gt;ClamAV&lt;/a&gt; installed.&lt;/p&gt;

&lt;p&gt;There are several to be found on DockerHub, I’ve pulled &lt;a href="https://hub.docker.com/r/mkodockx/docker-clamav/"&gt;mkodockx/docker-clamav&lt;/a&gt; and it works seamlessly in my demo. To run this, simply execute the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 127.0.0.1:3310:3310 mk0x/docker-clamav:alpine
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It should be running and listening on the default port on localhost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Azure Function
&lt;/h2&gt;

&lt;p&gt;The second step is to create a project for our Azure Function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MK5H6BV8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/04/createproject.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MK5H6BV8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/04/createproject.png%3Fw%3D840" alt="createproject"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re using the blob triggered function, because we want to scan all new blobs in the location ‘upload’.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JJV5IfXj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/04/blobtrigger.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JJV5IfXj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/04/blobtrigger.png%3Fw%3D840" alt="blobtrigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, for scanning, the following &lt;a href="https://www.nuget.org/packages/nClam"&gt;NuGet package for nClam&lt;/a&gt; should be installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Package nClam -Version 4.0.1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The actual code for scanning is pretty simple. Shown below is the code that grabs the file, uploads it to the Docker container and retrieves the status of the scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;using System.IO; using System.Linq; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; using nClam; namespace VirusScanFunction { public static class ScanBlobs { static readonly string serverName = "localhost"; static readonly int serverPort = 3310; [FunctionName("ScanBlobs")] public static void Run([BlobTrigger("upload/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log) { // Create client var clam = new ClamClient(serverName, serverPort); // Scanning for viruses... var scanResult = clam.SendAndScanFileAsync(myBlob).Result; switch (scanResult.Result) { case ClamScanResults.Clean: log.LogInformation("The file is clean!"); break; case ClamScanResults.VirusDetected: log.LogInformation("Virus Found!"); log.LogInformation("Virus name: {0}", scanResult.InfectedFiles.First().VirusName); break; case ClamScanResults.Error: log.LogInformation("Error scanning file: {0}", scanResult.RawResult); break; } } } }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That is basically it! You just created your own local virusscanner for your blob storage!&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap and considerations
&lt;/h2&gt;

&lt;p&gt;Obviously this is a PoC and runs fine ‘on my &lt;del&gt;machine&lt;/del&gt; container’. For enterprise environments you should care about what container image to use, how to handle viruses found, and what to do to mitigate problems. You obviously want to warn, and block, the person who uploaded the virus in the first place.&lt;/p&gt;

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

&lt;p&gt;Serverless and containers allow you to setup really cool concepts, and make you think outside the box. Years ago we had to install ClamAV on a VM, where now we can use containers, spin them up, scale them, and dispose when we are done. Think of the possibilities!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cicd</category>
      <category>serverless</category>
    </item>
    <item>
      <title>LogicApps monitoring with Log Analytics</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Mon, 01 Apr 2019 20:56:00 +0000</pubDate>
      <link>https://dev.to/sogeti/logicapps-monitoring-with-log-analytics-679</link>
      <guid>https://dev.to/sogeti/logicapps-monitoring-with-log-analytics-679</guid>
      <description>&lt;p&gt;Azure &lt;a href="https://azure.microsoft.com/en-us/services/logic-apps/" rel="noopener noreferrer"&gt;LogicApps&lt;/a&gt; are incredibly powerful and I believe it should be in every developers toolbox. Enterprise integrations, ready-to-use connectors and all of this with almost no code and serverless!&lt;/p&gt;

&lt;p&gt;Alas monitoring and debugging are more complex. In this blog I will explain how to add LogicApps to Log Analytics, and even track custom properties for filtering and alerting. Keep on reading for the exciting stuff!&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a LogicApp
&lt;/h2&gt;

&lt;p&gt;Let’s start out with a very simple LogicApp. This app will receive a HTTP request with an array of data, and for each item, send an email:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicappdesigner.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicappdesigner.png%3Fw%3D840" alt="LogicAppDesigner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Standard logging
&lt;/h2&gt;

&lt;p&gt;The history of runs is shown below. You can drill down and see the actual results of each call, and see what part took how long and more details.&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicapphistory.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicapphistory.png%3Fw%3D840" alt="LogicAppHistory"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter the Log Analytics workspace
&lt;/h2&gt;

&lt;p&gt;Standard logging seems fine, but what if you want to integrate this LogicApp and have alerting setup? First of all, setup a &lt;a href="https://docs.microsoft.com/en-us/azure/azure-monitor/learn/quick-create-workspace" rel="noopener noreferrer"&gt;Log Analytics workspace&lt;/a&gt;. When you created the Log Analytics Workspace, make sure your LogicApp sends logs to it. You can simply go to the Logs section of your LogicApp:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicapplogs.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogicapplogs.png%3Fw%3D840" alt="logicapplogs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, I already set mine up to the existing one. When that is done, you can click on the Log Analytics workspace, which brings up the &lt;strong&gt;overview&lt;/strong&gt; blade of your workspace:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flaworkspace.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flaworkspace.png%3Fw%3D840" alt="laworkspace"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on ‘View solutions’ on the ‘Configure monitoring solutions’ will open up the settings. Click on ‘Add’ and search for &lt;strong&gt;Logic Apps Management&lt;/strong&gt;. Please note that this is in &lt;strong&gt;preview&lt;/strong&gt; at the moment of writing:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flamanagement.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flamanagement.png%3Fw%3D840" alt="lamanagement"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you select &lt;strong&gt;Create&lt;/strong&gt; and choose the correct settings, it will show the runs and logging in the &lt;strong&gt;Workspace Summary&lt;/strong&gt; section of Log Analytics:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flaoverview-1.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flaoverview-1.png%3Fw%3D840" alt="laoverview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, we see a nice chart with basic info. Drill down on that and you will see all LogicApps reporting to this workspace. Note that I’ve only configured one:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flalogs.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flalogs.png%3Fw%3D840" alt="lalogs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Detailed Logging and resubmit LogicApps
&lt;/h2&gt;

&lt;p&gt;If we zoom in even further we can rerun several LogicApps and view more detailed information:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flazoomedin.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flazoomedin.png%3Fw%3D840" alt="lazoomedin"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we can click on Logs and zoom in even further, or we can resubmit multiple LogicApps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking custom properties
&lt;/h2&gt;

&lt;p&gt;Let’s say we have many, many events coming in, and we want to track by CustomerID. For the LogicApp, we have to define tracked properties. For this go back to the LogicApp, enter Code view, and add the properties you want to track:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"runAfter": {}, "trackedProperties": { "CustomerId": "@{items('For\_each')?['data']?['customerid']}", "Flow": "Email", "Receiver": "SomeReceiver", "Subject": "@{items('For\_each')['subject']}" }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To explain the piece of code above; I’ve added the ‘trackedProperties’ in the forEach loop, and this will send these custom properties to Log Analytics. Obviously these properties correspond to the event we got in the HTTP Request.&lt;/p&gt;

&lt;p&gt;After running this app now, we can see tracked properties in Log Analytics! If we click on the ‘ &lt;strong&gt;View&lt;/strong&gt; ‘ button, it will bring up the actual properties:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flatracking.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flatracking.png%3Fw%3D840" alt="latracking"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts and filters
&lt;/h2&gt;

&lt;p&gt;Now for the advanced scenario, we want to create a query and search on the properties:&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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogquery.png%3Fw%3D840" 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%2Fpeterrombouts.files.wordpress.com%2F2019%2F04%2Flogquery.png%3Fw%3D840" alt="logquery"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the above sample, you can see that a simple filter on schema will bring up all tracked properties and on the right, you can see a simple query to retrieve all events for ‘ &lt;strong&gt;Customer 1&lt;/strong&gt; ‘. That is basically it! Now you can click on ‘ &lt;strong&gt;Create Alert Rule&lt;/strong&gt; ‘ and do your magic there, and create alerts using these tracked properties!&lt;/p&gt;

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

&lt;p&gt;Setting up the LogicApps to communicate with Log Analytics is a breeze (yes still preview) with the Logic Apps Management module. Tracking properties is a bit of manual labour, because you have to enter code view, but still no worries there. Do look out; if you add the tracked properties in the wrong portion of the JSON, you will not see anything working. And also don’t forget that it can take some time before all logs are updates. Happy low-coding!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Cost optimization in Azure</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Fri, 15 Feb 2019 15:08:08 +0000</pubDate>
      <link>https://dev.to/sogeti/cost-optimization-in-azure-h32</link>
      <guid>https://dev.to/sogeti/cost-optimization-in-azure-h32</guid>
      <description>&lt;p&gt;In my &lt;a href="https://dev.to/prombouts/managing-virtualmachines-in-azure-with-c-17pd-temp-slug-4334241"&gt;previous post&lt;/a&gt; I showed how easy it is to start or deallocate machines using C# and Azure Functions.&lt;/p&gt;

&lt;p&gt;Azure VirtualMachines can be handy but very costly if you forget to turn them off∗ and leaving them running for 24/7.&lt;/p&gt;

&lt;p&gt;But, what if you have dozens of existing VMs and are looking for a quick way to schedule the on/off times for those machines to save money?&lt;/p&gt;

&lt;p&gt;In this post I will show a very simple script to use with &lt;a href="https://azure.microsoft.com/nl-nl/services/automation/"&gt;Azure Automation&lt;/a&gt; that enables you to get this up and running, literally within the hour.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: I would advise to use &lt;a href="https://azure.microsoft.com/en-us/services/devtest-lab/"&gt;Azure DevTest labs&lt;/a&gt; if you have development virtual machines. That will give you the opportunity to reuse, claim or share VMs within a group of users.&lt;/p&gt;

&lt;p&gt;* In this blogpost I will use the word &lt;strong&gt;Stop&lt;/strong&gt; in code and comments, but in fact that will &lt;strong&gt;Deallocate&lt;/strong&gt; the machines, and will stop incurring costs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Calculating costs
&lt;/h2&gt;

&lt;p&gt;First of all, lets take a quick look at how much you can actually save with the instructions in this blogpost. If we take a D4s v3 machine and let it run for 24/7, it will cost approximately &lt;strong&gt;260 euros a month (in West Europe)&lt;/strong&gt;. If you have a team of 8 developers, that adds up to more than &lt;strong&gt;2000 euros a month&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For sake of this blogpost, let us state the actual working hours are (monday to friday) from 7 AM until 7 PM. This brings the hours down to 12/5. The running costs of one machine will be lowered to approximately &lt;strong&gt;92 euros a month&lt;/strong&gt;. For a team of &lt;strong&gt;8&lt;/strong&gt; developers, this will save over &lt;strong&gt;1300 euros a month&lt;/strong&gt; , each month, with the use of a simple script.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure Automation
&lt;/h2&gt;

&lt;p&gt;I will not explain how to setup Azure Automation, as that is pretty simple to setup using the Azure Portal. I’ll jump right into importing and creating runbooks. We start in the Azure Automation blade in the portal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HcINZ836--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/1azureautomation-1.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HcINZ836--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/1azureautomation-1.png%3Fw%3D840" alt="1AzureAutomation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on ‘Runbooks’ in the left pane, and you’ll see some predefined runbooks added by the system.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please &lt;a href="https://gist.github.com/prombouts/43f14670739bab51834bd3753c8c89f7"&gt;download my PowerShell script for importing here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After downloading my script, you can click on ‘Import runbook’ in the menu bar of the blade.&lt;/p&gt;

&lt;p&gt;After importing, the runbook will have the status ‘New’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qGh1SxyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/2overviewrunbooks.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qGh1SxyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/2overviewrunbooks.png%3Fw%3D840" alt="2OverviewRunbooks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To start using the runbook, click on the ‘Stop-Start-AzureVM-By-Tag’ runbook. In the next screen, click on ‘Edit’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nXr_THBw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/3runbook.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nXr_THBw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/3runbook.png%3Fw%3D840" alt="3Runbook"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will open up the actual runbook script, and show all the PowerShell code. In here you can adjust the code to your liking if you want to add logic or change parameters:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cG7Ykz7N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/4editpublish.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cG7Ykz7N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/4editpublish.png%3Fw%3D840" alt="4EditPublish"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, click on ‘Publish’ and you can run your first runbook!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tagging your VMs
&lt;/h2&gt;

&lt;p&gt;Obviously you do not want to manually click to start or stop the machines. In my simple code example, I’ve filtered on a specific tag name and tag value. Tags can be set programmatically or manually. For playing around with this script, simply go to a VM, and make sure the tags are set up like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mydpYGtW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/5tagexample.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mydpYGtW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/5tagexample.png%3Fw%3D840" alt="5TagExample"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The tagname is ‘ &lt;strong&gt;ScheduledOnOff&lt;/strong&gt; ‘ and the value is ‘ &lt;strong&gt;Yes&lt;/strong&gt; ‘.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling your runbook
&lt;/h2&gt;

&lt;p&gt;At this moment the runbook is not automated. There is no schedule attached, but you could manually trigger the runbook to start or stop your machines.&lt;/p&gt;

&lt;p&gt;To create a schedule, go back to the runbook, and select ‘Schedules’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vukIwdpx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/6scheduling.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vukIwdpx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/6scheduling.png%3Fw%3D840" alt="6Scheduling"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a new schedule is easy; I’ve created one schedule to start at 07.00 at weekdays:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BdgXE1py--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/9startweekdays.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BdgXE1py--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/9startweekdays.png%3Fw%3D840" alt="9StartWeekdays"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final step is to setup the parameters. In my predefined script, using the default parameters, we only have to set ‘Start’ in the action field:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zjhWGP6p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/8parameterize.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zjhWGP6p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/02/8parameterize.png%3Fw%3D840" alt="8Parameterize"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The same setup should be followed to deallocate the VMs, creating a schedule with the ‘Stop’ action at the preferred time of day.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;This blog explains how to save resources and reduce costs in a very quick and effective way. This can be seen as a patch or temporary solution, because if some user deletes or changes the tags, the script will not work for that specific VM anymore.&lt;/p&gt;

&lt;p&gt;Nonetheless it is a very handy, quickly implemented solution to fix your long-running-always-on dev or test machines!&lt;/p&gt;

</description>
      <category>azure</category>
    </item>
    <item>
      <title>Managing VirtualMachines in Azure with C#</title>
      <dc:creator>Peter Rombouts</dc:creator>
      <pubDate>Thu, 24 Jan 2019 09:29:57 +0000</pubDate>
      <link>https://dev.to/sogeti/managing-virtualmachines-in-azure-with-c-2fbi</link>
      <guid>https://dev.to/sogeti/managing-virtualmachines-in-azure-with-c-2fbi</guid>
      <description>&lt;p&gt;Managing VirtualMachines is often done using Azure Automation or PowerShell. But what if you want to do this using C#, in an Azure Function? This post shows a very simple example on how to implement this in a .Net Core 2 Azure Function.&lt;/p&gt;

&lt;p&gt;Setting up the project&lt;/p&gt;

&lt;p&gt;To get started, simply create an Azure Function project in Visual Studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WZuGRx8A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/01/createnewfunctionproject.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WZuGRx8A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/01/createnewfunctionproject.png%3Fw%3D840" alt="createnewfunctionproject"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the function
&lt;/h2&gt;

&lt;p&gt;For this example I’m going to create a Function with HTTP trigger that deallocates all VMs in a resource group.&lt;/p&gt;

&lt;p&gt;To get started, create a new function called ‘DeallocateVMs’:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yee-HNxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/01/deallocatevms.png%3Fw%3D840" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yee-HNxd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://peterrombouts.files.wordpress.com/2019/01/deallocatevms.png%3Fw%3D840" alt="deallocatevms"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve chosen the ‘HTTP’ trigger because this is the easiest to run and debug on your local machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the packages
&lt;/h2&gt;

&lt;p&gt;First of all, install the next NuGet packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Install-Package Microsoft.Azure.Management.Fluent Install-Package Microsoft.Azure.Management.Compute.Fluent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This allows us to make use of the Azure libraries we need to manage VMs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boilerplate code
&lt;/h2&gt;

&lt;p&gt;The library needs to connect to Azure and have rights in the resource group you want to manage. For this, we need some boilerplate code to get the &lt;strong&gt;AzureCredentials&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;internal static AzureCredentials GetCredentials() { var clientId = "Enter ClientId Here"; var clientSecret = "Enter ClientSecret Here"; var tenantId = "Enter TenantId Here"; return SdkContext.AzureCredentialsFactory.FromServicePrincipal(clientId, clientSecret, tenantId, AzureEnvironment.AzureGlobalCloud); }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;For more info on creating Service Principals, please check out &lt;a href="https://docs.microsoft.com/nl-nl/azure/active-directory/develop/howto-create-service-principal-portal"&gt;this link at Microsoft&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After getting the credentials, the client can be configured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var azure = Azure .Configure() .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic) .Authenticate(credentials) .WithDefaultSubscription();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting all VMs in a resource group
&lt;/h2&gt;

&lt;p&gt;The IAzure interface allows us to list VMs, get information, and a lot more. Please check the recap of the blogpost for links to documentation.&lt;/p&gt;

&lt;p&gt;In this example we want to deallocate all VMs in a specific resource group. I’ve skipped all checks and exception handling for sake of readability:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var resourcegroup = "your-resourcegroup-name-here"; foreach (var virtualMachine in await azure.VirtualMachines.ListByResourceGroupAsync(resourcegroup)) { log.LogInformation($"Deallocating VM {virtualMachine.Name}..."); await virtualMachine.DeallocateAsync(); log.LogInformation($"Deallocated VM {virtualMachine.Name}"); }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That is basically it! This function will now iterate thru all virtualmachines in the resource group and deallocate them&lt;/p&gt;

&lt;h2&gt;
  
  
  Recap
&lt;/h2&gt;

&lt;p&gt;This example does not take into account what happens when you have very large numbers of virtual machines. The code also does not take into account what the current PowerState of the machine is. In a more advanced scenario, you should check the PowerState and determine what to do. The easiest way is to check if the machine is actually running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (virtualMachine.PowerState == PowerState.Running) { // Do something }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I’ve used a service principal with clientid and secrets, and set the rights on the managed resource groups. This is a very basic setup to show how to manage the VMs. There are alot of ways to implement security, and maybe your scenario has client certificates or other authentication options. &lt;a href="https://github.com/Azure/azure-libraries-for-java/blob/master/AUTH.md"&gt;This post on Github&lt;/a&gt; shows many scenarios on authenticating with this library.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;For this example, I’ve used the namespaces &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.compute.fluent?view=azure-dotnet"&gt;Microsoft.Azure.Management.Compute.Fluent&lt;/a&gt; and &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.management.fluent?view=azure-dotnet"&gt;Microsoft.Azure.Management.Fluent Namespace&lt;/a&gt;. There are a lot of &lt;a href="https://github.com/Azure/azure-libraries-for-net#virtual-machines"&gt;examples&lt;/a&gt;on Github using the two &lt;a href="https://www.nuget.org/packages/Microsoft.Azure.Management.Fluent/"&gt;NuGet&lt;/a&gt; &lt;a href="https://www.nuget.org/packages/Microsoft.Azure.Management.Compute.Fluent/"&gt;packages&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>serverless</category>
    </item>
  </channel>
</rss>
