<?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>Forem: @educostadev</title>
    <description>The latest articles on Forem by @educostadev (@educostadev).</description>
    <link>https://forem.com/educostadev</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%2F164976%2F611103c3-2285-462e-8877-a70bb951fa55.jpg</url>
      <title>Forem: @educostadev</title>
      <link>https://forem.com/educostadev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/educostadev"/>
    <language>en</language>
    <item>
      <title>How I Study for AWS Certification using Notion and FlashCards</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Fri, 08 Oct 2021 18:44:05 +0000</pubDate>
      <link>https://forem.com/educostadev/how-i-study-for-aws-certification-using-notion-and-flashcards-27bn</link>
      <guid>https://forem.com/educostadev/how-i-study-for-aws-certification-using-notion-and-flashcards-27bn</guid>
      <description>&lt;p&gt;In this post, I want to share my personal way of studying for AWS Solution Architect Certification using &lt;a href="https://learn.cantrill.io/"&gt;the amazing course from Adrian Cantrill&lt;/a&gt;. I have been improving my way of learning over time and I’m always open to trying new things. &lt;a href="https://www.coursera.org/learn/learning-how-to-learn"&gt;Learn about how to learn&lt;/a&gt;, productivity, and time management is a subject that I like (&lt;a href="https://www.youtube.com/watch?v=23QelT0nn28"&gt;PT-BR Lecture I did about the subject&lt;/a&gt;) and since I started study AWS I do my best to make this journey fun and productive. So I hope that showing what I do today can give you insights to try something new and also find what works best for you.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="http://Notion.so"&gt;Notion.so&lt;/a&gt; to organize my notes and digital content. Since I start to use it I felt more productive because everything I write is easily accessible in one place. You can also create a full &lt;a href="https://www.youtube.com/watch?v=Kt2uE_CinMs"&gt;Knowledge Management System using Notion&lt;/a&gt; if you want.&lt;/p&gt;

&lt;p&gt;When I watch the training video for the first time I choose a time where I can give full attention to the content. Some of the contents are totally new to me, &lt;a href="https://www.linkedin.com/posts/adriancantrill_aws-activity-6839093703466975232-P-1h/"&gt;which is good to learn correctly for the first time&lt;/a&gt;. While watching I carefully:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Listen with attention: The first time I listen to what is said is the most important to me. if I did not understand I came back and listen again if even listening again I did not understand I make a note to research more later.&lt;/li&gt;
&lt;li&gt;Select what I judge to be important: The content is dense with a lot of small details so it is hard to select everything to make notes, so when I see something and I think it is important or the instructor gives a warning bout it, I select it to take my notes.&lt;/li&gt;
&lt;li&gt;Translate with my words: Take good notes is not copy exactly what is said. So I pause the video and start to write the note with my own words and what I understood about the topic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output of this process is a collection of bullet points like that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM Role is the solution for a situation where you need to give access to AWS resources a big number or identities outside your organization due to the fact it is easy to manage or if the number is higher than 5k dues the IAM User limit.&lt;/li&gt;
&lt;li&gt;IAM Role is useful for “Cross account access”, in a situation where you have one AWS Account A that needs to access a resource on AWS Account B, an IAM Role on AWS Account B can be created to be assumed and give that access.&lt;/li&gt;
&lt;li&gt;In a situation that an IAM Role is assumed to add objects to an S3 Bucket, the object owner is the IAM Role.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After finished the videos I review the notes and fix mistakes in the grammar or meaning. So, I convert all-important ones into a collection of Questions &amp;amp; Answers.&lt;/p&gt;

&lt;p&gt;These are an example of Questions I created based on my understanding from the previous notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the solution for a situation where you need to give access to a big number of identities outside your organization?
Use IAM Roles due to the fact it will be easier to manage or when the number is higher than 5k due to the IAM User limitation of 5k.&lt;/li&gt;
&lt;li&gt;What is the solution for a situation where you need to give access to other AWS account by implementing a “Cross-Account Access”?
Create an IAM Role on the account with the resource and allow it to be assumed by identities by the other account.&lt;/li&gt;
&lt;li&gt;When an IAM Role is assumed by identity to add an Object in the S3 bucket, which one is the Object owner?
The IAM Role is the owner of the Object within the s3 bucket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every question should be created within a “toggle” within Notion to allow it to be converted to FlashCards later. Create good Q&amp;amp;A is something &lt;a href="https://senrigan.io/blog/everything-i-know-strategies-tips-and-tricks-for-spaced-repetition-anki/"&gt;you improve over time&lt;/a&gt;. The idea behind FlashCards is to use the &lt;a href="https://en.wikipedia.org/wiki/Spaced_repetition"&gt;Space Repetition&lt;/a&gt; method to review the topic.&lt;/p&gt;

&lt;p&gt;I copy the block of questions and paste it inside a new Notion page, so I export it as HTML and use the &lt;a href="http://2anki.net"&gt;2anki.net&lt;/a&gt; website to convert it into the Anki deck. Anki is a &lt;a href="https://www.youtube.com/watch?v=DJ9suxXaK4E&amp;amp;list=PLXL_lTSgbB_V_EGxUJla-yiqcr8OMkls7"&gt;Space Repetition Sofware (SRS)&lt;/a&gt; for &lt;a href="https://docs.ankiweb.net/platform/windows/installing.html"&gt;Windows&lt;/a&gt;, &lt;a href="https://docs.ankiweb.net/platform/linux/installing.html"&gt;Linux&lt;/a&gt;, &lt;a href="https://docs.ankiweb.net/platform/mac/installing.html"&gt;Mac&lt;/a&gt;, &lt;a href="https://play.google.com/store/apps/details?id=com.ichi2.anki&amp;amp;hl=pt_BR&amp;amp;gl=US"&gt;Android&lt;/a&gt; and &lt;a href="https://itunes.apple.com/us/app/ankimobile-flashcards/id373493387"&gt;iOS&lt;/a&gt;, well know for managing flashcards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Bh53SB6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/notion-export.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Bh53SB6H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/notion-export.png" alt=""&gt;&lt;/a&gt;Exporting Notion page&lt;/p&gt;

&lt;p&gt;After downloaded the deck file, I double-click over it, and it is imported within my Anki within a new deck. It’s time to review it, add tags, and make minor adjustments when necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_98lRVGb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/anki-import.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_98lRVGb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/anki-import.png" alt=""&gt;&lt;/a&gt;Importing cards to anki&lt;/p&gt;

&lt;p&gt;So, I moved all of the new cards to the Main Deck I created, with sub-decks for better organization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WVgT-GPh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/ank-browser.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WVgT-GPh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://educosta.dev/wp-content/uploads/ank-browser.png" alt=""&gt;&lt;/a&gt;Moving cards to sub-decks&lt;/p&gt;

&lt;p&gt;Anki desktop allows you to add a lot of smart plugins like &lt;a href="https://ankiweb.net/shared/info/109531687"&gt;Cloze&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=ag4Hdnkig8U"&gt;deletion&lt;/a&gt; to hide part of the word pressing (ctrl+shift+c) over the word or the &lt;a href="https://ankiweb.net/shared/info/1374772155"&gt;image occlusion&lt;/a&gt; to hide part of images.&lt;/p&gt;

