<?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: Thomas Gotwig</title>
    <description>The latest articles on DEV Community by Thomas Gotwig (@tgotwig).</description>
    <link>https://dev.to/tgotwig</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%2F452779%2Fb7a810cf-c409-4f66-a0f8-b0982b509029.png</url>
      <title>DEV Community: Thomas Gotwig</title>
      <link>https://dev.to/tgotwig</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tgotwig"/>
    <language>en</language>
    <item>
      <title>Add initial testing to Camunda with Spring Boot 🍃</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sun, 05 Dec 2021 17:59:01 +0000</pubDate>
      <link>https://dev.to/tgotwig/add-initial-testing-to-camunda-spring-boot-pni</link>
      <guid>https://dev.to/tgotwig/add-initial-testing-to-camunda-spring-boot-pni</guid>
      <description>&lt;p&gt;Let's add a test to our application so that we don't have to confirm things like the &lt;code&gt;User Task&lt;/code&gt; manually! As well as some assertions to know what got executed and what not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TGotwig/camunda-demo"&gt;Here&lt;/a&gt; you can find the code for this chapter under the git tag chapter-2.&lt;/p&gt;

&lt;p&gt;For doing the assertions we need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.camunda.bpm.assert&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;camunda-bpm-assert&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;8.0.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;scope&amp;gt;&lt;/span&gt;test&lt;span class="nt"&gt;&amp;lt;/scope&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And there is our final &lt;code&gt;happyPath&lt;/code&gt; test which goes through all we did from the last article automatically! 🤗&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootTest&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainDelegateTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;RuntimeService&lt;/span&gt; &lt;span class="n"&gt;runtimeService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ManagementService&lt;/span&gt; &lt;span class="n"&gt;managementService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;ProcessInstance&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@BeforeEach&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;runtimeService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startProcessInstanceByKey&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"loanApproval"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;assertThat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;hasPassed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"StartEvent_1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hasNotPassed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task_0dfv74n"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEnded&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Test&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;happyPath&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;completeTask&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;hasPassed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task_0dfv74n"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;isEnded&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;ProcessInstanceAssert&lt;/span&gt; &lt;span class="nf"&gt;completeTask&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;assertThat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;loanApproval&lt;/code&gt; is from &lt;code&gt;loanApproval.bpmn&lt;/code&gt; which you can find inside the Camunda Modeler when nothing is selected 🖼️&lt;/p&gt;

&lt;p&gt;&lt;code&gt;complete(task())&lt;/code&gt; are two static functions which are doing the clicking on &lt;code&gt;Complete&lt;/code&gt; part from the last article for you 🤖&lt;/p&gt;

</description>
      <category>camunda</category>
      <category>java</category>
      <category>spring</category>
      <category>testing</category>
    </item>
    <item>
      <title>Getting Started with Camunda &amp; Spring Boot 🍃</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sat, 27 Nov 2021 08:39:38 +0000</pubDate>
      <link>https://dev.to/tgotwig/getting-started-with-camunda-spring-boot-2gbi</link>
      <guid>https://dev.to/tgotwig/getting-started-with-camunda-spring-boot-2gbi</guid>
      <description>&lt;p&gt;This tutorial intends to gives you a quick and practical introduction to the open-source workflow and decision automation platform Camunda! 🦊&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tgotwig/camunda-demo"&gt;Here&lt;/a&gt; you can find the code for this chapter under the git tag &lt;code&gt;chapter-1&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  💿 Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Java 8+&lt;/li&gt;
&lt;li&gt;Maven&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://camunda.com/download/modeler"&gt;Camunda Modeler&lt;/a&gt; (you can install it on Linux by executing &lt;code&gt;support/xdg_register.sh&lt;/code&gt; after extracting the archive)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏃 Let's go!
&lt;/h2&gt;

