<?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: Linda Nichols</title>
    <description>The latest articles on DEV Community by Linda Nichols (@lynnaloo).</description>
    <link>https://dev.to/lynnaloo</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%2F255719%2Faa68a1ce-d2e5-47e2-bac2-43e04864eb38.jpg</url>
      <title>DEV Community: Linda Nichols</title>
      <link>https://dev.to/lynnaloo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lynnaloo"/>
    <language>en</language>
    <item>
      <title>How to refactor your creepy Halloween bot... into a Christmas elf bot!</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Sat, 05 Dec 2020 04:30:04 +0000</pubDate>
      <link>https://dev.to/lynnaloo/how-to-refactor-your-creepy-halloween-bot-into-a-christmas-elf-bot-3g5a</link>
      <guid>https://dev.to/lynnaloo/how-to-refactor-your-creepy-halloween-bot-into-a-christmas-elf-bot-3g5a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;There's room for everyone on the nice list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In October, I made a &lt;a href="https://github.com/lynnaloo/scream-caller-bot"&gt;Halloween bot&lt;/a&gt; based on the movie Scream. And it ended up &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3pcDmqh8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/vtnia7tl60bc4eoy8ijr.png"&gt;getting a little creepy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the holidays, I decided that I wanted turn my creepy Halloween bot into a jolly Christmas bot, based on the movie &lt;a href="https://www.imdb.com/title/tt0319343/"&gt;Elf&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3ofT5EtPNBpIjC8jTy/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3ofT5EtPNBpIjC8jTy/giphy.gif" alt="Santas coming"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uiqjTjRV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6nxuojvo5o8uytxia5p3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uiqjTjRV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/6nxuojvo5o8uytxia5p3.png" alt="Elf greeting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;         &lt;br&gt;
&lt;strong&gt;Now, you should make a jolly (and a little bit creepy) Christmas bot too!&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Create a knowledge base for your Buddy-bot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26mfytnSNmNAhZmnK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/26mfytnSNmNAhZmnK/giphy.gif" alt="Meet Elf"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To give your Buddy-bot the ability to answer questions, you'll need to create a QnA Maker service and a knowledge base. You can fill the knowledge base with personalized answers and fill in the conversation gaps with some pre-made "chit-chat." &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign into &lt;a href="https://qnamaker.ai/"&gt;QnA Maker Portal&lt;/a&gt; using your Azure credentials.&lt;/li&gt;
&lt;li&gt;Create a new QnA knowledge base or import an &lt;a href="https://github.com/lynnaloo/scream-caller-bot/blob/main/elf-knowledge-base.tsv"&gt;existing elf knowledge base&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When you're done tweaking the question and answers for your bot and training the model, select "PUBLISH."&lt;/li&gt;
&lt;li&gt;Once your QnA Maker app is published, select "SETTINGS" and note the values from the "Deployment details" section. You’ll need these later.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /knowledgebases/&amp;lt;knowledge-base-id&amp;gt;/generateAnswer
Host: https://&amp;lt;yourqna&amp;gt;.azurewebsites.net/qnamaker
Authorization: EndpointKey &amp;lt;resource-key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scream-bot becomes Buddy-bot
&lt;/h3&gt;

&lt;p&gt;For detailed instructions on creating an Azure Bot Service, you can find the steps &lt;a href="https://dev.to/lynnaloo/how-i-accidentally-created-a-creepy-halloween-bot-and-you-can-too-1ed7"&gt;here&lt;/a&gt;. Instead of downloading and making changes to the sample bot code, can also clone and deploy &lt;a href="https://github.com/lynnaloo/scream-caller-bot"&gt;my sample bot code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Use the keys from the QNA Maker knowledge base that you just made to set the environment variables in the application settings of your bot's App Service instance.&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;QnAKnowledgebaseId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;knowledge-base-id&amp;gt;
&lt;span class="nv"&gt;QnAAuthKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;resource-key&amp;gt;
&lt;span class="nv"&gt;QnAEndpointHostName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;yourqna&amp;gt;.azurewebsites.net/qnamaker"&lt;/span&gt;
&lt;span class="nv"&gt;WelcomeText&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Buddy the Elf!'&lt;/span&gt;
&lt;span class="nv"&gt;UnknownText&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'So, good news—I saw a dog today.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might also want to upload your own custom Buddy icon in the setting of your bot to make it more... cheerful.&lt;br&gt;
         &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MBccTzDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f9hwpf0snun2lovv0405.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MBccTzDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/f9hwpf0snun2lovv0405.png" alt="Icon"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Now, test your bot using the "Test in Web Chat" option under "Bot management."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l1AvyLF0Sdg6wSZZS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l1AvyLF0Sdg6wSZZS/giphy.gif" alt="Santa!"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XywdF9Xn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eukvczydkzn15hgrl4tq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XywdF9Xn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eukvczydkzn15hgrl4tq.png" alt="Settings"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congrats!&lt;/strong&gt; You now have a more cheerful and slightly less creepy holiday bot!&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QXTvBedv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5emh2dooyt7wlf1e8d5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QXTvBedv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5emh2dooyt7wlf1e8d5x.png" alt="Color"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xUySTVNHpdACknfKuc/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xUySTVNHpdACknfKuc/giphy.gif" alt="Bye"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/lynnaloo/scream-caller-bot"&gt;Scream-bot&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lynnaloo/how-i-accidentally-created-a-creepy-halloween-bot-and-you-can-too-1ed7"&gt;Scream-bot blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0"&gt;Bot Basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0"&gt;Azure Bot Service Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>bot</category>
      <category>node</category>
      <category>ai</category>
    </item>
    <item>
      <title>How I accidentally created a creepy Halloween bot ... and you can too!</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Fri, 23 Oct 2020 03:29:56 +0000</pubDate>
      <link>https://dev.to/lynnaloo/how-i-accidentally-created-a-creepy-halloween-bot-and-you-can-too-1ed7</link>
      <guid>https://dev.to/lynnaloo/how-i-accidentally-created-a-creepy-halloween-bot-and-you-can-too-1ed7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Do you like scary movies?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I decided to create a fun and smart &lt;a href="https://github.com/lynnaloo/scream-caller-bot" rel="noopener noreferrer"&gt;Halloween bot&lt;/a&gt; using Azure Bot Service and Cognitive services. Specifically, a bot about Halloween movies. Halloween movies, like Scream.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT9KVzBIcz7xsaVjQ4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT9KVzBIcz7xsaVjQ4/giphy.gif" alt="Scream movie"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;p&gt;If I'm making a bot featuring the movie, &lt;a href="https://en.wikipedia.org/wiki/Scream_(1996_film)" rel="noopener noreferrer"&gt;Scream&lt;/a&gt;, then &lt;em&gt;why not&lt;/em&gt; replace the main character of the Scream movie - the "caller" - with a new automated robot version? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/iSbYEhQDyjn20/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/iSbYEhQDyjn20/giphy.gif" alt="Scream caller"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;p&gt;Why &lt;em&gt;not&lt;/em&gt; is because an automated robot Scream caller can accidentally end up being a little creepy. And the more accurate the "brains" are for the Scream-bot, the creepier it becomes. &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%2Fi%2Fvtnia7tl60bc4eoy8ijr.png" 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%2Fi%2Fvtnia7tl60bc4eoy8ijr.png" alt="Transcript of chat"&gt;&lt;/a&gt;          &lt;/p&gt;