&lt;p&gt;Take good notes does not mean it will be faster or easier. I spend two or three more times doing this process. The difference is that I do it once, and I study being active rather than passive by just consuming content. I also do practical exercises that the course provides, and this helps me fix the knowledge. The next step for me is to add the &lt;a href="https://fs.blog/2021/02/feynman-learning-technique/"&gt;Feynman technic&lt;/a&gt; in this process. Recently I read about the &lt;a href="https://zenkit.com/en/blog/a-beginners-guide-to-the-zettelkasten-method/"&gt;zettelkasten-method&lt;/a&gt; and looked cool.&lt;/p&gt;

&lt;p&gt;This is my way of study for AWS. Share in the comments what method have you been using, what works for you?&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/how-i-study-for-aws-certification-using-notion-and-flashcards/"&gt;How I Study for AWS Certification using Notion and FlashCards&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>beginners</category>
    </item>
    <item>
      <title>3 tools to make the commits in your repository more professional</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 19 May 2020 16:54:47 +0000</pubDate>
      <link>https://forem.com/educostadev/3-tools-to-make-the-commits-in-your-repository-more-professional-3ec4</link>
      <guid>https://forem.com/educostadev/3-tools-to-make-the-commits-in-your-repository-more-professional-3ec4</guid>
      <description>&lt;h2&gt;
  
  
  Show professionalism and maturity through your repositories applying good practices to write &lt;em&gt;commit&lt;/em&gt; messages
&lt;/h2&gt;

&lt;p&gt;A management version repository that has an organized history of changes and good commit messages shows maturity and professionalism. This organization begins writing commit messages that make clear the intention behind the change made and also has a guideline followed by all the team.&lt;/p&gt;

&lt;p&gt;In this article, we will see how you can structure the commit messages in your repository and apply some good practices that can be shared by all the team. We will make use of tree tools to help us to write good commit messages, validate, and make sure that all the rules are being followed.&lt;/p&gt;

&lt;p&gt;The following good practice and tools can be applied to Git repositories no matter what kind of programming language this repository keeps track of.&lt;/p&gt;

&lt;h3&gt;
  
  
  The art of writing good commit messages
&lt;/h3&gt;

&lt;p&gt;Writing good commit messages can be considered an art. And mastering this art takes time and practice. When making a commit of code we can see it as a picture of our work. If the code is a picture then the commit message is a subtitle that puts a description of our work.&lt;/p&gt;

&lt;p&gt;When it is time to commit, the developer sees himself free to write a description of his work. Each one has a way to write and in a team, this can lead us to many problems. Without a guideline with some rules to follow and structure the message, we can end with a repository to just stock code without taking all the advantages the tool provides. Later, when we need to go back and check the history to find something, all commit messages can be a mess and make no sense. &lt;/p&gt;

&lt;p&gt;The article “&lt;a href="https://chris.beams.io/posts/git-commit/"&gt;How to Write a Git Commit Message&lt;/a&gt;” is one of these texts to keep bookmarked. Although there is no main guideline to be followed, we can take some good rules like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write the subject using the imperative mood&lt;/li&gt;
&lt;li&gt;Limit the number of characters of the subject&lt;/li&gt;
&lt;li&gt;Do not end a subject with a period punctuation&lt;/li&gt;
&lt;li&gt;Use the body message to describe the why vs how&lt;/li&gt;
&lt;li&gt;Limit the number of characters of the body and wrap the text&lt;/li&gt;
&lt;li&gt;Separate the subject and body with a blank line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following rules like these without a tool to help is a pain. We will show how you can write commit messages always with the same structure and better describe the intention of your commit.&lt;/p&gt;

&lt;p&gt;Tree tools will be used. These tools were written in javascript and despite the development language and the use of Node.js to make it work, the repository can hold code in any language. &lt;/p&gt;

&lt;p&gt;The tools are the following:&lt;/p&gt;

&lt;p&gt;Commitlint &lt;br&gt;
The commitlint is a tool that validates the message following a set of rules and good practices. It throws an error when a rule is violated.&lt;/p&gt;

&lt;p&gt;Husky&lt;br&gt;
The Husky is the tool that adds scripts (hooks) trigged before (pre-commit) and after (post-commit) your commit. It will be responsible to execute the commitlint to analyze the message before the commit happens and avoid that bad messages be sent to the repository.  &lt;/p&gt;

&lt;p&gt;Commitizen&lt;br&gt;
The commitizen is the tool responsible to guide the developer through the writing of the message. A sequence of options will be shown and filled by the developer.&lt;/p&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  Pre-requirements
&lt;/h3&gt;

&lt;p&gt;As said before, we will use the tools, commitlint, husky, and commitizen. All of them have as a pre-requirement the node.js and Git installed. Let’s see how you can install the node using a Linux machine. If you are using Windows you can follow &lt;a href="https://phoenixnap.com/kb/install-node-js-npm-on-windows"&gt;this tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  Installing the nvm and node.js
&lt;/h4&gt;

&lt;p&gt;The nvm is version manager for node.js. Let’s install it first and use it to install the node.js. If you use the &lt;strong&gt;bash&lt;/strong&gt; shell, open the terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Close and open the terminal again and run the following command to see if the nvm is installed with success:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ nvm --version0.35.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Se você utiliza o &lt;strong&gt;zsh&lt;/strong&gt; como &lt;em&gt;shell&lt;/em&gt;, será necessário &lt;a href="https://github.com/nvm-sh/nvm#calling-nvm-use-automatically-in-a-directory-with-a-nvmrc-file"&gt;alguns passos adicionais&lt;/a&gt; para concluir a instalação.&lt;/p&gt;

&lt;p&gt;Vamos agora instalar o &lt;strong&gt;node.js&lt;/strong&gt; através do &lt;strong&gt;nvm&lt;/strong&gt;. No momento da escrita deste artigo, a versão estável é a &lt;strong&gt;12&lt;/strong&gt; (12.16.2)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ nvm install node 12
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Check if the node installation is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ node -vV12.16.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Also, check if the package manager npm is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm --version6.14.4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuring your repository
&lt;/h3&gt;

&lt;p&gt;The steps to configure your repository should be done only once and preferably before the developers start to make commits. After this configuration, all developers can make a clone of the repository, and before starting to work they need to execute the command “nvm install” into the root folder. If the repository is already configured the following steps should not be followed. &lt;/p&gt;