&lt;p&gt;The easiest way to get started is to download &lt;a href="https://docs.camunda.org/get-started/spring-boot/model"&gt;this sample project&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/camunda/camunda-get-started-spring-boot/archive/Step-3.zip &lt;span class="se"&gt;\&lt;/span&gt;
  | bsdtar &lt;span class="nt"&gt;-xvf&lt;/span&gt; - &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which you can then execute with Maven:&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="nb"&gt;cd &lt;/span&gt;camunda-get-started-spring-boot-Step-3 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mvn spring-boot:run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now surf towards &lt;a href="http://localhost:8080"&gt;localhost:8080&lt;/a&gt; and login via demo &amp;amp; demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U0H8KI4m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143623020-0c878f77-e622-4d1d-b981-46414c702928.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U0H8KI4m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143623020-0c878f77-e622-4d1d-b981-46414c702928.png" alt="image" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Taking a closer look into the browser app
&lt;/h2&gt;

&lt;p&gt;Now click on &lt;code&gt;Tasklist&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vUqiaApg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627050-b2ba203e-ea35-45bf-8a39-2de64cbf2a3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vUqiaApg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627050-b2ba203e-ea35-45bf-8a39-2de64cbf2a3d.png" alt="image" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the second column you can see that you have a process running, which is on hold because of the &lt;code&gt;User Task&lt;/code&gt; named &lt;code&gt;Check the request&lt;/code&gt;, which requires that a user takes a look at it and allows further execution:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ehG6E15R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143622893-2b33c717-aed7-4af3-9773-1f8ac5615de6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ehG6E15R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143622893-2b33c717-aed7-4af3-9773-1f8ac5615de6.png" alt="image" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can do so by clicking on &lt;code&gt;Complete&lt;/code&gt; from within the first tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VSPN7LSa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627087-3bbc92ba-728d-41e7-8bd0-75dff35aaf6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VSPN7LSa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627087-3bbc92ba-728d-41e7-8bd0-75dff35aaf6b.png" alt="image" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Adding a Service Task to loanApproval.bpmn
&lt;/h2&gt;

&lt;p&gt;One way to let Camunda execute a own Java function by creating a &lt;code&gt;Service Task&lt;/code&gt; from within the Camunda Modeler, you should see the following view by opening &lt;code&gt;loanApproval.bpmn&lt;/code&gt; with the modeler:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--isfMiN41--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627113-c7f13348-7ef6-4d37-95de-edcd59ff2018.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--isfMiN41--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143627113-c7f13348-7ef6-4d37-95de-edcd59ff2018.png" alt="image" width="880" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within &lt;strong&gt;block #1&lt;/strong&gt; you can set &lt;code&gt;ID&lt;/code&gt; and &lt;code&gt;Name&lt;/code&gt;, &lt;strong&gt;block #2&lt;/strong&gt; is for pointing to your own Java function. It's most practical name &lt;code&gt;ID&lt;/code&gt; like your Java function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.camunda.bpm.getstarted.loanapproval.delegates&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.camunda.bpm.engine.delegate.DelegateExecution&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MainDelegate&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;validateTheRequest&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DelegateExecution&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"🚀 Executing MainDelegate.validateTheRequest"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now you should see a new item from within your browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---9ASHB4A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143623140-11451fb8-4553-4615-87bd-9ca149de7ea0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---9ASHB4A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent.com/30773779/143623140-11451fb8-4553-4615-87bd-9ca149de7ea0.png" alt="image" width="880" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Switch back to the first tab &lt;code&gt;Form&lt;/code&gt; and click again on &lt;code&gt;Complete&lt;/code&gt;, this time it should go through your own Java function, the Spring terminal proves it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
2021-11-26 20:19:49.855  INFO 2249 &lt;span class="nt"&gt;---&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Completed initialization &lt;span class="k"&gt;in &lt;/span&gt;5 ms
🚀 Executing MainDelegate.validateTheRequest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nice! 🥳🎉 I think I will add some testing for the next article, stay tuned and happy coding! 🤗&lt;/p&gt;