&lt;p&gt;&lt;a href="https://i.giphy.com/media/xhaHU2l56OSYM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xhaHU2l56OSYM/giphy.gif" alt="Leave me alone"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;p&gt;&lt;em&gt;But it's Halloween, the time of year for a little creepy and a lot of scary!&lt;/em&gt;&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%2Fi%2Fj8pn2dp8ly7hishecgk5.png" 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%2Fi%2Fj8pn2dp8ly7hishecgk5.png" alt="Creepier bot"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;So, now &lt;strong&gt;you&lt;/strong&gt; should make a Halloween bot too! Let's get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o7aTsqGG4816rTKQU/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o7aTsqGG4816rTKQU/giphy.gif" alt="Killer"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Create a new bot
&lt;/h3&gt;

&lt;p&gt;Azure Bot Service provides the basic tools for developing bots: the open-source &lt;a href="https://dev.botframework.com/" rel="noopener noreferrer"&gt;Bot Framework SDK&lt;/a&gt; and the bot service for connecting bots to channels. The only requirement for getting started is an &lt;a href="//portal.azure.com"&gt;Azure subscription&lt;/a&gt; and some development experience with Node.js, .NET, or Python for adding some extra bot features.&lt;/p&gt;

&lt;p&gt;You can begin with a &lt;a href="https://github.com/microsoft/BotBuilder-Samples" rel="noopener noreferrer"&gt;sample&lt;/a&gt; or Yeoman-generated project and connect it to a Bot Service instance, but I prefer to start with Bot Service so that I can download a starter project, including the correct credentials.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create a Bot Service instance in Azure
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Find Bot Services in the &lt;a href="//portal.azure.com"&gt;Azure portal&lt;/a&gt; and add a new service.&lt;/li&gt;
&lt;li&gt;Select "Web App Bot" as the type and then &lt;code&gt;Create&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Your "Bot handle" must be unique, but you can change the display name for your bot later in the settings.&lt;/li&gt;
&lt;li&gt;"App name" will be the value that will be in your application url: &lt;code&gt;&amp;lt;app-name&amp;gt;.azurewebsites.net&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For the starter template, we'll be using the Node.js Echo Bot&lt;/li&gt;
&lt;li&gt;Once it's created, you can visit your resource and test your bot in web chat. &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Download your code
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Select "Build" in the Bot Management section of your bot resource and then &lt;code&gt;Download Bot source code&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: When downloading your source code, check the box to include settings. This will include your application keys in &lt;code&gt;.env&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now that you have the code, you can start development on the bot locally, in your preferred dev environment.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Create a bank of knowledge for your bots
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o7aTkjnoAzNaxPes8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o7aTkjnoAzNaxPes8/giphy.gif" alt="Certain rules"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;p&gt;To give your scary (and maybe creepy) bot the ability to answer questions, we'll use QnA Maker service and a knowledge base. You can fill the knowledge base with personalized answers and fill in the conversation gaps with some pre-made "chit-chat." &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sign into &lt;a href="https://qnamaker.ai/" rel="noopener noreferrer"&gt;QnA Maker Portal&lt;/a&gt; using your Azure credentials.&lt;/li&gt;
&lt;li&gt;Create a new QnA knowledge base or import an &lt;a href="https://github.com/lynnaloo/scream-caller-bot/blob/main/scream-knowledge-base.tsv" rel="noopener noreferrer"&gt;existing creepy Scream knowledge base&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;When you're done tweaking the question and answers for your bot and training the model, select "PUBLISH."&lt;/li&gt;
&lt;li&gt;Once your QnA Maker app is published, select "SETTINGS" and note the values from the "Deployment details" section. You’ll need these later.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;POST /knowledgebases/&amp;lt;knowledge-base-id&amp;gt;/generateAnswer
Host: https://&amp;lt;yourqna&amp;gt;.azurewebsites.net/qnamaker
Authorization: EndpointKey &amp;lt;resource-key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Give your bot the brains
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l2YWAOJso1n136fM4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l2YWAOJso1n136fM4/giphy.gif" alt="Zombies"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the botbuilder-ai module to your local bot project
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-S&lt;/span&gt; botbuilder-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add the secret values from your QnA knowledge base to your &lt;code&gt;.env&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;QnAKnowledgebaseId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"knowledge-base-id"&lt;/span&gt;
&lt;span class="nv"&gt;QnAAuthKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"resource-key"&lt;/span&gt;
&lt;span class="nv"&gt;QnAEndpointHostName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"https://&amp;lt;yourqna&amp;gt;.azurewebsites.net/qnamaker"&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;index.js&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following the &lt;code&gt;// Create Adapter&lt;/code&gt; section, add the following code to read your &lt;code&gt;.env&lt;/code&gt; file. Or you can copy/paste from &lt;a href="https://github.com/lynnaloo/scream-caller-bot/blob/main/index.js" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;configuration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="na"&gt;knowledgeBaseId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QnAKnowledgebaseId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;endpointKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QnAAuthKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QnAEndpointHostName&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update the bot construction to pass in the configuration information. Update &lt;code&gt;EchoBot&lt;/code&gt; to &lt;code&gt;ScreamBot&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;screamBot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ScreamBot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;configuration&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;ul&gt;
&lt;li&gt;Update &lt;code&gt;bot.js&lt;/code&gt; to add a reference to QnAMaker
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;QnAMaker&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;botbuilder-ai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can see the final version of &lt;code&gt;bot.js&lt;/code&gt; &lt;a href="https://github.com/lynnaloo/scream-caller-bot/blob/main/bot.js" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Deploy your bot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o7aTvjpZypM4rKH4s/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/3o7aTvjpZypM4rKH4s/giphy.gif" alt="Scream mirror"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;p&gt;Since your bot is a Node.js web application, we deploy it to Azure just like we would our other applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/targets/deploy-to-azure-vscode?view=azure-devops" rel="noopener noreferrer"&gt;VS Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/app-service/scripts/cli-deploy-github?toc=/cli/azure/toc.json" rel="noopener noreferrer"&gt;Command Line&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.microsoft.com/en-us/azure/app-service/deploy-github-actions?tabs=applevel" rel="noopener noreferrer"&gt;Github Actions&lt;/a&gt;/Azure DevOps/Other DevOps tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To connect to Bot Service and QnA Maker, it's important to make sure the environment variable are set in the configuration of your App Service instance, or that you deploy a &lt;code&gt;.env&lt;/code&gt; file (do &lt;em&gt;not&lt;/em&gt; include that in your source control).&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%2Fi%2Fvuoriievn7ofky8ckcpc.png" 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%2Fi%2Fvuoriievn7ofky8ckcpc.png" alt="Alt Text"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;h5&gt;
  
  
  CI/CD with Github Actions
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;To deploy your bot for the first time and setup a CI/CD pipeline for your bot, first commit your local code to a repository in Github.&lt;/li&gt;
&lt;li&gt;In the Azure Portal, Select "All App service settings" under App Service Settings in your Bot Service instance.&lt;/li&gt;
&lt;li&gt;Then select "Deployment Center" in the Deployment section to create a Github Action deployment.&lt;/li&gt;
&lt;li&gt;Under the "Settings" tab, complete the form to create the Github Action in your Github repository. This will automatically commit an &lt;a href="https://github.com/lynnaloo/scream-caller-bot/blob/main/.github/workflows/main_scream-caller-2020.yml" rel="noopener noreferrer"&gt;Action file&lt;/a&gt; to the &lt;code&gt;.github/workflows&lt;/code&gt; folder and create the necessary Github secrets to deploy your application to your Azure Web App. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From this point, your Github action will be triggered when changes are pushed to the &lt;code&gt;main&lt;/code&gt; branch. You can see the results of your deployments in Github, or in the Azure portal.&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%2Fi%2Fi242jzykl25h6wt3nc4x.png" 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%2Fi%2Fi242jzykl25h6wt3nc4x.png" alt="Screen shot"&gt;&lt;/a&gt;          &lt;/p&gt;