&lt;p&gt;After installing the &lt;em&gt;node.js&lt;/em&gt; let’s install and configure other tools in the &lt;em&gt;Git&lt;/em&gt; repository. To use the tools Commitlint, Husky and Commitizen you need first initialize it with the “git init” command, however, if you use remote version management like GitHub or Bitbucket you can create the repository remotely and clone it in your local machine. Just in case you want to follow this tutorial in your local machine with a fresh repository run the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir &amp;lt;nome-do-repositorio&amp;gt;$ cd &amp;lt;nome-do-repositorio&amp;gt;$ git init
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let’s create or change the file .gitignore to ignore the node_modules folder. This folder will store the tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ echo “node\_modules/” &amp;gt;&amp;gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Before start, the installation of the tools lets create a &lt;em&gt;package.json&lt;/em&gt; file. It is responsible to store the dependencies and configuration of the tools. Run the following command and a new file package.json will be created in the current folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm init -y
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, let’s install the &lt;em&gt;commitlint&lt;/em&gt; that will be responsible to validate your &lt;em&gt;commit&lt;/em&gt; message following a set of rules. Run the following command and the tool will be installed within the &lt;em&gt;node_modules&lt;/em&gt; folder and a new entry will be added into the &lt;em&gt;package.json&lt;/em&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install @commitlint/cli --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It’s time to install the &lt;em&gt;config-conventional.&lt;/em&gt; It is the &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/"&gt;set of rules&lt;/a&gt; that will be followed by our &lt;em&gt;commit&lt;/em&gt; messages_._ Run the following command and the files will be installed within the &lt;em&gt;node_modules&lt;/em&gt; folder and a new entry will be added into the &lt;em&gt;package.json&lt;/em&gt; file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install @commitlint/config-conventional --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In this step, it is necessary to configure the &lt;em&gt;commitlint&lt;/em&gt; to use the validation rules from &lt;em&gt;config-conventional&lt;/em&gt;. So, let’s create the &lt;em&gt;commitlint.config.js&lt;/em&gt; file with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo "module.exports = {extends: ['@commitlint/config-conventional']}" &amp;gt; commitlint.config.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The next too to be installed is the &lt;em&gt;Husky&lt;/em&gt;. It is responsible to receive events from the Git and trigger the commitlint to validate the commit message. Run the following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install husky --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;For configuring what are the events where the &lt;em&gt;Husky&lt;/em&gt; will listen add the following text into the package.json file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WARNING&lt;/strong&gt; : If in the code below you find the symbol &lt;code&gt;&amp;amp;amp;&amp;amp;amp;&lt;/code&gt; replace it by &amp;amp;&amp;amp; some browser renders the code wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"husky": { "hooks": { "commit-msg": "commitlint -E HUSKY\_GIT\_PARAMS", "prepare-commit-msg": "exec &amp;lt; /dev/tty &amp;amp;amp;&amp;amp;amp; git cz --hook || true" } },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;According to the &lt;a href="https://git-scm.com/docs/githooks"&gt;git documentation&lt;/a&gt;, during the event “commit-msg” it is possible to format or validate the message. The vent “prepare-commit-msg” allows us to execute commands before the commit editor is opened. Are in these events that &lt;em&gt;commitzen&lt;/em&gt; will work and guide the user to write good commit messages.   &lt;/p&gt;

&lt;p&gt;To install the &lt;em&gt;commitizen&lt;/em&gt; run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ npm install commitizen --save-dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We also need to configure it to work following the validation rules form the config-conventions. Run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./node\_modules/.bin/commitizen init cz-conventional-changelog --save-dev --save-exact
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We are done! Now we have configured the git repository and we can test if everything is working as expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making commits in a configured repository
&lt;/h3&gt;

&lt;p&gt;Add all the changes to the management version system and run the commit command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git add .$ git commit
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now, you will be guided to build your commit message. It’s also a good practice don’t mix more than one change into a single commit, the commit &lt;a href="https://www.freshconsulting.com/atomic-commits/"&gt;must be atomic&lt;/a&gt; and do not put the code into the repository into a state of failure with compile errors or tests broken. &lt;/p&gt;

&lt;p&gt;Choose the type of change that is being made. For this example let’s choose “feat”:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ᐳ git commithusky &amp;gt; prepare-commit-msg (node v12.16.2)cz-cli@4.0.4, cz-conventional-changelog@3.1.0? Select the type of change that you're committing: (Use arrow keys)❯ feat: A new feature fix: A bug fix docs: Documentation only changes style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) refactor: A code change that neither fixes a bug nor adds a feature perf: A code change that improves performance test: Adding missing tests or correcting existing tests (Move up and down to reveal more choices)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If your repository has more than one module you can specify the scope of the change. Let’s skip this step, just press enter key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Select the type of change that you're committing: feat: A new feature? What is the scope of this change (e.g. component or file name): (press enter to skip) 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Write the subject. Remember that it’s a good practice to write the subject using the imperative mood.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Select the type of change that you're committing: feat: A new feature? What is the scope of this change (e.g. component or file name): (press enter to skip) ? Write a short, imperative tense description of the change (max 66 chars): (55) configure the repository for commit message conventions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Write the description to tell why the change was made.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Provide a longer description of the change: (press enter to skip) Specified a commit message convention for better track the changes in this repository through the use of the tools commitizen, commitlint and husky.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In the next two steps let’s specify that the changes do not introduce breaking changes and it is not related to any open issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Are there any breaking changes? (y/N) N? Does this change affect any open issues? (y/N) N
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Your default text editor will be opened with a message preview that will be committed. Close the editor and the commit will be made.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[master 47bb6b3] feat: configure the repository for commit message conventions 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 dummy.txtᐳ git logcommit 47bb6b3f6f1b37776ce365c7589345ffe3c4ecbd (HEAD -&amp;gt; master)Author: Eduardo Costa Date: Mon Apr 27 13:20:38 2020 -0300 feat: configure the repository for commit message conventions Specified a commit message convention for better track the changes in this repository through the use of the tools commitizen, commitlint and husky.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The commit messages are a very important way to register the changes made into the repository and writing a good message is not an easy task. Using some tips, like to write the title in an imperative mood and the message body describing why the source code changed help us to create good messages. &lt;/p&gt;

&lt;p&gt;Standard commit messages are evidence of maturity and professionalism and improve the reliability of the history of changes into the repository, it also helps us to undo some changes and track the cause of issues.&lt;/p&gt;

&lt;p&gt;Using some automation tools like &lt;em&gt;Commitlint&lt;/em&gt;, &lt;em&gt;Commitizen&lt;/em&gt; and &lt;em&gt;Husky&lt;/em&gt;, ensure that rules will not be broken and help developers to write good commit messages.&lt;/p&gt;

&lt;h3&gt;
  
  
  What next
&lt;/h3&gt;

&lt;p&gt;What next&lt;/p&gt;

&lt;p&gt;Besides the shown benefits, standardized commit messages are a requirement to automate the &lt;a href="https://semver.org/"&gt;semantic versioning&lt;/a&gt;, an important topic of software &lt;a href="https://en.wikipedia.org/wiki/Configuration_management"&gt;configuration management&lt;/a&gt;. There are some tools like &lt;a href="https://github.com/semantic-release/semantic-release"&gt;&lt;strong&gt;semantic release&lt;/strong&gt;&lt;/a&gt;, that can automate this process and besides that, to create a version tag in the branch and also generate the &lt;em&gt;changelog.&lt;/em&gt; This is a good topic to start studying and write a new article.&lt;/p&gt;