</description>
      <category>camunda</category>
      <category>java</category>
      <category>spring</category>
      <category>automation</category>
    </item>
    <item>
      <title>Executing Github Gist files from Linux Shell via cURL 🚀</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sat, 20 Nov 2021 09:54:11 +0000</pubDate>
      <link>https://dev.to/tgotwig/executing-github-gist-files-from-linux-shell-via-curl-10fe</link>
      <guid>https://dev.to/tgotwig/executing-github-gist-files-from-linux-shell-via-curl-10fe</guid>
      <description>&lt;p&gt;We have two different URL options to fetch a Github Gist file via cURL:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;gist.githubusercontent.com&lt;/li&gt;
&lt;li&gt;api.github.com&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The second one is a bit more work, but always instant up-to-date! 🌟&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ gist.githubusercontent.com
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://gist.githubusercontent.com/[user]/[gist_id]/raw/[gist_file]?_&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;uuidgen&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
| bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;🌍 Hello World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this can run a older version of the file 😖&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ api.github.com
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 Fix limitations of api.github.com
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;api.github.com&lt;/code&gt; comes with &lt;a href="https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting"&gt;rate-limiting&lt;/a&gt; per hour:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.github.com/users/[user] | &lt;span class="nb"&gt;grep &lt;/span&gt;x-ratelimit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;x-ratelimit-limit: 60
x-ratelimit-remaining: 59
x-ratelimit-reset: 1636928776
x-ratelimit-resource: core
x-ratelimit-used: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, we can get around this strong limitation by using a &lt;a href="https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token"&gt;PAT&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &amp;lt;user&amp;gt;:&amp;lt;pat&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    https://api.github.com/users/[user] | &lt;span class="nb"&gt;grep &lt;/span&gt;x-ratelimit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;x-ratelimit-limit: 5000
x-ratelimit-remaining: 4999
x-ratelimit-reset: 1636928894
x-ratelimit-used: 1
x-ratelimit-resource: core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🚀 Executing the Gist file!
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &amp;lt;user&amp;gt;:&amp;lt;pat&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="s2"&gt;"https://api.github.com/gists/[gist_id]?_=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;uuidgen&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    | jq &lt;span class="nt"&gt;--raw-output&lt;/span&gt; &lt;span class="s1"&gt;'.files."&amp;lt;GIST_FILE&amp;gt;".content'&lt;/span&gt; | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;🌍 Hello World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Until now it was always up-to-date! 😊&lt;/p&gt;

</description>
      <category>bash</category>
      <category>github</category>
      <category>tutorial</category>
      <category>shell</category>
    </item>
    <item>
      <title>Host your Swagger files with Github Pages &amp; Swagger UI 🦜</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sat, 13 Nov 2021 16:35:16 +0000</pubDate>
      <link>https://dev.to/tgotwig/host-your-swagger-files-with-github-pages-swagger-ui-13h8</link>
      <guid>https://dev.to/tgotwig/host-your-swagger-files-with-github-pages-swagger-ui-13h8</guid>
      <description>&lt;p&gt;Get some Swagger files like from the &lt;a href="https://github.com/TGotwig/TMF622_ProductOrder" rel="noopener noreferrer"&gt;tmforum ProductOrder specification&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;index.html&lt;/code&gt; at root level:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;