&lt;p&gt;Now that your bot is deployed, you can use it in a variety of ways. Embed your bot in your website. Imagine your scary (creepy) bot as an Alexa voice integration or Slack bot that you can share with your friends? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/no2JeUjkz6EBG/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/no2JeUjkz6EBG/giphy.gif" alt="Sidney"&gt;&lt;/a&gt;          &lt;/p&gt;




&lt;h3&gt;
  
  
  Next Steps for my super-creepy Halloween Bot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT9KVe8ctR6MVLUuLm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT9KVe8ctR6MVLUuLm/giphy.gif" alt="Sequel"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect the Scream-bot to a &lt;a href="[channels](https://docs.microsoft.com/en-us/azure/bot-service/bot-service-manage-channels?view=azure-bot-service-4.0)"&gt;channel&lt;/a&gt; - Slack, Text, Teams, and more.&lt;/li&gt;
&lt;/ul&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%2Fi%2Fridn3pie89uk4cyk4j0i.png" 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%2Fi%2Fridn3pie89uk4cyk4j0i.png" alt="Alt Text"&gt;&lt;/a&gt;          &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make Scream-bot smarter with &lt;a href="https://docs.microsoft.com/en-us/azure/cognitive-services/luis/what-is-luis#use-luis-in-a-chat-bot" rel="noopener noreferrer"&gt;LUIS&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect Scream-bot to &lt;a href="https://azure.microsoft.com/en-us/services/communication-services" rel="noopener noreferrer"&gt;Azure Communication Services&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/lynnaloo/scream-caller-bot" rel="noopener noreferrer"&gt;Scream-bot&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.botframework.com" rel="noopener noreferrer"&gt;Bot Framework Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/bot-service/bot-builder-basics?view=azure-bot-service-4.0" rel="noopener noreferrer"&gt;Bot Basics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/bot-service/bot-service-overview-introduction?view=azure-bot-service-4.0" rel="noopener noreferrer"&gt;Azure Bot Service Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/azure/bot-service/?view=azure-bot-service-4.0" rel="noopener noreferrer"&gt;Azure Bot Service Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/bot-service/bot-concepts?view=azure-bot-service-4.0" rel="noopener noreferrer"&gt;Channels and Bot Connector Service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>azure</category>
      <category>bot</category>
      <category>node</category>
      <category>ai</category>
    </item>
    <item>
      <title>Five years of #Hacktoberfest</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Thu, 01 Oct 2020 00:06:36 +0000</pubDate>
      <link>https://dev.to/lynnaloo/five-years-of-hacktoberfest-58lb</link>
      <guid>https://dev.to/lynnaloo/five-years-of-hacktoberfest-58lb</guid>
      <description>&lt;p&gt;This year marks my fifth year participating in &lt;a href="https://hacktoberfest.digitalocean.com/"&gt;#hacktoberfest&lt;/a&gt; and celebrating open-source software. This year, instead of a t-shirt, they'll plan you a tree for your pull-requests! 🌳🌳🌳🌳&lt;/p&gt;

&lt;p&gt;During my second Hacktoberfest, I wrote a short blog about my experience as a maintainer of &lt;a href="https://github.com/lynnaloo/oranjs"&gt;Oran.js&lt;/a&gt; with my friend and then co-worker &lt;a href="https://github.com/troy0820"&gt;Troy Connor&lt;/a&gt;. Oran.js is a fictional application about orange &lt;del&gt;cats&lt;/del&gt; pets that went from straight markdown to a fully-functional web application during October 2016. This is a &lt;strong&gt;re-post&lt;/strong&gt; of that story to celebrate yet another year of writing and maintaining open-source software. I hope you enjoy and participate this year!&lt;/p&gt;




&lt;p&gt;To participate in Hacktoberfest, developers need to register through &lt;a href="https://hacktoberfest.digitalocean.com/login"&gt;the website&lt;/a&gt; and then issue four pull requests to public GitHub repositories between October 1st and October 31st. These pull requests can be full features, bug fixes, or even just changes to documentation. It’s open to those who have been using GitHub for years and those who are complete beginners. At the end of the month, sponsoring partners &lt;a href="https://hacktoberfest.digitalocean.com"&gt;DigitalOcean&lt;/a&gt; and &lt;a href="http://www.github.com"&gt;GitHub&lt;/a&gt; reward open-source contributors for their work with a special commemorative t-shirt. &lt;em&gt;(note from 2020: now just Digital Ocean and it's a t-shirt OR a tree!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The t-shirt prize is nice for participants, but the much bigger reward is the growth in the open-source development community. The number of first-time contributors and volume of overall contributions increases exponentially during this celebration. During Hacktoberfest 2015, there were more than 48,000 pull requests issued in 12,000 projects.&lt;/p&gt;

&lt;p&gt;Project maintainers looking for help from aspiring Hacktoberfest contributors can mark new or existing issues with the &lt;code&gt;hacktoberfest&lt;/code&gt; tag. Then, participants who aren’t sure where to begin can search for that same tag. The ETA development team earned our Hacktoberfest pull request credits by working on open-source projects in &lt;a href="https://github.com/EmergingTechnologyAdvisors/eslint-config-eta/pull/6"&gt;our GitHub organization&lt;/a&gt;, fixing issues in the &lt;a href="https://github.com/docker/docker/pull/27363"&gt;projects that we use&lt;/a&gt;, and by adding features to some &lt;a href="https://github.com/lynnaloo/oranjs/pull/39"&gt;fun projects&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ds7Lw_Dn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qj12gx5g5uq5dx8us7k3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ds7Lw_Dn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/qj12gx5g5uq5dx8us7k3.png" alt="Troy PR"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we started participating in Hacktoberfest as a development team, the obvious goal was to give back to the open-source community (well, and maybe win that cool t-shirt). The unforeseen benefit, however, has been the social aspect. By adding the "hacktoberfest" tag to your issues, you’re attracting helpful people to your project that you might otherwise have never even interacted with. Through this tag, you begin collaborating with, teaching, and learning from other developers from around the world.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QRX_FOCA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mfbqixhxgwrjhugyxwdn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QRX_FOCA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mfbqixhxgwrjhugyxwdn.png" alt="Linda PR 1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We found that &lt;code&gt;README.md&lt;/code&gt; changes and "easy" fix issues were attractive to students and developers that were new to the open-source ecosystem. Even with a simple issue, beginners can learn how to submit a pull request, how a code-review works, and how to rebase upstream changes as other issues are being fixed. We used this as a chance to teach the basics of open-source development and to show how GitHub can be an empathetic and helpful environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--izjfmQ_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nqhknt10z598headgqrq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--izjfmQ_D--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/nqhknt10z598headgqrq.png" alt="Linda PR 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We were also really impressed by the quality of submissions and the obvious effort that contributors put into their pull requests. In several cases, they fixed the issue at hand and found some other improvement to add based on their own experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sh89Moyo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9qr5p9v5gdxk7bewsciu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sh89Moyo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9qr5p9v5gdxk7bewsciu.png" alt="Oran.js commits"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's not much time left in the month of October for Hacktoberfest, but you can get involved in open-source at any time. Even an issue for the smallest documentation fixes can bring awareness to your project and allow you to interact with the community. If you enjoy education, you can teach something to someone new. If you want to learn, you can ask questions in the comments of an issue or pull request and start a conversation with someone new in the community.&lt;/p&gt;

&lt;p&gt;Many thanks to the sponsors this celebration and we’re looking forwarding to seeing what happens in the final hours of Hacktoberfest 2016.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I2n33OyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/262p96055sws6heak7ct.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I2n33OyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/262p96055sws6heak7ct.png" alt="Troy's Docker PR"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZvoKBQem--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p3n880ve1r6jx8wid6t0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZvoKBQem--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/p3n880ve1r6jx8wid6t0.png" alt="Swag"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This was a repost of the story of our experience in 2015, but I've participated every year since the start and I looked forward to this every year. More technical &lt;em&gt;and&lt;/em&gt; non-technical people are introduced to open-source every year because of this celebration and that's awesome!&lt;/p&gt;

&lt;p&gt;Take a peek at the commmits on &lt;a href="https://github.com/lynnaloo/oranjs"&gt;Oran.js&lt;/a&gt; and see how it evolved from straight markdown to becoming an Express.js application in a Docker container. All work done by new contributors to open-sourse!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Hacktoberfest 2020 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hacktoberfest.digitalocean.com/login"&gt;Hacktoberfest Signup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hacktoberfest.digitalocean.com/details"&gt;Hacktoberfest Resources&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hacktoberfest</category>
      <category>github</category>
      <category>throwback</category>
    </item>
    <item>
      <title>From Serverless to Code-less</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Tue, 22 Sep 2020 23:26:52 +0000</pubDate>
      <link>https://dev.to/lynnaloo/from-serverless-to-code-less-49ib</link>
      <guid>https://dev.to/lynnaloo/from-serverless-to-code-less-49ib</guid>
      <description>&lt;p&gt;This article is part of &lt;a href="https://aka.ms/ServerlessSeptember2020" rel="noopener noreferrer"&gt;#ServerlessSeptember&lt;/a&gt;. You'll find other helpful articles, detailed tutorials, and videos in this all-things-Serverless content collection. New articles from community members and cloud advocates are published every week from Monday to Thursday through September.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;"The only thing I like more than writing code, is not writing code."  &lt;strong&gt;- Travis Webb&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;The most secure code is code that was never written. The most clever developer is the one that writes the least code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Before Time
&lt;/h2&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%2Fmedia1.giphy.com%2Fmedia%2FRK9havaWZzZy9US10A%2Fgiphy.gif" 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%2Fmedia1.giphy.com%2Fmedia%2FRK9havaWZzZy9US10A%2Fgiphy.gif" alt="Astronauts"&gt;&lt;/a&gt;       &lt;/p&gt;



&lt;p&gt;Historically, developers self-identified by the lines of code written and the number of commits to a code repository. There were fierce debates on code syntax alone: semicolons or not, tabs or spaces, and where do the braces belong. &lt;/p&gt;




&lt;h2&gt;
  
  
  Now
&lt;/h2&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%2Fmedia1.giphy.com%2Fmedia%2F3xz2BzSNxkwPqF8Wdy%2Fgiphy.gif" 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%2Fmedia1.giphy.com%2Fmedia%2F3xz2BzSNxkwPqF8Wdy%2Fgiphy.gif" alt="New Astronauts"&gt;&lt;/a&gt;        &lt;/p&gt;



&lt;p&gt;In this new “cloud” environment, what if writing “good code” doesn’t matter anymore? What if all the code to solve the majority of problems already exists? What if this existing code is deployed, tested, and used at larger scale than most developers ever code for? &lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;What if going “serverless” also meant not writing code? &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What. Is. Serverless?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Event-driven architectures&lt;/li&gt;
&lt;li&gt;Managed services&lt;/li&gt;
&lt;li&gt;Pay only for what you use&lt;/li&gt;
&lt;li&gt;Focusing on applications, not infrastructure&lt;/li&gt;
&lt;li&gt;Decoupled application design from the start&lt;/li&gt;
&lt;li&gt;Shorter time to market&lt;/li&gt;
&lt;li&gt;Fewer wasted resources (like code)&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt;
&lt;p&gt;Note: Serverless is not simply just FaaS!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Future
&lt;/h2&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%2Fmedia1.giphy.com%2Fmedia%2FQRXwbVxk1oViM%2Fgiphy.gif" 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%2Fmedia1.giphy.com%2Fmedia%2FQRXwbVxk1oViM%2Fgiphy.gif" alt="Oil Rig Astronauts"&gt;&lt;/a&gt;        &lt;/p&gt;



&lt;p&gt;The future doesn't demand more code, it demands faster iteration and innovation. Writing new code is time-consuming, expensive, and full of liability. Every line created is a potential bug or vulnerability and code that must be then tested. &lt;/p&gt;




&lt;h2&gt;
  
  
  Builders, not Coders
&lt;/h2&gt;

&lt;p&gt;In order to remain competitive, developers must become engineers, not just coders. Engineers don’t create the individual blocks, but they know to arrange building blocks together in a way to produce better quality and more reliable products. For "serverless" applications, those blocks are functions, events, and other fully-managed and event-driven services.  &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%2Fmedia1.tenor.com%2Fimages%2F16161e7f3b0f9f7c59241d21c08b4df3%2Ftenor.gif%3Fitemid%3D13146193" 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%2Fmedia1.tenor.com%2Fimages%2F16161e7f3b0f9f7c59241d21c08b4df3%2Ftenor.gif%3Fitemid%3D13146193" alt="Cosmonaut fixing"&gt;&lt;/a&gt;                    &lt;/p&gt;



&lt;p&gt;Let’s now look at how moving to a serverless architecture can help to promote good engineering and reduce code. Not only can developers abstract away their infrastructure concerns, but now they also have the services necessary to build the most powerful and reliable applications to compete in a modern world.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Things that you used to write a lot of code for that you should now never write a lot of code for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;http servers&lt;/li&gt;
&lt;li&gt;messaging systems&lt;/li&gt;
&lt;li&gt;cron jobs&lt;/li&gt;
&lt;li&gt;bots&lt;/li&gt;
&lt;li&gt;notification systems&lt;/li&gt;
&lt;li&gt;data parsing&lt;/li&gt;
&lt;li&gt;image/video parsing&lt;/li&gt;
&lt;li&gt;basic AI analysis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Serverless on Azure
&lt;/h2&gt;

&lt;p&gt;The basic building blocks for Serverless architectures on Azure:&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%2Fs3.amazonaws.com%2Fmedia-p.slid.es%2Fuploads%2F152953%2Fimages%2F7586769%2FScreen_Shot_2020-07-26_at_1.19.07_PM.png" 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%2Fs3.amazonaws.com%2Fmedia-p.slid.es%2Fuploads%2F152953%2Fimages%2F7586769%2FScreen_Shot_2020-07-26_at_1.19.07_PM.png" alt="Azure Services"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Expanded to the larger ecosystem:&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%2Fs3.amazonaws.com%2Fmedia-p.slid.es%2Fuploads%2F152953%2Fimages%2F7586766%2FScreen_Shot_2020-07-26_at_1.17.47_PM.png" 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%2Fs3.amazonaws.com%2Fmedia-p.slid.es%2Fuploads%2F152953%2Fimages%2F7586766%2FScreen_Shot_2020-07-26_at_1.17.47_PM.png" alt="More Azure Services"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;      &lt;/p&gt;



&lt;h2&gt;
  
  
  Serverless Workflow with Logic Apps
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/uGvqUyMblcusM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/uGvqUyMblcusM/giphy.gif" alt="Harry Stamper Golf"&gt;&lt;/a&gt;       &lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;Low code/No code visual designer&lt;/li&gt;
&lt;li&gt;Connects disparate functions and APIs&lt;/li&gt;
&lt;li&gt;Organizes workflows &lt;/li&gt;
&lt;li&gt;300+ out-of-the-box connectors for many internal and external services&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Hello from the year 2020  👋 👋
&lt;/h2&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%2Fmedia1.tenor.com%2Fimages%2F30112930abf5ee2e383d24f5d28af6a6%2Ftenor.gif%3Fitemid%3D7204885" 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%2Fmedia1.tenor.com%2Fimages%2F30112930abf5ee2e383d24f5d28af6a6%2Ftenor.gif%3Fitemid%3D7204885" alt="The End is Near"&gt;&lt;/a&gt;       &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%2Fi%2F1172juc48b32o3vual1n.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%2Fi%2F1172juc48b32o3vual1n.jpg" alt="Dwight Schrute"&gt;&lt;/a&gt;       &lt;/p&gt;



&lt;p&gt;&lt;em&gt;Have you thought about Meteor Impacts?&lt;/em&gt;&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%2Fmedia1.giphy.com%2Fmedia%2Fd31uRIAtOKDp8EuI%2Fgiphy.gif" 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%2Fmedia1.giphy.com%2Fmedia%2Fd31uRIAtOKDp8EuI%2Fgiphy.gif" alt="Meteor Impacts"&gt;&lt;/a&gt;       &lt;/p&gt;



&lt;p&gt;To demonstrate Microsoft Azure's low-code Serverless services, I used data from NASA's &lt;a href="https://data.nasa.gov/Space-Science/Asteroids-NeoWs-API/73uw-d9i8" rel="noopener noreferrer"&gt;NeoWs (Near earth object Web service) API&lt;/a&gt; to create a Meteor Strike Twitter Bot and to provide data to a Microsoft Power App.&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%2Fi%2Ffw384vl57dfzvljz0i35.png" 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%2Fi%2Ffw384vl57dfzvljz0i35.png" alt="App Diagram"&gt;&lt;/a&gt; &lt;br&gt;
       &lt;/p&gt;



&lt;p&gt;Azure Logic App which calls the NeoWs API and parses the data:&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%2Fi%2Fw7hi6oqnx5xsqrtn47fu.png" 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%2Fi%2Fw7hi6oqnx5xsqrtn47fu.png" alt="Data Parsing Logic App"&gt;&lt;/a&gt;&lt;br&gt;
       &lt;/p&gt;



&lt;p&gt;This Logic App calls the previous Logic App through Azure's API Management service and tweets Meteors that will be close to Earth on the current day:&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%2Fi%2Fy9nqlpa0d5m193zdul3p.png" 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%2Fi%2Fy9nqlpa0d5m193zdul3p.png" alt="Tweet Logic App"&gt;&lt;/a&gt;&lt;br&gt;
       &lt;/p&gt;



&lt;p&gt;If there are Meteors close to the earth on the current day, tweets are generated daily by the Logic App:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1307721353429221377-560" src="https://platform.twitter.com/embed/Tweet.html?id=1307721353429221377"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1307721353429221377-560');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1307721353429221377&amp;amp;theme=dark"
  }



        &lt;/p&gt;



&lt;p&gt;The Microsoft Power App connects to the API Management api url through a manual custom connector or &lt;a href="https://powerapps.microsoft.com/en-us/blog/azure-api-management-connector-on-the-power-platform/" rel="noopener noreferrer"&gt;one exported from APIM&lt;/a&gt;:&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%2Fi%2Foowj6bjjlq7hujuag51m.png" 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%2Fi%2Foowj6bjjlq7hujuag51m.png" alt="Impacts Power App"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;       &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%2Fi%2Fuoaxzy0pxqgxs02hcei6.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%2Fi%2Fuoaxzy0pxqgxs02hcei6.jpg" alt="Bruce Willis Missed It"&gt;&lt;/a&gt;  &lt;/p&gt;




&lt;p&gt;You can also see a talk and live demo I did about this topic and application at Serverless Days Virtual &lt;a href="https://www.youtube.com/watch?v=K1KOHsrVzLo" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Do you want to hear more on this topic? I'll be joining Dona Sarkar to talk about low-code serverless applications at &lt;a href="https://createserverless2020.splashthat.com/" rel="noopener noreferrer"&gt;Create: Serverless&lt;/a&gt; next week.&lt;/p&gt;

&lt;p&gt;You can also discuss low-code development and the "Citizen Developer" movement in a Serverless environment with me &lt;em&gt;live&lt;/em&gt; next week. Please RSVP for my Community On Air - Open Mic session at &lt;a href="https://createserverless2020.splashthat.com/" rel="noopener noreferrer"&gt;Create: Serverless&lt;/a&gt; with Jeff Hollan.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/logic-apps/" rel="noopener noreferrer"&gt;Azure Logic Apps&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/api-management/" rel="noopener noreferrer"&gt;Azure Api Management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://powerapps.microsoft.com/en-us/build-powerapps/" rel="noopener noreferrer"&gt;Microsoft Power Platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=K1KOHsrVzLo" rel="noopener noreferrer"&gt;Serverless Days Virtual (July 2020)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://powerapps.microsoft.com/en-us/blog/azure-api-management-connector-on-the-power-platform/" rel="noopener noreferrer"&gt;APIM PowerApps Connector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>serverlessseptember</category>
      <category>azure</category>
      <category>logicapps</category>
    </item>
    <item>
      <title>The Curious Developer's Guide to Portable Azure Functions</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Sun, 06 Sep 2020 16:41:20 +0000</pubDate>
      <link>https://dev.to/lynnaloo/the-curious-developer-s-guide-to-portable-azure-functions-109m</link>
      <guid>https://dev.to/lynnaloo/the-curious-developer-s-guide-to-portable-azure-functions-109m</guid>
      <description>&lt;p&gt;This article is part of &lt;a href="https://aka.ms/ServerlessSeptember2020"&gt;#ServerlessSeptember&lt;/a&gt;. You'll find other helpful articles, detailed tutorials, and videos in this all-things-Serverless content collection. New articles from community members and cloud advocates are published every week from Monday to Thursday through September.   &lt;/p&gt;

&lt;p&gt;Find out more about how Microsoft Azure enables your Serverless functions at &lt;a href="https://docs.microsoft.com/azure/azure-functions/?WT.mc_id=servsept20-devto-cxaall"&gt;https://docs.microsoft.com/azure/azure-functions/&lt;/a&gt;.       &lt;/p&gt;




&lt;p&gt;&lt;a href="https://azure.microsoft.com/en-us/services/functions/"&gt;Azure Functions&lt;/a&gt; allow you to execute small snippets of code, in the cloud, without concern for cloud infrastructure. These functions are triggered by several different types of event sources, making them the building blocks of an event-driven or "serverless" architecture. They're easy to write, deploy, and connect to other cloud services to create powerful applications.&lt;/p&gt;

&lt;p&gt;Azure Functions are also &lt;a href="https://github.com/Azure/Azure-Functions"&gt;open source&lt;/a&gt;!    &lt;/p&gt;

&lt;p&gt;&lt;em&gt;But did you know they're also... &lt;i&gt;portable&lt;/i&gt;?&lt;/em&gt;     &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT0GqrJNbZkRcr2Jgc/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT0GqrJNbZkRcr2Jgc/giphy.gif" alt="Pee Wee on Bike"&gt;&lt;/a&gt;                &lt;/p&gt;

&lt;p&gt;Function Apps runtimes can run in a container. And containers are managed by Kubernetes. And Kubernetes can run just about anywhere.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Even outside of Azure.&lt;/em&gt;                         &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Azure Functions, in Kubernetes, running outside of Azure?&lt;/strong&gt;                                   &lt;/p&gt;



&lt;p&gt;&lt;a href="https://i.giphy.com/media/AVYgfmc0UiP9m/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/AVYgfmc0UiP9m/giphy.gif" alt="Evil Witch"&gt;&lt;/a&gt;                                    &lt;/p&gt;



&lt;p&gt;What about the event-driven nature of "serverless" applications with Azure Functions? When Function Apps are fully-managed on Azure, container instances are added (or removed) based on the number of incoming trigger events. This makes scaling to support message load nearly seamless. The Azure Functions runtime can run &lt;em&gt;anywhere&lt;/em&gt; but what about the scale controller?    &lt;/p&gt;

&lt;p&gt;The &lt;a href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/"&gt;Horizontal Pod Autoscaler&lt;/a&gt; in Kubernetes provides some autoscaling to support spikes in CPU intensity or some other custom application metrics. To replicate the event-based scaling that we're used to with Azure Functions, the HPA needs a little help from an open-source project called &lt;a href="https://keda.sh/"&gt;KEDA&lt;/a&gt;.    &lt;/p&gt;



&lt;p&gt;KEDA, or &lt;b&gt;Kubernetes-based Event Driven Autoscaler&lt;/b&gt;, does exactly as described. It extends (but doesn't duplicate) the functionality of the Horizontal Pod Autoscaler. It supports events triggers from a &lt;a href="https://keda.sh/docs/1.5/scalers/"&gt;large variety of sources&lt;/a&gt; both internal and external to large cloud providers. KEDA's scaler takes metric values from the event source and creates custom metrics to send to the HPA to support scaling based on the event load.                                    &lt;/p&gt;



&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT9DPObyHCA9Mhya6A/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT9DPObyHCA9Mhya6A/giphy.gif" alt="Yada Yada Yada"&gt;&lt;/a&gt;                                &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;So, let's do it. Let's make portable Azure Functions.&lt;/strong&gt;                 &lt;/p&gt;



&lt;p&gt;&lt;a href="https://i.giphy.com/media/l1adwi79gVdIdWz3CB/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l1adwi79gVdIdWz3CB/giphy.gif" alt="Let's Do It"&gt;&lt;/a&gt;                            &lt;/p&gt;






&lt;p&gt;Assumption is that you already have these things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Installed &lt;a href="https://github.com/azure/azure-functions-core-tools#installing"&gt;Azure Function Core Tools v2&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An Azure Subscription (this is for the storage queue, not for Azure Functions)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Kubernetes cluster. It can be &lt;a href="https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough-portal"&gt;AKS&lt;/a&gt;, GKE, EKS, OpenShift, Kubernetes on-prem, whatever and wherever.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/"&gt;&lt;code&gt;kubectl&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;current-context&lt;/code&gt; set to your Kubernetes cluster.   &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;And now we're ready to package up our function apps and take them on the road.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xRfxdozZr2zYI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xRfxdozZr2zYI/giphy.gif" alt="Leslie Knope"&gt;&lt;/a&gt;                                    &lt;/p&gt;






&lt;h4&gt;
  
  
  1. Make a directory for the Function App for your Azure Functions
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;functions-everywhere
&lt;span class="nb"&gt;cd &lt;/span&gt;functions-everywhere
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Initialize the Functions directory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;func init &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--docker&lt;/code&gt; flag creates a Dockerfile for a container using a base image that is based on the chosen &lt;code&gt;--worker-runtime&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Choose your runtime and language.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Create a new Azure Function and define the trigger type
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;func new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the &lt;em&gt;Azure Queue Storage Trigger&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You can rename the function, or just leave the default for this demo.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Create an Azure storage account and queue
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal"&gt;Create storage account in the portal&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to your new storage account and under the &lt;strong&gt;Queue service&lt;/strong&gt; heading, select &lt;strong&gt;Queues&lt;/strong&gt; and create a new queue. Take note of the queue name.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Update your function with the storage account names
&lt;/h4&gt;

&lt;p&gt;Get the connection string for your new storage account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az storage account show-connection-string &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;storage-name&amp;gt; &lt;span class="nt"&gt;--query&lt;/span&gt; connectionString
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit the &lt;code&gt;local.settings.json&lt;/code&gt; file in your function app, which contains the local debug connection string settings.  Replace the &lt;code&gt;{AzureWebJobsStorage}&lt;/code&gt; with the connection string value:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;local.settings.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"IsEncrypted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=yourstorageaccount;AccountKey=shhhh==="&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, open the &lt;code&gt;function.json&lt;/code&gt; file and set the &lt;code&gt;connection&lt;/code&gt; setting value to &lt;code&gt;AzureWebJobsStorage&lt;/code&gt;.  This tells the function to pull the connection string from the &lt;code&gt;AzureWebJobsStorage&lt;/code&gt; key we set above.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bindings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"myQueueItem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"queueTrigger"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"in"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"queueName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;your-queue-name&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"connection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  6. Enable the storage queue bundle for the function runtime
&lt;/h4&gt;

&lt;p&gt;Ensure that &lt;code&gt;host.json&lt;/code&gt; contains the extensions bundle to allow Azure Storage Queues binding support.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;host.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extensionBundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Azure.Functions.ExtensionBundle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[1.*, 2.0.0)"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  7. Install KEDA in your cluster
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;func kubernetes &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt; keda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm that KEDA is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get customresourcedefinition

NAME                        AGE
scaledobjects.keda.k8s.io   2h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  8. Deploy your Function App to Kubernetes
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Note: This assumes that you have a Docker account and you've already used &lt;code&gt;docker login&lt;/code&gt; to sign-in through the cli.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;func kubernetes deploy &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nt"&gt;-app-name-lowercase&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--registry&lt;/span&gt; &amp;lt;your-docker-registry&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command build the docker container, push it to the specified registry, generate a YAML file, and deploy to your Kubernetes cluster.&lt;/p&gt;

&lt;p&gt;If you'd like to save a copy of the YAML deploy file, use the &lt;code&gt;dry-run&lt;/code&gt; flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;func kubernetes deploy &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nt"&gt;-app-name-lowercase&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--registry&lt;/span&gt; &amp;lt;your-docker-registry&amp;gt; &lt;span class="nt"&gt;--dry-run&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; func-deployment.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  9. See your function scaling as messages are added
&lt;/h4&gt;

&lt;p&gt;To add a message to your storage queue, go to your Azure Storage account in the &lt;a href="https://portal.azure.com"&gt;Azure Portal&lt;/a&gt; and open the &lt;em&gt;Storage Explorer&lt;/em&gt;.  Select your storage queue and add a new message.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You should initially see &lt;code&gt;0&lt;/code&gt; pods since the function has not started scaling yet.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: By default, the polling interval set is 30 seconds on the &lt;code&gt;ScaledObject&lt;/code&gt; resource and the cooldown period is 300 seconds.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After all messages are consumed by the function app, and the cooldown period has elapsed, the last pod should scale back down to &lt;code&gt;0&lt;/code&gt;.                    &lt;/p&gt;






&lt;p&gt;&lt;strong&gt;Congrats!&lt;/strong&gt; You are now using &lt;em&gt;portable&lt;/em&gt; Azure Functions.   &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/2AilMg2L8rTAA/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/2AilMg2L8rTAA/giphy.gif" alt="Leslie Dancing"&gt;&lt;/a&gt;                        &lt;/p&gt;






&lt;h4&gt;
  
  
  More Resources
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://keda.sh/"&gt;Official KEDA Docs&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kedacore/samples"&gt;More Samples!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-kubernetes-keda"&gt;Microsoft Azure Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>serverless</category>
      <category>azure</category>
      <category>keda</category>
      <category>serverlessseptember</category>
    </item>
    <item>
      <title>Makeover your old web sites with Azure Static Web Apps</title>
      <dc:creator>Linda Nichols</dc:creator>
      <pubDate>Wed, 08 Jul 2020 18:15:17 +0000</pubDate>
      <link>https://dev.to/lynnaloo/makeover-your-old-web-sites-with-azure-static-web-apps-2if9</link>
      <guid>https://dev.to/lynnaloo/makeover-your-old-web-sites-with-azure-static-web-apps-2if9</guid>
      <description>&lt;p&gt;&lt;strong&gt;Everyone loves a makeover!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;So, what about a makeover for your collection of janky outdated web sites?&lt;/em&gt;&lt;br&gt;
&lt;br&gt;&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%2Fi%2Fgybwxe04hcegqjs0ph8e.gif" 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%2Fi%2Fgybwxe04hcegqjs0ph8e.gif" alt="Princess Diaries Makeover"&gt;&lt;/a&gt;&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What is Azure Static Web Apps?
&lt;/h1&gt;

&lt;p&gt;It's a service that builds and deploys full-stack web apps to Microsoft Azure from Github. Your static assets are separated from a web server and are instead served in storage where they can be globally distributed and faster to access. &lt;/p&gt;


&lt;p&gt; Need an API? Great. Because Static Web Apps automatically creates API endpoints that are hosted using a &lt;em&gt;serverless&lt;/em&gt; architecture.&lt;/p&gt;

&lt;p&gt;Azure Static Webb Apps is currently in public preview and right now it's &lt;strong&gt;free&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  How do you get started?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/static-web-apps/getting-started?tabs=angular#create-a-static-web-app" rel="noopener noreferrer"&gt;Azure SWA Quickstart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/learn/modules/publish-app-service-static-web-app-api/" rel="noopener noreferrer"&gt;Microsoft Learn Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;But what if you don't need a &lt;em&gt;new&lt;/em&gt; app and you have a bunch of old ones sitting in your Github repositories?&lt;/strong&gt;&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%2Fi%2Fp7vi8lxe3lt8i1ptpe1q.gif" 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%2Fi%2Fp7vi8lxe3lt8i1ptpe1q.gif" alt="Before Makeover"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;em&gt;You can update them to deploy as static web apps on Azure!&lt;/em&gt;&lt;/p&gt;



&lt;h1&gt;
  
  
  Updating existing applications
&lt;/h1&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%2Fi%2F6uyq9yt3gas8lt0x5xzc.gif" 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%2Fi%2F6uyq9yt3gas8lt0x5xzc.gif" alt="Clueless Makeover"&gt;&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose a web app in your Github account:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/lynnaloo/mullet" rel="noopener noreferrer"&gt;https://github.com/lynnaloo/mullet&lt;/a&gt; &lt;br&gt;&lt;br&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Some things to consider with your old web application:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It has to be a JavaScript or TypeScript application&lt;/li&gt;
&lt;li&gt;You need to know where your build artifact folder is, i.e. "public" or "dist."&lt;/li&gt;
&lt;li&gt;Remove any pins to old Node versions in your &lt;code&gt;package.json&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"engines": {    
    "node": "8.12"  
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Your build should be able to run &lt;code&gt;npm run build&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "build": "webpack",
    "start": "node walmart.js"
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you want to create serverless APIs, add a folder for your functions, i.e. "api" and add a &lt;code&gt;routes.json&lt;/code&gt; file in the root of your build artifact folder. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;br&gt; Create an Azure Static Web App in the Azure Portal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;code&gt;Create a Resource&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Search for &lt;code&gt;Static Web Apps&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Static Web Apps (Preview)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Create&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enter your application information, sign-in to your Github account, and select the repository for your old application&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Review and Create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Create&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;br&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%2Fi%2Fhtjrdvzd0kandlr377ow.png" 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%2Fi%2Fhtjrdvzd0kandlr377ow.png" alt="First screen"&gt;&lt;/a&gt;&lt;br&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%2Fi%2Fro9zqke96x87nylqhq6f.png" 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%2Fi%2Fro9zqke96x87nylqhq6f.png" alt="Second screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A Github Actions workflow file has &lt;em&gt;magically&lt;/em&gt; been added to your old application's Github repository.&lt;/strong&gt; Once the action finishes running, you should be able to access your application from the provided URL.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&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%2Fi%2F3qphrk12eq4rpq4p79nl.png" 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%2Fi%2F3qphrk12eq4rpq4p79nl.png" alt="Final screen"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Now, your previously outdated and janky application is now made-over into something beautiful!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&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%2Fi%2Fnzfywdmkiby78tg0pydk.gif" 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%2Fi%2Fnzfywdmkiby78tg0pydk.gif" alt="After"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>react</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