&lt;p&gt;This article was written by &lt;a href="https://www.linkedin.com/in/tuliopolachini/"&gt;Tulio Polachini&lt;/a&gt; e &lt;a href="https://www.linkedin.com/in/educostadev/"&gt;Edu Costa&lt;/a&gt; feel free to leave a comment if you have some question.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/3-tools-to-make-the-commits-in-your-repository-more-professional/"&gt;3 tools to make the commits in your repository more professional&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>howto</category>
      <category>git</category>
      <category>goodpractice</category>
    </item>
    <item>
      <title>Integration test with TestContainer</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Thu, 20 Feb 2020 02:47:50 +0000</pubDate>
      <link>https://forem.com/educostadev/integration-test-with-testcontainer-21o7</link>
      <guid>https://forem.com/educostadev/integration-test-with-testcontainer-21o7</guid>
      <description>&lt;h2&gt;
  
  
  Test the integration layer of your java application with a real Postgres instance using the TestContainer library
&lt;/h2&gt;

&lt;p&gt;Creating efficient integration tests is &lt;a href="https://dextra.com.br/pt/por-que-devo-testar-minhas-aplicacoes/"&gt;a common challenge&lt;/a&gt; when building &lt;a href="https://dev.to/educostadev/what-is-microservice-461k"&gt;microservices&lt;/a&gt;. Ensure the environment equality among the development and the production environment can be a pain. Mainly when the tools and services require too much hand configuration. When this happens, we usually take a short cut to adopt lightweight tools for the development and test environment. This makes the difference between the environments even bigger. &lt;/p&gt;

&lt;p&gt;The guidelines &lt;a href="http://12factor.net/"&gt;Twelve-Factor Apps&lt;/a&gt; tell us that environment equality is one of the success keys to build &lt;a href="https://educosta.dev/blog/what-is-cloud-native/"&gt;cloud-native&lt;/a&gt; applications. Developing and testing on similar environments allow us to create resilient applications that bring safety and speed to deploy.  &lt;/p&gt;

&lt;p&gt;In this blog post, we will see how to create an integration test using the &lt;a href="https://www.testcontainers.org/"&gt;Testcontainer&lt;/a&gt; library. The test will start a PostgreSQL container and run reading and writing tests on a real database instance. &lt;/p&gt;

&lt;h3&gt;
  
  
  What is Testcontainer?
&lt;/h3&gt;

&lt;p&gt;Testcontainer is a java library that gives us support to create unit tests. It provides lightweight and throwaway instances of common databases or any application that ran into a &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; container. It also makes easy the creation of integration tests using container and without using complex configurations &lt;/p&gt;

&lt;h3&gt;
  
  
  Pre-requirements
&lt;/h3&gt;

&lt;p&gt;To run the example code &lt;a href="https://github.com/educostadev/poc-testcontainers"&gt;available on Github&lt;/a&gt;, you will need to have installed the git and an IDE. Besides that, you also need to have the Docker and be able to perform the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker info
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you are using Linux, look that the command does not have the “&lt;em&gt;sudo&lt;/em&gt;” prefix. You must be able to execute this command without this prefix because during the test running the library will use the &lt;em&gt;Docker&lt;/em&gt; to download images and create containers.  &lt;/p&gt;

&lt;p&gt;To run the docker command without the “&lt;em&gt;sudo&lt;/em&gt;” prefix, your user should be added to the docker user group by the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After running this command you will need to log-off and log-in to the changes take effect. &lt;/p&gt;

&lt;h3&gt;
  
  
  Example project
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/educostadev/poc-testcontainers.git"&gt;This project&lt;/a&gt; has an integration test that starts a PostgreSQL container, sets up the database initial status running a SQL script, runs the test and in the end, destroys the container.  &lt;/p&gt;

&lt;p&gt;To see the code, clone the git repository running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/educostadev/poc-testcontainers.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Import the project in your IDE as a Maven project. If you use IntelliJ, &lt;a href="https://www.lagomframework.com/documentation/1.6.x/java/IntellijMaven.html"&gt;this link&lt;/a&gt; has more information about how to import a Maven project. &lt;/p&gt;

&lt;p&gt;The Testcontainer integrates well with &lt;a href="https://www.testcontainers.org/quickstart/junit_4_quickstart/"&gt;JUnit4&lt;/a&gt; and &lt;a href="https://www.testcontainers.org/quickstart/junit_5_quickstart/"&gt;JUnit5&lt;/a&gt; using dependencies specified within the pom.xml. Open the pom.xml file from the code example and look at the dependencies responsible for the use of Testcontainer with JUnit5.&lt;br&gt;
&lt;/p&gt;

&lt;div class="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.testcontainers&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;junit-jupiter&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;1.12.3&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;If you are using a database already supported by Testcontainer then you will need to add in your project the correct dependencies. Here in&lt;a href="https://www.testcontainers.org/modules/databases/"&gt;_ this link_&lt;/a&gt;, you can find a list of databases supported by the Testcontainer. In our example, we are using a PostgreSQL instance, and the following dependency is required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="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.testcontainers&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;postgresql&lt;span class="nt"&gt;&amp;lt;/artifactId&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;The project files follow a standard Spring Boot application. Within the application.yml file, you can find all the database connection entries. Pay attention to the use of environment variables named &lt;em&gt;DB_URL&lt;/em&gt;, &lt;em&gt;DB_USERNAME&lt;/em&gt;, and &lt;em&gt;DB_PASSWORD&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8083&lt;/span&gt;
&lt;span class="na"&gt;logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ROOT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;info&lt;/span&gt;
    &lt;span class="s"&gt;org.hibernate.tool.hbm2ddl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug&lt;/span&gt;
    &lt;span class="s"&gt;org.hibernate.SQL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debug&lt;/span&gt;
    &lt;span class="s"&gt;org.hibernate.type.descriptor.sql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trace&lt;/span&gt;
&lt;span class="na"&gt;spring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;datasource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_URL}&lt;/span&gt;
    &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_USERNAME}&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${DB_PASSWORD}&lt;/span&gt;
    &lt;span class="na"&gt;driver-class-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;org.postgresql.Driver&lt;/span&gt;
    &lt;span class="na"&gt;hikari&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;maximum-pool-size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
      &lt;span class="na"&gt;connection-timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20000&lt;/span&gt;
    &lt;span class="na"&gt;initialization-mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
  &lt;span class="na"&gt;jpa&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;database-platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;org.hibernate.dialect.PostgreSQLDialect&lt;/span&gt;
    &lt;span class="na"&gt;hibernate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;ddl-auto&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;The &lt;em&gt;DummyDao&lt;/em&gt; class makes use of the &lt;em&gt;jdbcTemplate&lt;/em&gt; library to execute SQL queries in the database. This is the class that will be tested using the &lt;em&gt;PostgreSQL&lt;/em&gt; container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Repository&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;DummyDao&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;JdbcTemplate&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Dummy&lt;/span&gt; &lt;span class="nf"&gt;findDummyById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queryForObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT * FROM dummy_test where id=?"&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;Object&lt;/span&gt;&lt;span class="o"&gt;[]{&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DummyRowMapper&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt; &lt;span class="nf"&gt;readAll&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT id,name_value FROM dummy_test"&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;DummyRowMapper&lt;/span&gt;&lt;span class="o"&gt;());&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;int&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dummy&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"INSERT INTO dummy_test (id,name_value) VALUES (?,?) "&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;Object&lt;/span&gt;&lt;span class="o"&gt;[]{&lt;/span&gt;&lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()});&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DummyRowMapper&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;RowMapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Dummy&lt;/span&gt; &lt;span class="nf"&gt;mapRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ResultSet&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rowNumber&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Dummy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name_value"&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;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Look at the test bellow, it injects a DummyDAO instance and the following methods execute a read and write integration tests. Because this is an integration test, we are not_ &lt;em&gt;[_mocking&lt;/em&gt;](&lt;a href="https://pt.wikipedia.org/wiki/Objeto_Mock)_"&gt;https://pt.wikipedia.org/wiki/Objeto_Mock)_&lt;/a&gt; &lt;em&gt;the behavior of the _DummyDAO&lt;/em&gt; class, this means that a real connection with the database is required. &lt;/p&gt;