&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@3/swagger-ui-standalone-preset.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/css"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/swagger-ui-dist@3/swagger-ui.css"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;TMF622_ProductOrder&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"swagger-ui"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SwaggerUIBundle&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
          &lt;span class="na"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TMF622-ProductOrder-v4.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TMF622-ProductOrder-v4.0.0.swagger.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product_Ordering_Management.regular&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product_Ordering_Management.regular.swagger.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;dom_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#swagger-ui&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;deepLinking&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;SwaggerUIBundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SwaggerUIStandalonePreset&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;SwaggerUIBundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DownloadUrl&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
          &lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;StandaloneLayout&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ui&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ui&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="nc"&gt;.swagger-ui&lt;/span&gt; &lt;span class="nc"&gt;.topbar&lt;/span&gt; &lt;span class="nc"&gt;.download-url-wrapper&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;"text"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#77889a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.swagger-ui&lt;/span&gt; &lt;span class="nc"&gt;.topbar&lt;/span&gt; &lt;span class="nc"&gt;.download-url-wrapper&lt;/span&gt; &lt;span class="nc"&gt;.download-url-button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#77889a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.swagger-ui&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.swagger-ui&lt;/span&gt; &lt;span class="nc"&gt;.topbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#ededed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;border-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#c1c1c1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nc"&gt;.swagger-ui&lt;/span&gt; &lt;span class="nc"&gt;.topbar&lt;/span&gt; &lt;span class="nc"&gt;.download-url-wrapper&lt;/span&gt; &lt;span class="nc"&gt;.select-label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3b4151&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Enable &lt;strong&gt;Github Pages&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%2Fuploads%2Farticles%2Fsweaw9lhwrzr0sjtczd8.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%2Fuploads%2Farticles%2Fsweaw9lhwrzr0sjtczd8.png" alt="Github Pages settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all! 😀🎉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fou3g6h3frxl5e3usnva7.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%2Fuploads%2Farticles%2Fou3g6h3frxl5e3usnva7.png" alt="Swagger UI"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>html</category>
      <category>javascript</category>
      <category>tmforum</category>
    </item>
    <item>
      <title>Load-Balanced MEAN-Stack by AWS CloudFormation &amp; Docker 🐳</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sun, 07 Nov 2021 16:54:15 +0000</pubDate>
      <link>https://dev.to/tgotwig/load-balanced-mean-stack-by-aws-cloudformation-docker-3pj9</link>
      <guid>https://dev.to/tgotwig/load-balanced-mean-stack-by-aws-cloudformation-docker-3pj9</guid>
      <description>&lt;p&gt;In this short article I will show how to deploy a Mean-Stack app by AWS-CLI and CloudFormation using a &lt;strong&gt;v1 load-balancer&lt;/strong&gt; 😃&lt;/p&gt;

&lt;p&gt;All the code regarding our deployment you can also find here:&lt;br&gt;
&lt;a href="https://github.com/TGotwig/devops" rel="noopener noreferrer"&gt;https://github.com/TGotwig/devops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We take usage of an very nice and simple MEAN-Stack project which comes from Brad Traversy 🤗&lt;/p&gt;

&lt;p&gt;Download the sample repo and cd into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:TGotwig/devops.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-cloudformation/solutions/advanced/mean-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Setup awscli
&lt;/h2&gt;

&lt;p&gt;Install the &lt;code&gt;awscli&lt;/code&gt; from somewhere and login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure &lt;span class="nt"&gt;--profile&lt;/span&gt; &amp;lt;YOUR_AWS_ACCOUNT_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be asked for two IDs, you can get them through:&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%2F2m1ne5vu0ld2f3ugpgfs.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%2F2m1ne5vu0ld2f3ugpgfs.png" alt="Click on your name at the top right corner and then on  raw `My Security Credentials` endraw "&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%2F4gn2acj7xt2jwmn0lodf.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%2F4gn2acj7xt2jwmn0lodf.png" alt="Open the tab  raw `Access keys (access key ID and secret access key)` endraw "&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%2Fx16gkhxd0gnlvzasi2p5.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%2Fx16gkhxd0gnlvzasi2p5.png" alt="Let it create two keys for you for later use"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Setup ssh
&lt;/h2&gt;

&lt;p&gt;Create a file called &lt;code&gt;parameters.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"ParameterKey"&lt;/span&gt;: &lt;span class="s2"&gt;"KeyName"&lt;/span&gt;,
    &lt;span class="s2"&gt;"ParameterValue"&lt;/span&gt;: &lt;span class="s2"&gt;"&amp;lt;KeyName&amp;gt;"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;KeyName&amp;gt;&lt;/code&gt; by your SSH key under &lt;code&gt;EC2 / Key Pairs&lt;/code&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%2Fq9bo1ahkuq87e3yagttg.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%2Fq9bo1ahkuq87e3yagttg.png" alt="Screenshot_2020-10-10 Key pairs EC2 Management Console(1)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Setup Makefile