&lt;p&gt;A static instance of the PostgresSQL container is created in the class beginning. Even though this instance is not used in the class body, it is responsible to create and start the container. &lt;/p&gt;

&lt;p&gt;The static initialization of the attribute allows us to reuse the same container instance in other running tests. This avoids that a new container is created and destroyed on an every executed test. Tha &lt;em&gt;@TestContainer&lt;/em&gt; and &lt;em&gt;@Container&lt;/em&gt; annotation takes care of the container life cycle and allows that it be started once and destroyed when the test ends.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootTest&lt;/span&gt;
&lt;span class="nd"&gt;@ContextConfiguration&lt;/span&gt;
&lt;span class="nd"&gt;@Testcontainers&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;DummyDaoTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="nd"&gt;@Container&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;PostgreSQLContainer&lt;/span&gt; &lt;span class="n"&gt;postgreSQLContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CustomPostgresContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nd"&gt;@Autowired&lt;/span&gt;
&lt;span class="nc"&gt;DummyDao&lt;/span&gt; &lt;span class="n"&gt;dao&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Test&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;injectedComponentsAreNotNull&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;assertNotNull&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dao&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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save_new_value&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;Dummy&lt;/span&gt; &lt;span class="n"&gt;value&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;Dummy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"dummy"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;affectedRows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;affectedRows&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="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;read_all&lt;/span&gt;&lt;span class="o"&gt;()&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;dao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readAll&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&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;The &lt;em&gt;CustomPostgresContainer _class is responsible for download the image, create and start the _PostgreSQL&lt;/em&gt; container in the &lt;em&gt;alpine&lt;/em&gt; version. You could use any available image from &lt;a href="https://hub.docker.com/_/postgres"&gt;Docker Hub&lt;/a&gt;, or even a customized image. &lt;/p&gt;

&lt;p&gt;In this demonstration example, the container is started and a SQL Script is loaded to set up the database with some data. &lt;/p&gt;

&lt;p&gt;The overridden method &lt;em&gt;start()&lt;/em&gt; plays an important role in this test infrastructure. It gets the URL, user, and password from the started container and writes these values on environment variables. This allows the test to connect with a real database instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomPostgresContainer&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PostgreSQLContainer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LoggerFactory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLogger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CustomPostgresContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;IMAGE_VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"postgres:alpine"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;CustomPostgresContainer&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;CustomPostgresContainer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;IMAGE_VERSION&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;CustomPostgresContainer&lt;/span&gt; &lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;container&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;CustomPostgresContainer&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@Override&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;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"POSTGRES INFO"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_URL: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJdbcUrl&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_USERNAME: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUsername&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_PASSWORD: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPassword&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;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_URL"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJdbcUrl&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;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_USERNAME"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUsername&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;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB_PASSWORD"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPassword&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@Override&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;stop&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//do nothing, JVM handles shut down&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;The summary of the test execution flow using the Testcontainer is the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first test from the tests tacks is started;&lt;/li&gt;
&lt;li&gt;The &lt;em&gt;getInstance()&lt;/em&gt; method from &lt;em&gt;CustomPostgresContainer&lt;/em&gt; class is invoked. &lt;/li&gt;
&lt;li&gt;The &lt;em&gt;Testcontainer&lt;/em&gt; library checks if the required image exists locally;&lt;/li&gt;
&lt;li&gt;If the image does not exist locally, it is downloaded from the &lt;em&gt;docker hub&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;A container is created, based on the downloaded image and the database is started;&lt;/li&gt;
&lt;li&gt;All the following tests use the started database;&lt;/li&gt;
&lt;li&gt;At the end of all test execution, the container is destroyed. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;In this article, we saw how the Testcontainer library makes easy the creation of test integration with the use of docker images. It allows us to decrease, the environment disparity between the development environment and production environment, it also brings safety to deploy. The library is evolving daily and brings native support to many other databases and allows you to create your image.  &lt;a href="https://www.youtube.com/watch?v=L_i61qTg510"&gt;In this video&lt;/a&gt;, &lt;a href="https://github.com/kiview"&gt;Kevin Wittek&lt;/a&gt; one of the Testcontainer committers show us more about the library. &lt;/p&gt;