&lt;/h2&gt;

&lt;p&gt;Create a file called &lt;code&gt;.env&lt;/code&gt; for the &lt;code&gt;Makefile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stack-name&lt;span class="o"&gt;=&lt;/span&gt;simple-mean-stack
&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_AWS_ACCOUNT_NAME&amp;gt;
&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_AWS_REGION&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Run it!
&lt;/h2&gt;

&lt;p&gt;Start it by running &lt;code&gt;make up&lt;/code&gt;, an EC2 machine should boot up:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fej8ywt3mpc8z9apgten4.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%2Fuploads%2Farticles%2Fej8ywt3mpc8z9apgten4.png" alt="Created EC2 machine with public IPv4 address"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After some time we can reach the app, run &lt;code&gt;make getUrl&lt;/code&gt; to get the url:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjl5qrrt8hcxfrygjhyd4.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%2Fuploads%2Farticles%2Fjl5qrrt8hcxfrygjhyd4.png" alt="App with ID from machine x"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After refreshing the page few times you should see another IP:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flhxpasnlsa1x7igx3nzm.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%2Fuploads%2Farticles%2Flhxpasnlsa1x7igx3nzm.png" alt="App with ID from machine y"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can remove the entire stack by running &lt;code&gt;make rm&lt;/code&gt;! 🔥 &lt;/p&gt;

&lt;p&gt;Awesome! Now we have finished our load-balanced Mean-Stack app 😎🎉&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>docker</category>
      <category>angular</category>
    </item>
    <item>
      <title>Flash USB stick for Windows from Ubuntu 🚀</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Wed, 27 Oct 2021 19:26:14 +0000</pubDate>
      <link>https://dev.to/tgotwig/flash-usb-stick-for-windows-from-ubuntu-1la8</link>
      <guid>https://dev.to/tgotwig/flash-usb-stick-for-windows-from-ubuntu-1la8</guid>
      <description>&lt;p&gt;This article will should you how to create a bootable USB stick for installing Windows 10 / 11 from MacOS, &lt;a href="https://tb.rg-adguard.net" rel="noopener noreferrer"&gt;here&lt;/a&gt; you can find ISO images for Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧹 Format your USB stick to NTFS
&lt;/h2&gt;

&lt;p&gt;Install gparted to format your USB stick:&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="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; gparted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Select your USB device in the top right corner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Delete&lt;/code&gt; all your partitions so that you have only one (if you cant delete a partition then &lt;code&gt;unmount&lt;/code&gt; it first by selecting that option through the context menu of that table item).&lt;/li&gt;
&lt;li&gt;Create the &lt;code&gt;NTFS&lt;/code&gt; partition.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7vcvlhs8b0t60bqhn3bs.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%2Fuploads%2Farticles%2F7vcvlhs8b0t60bqhn3bs.png" alt="GParted GUI with one partition which is ntfs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💿 Installing &amp;amp; opening unetbootin
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository &lt;span class="nt"&gt;-y&lt;/span&gt; ppa:gezakovacs/ppa
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; unetbootin

&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /media/hdd1
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-t&lt;/span&gt; ntfs-3g /dev/sda1 /media/hdd1
&lt;span class="nb"&gt;sudo &lt;/span&gt;unetbootin &lt;span class="nv"&gt;installtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;USB &lt;span class="nv"&gt;targetdrive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/sda1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Flash it!
&lt;/h2&gt;

&lt;p&gt;Select your Windows ISO image and flash it 🙌&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz8b5dibwbpmxbz7zoapb.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%2Fuploads%2Farticles%2Fz8b5dibwbpmxbz7zoapb.png" alt="UNetbootin with ISO &amp;amp; USB stick selected"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Flash USB stick for Windows from MacOS 🚀</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sat, 23 Oct 2021 11:29:46 +0000</pubDate>
      <link>https://dev.to/tgotwig/create-bootable-usb-stick-for-windows-from-macos-104m</link>
      <guid>https://dev.to/tgotwig/create-bootable-usb-stick-for-windows-from-macos-104m</guid>
      <description>&lt;p&gt;This article will should you how to create a bootable USB stick for installing Windows 10 / 11 from MacOS, &lt;a href="https://tb.rg-adguard.net" rel="noopener noreferrer"&gt;here&lt;/a&gt; you can find ISO images for Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧹 Format your USB stick to NTFS
&lt;/h2&gt;

&lt;p&gt;Format your USB stick to &lt;code&gt;Microsoft NTFS&lt;/code&gt;, to do so install &lt;a href="https://www.paragon-software.com/us/home/ntfs-mac" rel="noopener noreferrer"&gt;ntfs-mac&lt;/a&gt;, this will install a ntfs driver for MacOS, now this format should be available for you inside of &lt;code&gt;Disk Utility&lt;/code&gt;, erase the USB stick:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gte98wanr4iyhzjlxin.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gte98wanr4iyhzjlxin.jpg" alt="erase window from Disk Utility"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  💿 Installing &amp;amp; opening unetbootin
&lt;/h2&gt;

&lt;p&gt;Install unetbootin with brew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; unetbootin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open it and allow it through &lt;code&gt;System Preferences / Security &amp;amp; Privacy&lt;/code&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%2Fuploads%2Farticles%2F6poo3sy6z2qijwb91xpj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6poo3sy6z2qijwb91xpj.jpg" alt="Security &amp;amp; Privacy with Open Anyway button"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For me unetbootin didn't recognize my usb device, but it worked by selecting it through the command line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/Applications/unetbootin.app/Contents/MacOS/unetbootin &lt;span class="nv"&gt;installtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;USB &lt;span class="nv"&gt;targetdrive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/disk2s1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;/dev/disk2s1&lt;/code&gt; with yours, you can find it out by &lt;code&gt;diskutil list&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/dev/disk2 &lt;span class="o"&gt;(&lt;/span&gt;external, physical&lt;span class="o"&gt;)&lt;/span&gt;:
   &lt;span class="c"&gt;#:                       TYPE NAME                    SIZE       IDENTIFIER&lt;/span&gt;
   0:     FDisk_partition_scheme                        &lt;span class="k"&gt;*&lt;/span&gt;31.5 GB    disk2
   1:               Windows_NTFS WIN                     31.5 GB    disk2s1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Flash it!
&lt;/h2&gt;

&lt;p&gt;Select your Windows ISO image and flash it 🙌&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jwe9h72v6s01izdlpbw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8jwe9h72v6s01izdlpbw.jpg" alt="UNetbootin with ISO &amp;amp; USB stick selected"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Publish a simple executable from Rust on Chocolatey 🍫</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Fri, 04 Sep 2020 06:51:00 +0000</pubDate>
      <link>https://dev.to/tgotwig/publish-a-simple-executable-from-rust-on-chocolatey-2pbl</link>
      <guid>https://dev.to/tgotwig/publish-a-simple-executable-from-rust-on-chocolatey-2pbl</guid>
      <description>&lt;p&gt;The most comfortable way to install software on Windows is thorugh &lt;a href="https://chocolatey.org"&gt;Chocolatey&lt;/a&gt; 🍫 And in this guide you will learn how to do that! 🤩 At least for simple executables 🐣&lt;/p&gt;

&lt;p&gt;I successfully published my Rust app &lt;a href="https://chocolatey.org/packages/vidmerger"&gt;vidmerger&lt;/a&gt; in that way! 🎞✨&lt;/p&gt;

&lt;h1&gt;
  
  
  🐣 Initializing
&lt;/h1&gt;

&lt;p&gt;First of all install the &lt;a href="https://chocolatey.org/install"&gt;cli-tool&lt;/a&gt; for Chocolatey:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-ExecutionPolicy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Bypass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&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="n"&gt;System.Net.ServicePointManager&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SecurityProtocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;System.Net.ServicePointManager&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;SecurityProtocol&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-bor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;3072&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Net.WebClient&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://chocolatey.org/install.ps1'&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;Then run &lt;code&gt;choco new my-app&lt;/code&gt; to generate a folder called &lt;code&gt;my-app&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;my-app
├── ReadMe.md
├── _TODO.txt
├── my-app.nuspec
└── tools
    ├── LICENSE.txt
    ├── VERIFICATION.txt
    ├── chocolateybeforemodify.ps1
    ├── chocolateyinstall.ps1
    └── chocolateyuninstall.ps1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The minimal setup for publishing would look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;my-app