&lt;p&gt;Have you created integration tests that use real instances of services? What tools did you use? Drop a comment below! &lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/integration-test-with-testcontainer/"&gt;Integration test with TestContainer&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>container</category>
      <category>docker</category>
      <category>test</category>
      <category>begginer</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #21</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Thu, 21 Nov 2019 11:59:40 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-21-5he</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-21-5he</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/en-us/resources/designing-distributed-systems/en-us/"&gt;Free Ebook Designing Distributed Systems - Rapidly develop reliable, distributed systems with the patterns and paradigms.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://twitter.com/educostadev/status/1195651928765669376"&gt;Build your maillist. Create a simple #serverless function to collect email from your users for free without external tools.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.avanscoperta.it/it/2019/08/29/how-mob-programming-helps-collaboration-and-getting-work-done/"&gt;How Mob Programming helps collaboration and getting work done&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://monzo.com/blog/2016/09/19/building-a-modern-bank-backend"&gt;Building a Modern Bank Backend - How Monzo build a system scalable to hundreds of millions of customers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.thereformedprogrammer.net/ef-core-combining-sql-and-nosql-databases-for-better-performance/"&gt;Combining SQL and NoSQL databases for better performance&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.eweek.com/servers/why-serverless-may-become-dominant-programming-paradigm"&gt;Why #Serverless May Become a Dominant Programming Paradigm ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://idk.dev/architecting-a-low-cost-web-content-publishing-system/"&gt;Architecting a Low-Cost Web Content Publishing System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kennybastani.com/2016/04/event-sourcing-microservices-spring-cloud.html"&gt;Event  Sourcing in #Microservices Using #Spring #Cloud and Reactor. Explore  the problems of data consistency and high availability in microservices.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.bernd-ruecker.com/the-microservice-workflow-automation-cheat-sheet-fc0a80dc25aa"&gt;The Microservices Workflow Automation Cheat Sheet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://building.echo.co.uk/microservices-opinions-and-advice/"&gt;Building sustainable microservices, our opinions and advice.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.protego.io/what-you-need-to-know-about-cloud-native-security/"&gt;Cloud Native Application Security – What You Need To Know&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/innomizetech/top-serverless-plugins-we-are-using-f02df901bbbf"&gt;Top serverless plugins we are using&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://phauer.com/2019/no-fat-jar-in-docker-image/"&gt;Putting  a fat jar into a #Docker #container is a waste of storage, bandwidth  and time. Fortunately, we can leverage Docker’s image layering and  registry caching to create incremental builds and very small artifacts.  Read more #java&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/educostadev/status/1196382203304972288"&gt;Vodafone Greece has seen many benefits on using #Quarkus and replaces #SpringBoot #Microservices with @QuarkusIO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-21/"&gt;Weekly Cloud-Native Digest #21&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #20</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 12 Nov 2019 11:03:21 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-20-30o5</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-20-30o5</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.lightbend.com/blog/design-techniques-stateful-cloud-native-applications-resilience-recoverability-scalability"&gt;Design Techniques for Building Stateful, Cloud-Native Applications - Part 1: Resiliency, Recoverability, and Scalability&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.youtube.com/watch?v=xIB_VQVVWKk&amp;amp;list=PLxpwvsFSXIjD_RVJ1g_URXyQCNpbGtD6N&amp;amp;index=7&amp;amp;t=450s"&gt;Nice video with a demonstration on how #EventStorm technique works.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.redhat.com/en/engage/kubernetes-containers-architecture-s-201910240918?sc_cid=701f2000000u6QkAAI"&gt;FREE  EBook - Kubernetes Patterns Reusable Elements for Design Cloud-Native  Applications. Wrote @bibryam  and @ro14nd  with compliments of @RedHat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.brianstorti.com/the-actor-model/"&gt;The actor model in 10 minutes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://backendology.com/2018/08/27/multiple-layers-caching/"&gt;Multiple  Layers of Caching - This article covers some of the basics of caching,  yet focus on the importance of having multiple layers of caching in a  system. By @JaredRirie&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zeebe.io/blog/2018/12/microservices-workflow-automation-cheatsheet/"&gt;The  Microservices Workflow Automation Cheat Sheet - Does your company want  to go for a #microservice architecture and apply #workflow automation ?  Check some some guidance on the core #architecture decisions you have to  make. By @berndruecker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://spring.io/blog/2019/10/15/simple-event-driven-microservices-with-spring-cloud-stream"&gt;Simple Event Driven Microservices with Spring Cloud Stream&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://monzo.com/blog/we-built-network-isolation-for-1-500-services"&gt;We built network isolation for 1,500 services to make Monzo more secure&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://ziobrando.blogspot.com/2013/11/introducing-event-storming.html"&gt;Introducing  Event Storming - #EventStorming is a workshop format for quickly  exploring complex business domains. It is powerful, engaging, efficient,  easy and fun. Read this introduction and know more. by @ziobrando                                           &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.lightbend.com/blog/design-techniques-stateful-cloud-native-applications-resilience-recoverability-scalability"&gt;Design Techniques for Building Stateful, #CloudNative Applications -  #Resiliency, #Recoverability, and #Scalability By @mckeeh3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-20/"&gt;Weekly Cloud-Native Digest #20&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #19</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 05 Nov 2019 11:14:43 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-19-4hjk</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-19-4hjk</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/educostadev/status/1190668251526770690"&gt;The 1500 Microservices of Monzo Bank (UK)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/"&gt;The  Hardest Part About Microservices: Your Data. Taking a hard look at your  domain and your data will help you get to microservices. By  @christianposta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.bernd-ruecker.com/saga-how-to-implement-complex-business-transactions-without-two-phase-commit-e00aa41a1b1b"&gt;Saga: How to implement complex business transactions without two phase commit.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/why-do-we-cache-b24920e1e903"&gt;Why  do we cache? - Caching is extremely important because you can get  dramatic performance improvements without a lot of effort in certain  situations. Check this great article by @balexlandau&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.christianposta.com/microservices/carving-the-java-ee-monolith-into-microservices-perfer-verticals-not-layers/"&gt;Carving the Java EE Monolith Into Microservices: Prefer Verticals Not Layers By @christianposta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.christianposta.com/microservices/3-easy-things-to-do-to-make-your-microservices-more-resilient/"&gt;3 Easy Things to Do to Make Your #Microservices More Resilient By @christianposta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://udidahan.com/2009/12/09/clarified-cqrs/"&gt;Clarified  #CQRS - Before describing the details of CQRS we need to understand the  two main driving forces behind it: collaboration and staleness. Read  more.  By @UdiDahan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kennybastani.com/2017/01/building-event-driven-microservices.html"&gt;Building  Event-driven Microservices Using CQRS and Serverless - One of the most  popular practices in event-driven architectures today is called CQRS.  Check this great example by @kennybastani&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/letgo/event-oriented-architecture-anti-patterns-2dccc68ed282"&gt;Event-Oriented Architecture Anti-Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datawire.io/creating-a-microservice-answer-these-10-questions-first/"&gt;Creating  a Microservice? Answer these 10 Questions First  - 10 important  questions that you should answer about any new microservice before  development begins on it – and certainly before it gets deployed into  production. By @datawireio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=NGXl1D-KwRI&amp;amp;list=PLxpwvsFSXIjD_RVJ1g_URXyQCNpbGtD6N&amp;amp;index=6&amp;amp;t=0s"&gt;50.000  Orange Stickies Later - Watch this amazing talk with @ziobrando  about  #EventStorming. Event storming is a workshop-based method to quickly  find out what is happening in the domain of a software program.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-19/"&gt;Weekly Cloud-Native Digest #19&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>weeklydigest</category>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #18</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 29 Oct 2019 11:13:30 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-18-2pab</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-18-2pab</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.christianposta.com/microservices/why-microservices-should-be-event-driven-autonomy-vs-authority/"&gt;Why  Microservices Should Be Event Driven: Autonomy vs Authority - Going  from authority to autonomy and embracing eventual consistency By  @christianposta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/engineering-varo/event-driven-architecture-and-the-outbox-pattern-569e6fba7216"&gt;Event-Driven Architecture and the Outbox Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-17/"&gt;Weekly Cloud-Native Digest #17&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/JHGkaShoyNs"&gt;CQRS and Event Sourcing - In this talk, @gregyoung gives a good overview of how ES and CQRS work and what problems it solves.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lorenzotenti/how-to-build-a-serverless-twitter-bot-lph"&gt;How  to build a Serverless Twitter bot - Build a bot that will retweet at  regular intervals the most relevant tweets. By @LorenzoTenti&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://educosta.dev/blog/installing-google-cloud-sdk-on-windows/"&gt;Installing Google Cloud SDK on Windows - See the steps to install the Google Cloud Sofware Development Kit on Windows.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kennybastani.com/2017/01/building-event-driven-microservices.html"&gt;Building Event-driven Microservices Using CQRS and Serverless. By @kennybastani&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stepan.wtf/cloud-naming-convention/"&gt;Cloud Naming Convention - Consistent and descriptive naming of resources has many benefits.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.simform.com/tips-building-scalable-web-applications/"&gt;25 Experts Share Their Tips for building Scalable Web Application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stepan.wtf/cloud-naming-convention/"&gt;Cloud Naming Convention&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alexgaynor.net/2015/may/27/tips-for-scaling-web-apps/"&gt;Tips  for Scaling Web Apps. A short list of things you can do, on basically  any web project, to improve performance, scalability, and cost.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.okta.com/blog/2019/10/21/illustrated-guide-to-oauth-and-oidc"&gt;An Illustrated Guide to OAuth and OpenID Connect&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-18/"&gt;Weekly Cloud-Native Digest #18&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>weeklydigest</category>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>Installing Google Cloud SDK on Windows</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Wed, 23 Oct 2019 10:46:59 +0000</pubDate>
      <link>https://forem.com/educostadev/installing-google-cloud-sdk-on-windows-4024</link>
      <guid>https://forem.com/educostadev/installing-google-cloud-sdk-on-windows-4024</guid>
      <description>&lt;p&gt;&lt;a href="https://cloud.google.com/sdk/"&gt;Google Cloud SDK&lt;/a&gt; (Software Development Kit) is a Command-line interface for Google Cloud Platform products and services. It has a set of useful tools for manage VM Instances, network, firewall, disk storage and more. In the video below you see the steps to install it on Windows. If your operating system is other than windows, visit the Google Cloud &lt;a href="https://cloud.google.com/sdk/docs/quickstarts"&gt;Quickstarts documentation&lt;/a&gt; and follow the steps according to your operating system.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zqAiRd0R0jI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Check &lt;a href="https://educosta.dev/blog/tag/gcp/"&gt;other tutorials&lt;/a&gt; for Google Cloud Platform.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/installing-google-cloud-sdk-on-windows/"&gt;Installing Google Cloud SDK on Windows&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #17</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 22 Oct 2019 10:47:59 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-17-59kd</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-17-59kd</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leanpub.com/esversioning/read"&gt;Versioning  in an Event Sourced System - The goal of this text is not to discuss  Event Sourcing but to discuss how to version Event Sourced systems.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/blog/introducing-azure-spring-cloud-fully-managed-service-for-spring-boot-microservices/"&gt;Introducing  Azure Spring Cloud - To help make it simpler to deploy and operate  Spring Cloud applications, together with @pivotal Microsoft have created  @Azure  Spring Cloud. By @Johnmont&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.engineering/how-slack-built-shared-channels-8d42c895b19f"&gt;How  Slack Built Shared Channels - See the technical decision behind the  implementation of Shared Channels on @SlackHQ , the implications of the  decisions, and how they' working on scaling for the future.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.git-tower.com/blog/surviving-with-git-videos/"&gt;17  Ways to Undo Mistakes with Git - Git offers countless tools to undo and  recover from small and big mishaps. Here are 17 short  handy videos  that help you learn how to save your neck!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://educosta.dev/blog/5-facts-that-will-make-you-rethink-the-use-of-microservice/"&gt;5  facts that will make you rethink the use of Microservice. Although  Microservice is a tool to build scalable and resilient applications, it  has some requirements to be applied with success. This article explores  some of these requirements.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.allthingsdistributed.com/2008/12/eventually_consistent.html"&gt;Eventually  Consistent - Building reliable distributed systems at a worldwide scale  demands trade-offs between consistency and availability. By @Werner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://chatbotslife.com/building-a-custom-serverless-chatbot-pieces-parts-14ec8121b597"&gt;Building a Custom Serverless Chatbot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.infoq.com/presentations/event-flow-systems/"&gt;Complex Event Flows in Distributed Systems&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-17/"&gt;Weekly Cloud-Native Digest #17&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>weeklydigest</category>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>5 facts that will make you rethink the use of Microservice</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Wed, 16 Oct 2019 11:05:30 +0000</pubDate>
      <link>https://forem.com/educostadev/5-facts-that-will-make-you-rethink-the-use-of-microservice-11ip</link>
      <guid>https://forem.com/educostadev/5-facts-that-will-make-you-rethink-the-use-of-microservice-11ip</guid>
      <description>&lt;p&gt;Microservice architecture has been widely used to build scalable and resilient applications. Every company wants to build application fault-tolerant and be able to build and deploy new features fast. Although Microservice architecture is a tool to achieve these goals, it is also a tool that has some requirements to be applied with success. This article explores some of these requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;You should rethink use Microservices when…&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. The application is too small&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When the application is too small, the cost of maintaining a microservice up and running is higher than the benefits it generates.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. The problem domain is unclear or uncertain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Microservices are created based on the capabilities that you identify on the domain you are working on. This means that you will start by the creation of a domain model with boundaries, aggregates, entities, and interfaces. When the problem domain is unclear or uncertain, changes can happen more often than you expect. Boundaries will move, aggregates will consolidate, interfaces will change, the model will split. Refactory is good to&lt;a href="https://martinfowler.com/books/refactoring.html"&gt;improve the design of existing code&lt;/a&gt; but also can slow down the team when the contract with other services is broke. A monolith, in this case, is much more flexible.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. The Organization has a rigid business structure and cannot change&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The system architecture tends to reflect the business organization. The&lt;a href="http://www.melconway.com/Home/Conways_Law.html"&gt;Conway’s law&lt;/a&gt; states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Mel Conway&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Organization sometimes will need a&lt;a href="https://youtu.be/CZ3wIuvmHeM"&gt;Business Refactory&lt;/a&gt; to build Microservices. Different teams have different priorities that can create delays and conflicts. On Microservice architecture each service (or a small set of them) are managed by small and self sufficient teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. The team lacks experience to understand the microservice concepts or conceptual design&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Bad design architecture leads to a tightly coupled distributed monolith. And all the nightmare associated with it, delays, complexity, coupling deploy times. The lack of knowledge of DDD and commons patterns for Microservices is an open door to take shortcuts and implement anti-patterns. Managers also need to be comfortable with refractories and not blame the team due to bad choices. Fail often, fail early, fail fast is desired, but it is not an easy thing to learn because of the&lt;a href="https://en.wikipedia.org/wiki/Escalation_of_commitment"&gt;sunk cost fallacy&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. The team turnover is high or lacks experience with delivery pipeline&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Build and deploy microservices demands skills that go beyond programming and problem-solving. The team needs experience with &lt;a href="https://educosta.dev/blog/what-is-cloud-native/"&gt;test-driven development, code review, DevOps, infrastructure as code, continuous integration and deployment&lt;/a&gt;. If the turnover is high or the team lacks this skill there is a chance you ended up with a&lt;a href="https://www.infoq.com/news/2016/02/services-distributed-monolith/"&gt;distributed monolith&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article was based on this&lt;a href="https://www.feval.ca/posts/microservices/"&gt;great post&lt;/a&gt; from Charles Féval where he explains some of the downsides of adopting a Microservice Architecture.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What other facts you faced that made you rethink in adopt Microservice architecture? Drop a comment here.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/5-facts-that-will-make-you-rethink-the-use-of-microservice/"&gt;5 facts that will make you rethink the use of Microservice&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microservices</category>
    </item>
    <item>
      <title>Weekly Cloud-Native Digest #16</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Tue, 15 Oct 2019 10:30:54 +0000</pubDate>
      <link>https://forem.com/educostadev/weekly-cloud-native-digest-16-4l83</link>
      <guid>https://forem.com/educostadev/weekly-cloud-native-digest-16-4l83</guid>
      <description>&lt;p&gt;Save  time and stay up-to-date with what’s going on in the Cloud-Native  ecosystem. Every week a collection of useful links with videos, articles  and more. &lt;/p&gt;