├── my-app.nuspec
└── tools
    ├── LICENSE.txt
    └── VERIFICATION.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;*.ps1&lt;/code&gt; files are basically for defining shell commands which run on &lt;code&gt;beforemodify&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt; and &lt;code&gt;uninstall&lt;/code&gt;. We don't really need them for publishing a simple executable.&lt;/p&gt;

&lt;p&gt;Put your &lt;code&gt;*.exe&lt;/code&gt; file from Rust or whatever into the &lt;code&gt;tools&lt;/code&gt; folder 🦀&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚙️ Modifying
&lt;/h1&gt;

&lt;p&gt;I think I'll just show you here my three modified files from my Rust app &lt;a href="https://chocolatey.org/packages/vidmerger"&gt;vidmerger&lt;/a&gt;, modify them accordingly 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  🎴 my-app.nuspec
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;package&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;"http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;metadata&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;id&amp;gt;&lt;/span&gt;vidmerger&lt;span class="nt"&gt;&amp;lt;/id&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;0.1.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;vidmerger&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;authors&amp;gt;&lt;/span&gt;Thomas Gotwig&lt;span class="nt"&gt;&amp;lt;/authors&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;projectUrl&amp;gt;&lt;/span&gt;https://github.com/tgotwig/vidmerger&lt;span class="nt"&gt;&amp;lt;/projectUrl&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;tags&amp;gt;&lt;/span&gt;video cli&lt;span class="nt"&gt;&amp;lt;/tags&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;A wrapper around ffmpeg which simplifies merging multiple videos 🎞&lt;span class="nt"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;Vidmerger is a command-line-tool which uses `ffmpeg` to merge multiple video-files with the same file-extension together into one file called `output.FORMAT`. It includes a usage help which you can print out by `vidmerger --help` 😃&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/metadata&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;files&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;file&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"tools\**"&lt;/span&gt; &lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;"tools"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/files&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/package&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎴 LICENSE.txt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copyright 2020 Thomas Gotwig

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎴 VERIFICATION.txt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generated by `CertUtil -hashfile vidmerger.exe SHA256`:

1268967539be0449126438887170c779aaea6fdbf4d835e529c77d4c56a7f75d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think on updating the hash inside of &lt;code&gt;VERIFICATION.txt&lt;/code&gt; before pushing 🧐&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 Pushing
&lt;/h1&gt;

&lt;p&gt;Before you can push something, you'll need to login on your choco-cli first, to do so, go on &lt;code&gt;https://chocolatey.org/account&lt;/code&gt;, do a login there and click on &lt;code&gt;Show API Key&lt;/code&gt;, run that listed commands in your console.&lt;/p&gt;

&lt;p&gt;Finally lets push it to Chocolatey! 😃&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pack&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="nf"&gt;nupkg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ren&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NewName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vidmerger.nupkg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;choco&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vidmerger.nupkg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://push.chocolatey.org&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vidmerger.nupkg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all! 😊🍫&lt;/p&gt;

</description>
      <category>rust</category>
      <category>devops</category>
      <category>backend</category>
    </item>
    <item>
      <title>Simple MEAN-Stack deployment by AWS CloudFormation &amp; Docker 🐳</title>
      <dc:creator>Thomas Gotwig</dc:creator>
      <pubDate>Sat, 15 Aug 2020 11:06:03 +0000</pubDate>
      <link>https://dev.to/tgotwig/simple-mean-stack-deployment-by-aws-cloudformation-docker-nkp</link>
      <guid>https://dev.to/tgotwig/simple-mean-stack-deployment-by-aws-cloudformation-docker-nkp</guid>
      <description>&lt;p&gt;Deploying AWS apps mainly over the AWS homepage takes much time, we can reduce this time a lot by using code-as-infrastructure principles by using the great AWS-CLI and AWS CloudFormation! 🚀&lt;/p&gt;