&lt;h2&gt;
  
  
  VIDEOS
&lt;/h2&gt;

&lt;p&gt;-[&lt;a href="https://www.youtube.com/watch?v=PFQnNFe27kU&amp;amp;list=PLxpwvsFSXIjDY7rxBV4_IorF1qhSfIv3I&amp;amp;index=6&amp;amp;t=850s"&gt;Principles  Of Microservices] In this talk, Sam Newman shows us some principles of  Microservice Architecture with good examples and suggestions of tools to  address some of them&lt;/a&gt;&lt;br&gt;
-[&lt;a href="https://www.youtube.com/watch?v=4MEKu2TcEHM&amp;amp;t=2219s"&gt;Don't  Walk Away from Complexity, Run] A must watch presentation with an  amazing highlight on some types of complexity you commonly found in  software. Learn to identify it and run from it.  By @venkat_s  at  @GOTOcon&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://youtu.be/CZ3wIuvmHeM"&gt;Mastering  Chaos A Netflix Guide to Microservices -  In this talk @ZenTeknologist  talks about the chaotic and vibrant world of microservices at Netflix.&lt;/a&gt;  ​             &lt;/p&gt;

&lt;h2&gt;
  
  
  CQRS &amp;amp; ES
&lt;/h2&gt;

&lt;p&gt;-&lt;a href="https://hackernoon.com/1-year-of-event-sourcing-and-cqrs-fb9033ccd1c6"&gt;1  Year of Event Sourcing and CQRS - Great post which describe the journey  on implementing an application based on CQRS and Event Sourcing  principles. By @teivah at @hackernoon&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://www.microsoft.com/en-us/download/details.aspx?id=34774"&gt;Free  eBook Exploring CQRS and Event Sourcing - Focused on building highly  scalable, highly available, and maintainable applications with the  Command &amp;amp; Query Responsibility Segregation and the Event Sourcing  architectural patterns.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MICROSERVICES
&lt;/h2&gt;

&lt;p&gt;-&lt;a href="https://bravenewgeek.com/microservice-observability-part-1-disambiguating-observability-and-monitoring/"&gt;Microservice Observability, Part 1: Disambiguating Observability and Monitoring&lt;/a&gt;&lt;br&gt;
-&lt;a href="http://highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html"&gt;Microservices  - Not a free lunch! - Microservices one of these ideas that are nice in  practice, but all manner of complexity comes out when it meets reality.  Check this great article from @benjaminwootton .&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://azure.microsoft.com/en-us/blog/introducing-azure-spring-cloud-fully-managed-service-for-spring-boot-microservices/"&gt;Introducing  Azure Spring Cloud: fully managed service for Spring Boot microservices  - To help make it simpler to deploy and operate Spring Cloud  applications, together with @pivotal Microsoft have created @Azure   Spring Cloud. By @Johnmont&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://www.simform.com/microservice-testing-strategies/"&gt;Microservices Testing Strategies, Types &amp;amp; Tools: A Complete Guide -&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CLOUD &amp;amp; OTHERS
&lt;/h2&gt;

&lt;p&gt;-&lt;a href="https://boyter.org/posts/an-informal-survey-of-10-million-github-bitbucket-gitlab-projects/"&gt;The power of the cloud - Processing 40 TB of code from ~10 million projects with a dedicated server and Go for $100&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://slack.engineering/how-slack-built-shared-channels-8d42c895b19f"&gt;How  Slack Built Shared Channels - See the technical decision behind the  implementation of Shared Channels on @SlackHQ , the implications of the  decisions, and how they're working on scaling for the future.&lt;/a&gt;&lt;br&gt;
-&lt;a href="https://www.jhanley.com/ibm-cloud-creating-a-lite-account/"&gt;IBM  Cloud Creating a Lite Account - What about Creating a Lite Account on  IBM Cloud and start having fun ? In this post @NeoPrimeAws cover the  steps to you start with @IBMcloud with a good introduction to the main  services available.&lt;/a&gt;&lt;br&gt;&lt;br&gt;
-&lt;a href="https://bravenewgeek.com/the-observability-pipeline/"&gt;The Observability Pipeline&lt;/a&gt;                                                                     &lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/weekly-cloud-native-digest-16/"&gt;Weekly Cloud-Native Digest #16&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>news</category>
    </item>
    <item>
      <title>8 tips to get your dream job and also improve your curriculum</title>
      <dc:creator>@educostadev</dc:creator>
      <pubDate>Fri, 11 Oct 2019 16:50:55 +0000</pubDate>
      <link>https://forem.com/educostadev/8-tips-to-get-your-dream-job-and-also-improve-your-curriculum-3pjk</link>
      <guid>https://forem.com/educostadev/8-tips-to-get-your-dream-job-and-also-improve-your-curriculum-3pjk</guid>
      <description>&lt;p&gt;Dream job! Talking with &lt;a href="https://twitter.com/brjavaman"&gt;Bruno Souza&lt;/a&gt; (the Brazilian Java man) about career, he gave me golden tips on how to get your &lt;a href="https://educosta.dev/blog/3-lessons-on-software-development-from-the-book-essentialism-the-disciplined-pursuit-of-less/"&gt;dream job&lt;/a&gt; and also improve your curriculum. Check this out &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XmPjmDMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f447.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XmPjmDMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f447.png" alt="👇"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 1#
&lt;/h2&gt;

&lt;p&gt;The best offers is the one where the company knows and trusts you. When this happens, your curriculum does not matter. So keep improving your network and share knowledge as much as you can.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 2
&lt;/h2&gt;

&lt;p&gt;Create a curriculum is like to create a marketing folder to sell a product. You do not sell a product talking about its features, but about the benefits it brings. Talk about your benefits!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 3
&lt;/h2&gt;

&lt;p&gt;Tell in your curriculum about what you are good and what you can bring to the company you are applying to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 4#
&lt;/h2&gt;

&lt;p&gt;When a company reads your curriculum they are looking for what you can do for them. How can you help them? Show how in your curriculum!&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 5#
&lt;/h2&gt;

&lt;p&gt;Show the transformation you can cause to the people you work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 6#
&lt;/h2&gt;

&lt;p&gt;Whether a company will pay 100k/year for a position, it will be 1 Million in 10 years. Why the company should choose you? Show them why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 7#
&lt;/h2&gt;

&lt;p&gt;Make your curriculum easy to read. You can, for example, create sessions divided by companies or projects you worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tip Number 8#
&lt;/h2&gt;

&lt;p&gt;Look on the position requirements you are applying and add on your curriculum the values you can bring for the company that matches the offer. A directed curriculum is even better than a generic one.&lt;/p&gt;




&lt;p&gt;Can you add more tips here? What do you think is important to get your dream job? Drop a comment bellow.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://educosta.dev/blog/8-tips-to-get-your-dream-job-and-also-improve-your-curriculum/"&gt;8 tips to get your dream job and also improve your curriculum&lt;/a&gt; appeared first on &lt;a href="https://educosta.dev"&gt;Be Cloud Native&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
  </channel>
</rss>