&lt;p&gt;This guide is mainly for beginners which wants a quick &amp;amp; simple overview 🙂 All the code regarding our deployment you can also find here:&lt;br&gt;
&lt;a href="https://github.com/TGotwig/devops"&gt;https://github.com/TGotwig/devops&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We take usage of an very nice and simple MEAN-Stack project which comes from Brad Traversy 🤗&lt;/p&gt;

&lt;p&gt;Download the sample repo and cd into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:TGotwig/devops.git
&lt;span class="nb"&gt;cd &lt;/span&gt;aws-cloudformation/solutions/simple/mean-stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Setup awscli
&lt;/h2&gt;

&lt;p&gt;Install the &lt;code&gt;awscli&lt;/code&gt; from somewhere and login:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure &lt;span class="nt"&gt;--profile&lt;/span&gt; &amp;lt;YOUR_AWS_ACCOUNT_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will be asked for two IDs, you can get them through:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BP8Pql4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2m1ne5vu0ld2f3ugpgfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BP8Pql4T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2m1ne5vu0ld2f3ugpgfs.png" alt="Click on your name at the top right corner and then on  raw `My Security Credentials` endraw " width="880" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c8qtyVO6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4gn2acj7xt2jwmn0lodf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c8qtyVO6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4gn2acj7xt2jwmn0lodf.png" alt="Open the tab  raw `Access keys (access key ID and secret access key)` endraw " width="880" height="245"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KzrWiAjD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x16gkhxd0gnlvzasi2p5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KzrWiAjD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/x16gkhxd0gnlvzasi2p5.png" alt="Let it create two keys for you for later use" width="880" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Setup ssh
&lt;/h2&gt;

&lt;p&gt;Create a file called &lt;code&gt;parameters.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"ParameterKey"&lt;/span&gt;: &lt;span class="s2"&gt;"KeyName"&lt;/span&gt;,
    &lt;span class="s2"&gt;"ParameterValue"&lt;/span&gt;: &lt;span class="s2"&gt;"&amp;lt;KeyName&amp;gt;"&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;KeyName&amp;gt;&lt;/code&gt; by your SSH key under &lt;code&gt;EC2 / Key Pairs&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d-DDkQkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9bo1ahkuq87e3yagttg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d-DDkQkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q9bo1ahkuq87e3yagttg.png" alt="Screenshot_2020-10-10 Key pairs EC2 Management Console(1)" width="880" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Setup Makefile
&lt;/h2&gt;

&lt;p&gt;Create a file called &lt;code&gt;.env&lt;/code&gt; for the &lt;code&gt;Makefile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stack-name&lt;span class="o"&gt;=&lt;/span&gt;simple-mean-stack
&lt;span class="nv"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_AWS_ACCOUNT_NAME&amp;gt;
&lt;span class="nv"&gt;region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_AWS_REGION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Run it!
&lt;/h2&gt;

&lt;p&gt;Start it by running &lt;code&gt;make up&lt;/code&gt;, an EC2 machine should boot up:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--46ZRocov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ej8ywt3mpc8z9apgten4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--46ZRocov--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ej8ywt3mpc8z9apgten4.png" alt="Created EC2 machine with public IPv4 address" width="880" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From that, surf towards &lt;code&gt;http://3.70.190.17&lt;/code&gt; to see it 👀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j0pgsAf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0p7p3fbn8q0440r2qj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j0pgsAf9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0p7p3fbn8q0440r2qj3.png" alt="Hosted app" width="880" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can remove the entire stack by running &lt;code&gt;make rm&lt;/code&gt;! 🔥 &lt;/p&gt;

&lt;p&gt;I really hope you enjoyed this story and wish you happy coding! 🤗🖥&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>docker</category>
      <category>angular</category>
    </item>
  </channel>
</rss>
