<?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: VaiVoa</title>
    <description>The latest articles on DEV Community by VaiVoa (@vaivoa).</description>
    <link>https://dev.to/vaivoa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4833%2F8a5be119-7e65-4751-bbff-08aba2bf01fa.png</url>
      <title>DEV Community: VaiVoa</title>
      <link>https://dev.to/vaivoa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vaivoa"/>
    <language>en</language>
    <item>
      <title>Design Pattern: Factory Method</title>
      <dc:creator>Guilherme Pirani</dc:creator>
      <pubDate>Tue, 05 Apr 2022 20:52:56 +0000</pubDate>
      <link>https://dev.to/vaivoa/design-pattern-factory-method-5580</link>
      <guid>https://dev.to/vaivoa/design-pattern-factory-method-5580</guid>
      <description>&lt;p&gt;Os designs de criação, nos quais se inclui o Factory, são utilizados para criar objetos sem expor ao cliente a lógica pela qual aquele objeto é criado. Assim, as subclasses ligadas a uma interface ou classe abstrata podem ser instanciadas sem que o cliente se importe com o tipo específico do objeto sendo criado.&lt;/p&gt;

&lt;p&gt;De uma maneira mais prática, o diagrama abaixo é um exemplo de implementação de uma Factory:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl84m586e14v1ejhael6q.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%2Fl84m586e14v1ejhael6q.png" alt="SAMPLE FACTORY UML"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pode parecer sem sentido o simples ato de levar o construtor de um objeto para uma outra parte do programa, mas é justamente esse pequeno ato que gera a abstração que queremos, algo extremamente benéfico quando se trata de grandes projetos. Assim podemos sobrescrever o método de criação em uma subclasse, alterando o objeto criado, não é necessário reescrevermos toda a lógica de criação para cada subclasse que quisermos adicionar ao nosso programa, aplicamos princípios SOLID em nosso código, geramos um baixo acoplamento e facilitamos a manutenção.&lt;/p&gt;

&lt;p&gt;Quando utilizar o Factory Method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando o cliente não sabe de antemão o tipo de objeto que deverá ser criado.&lt;/li&gt;
&lt;li&gt;Para permitir a extensão do código sem ter que realizar alterações em outras partes do projeto.&lt;/li&gt;
&lt;li&gt;Para eliminar duplicação de código na criação de objetos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prós do Factory Method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evita acoplamento&lt;/li&gt;
&lt;li&gt;Facilita Manutenção&lt;/li&gt;
&lt;li&gt;Responsabilidade única (&lt;a href="https://en.wikipedia.org/wiki/SOLID#:~:text=In%20software%20engineering%2C%20SOLID%20is,engineer%20and%20instructor%20Robert%20C." rel="noopener noreferrer"&gt;SOLID&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Aberto/Fechado (&lt;a href="https://en.wikipedia.org/wiki/SOLID#:~:text=In%20software%20engineering%2C%20SOLID%20is,engineer%20and%20instructor%20Robert%20C." rel="noopener noreferrer"&gt;SOLID&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras do Factory Method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Os produtos para serem retornados precisam ter uma classe ou interface base em comum.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Gera uma grande quantidade de classes no seu projeto.&lt;/em&gt; No entanto cabe aqui uma observação: é responsabilidade do desenvolvedor considerar os trade-offs daquilo que ele implementa. Nesse caso da quantidade de classes, podemos abrir mão de um pró do Factory de forma a diminuir a quantidade de classes, porém aumentando o acoplamento do código (usando switch case na Factory por exemplo, transformando o padrão em um Simple Factory)&lt;/li&gt;
&lt;li&gt;Outros patterns podem oferecer mais flexibilidade, como Builder e Prototype, porém trazendo maior complexidade. Assim muitos projetos iniciam utilizando Factory e depois migram para outros design patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para um tutorial prático de como aplicar o Factory Method &lt;a href="https://vaivoa.github.io/factory-method-design-pattern/" rel="noopener noreferrer"&gt;CLIQUE AQUI&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__754899"&gt;
    &lt;a href="/guilhermepirani" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F754899%2F4149c1ee-686f-4a12-b0d5-0111b52bb86d.png" alt="guilhermepirani image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/guilhermepirani"&gt;Guilherme Pirani&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/guilhermepirani"&gt;Developer | Microsoft Learn Student Ambassador | AZ-900 | DP-900 | SC-900&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&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%2Fn8bndcx2jkn1jz1dy98v.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%2Fn8bndcx2jkn1jz1dy98v.png" alt="linha horizontal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&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%2F1wmziqv74ghhgyi9p0om.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>tutorial</category>
      <category>architecture</category>
      <category>oop</category>
    </item>
    <item>
      <title>Setting up a virtual machine to run a scheduled job - Part 1 - Terraform, Serverless Framework and AWS</title>
      <dc:creator>José Paiva</dc:creator>
      <pubDate>Mon, 04 Apr 2022 23:54:09 +0000</pubDate>
      <link>https://dev.to/vaivoa/setting-up-a-virtual-machine-to-run-a-scheduled-job-part-1-terraform-serverless-framework-and-aws-o43</link>
      <guid>https://dev.to/vaivoa/setting-up-a-virtual-machine-to-run-a-scheduled-job-part-1-terraform-serverless-framework-and-aws-o43</guid>
      <description>&lt;p&gt;Hello, I'm José Silva, backend developer at Vaivoa, and today I'm going to teach you how to set up a ec2 machine at aws to run a cron job on a specific schedule with terraform and the serverless framework.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;This article is the first of a series, which in the next steps, I'll explain how to use ansible to configure an ec2 instance dynamically to run a cron job and also configure git to always update the code before running the job.&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Terraform is a IaC tool, which helps you provide your cloud infrastructure with code. it's useful for versioning your infrastructure, documenting and automating your work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;EC2 is the AWS service for virtual machines. There's a free tier available, so don't worry about expenses(but still remember deleting all the resources created after the tutorial)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The serverless framework helps you deploy and configure lambda functions. We're going to write our lambda functions in python3.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full code of the project is here: &lt;a href="https://github.com/Jose-Victor-PS/ec2_cron_job_tutorial" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Next there's a picture representing the workflow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftkxzawqqds0kzstqzoid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftkxzawqqds0kzstqzoid.png" alt="Cron Triggers Lambda to Start EC2 Instance" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since we don't want the instance to be on 24/7, we'll rely on a lambda function to control the time the instance is up and running. The stop process will be taken care of by the instance itself. Since we don't know the time the job will take to execute(and for the most cases we can't predict), I'll encapsulate the job execution in a script that will take care of shutting down the instance once the job is finished.&lt;/p&gt;

&lt;p&gt;For the scope of this part of the series, I'll focus only on starting the instance in a specific schedule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terraform
&lt;/h2&gt;

&lt;p&gt;Let's start with our repository structure. First, terraform uses the working directory to get all information about your infrastructure. So let's create a directory just to put all the terraform config files. Every &lt;code&gt;terraform&lt;/code&gt; command should be used inside the terraform directory.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tutorial/
    terraform/
        main.tf
        machine.tf
        vars.tf
        outputs.tf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;inside main.tf, let's put this code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.74.3"
    }
  }
}

provider "aws" {
  region = "your-favorite-region"
  profile = "your-aws-profile"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the terraform part of the code, we tell which provider we're using, and which version of the provider we're using. Since I'm using version 3.74.3, if you want to know more about the terraform code i'm using, go to this version of the documentation. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the provider section, we're telling which region we're going to deploy our infrastructure and what aws profile we're using to authenticate. Your profile is defined under the &lt;code&gt;credentials&lt;/code&gt; file in your &lt;code&gt;.aws/&lt;/code&gt; folder.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, also in main.tf, we're using the data module to query the amazon linux 2 ami. It's useful because the same ami has different ids in different regions and so you don't have to look for it in the aws console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
data "aws_ami" "amazon_linux" {
  most_recent = true

  filter {
    name = "name"
    values = ["amzn2-ami-kernel-5.10-hvm*"]
  }

  filter {
    name = "architecture"
    values = ["x86_64"]
  }

  owners = ["137112412989"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The amazon linux is an improved version of linux for aws, is supposed to be stable, safe and have a good performance. It's similar to Red Hat 7, so it uses &lt;code&gt;yum&lt;/code&gt; as a package manager, for example.&lt;/p&gt;

&lt;p&gt;Now let's write the vars.tf file. In this file we're going to set up all the terraform variables in the code. This allows us to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;b&gt;Avoid&lt;/b&gt; hard coded values so it's easier to refactor our code.&lt;/li&gt;
&lt;li&gt;Modularize our environment in case we want to deploy different configurations for development and production, for example.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;
variable "instance_size" {
  type = map(string)

  default = {
    "test" = "t2.micro"
    "prod" = "t2.medium"
  }
}

variable "network" {
  type = object({
    all_ipv4 = string
    all_ipv6 = string
    all_protocols = string
    all_ports = number
  })

  default = {
    all_ipv4 = "0.0.0.0/0"
    all_ipv6 = "::/0"
    all_protocols = "-1"
    all_ports = 0
  }
}

variable "disk" {
  type = map(number)

  default = {
    "test" = 16
    "prod" = 64
  }
}

variable "ssh_key" {
  type = string
  default = "my-ssh-key"
}

variable "inbound_rules" {
  type = object({
    port = number
    protocol = string
    description = string
  })

  default = {
    port = 22,
    protocol = "tcp",
    description = "Allow SSH"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here are the values we're using for the &lt;code&gt;test&lt;/code&gt; environment. Feel free to change them as you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For instance type we're using the free tier, so you don't waste any money in this tutorial(as long as you still have the 750 hours per month to use).&lt;/li&gt;
&lt;li&gt;For disk size, we're using 16 GB because is a reasonable size, but depending on the job you want to run, you might increase or decrease this size.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next there's the machine.tf code. Here I'm setting up the ec2 machine configuration and the security group configuration. I'll explain each part separately.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
resource "aws_instance" "tutorial_machine" {
  ami = data.aws_ami.amazon_linux.id
  instance_type = var.instance_size.test
  key_name = var.ssh_key
  security_groups = [aws_security_group.tutorial_sg.name]
  root_block_device {
    volume_size = var.disk.test
  }
  tags = {
    Name = "my_tutorial_machine"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Here are some explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;aws_instance&lt;/code&gt; keyword means it's an ec2 virtual machine.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;tutorial_machine&lt;/code&gt; is the local name terraform uses to reference the resource in code.&lt;/li&gt;
&lt;li&gt;In the ami attribute, we're referencing the amazon linux 2 ami we queried in the data module in the main.tf file.&lt;/li&gt;
&lt;li&gt;In the tags attribute, we're telling what the actual name of the virtual machine will be.&lt;/li&gt;
&lt;li&gt;In the security groups, we're referencing a security group we're about to define next in the machine.tf file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the rest of the code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
resource "aws_security_group" "tutorial_sg" {
  name = "tutorial_sg"
  description = "Tutorial Security Group"

  ingress { #Inbound Rule
    from_port = var.inbound_rules.port
    protocol = var.inbound_rules.protocol
    to_port = var.inbound_rules.port
    cidr_blocks = [var.network.all_ipv4]
    ipv6_cidr_blocks = [var.network.all_ipv6]
    description = var.inbound_rules.description
  }

  egress { # Outbond Rule
    from_port = var.network.all_ports
    protocol = var.network.all_protocols
    to_port = var.network.all_ports
    cidr_blocks = [var.network.all_ipv4]
    ipv6_cidr_blocks = [var.network.all_ipv6]
  }

  tags = {
    Name = "Allow SSH Only"
  }

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

&lt;p&gt;In the console, we can set up the security group or create a new one, if we create a new one, there's the default outbond rules allowing every traffic to the internet. With terraform, the security group has no default rule, so we have to specify everything we want.&lt;/p&gt;

&lt;p&gt;In this security group we're setting two rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow all network traffic exiting the machine&lt;/li&gt;
&lt;li&gt;Only allow traffic entering the machine through the ssh port number 22 from all hosts, both ipv4 and ipv6.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 22 port is the default for ssh connections, which is something extremely important when configuring or using a virtual machine. In this part of the series we won't use it, but later we will.&lt;/p&gt;

&lt;p&gt;Feel free to open more ports if your job needs it.&lt;/p&gt;

&lt;p&gt;Finally, we're setting up some outputs to know some basic information about our deployed ec2 instance.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
output "tutorial_public_dns" {
  value = aws_instance.tutorial_machine.public_dns
}

output "tutorial_instance_id" {
  value = aws_instance.tutorial_machine.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Don't forget to change all the variables placeholders for your actual variables, like profile name, ssh key name, etc.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Now let's run some &lt;code&gt;terraform&lt;/code&gt; commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run &lt;code&gt;terraform init&lt;/code&gt; inside the terraform folder. This command will install the aws provider runtime terraform relies on to understand what "&lt;code&gt;aws_instance&lt;/code&gt;" or "&lt;code&gt;aws_security_group&lt;/code&gt;" means.&lt;/li&gt;
&lt;li&gt;Then run &lt;code&gt;terraform plan&lt;/code&gt; to get a sample output of what might happen when you actually deploy your infrastructure and verify if there's any sintax errors in your code.&lt;/li&gt;
&lt;li&gt;Now run &lt;code&gt;terraform apply&lt;/code&gt; to deploy your machine. Terraform will show you what will be deployed again and will ask you to confirm your action by typing "yes" in the terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After confirmation, you can go to your aws console, in the ec2 instances panel, and see your tutorial instance right there up and running!&lt;/p&gt;

&lt;p&gt;Since we don't want our instance to be up and running 24/7, let's stop the instance and move on to the final part of the tutorial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lambda Functions &amp;amp; Serverless Framework
&lt;/h2&gt;

&lt;p&gt;Now let's add a lambda directory to the tutorials folder and put the python script in it to start the ec2 instance, and the serverless.yml file to configure the lambda function.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tutorial/
    terraform/
        main.tf
        machine.tf
        vars.tf
        outputs.tf
    lambda/
        main.py
        serverless.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Under the lambda folder, in the main.py file, let's write our python code to start the instance based on the &lt;code&gt;name tag&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
import boto3


def handler(event, context):
    ec2 = boto3.client("ec2")
    response = ec2.describe_instances(
        Filters=[
            {
                'Name': "tag:Name",
                'Values': [
                    'my_tutorial_machine'
                ]
            }
        ]
    )

    instance_id = response['Reservations'][0]['Instances'][0]['InstanceId']

    response = ec2.start_instances(
        InstanceIds=[
            instance_id
        ]
    )
    print(response)


if __name__ == '__main__':
    handler({}, None)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Make sure the &lt;code&gt;name tag&lt;/code&gt; is the same in both the main.py and  the machine.tf.&lt;/p&gt;

&lt;p&gt;I'm using boto3, which is the AWS SDK for Python3 and can be installed via pip. This SDK allows us to send API calls to aws in a easier way to start, stop, modify ec2 instances and much more.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;start instance&lt;/code&gt; operation relies on the instance id, which is something that changes for every deploy. Since we're using terraform and might deploy and redeploy our virtual machine a couple of times, the instance id will change accordingly, and every time it changes we'll have to adapt our python script. So we're first querying the instance information by name, which is something that doesn't change for every deploy.&lt;/p&gt;

&lt;p&gt;Finally, let's write our serverless.yml, configuring the lambda runtime, stage, service name, aws region and IAM role statements.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
service: tutorial-initializer

provider:
  name: aws
  stage: development
  runtime: python3.6
  region: your-favorite-region
  iamRoleStatements:
    - Effect: Allow
      Action:
        - ec2:DescribeInstances
        - ec2:StartInstances
      Resource: "*"

functions:
  initializer:
    handler: main.handler
    events:
      - schedule:
          enabled: true
          rate: your-cron-expression
    memorySize: 128
    timeout: 30
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the &lt;code&gt;iamRoleStatements&lt;/code&gt; we're &lt;b&gt;allowing&lt;/b&gt; our lambda function to perform the &lt;code&gt;StartInstances&lt;/code&gt; and the &lt;code&gt;DescribeInstances&lt;/code&gt; on any ec2 instance.&lt;/p&gt;

&lt;p&gt;Here are some important things to know about the serverless.yml file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;code&gt;functions&lt;/code&gt; part of the configuration, we're saying that the &lt;code&gt;initializer&lt;/code&gt; lambda function will be the &lt;code&gt;handler&lt;/code&gt; function in the &lt;code&gt;main.py&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;events&lt;/code&gt; part defines the cron &lt;code&gt;schedule&lt;/code&gt; that will trigger the lambda function once the time is right.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;timeout&lt;/code&gt; defines the maximun time in seconds your lambda function is allowed to run. In this case 30 seconds is more than enough.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;memorySize&lt;/code&gt; defines how much memory your function might have in MB. AWS uses this parameter to bill you(lambda function memory size multiplied by the total time of execution), so try to use a low value in here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, just run &lt;code&gt;sls deploy&lt;/code&gt; inside your lambda folder and that's it! You just deployed a lambda function to start an EC2 instance based on a cron schedule.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Don't forget to replace the region and cron expression placeholders with your preferred region.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Also, keep in mind the schedule rate is based on the region time zone where your lambda is deployed. So calculate the difference between you local timezone and the aws region timezone to get the desired result.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Now you learned how to set up a virtual machine in AWS EC2 using free tier and setting up a lambda function to start the machine based on a cron schedule.&lt;/p&gt;

&lt;p&gt;In the next modules I'll teach about configuring the machine with ansible, setting up the cron job to start on boot and updating the code with git.&lt;/p&gt;

&lt;p&gt;The full code of the project is here: &lt;a href="https://github.com/Jose-Victor-PS/ec2_cron_job_tutorial" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;To avoid further costs, after the completion of this tutorial, please run:&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;terraform destroy&lt;/code&gt; in your terraform folder, to destroy your ec2 instance and security group&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;code&gt;sls remove&lt;/code&gt; in your lambda folder, to remove all of your deployed resources related to the serverless framework.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag__user ltag__user__id__779693"&gt;
    &lt;a href="/josevictorps" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F779693%2F296b2115-6111-47c2-b904-72689f7c9de6.jpg" alt="josevictorps image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/josevictorps"&gt;José Paiva&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/josevictorps"&gt;Backend Developer at Vaivoa School of Excellence and Cloud Architect &amp;amp; DevoOps Engineer at Carteira Global.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.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%2Fn8bndcx2jkn1jz1dy98v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn8bndcx2jkn1jz1dy98v.png" alt="linha horizontal" width="800" height="3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1wmziqv74ghhgyi9p0om.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa" width="548" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>terraform</category>
      <category>serverless</category>
    </item>
    <item>
      <title>KAFKA + KSQLDB + .NET #1</title>
      <dc:creator>Ricardo Medeiros</dc:creator>
      <pubDate>Tue, 30 Nov 2021 17:19:05 +0000</pubDate>
      <link>https://dev.to/vaivoa/kafka-ksqldb-net-1-40g4</link>
      <guid>https://dev.to/vaivoa/kafka-ksqldb-net-1-40g4</guid>
      <description>&lt;p&gt;Hi, I'm &lt;a href="https://github.com/jjackbauer" rel="noopener noreferrer"&gt;Ricardo Medeiros&lt;/a&gt;, .NET back end developer @vaivoa, and today I'm going to walk you through using ksqlDB to query messages produced in kafka by a .NET/C# producer. For this example, I will be deploying my enviroment as containers, described in a docker compose file, to ensure easy reproducibility of my results.&lt;/p&gt;

&lt;p&gt;The source code used in this example is avaliable &lt;a href="https://github.com/jjackbauer/ksqlDBDemo" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Services
&lt;/h2&gt;

&lt;p&gt;First, let's talk about the docker compose environment services. the file is avaliable &lt;a href="https://github.com/jjackbauer/ksqlDBDemo/blob/main/docker-compose.yml" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  .NET API Producer
&lt;/h3&gt;

&lt;p&gt;Automaticaly generated .NET api with docker compose service&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ksqldbdemo:
    container_name: ksqldbdemo
    image: ${DOCKER_REGISTRY-}ksqldbdemo
    build:
      context: .
      dockerfile: Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This producer service needs the .NET generated dockerfile shown below:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["ksqlDBDemo.csproj", "."]
RUN dotnet restore "ksqlDBDemo.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "ksqlDBDemo.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ksqlDBDemo.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ksqlDBDemo.dll"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ZooKeeper
&lt;/h3&gt;

&lt;p&gt;Despite not been necessary since Kafka 2.8, ZooKeeper coordinates kafka tasks, defining controllers, cluster membership, topic configuration and more. In this tutorial, it's used the confluent inc. ZooKeeper image, due to it's use in the reference material. It makes Kafka more reliable, but adds complexity into the system.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zookeeper:
    image: confluentinc/cp-zookeeper:7.0.0
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Kafka
&lt;/h3&gt;

&lt;p&gt;Kafka is an event streaming plataform capable of handling trillions of events a day. Kafka is based on the abstraction of an distributed commit log. Initialiy developed at LinkedIn in 2011 to work as a message queue, but it has evolved into a full-fledge event streanming platfmorm. Listed as broker in the services, is the core of this tutorial. It's configuration is tricky, but using it as follows worked well in this scenario.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; broker:
    image: confluentinc/cp-kafka:7.0.0
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "29092:29092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ksqlDB
&lt;/h3&gt;

&lt;p&gt;ksqlDB is a database built to allow distributed stream process applications. Made to work seamsly with kafka, it has a server that runs outside of kafka, with a REST API and a CLI application that can be run separatly and it's used in this tutorial.&lt;/p&gt;
&lt;h4&gt;
  
  
  ksqlDB Server
&lt;/h4&gt;

&lt;p&gt;In this example, it's used the confluent inc image of the ksqlDB server, once more, due to it's widespread usage.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ksqldb-server:
    image: confluentinc/ksqldb-server:0.22.0
    hostname: ksqldb-server
    container_name: ksqldb-server
    depends_on:
      - broker
    ports:
      - "8088:8088"
    environment:
      KSQL_LISTENERS: http://0.0.0.0:8088
      KSQL_BOOTSTRAP_SERVERS: broker:29092
      KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
      KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  ksqlDB CLI
&lt;/h4&gt;

&lt;p&gt;The same goes for the ksqlDB CLI service, that also use the confluent inc image.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ksqldb-cli:
    image: confluentinc/ksqldb-cli:0.22.0
    container_name: ksqldb-cli
    depends_on:
      - broker
      - ksqldb-server
    entrypoint: /bin/sh
    tty: true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Kafdrop
&lt;/h3&gt;

&lt;p&gt;Kafdrop is a Web UI for viewing kafka topics and browsing consumer groups. It makes kafka more accessible.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kafdrop:
    container_name: kafdrop
    image: obsidiandynamics/kafdrop:latest
    depends_on:
      - broker
    ports:
      - 19000:9000
    environment:
      KAFKA_BROKERCONNECT: broker:29092
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Tutorial
&lt;/h2&gt;

&lt;p&gt;Now it's the time that you have been waiting, let's make it work!&lt;/p&gt;
&lt;h3&gt;
  
  
  Enviroment
&lt;/h3&gt;

&lt;p&gt;For this tutorial, you'll need a &lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;docker desktop&lt;/a&gt; installation, either it's on a Linux distribution or on Windows with WSL and &lt;a href="https://git-scm.com/downloads" rel="noopener noreferrer"&gt;git&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Cloning the project
&lt;/h3&gt;

&lt;p&gt;A Visual Studio project is avaliable &lt;a href="https://github.com/jjackbauer/ksqlDBDemo" rel="noopener noreferrer"&gt;here&lt;/a&gt;, it has docker support and already deploys all the services needed for this demo in the IDE. However, you will be fine if you don't want or can't use Visual Studio. Just  clone it, running the following comand on the terminal and directory of your preference:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; $ git clone https://github.com/jjackbauer/ksqlDBDemo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use the following command to move to the project folder:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; $ cd /ksqlDBDemo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And, in the project folder, that contains the docker-compose.yml run the following command to deploy the services:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;after this command, make sure that all services are running. Sometimes services fall, but it is okay. In order to see if everything is running ok, it's possible to see the services running in docker desktop, as shown bellow:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3uakexrf3p7atec8q7k9.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3uakexrf3p7atec8q7k9.PNG" alt="Docker Desktop" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or you can execute the following command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Which should output something like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   IMAGE                               COMMAND                  CREATED       STATUS       PORTS
  NAMES
b42ce9954fd9   ksqldbdemo_ksqldbdemo               "dotnet ksqlDBDemo.d…"   2 hours ago   Up 2 hours   0.0.0.0:9009-&amp;gt;80/tcp, 0.0.0.0:52351-&amp;gt;443/tcp   ksqldbdemo
0a0186712553   confluentinc/ksqldb-cli:0.22.0      "/bin/sh"                2 hours ago   Up 2 hours
  ksqldb-cli
76519de6946e   obsidiandynamics/kafdrop:latest     "/kafdrop.sh"            2 hours ago   Up 2 hours   0.0.0.0:19000-&amp;gt;9000/tcp
  kafdrop
11c3a306ee01   confluentinc/ksqldb-server:0.22.0   "/usr/bin/docker/run"    2 hours ago   Up 2 hours   0.0.0.0:8088-&amp;gt;8088/tcp
  ksqldb-server
07cef9d69267   confluentinc/cp-kafka:7.0.0         "/etc/confluent/dock…"   2 hours ago   Up 2 hours   9092/tcp, 0.0.0.0:29092-&amp;gt;29092/tcp
  broker
3fa1b9a60954   confluentinc/cp-zookeeper:7.0.0     "/etc/confluent/dock…"   2 hours ago   Up 2 hours   2888/tcp, 0.0.0.0:2181-&amp;gt;2181/tcp, 3888/tcp     zookeeper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  WEB API
&lt;/h3&gt;

&lt;p&gt;Now, with all services up and running, we can access the WEB API Swagger to populate our Kafka topics. The code is very simple and it's avaliable in the &lt;a href="https://github.com/jjackbauer/ksqlDBDemo" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The WEB API swagger is deployed at &lt;a href="http://localhost:9009/swagger/index.html" rel="noopener noreferrer"&gt;http://localhost:9009/swagger/index.html&lt;/a&gt;. As shown in the image bellow, it has two endpoints and they create events that could be created by indepent microservices. One for creating an event that creates a userName in the system and another that takes an Id and generates a three digit code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F99l7s38ffu0tx1gon62r.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F99l7s38ffu0tx1gon62r.PNG" alt="Swagger Geral" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you can create an User with the user name of your choise, as shown:&lt;br&gt;
&lt;a href="https://media2.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%2Fmxlhjsmfeei7wnym834g.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmxlhjsmfeei7wnym834g.PNG" alt="Request Create user" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And it will have an assigned unique Id, as demonstrated:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3g06gff8025nxw6gze9v.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3g06gff8025nxw6gze9v.PNG" alt="Response create user" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, you can get a three digit code for your user Id as displayed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6yoezrw53wibte9baiaj.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6yoezrw53wibte9baiaj.PNG" alt="Get Code Request" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And a random code is generated for the selectd, as we can observe in the image that follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fazp6yri8cy4x4day7vyu.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fazp6yri8cy4x4day7vyu.PNG" alt="Get Code Response" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Kafdrop
&lt;/h3&gt;

&lt;p&gt;We can use the kafdrop UI the check if everything is okay. Kafdrop is deployed at &lt;a href="http://localhost:19000/" rel="noopener noreferrer"&gt;http://localhost:19000/&lt;/a&gt;.&lt;br&gt;
There, you will find all the brokers and topics avaliable. It should look like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fy9v29cx12cqw5cnp19sr.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fy9v29cx12cqw5cnp19sr.PNG" alt="Kafdrop" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  KSQL CLI
&lt;/h3&gt;

&lt;p&gt;After all that, you'll be able to create your streams of data and query it using ksqlDB. On your preferential terminal, use the command:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it ksqldb-cli ksql http://ksqldb-server:8088
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Creating streams
&lt;/h4&gt;

&lt;p&gt;And then you are in the ksql CLI and are free to create your streams and queries. First, let's create a stream for each one of our topics:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE STREAM stream_user (Name VARCHAR, Id VARCHAR)
  WITH (kafka_topic='demo-user', value_format='json', partitions=1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE STREAM stream_code (Id VARCHAR, code INT)
  WITH (kafka_topic='demo-code', value_format='json', partitions=1);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Create a materialized view
&lt;/h4&gt;

&lt;p&gt;You can join the client data with the most recent randomized code. to achieve this, you must create a materialized view table, that joins both streams as seen in the ksqldb script that follows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE TABLE currentCodeView AS
&amp;gt;   SELECT user.Name,
&amp;gt;   LATEST_BY_OFFSET(code.code) AS CurrentCode
&amp;gt;   FROM stream_code code INNER JOIN stream_user user
&amp;gt;   WITHIN 7 DAYS ON code.Id = user.Id
&amp;gt;   GROUP BY user.Name
&amp;gt;EMIT CHANGES;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Making a push query
&lt;/h4&gt;

&lt;p&gt;After that, we can query this materialized view:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM currentCodeView 
  EMIT CHANGES;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This push query keep on running until you hit cntrl+c to cancel it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;In this tutorial it's demonstrated that in a kafka + ksqlDB enviroment, you can make SQL queries and also join on data that comes from different events, which is one of most complexities envolved with microsservices systems. And it is what ksqlDB solves by enabling SQL operations over Kafka topics.&lt;br&gt;
It's my goal to explore the possibilites allowed by this ecosystem and I hope to bring more knowledge on this topic in another articles here. Any sugestions, comments or corrections, fell free to reach me out at &lt;a href="https://www.linkedin.com/in/rmedio/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__757631"&gt;
    &lt;a href="/jjackbauer" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F757631%2F76940fdf-9f04-4bd8-9217-d577d788ffef.jpeg" alt="jjackbauer image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/jjackbauer"&gt;Ricardo Medeiros&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/jjackbauer"&gt;Senior Cloud Software Engineer @Caylent&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ksqldb.io/quickstart.html?_ga=2.218008467.482211024.1638022122-847939024.1633623088&amp;amp;_gac=1.142412294.1634140787.EAIaIQobChMIjOL6pt_H8wIVmcWaCh1KbwgwEAEYASAAEgLBFvD_BwE" rel="noopener noreferrer"&gt;ksqlDB Quickstart&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.confluent.io/platform/current/ksqldb/index.html#ksql-home" rel="noopener noreferrer"&gt;ksqlDB Overview&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.confluent.io/clients-confluent-kafka-dotnet/current/overview.html" rel="noopener noreferrer"&gt;Kafka .NET Client&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.ksqldb.io/en/latest/reference/sql/data-types/" rel="noopener noreferrer"&gt;ksqlDB Documentation - Data Types Overview&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.ksqldb.io/en/latest/operate-and-deploy/ksql-vs-ksqldb/" rel="noopener noreferrer"&gt;KSQL and ksqlDB&lt;/a&gt;&lt;br&gt;
&lt;a href="https://zookeeper.apache.org/" rel="noopener noreferrer"&gt;Welcome to Apache ZooKeeper&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dattell.com/data-architecture-blog/what-is-zookeeper-how-does-it-support-kafka/" rel="noopener noreferrer"&gt;What is ZooKeeper &amp;amp; How Does it Support Kafka?&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.confluent.io/what-is-apache-kafka/?utm_medium=sem&amp;amp;utm_source=google&amp;amp;utm_campaign=ch.sem_br.nonbrand_tp.prs_tgt.kafka_mt.xct_rgn.latam_lng.eng_dv.all_con.kafka-general&amp;amp;utm_term=apache%20kafka&amp;amp;creative=&amp;amp;device=c&amp;amp;placement=&amp;amp;gcli&amp;lt;br&amp;gt;%0Ad=Cj0KCQiA7oyNBhDiARIsADtGRZYDVaYjkPkoJQHNrz_xBodIq2P8ztwb8g3OTiRG_wMHXyzof1nqKEMaAoT_EALw_wcB" rel="noopener noreferrer"&gt;What is Apache Kafka®?&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ksqldb.io/" rel="noopener noreferrer"&gt;ksqlDB - The database purpose-built for stream processing applications&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ksqldb.io/overview.html" rel="noopener noreferrer"&gt;An overview of ksqlDB&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.ksqldb.io/en/latest/developer-guide/ksqldb-reference/create-table-as-select/" rel="noopener noreferrer"&gt;CREATE TABLE AS SELECT&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kafka-tutorials.confluent.io/join-a-stream-to-a-stream/ksql.html" rel="noopener noreferrer"&gt;How to join a stream and a stream&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.ksqldb.io/en/latest/concepts/time-and-windows-in-ksqldb-queries/" rel="noopener noreferrer"&gt;Time and Windows in ksqlDB Queries&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.ksqldb.io/en/latest/reference/sql/time/" rel="noopener noreferrer"&gt;Time operations&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fn8bndcx2jkn1jz1dy98v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fn8bndcx2jkn1jz1dy98v.png" alt="linha horizontal" width="800" height="3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1wmziqv74ghhgyi9p0om.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa" width="548" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>ksqldb</category>
      <category>microservices</category>
      <category>docker</category>
    </item>
    <item>
      <title>Mercado Financeiro: Onboarding para Devs.</title>
      <dc:creator>Lucas Paes</dc:creator>
      <pubDate>Mon, 22 Nov 2021 21:54:52 +0000</pubDate>
      <link>https://dev.to/vaivoa/mercado-financeiro-onboarding-para-devs-i27</link>
      <guid>https://dev.to/vaivoa/mercado-financeiro-onboarding-para-devs-i27</guid>
      <description>&lt;p&gt;Eae Devs, tudo de boas?&lt;/p&gt;

&lt;p&gt;Hoje vou abordar um tema um pouco fora do contexto de “programar”, mas que se tornou muito relevante para mim, pois foi necessário se aprofundar um pouco nele para conseguir se adequar a alguns conceitos dentro da squad, e queria compartilhar os meus estudos com vocês. Farei uma introdução ao &lt;strong&gt;mercado brasileiro de investimentos&lt;/strong&gt;, para servir de base para outras pessoas que assim como eu estão entrando nessa área sem saber muito.&lt;/p&gt;

&lt;h3&gt;
  
  
  &amp;gt; Vamos começar pela &lt;strong&gt;B3&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/LoCDk7fecj2dwCtSB3/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Vamos" src="https://i.giphy.com/media/LoCDk7fecj2dwCtSB3/giphy.gif" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;B3 (Brasil, Bolsa e Balcão) é a bolsa de valores oficial do Brasil, sediada em São Paulo e fundada em 2017 pela fusão do Bovespa + BM&amp;amp;F + Cetrip. É considerada uma das 10 maiores bolsas de valores do mundo e a maior da américa latina. A B3 funciona como um mercado de negociações, sendo o “lugar” onde ocorre a compra e venda de ativos financeiros como: ações, fundos, derivativos, commodities, contratos e entre outros. As principais empresas dos setores econômicos estão dentro da bolsa do Brasil, comtemplando setores como: financeiro, industrial, petróleo e gás, saúde, biocombustível, tecnologia.&lt;/p&gt;

&lt;p&gt;Para uma empresa entrar na B3, ou seja, negociar as suas ações, é necessário realizar o &lt;strong&gt;IPO (Initial Public Offering)&lt;/strong&gt; ou oferta pública inicial, que torna a empresa uma instituição de capital aberto, representando a primeira vez que novos sócios farão parte da organização.&lt;/p&gt;

&lt;p&gt;As transações na B3 ocorrem por meio das &lt;strong&gt;corretoras de valores&lt;/strong&gt; (como a XP, Rico, Nu invest e Modalmais), também chamadas de Broker-dealer, que são instituições financeiras com foco no mercado de investimento, funcionando como um intermediário entre pessoas físicas e investimentos, elas funcionam com autorizações de órgãos reguladores.&lt;/p&gt;

&lt;p&gt;Um termo importante referente a B3 é o &lt;strong&gt;Circuit Breaker&lt;/strong&gt;, em situações muito especiais as negociações podem ser interrompidas, isso serve como um mecanismo de proteção para os investidores, porque defende eles contra as variações bruscas do mercado e gera um pouco de tempo para os investidores pensarem em soluções. &lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Ibovespa&lt;/strong&gt; ou IBOV é o principal índice da B3 e concentra os resultados das ações das grandes empresas dentro da bolsa, um índice é uma carteira teórica de ações funcionando como um termômetro, ou seja, um indicador de desempenho médio de um ativo ou um conjunto de ativos.&lt;/p&gt;

&lt;p&gt;Atualmente a bolsa brasileira conta com aproximadamente 3,8 milhões de pessoas físicas e com cerca de um volume diário R$ 34,031 bilhões.&lt;/p&gt;

&lt;h3&gt;
  
  
  &amp;gt; E quais os tipos de investimentos?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/3o6UB5RrlQuMfZp82Y/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Vamos" src="https://i.giphy.com/media/3o6UB5RrlQuMfZp82Y/giphy.gif" width="480" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos dividir os investimentos em 2 seguimentos: renda variável e renda fixa. Cada um tem suas peculiaridades e investidor alvo, no mercado financeiro existe também &lt;strong&gt;perfis de investidores&lt;/strong&gt;, que são nomenclaturas para identificar os melhores investimentos para determinado cliente, os principais perfis são: conservador, moderado e arrojado ou agressivo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Renda Variável:&lt;/strong&gt; São investimentos que apresentam rentabilidade inserta, ou seja, antes da aplicação não é possível saber se tal investimento trará lucro ou prejuízo ao investidor, o valor vai variar de acordo com as condições atuais do mercado, porém esse tipo de investimento pode trazer mais rentabilidade mas também inclui mais riscos. Alguns dos ativos nesse seguimento são: Ações, Fundos, Criptomoedas, FII, ETFS, COE, Cambio, Ouro e afins.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Renda Fixa:&lt;/strong&gt; Funcionam como uma espécie de empréstimo monetário ao governo, banco ou empresa, esperando receber esse dinheiro de volta acrescido de uma remuneração, diferente da renda variável, nesse tipo de investimento é possível prever a rentabilidade, pois geralmente é fixada em alguma porcentagem ao mês e/ou em índices financeiros como a taxa SELIC, o CDI, o IPCA e afins. Nesse seguimento se encontra os ativos: LCI, LCA, CRI, CRA, Poupança, Debêntures, CDBs e outros. Existe 3 tipos de investimentos dentro desse grupo, os Pré-fixados que informam desde o começo para o investidor a sua rentabilidade, Pôs-fixados que só é possível saber sua rentabilidade no final do empréstimo e os Híbridos que tem uma taxa fixa e variável que determina a rentabilidade final.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &amp;gt; Vamos nos aprofundar um pouco mais nos principais ativos financeiros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ações:&lt;/strong&gt; Representa a menor parcela do capital de uma empresa, quem compra ações de uma companhia adquire os direitos e deveres de um sócio, essas ações são adquiridas em lotes, que por padrão tem 100 unidades, mas também é possível adquirir ações pelo &lt;em&gt;mercado fracionário&lt;/em&gt;, para entrar nesse mercado basta acrescentar a letra “F” ao final da ação (VALE3F, PETR3F), permitindo assim comprar poucas unidades e pagar menos para realizar transações na bolsa. As ações da B3 são divididas entre, Small Caps que são ações de empresas de menor valor, Mid Caps referentes a empresas medianas e Large Caps ou conhecidas também como Blue Chips que são as ações das grandes empresas, ou seja, as mais negociadas da bolsa. Possuem também dois tipos: as &lt;em&gt;Ordinárias&lt;/em&gt; (ON) que dão direito a voto em assembleias dentro da empresa e possuem o digito 3 no final (PETR3, VALE3, BBAS3), e as &lt;em&gt;preferenciais&lt;/em&gt; (PN) que garantem prioridade na divisão dos dividendos.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fundos:&lt;/strong&gt; São gestores/investidores que captam recursos de diversas pessoas para que sejam aplicados em conjunto no mercado financeiro, de modo que o lucro é dividido entre cada participante na proporção do valor aplicado em relação ao montante. A soma de todo o dinheiro arrecadado forma o &lt;strong&gt;patrimônio do fundo&lt;/strong&gt;, e as decisões que os gestores desse fundo iram tomar com esse capital devem obedecer a regas e objetivos previamente determinados e públicos. Os fundos são divididos em &lt;strong&gt;cotas&lt;/strong&gt; e adquiridos por unidade, também é cobrado uma taxa de administração e uma taxa de performance caso o fundo obtenha uma rentabilidade acima do esperado. Os principais tipos de fundos são: fundo de renda (tijolo) investem diretamente em imóveis físicos, fundos de recebíveis (papel) conhecidos como FII de CRI, não ocorre a compra efetiva de imóveis e sim aplicações no setor como LCI e CRIS, fundo de fundos (FOFs) que compram cotas de outros fundos para diversificação, fundo multimercado, fundo de ações, fundo de índices e entre outros.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Derivativos:&lt;/strong&gt; São instrumentos financeiros com o preço baseado em outro ativo, que pode ser do tipo físico como a soja ou o café, ou podem ser financeiros como ações e índices. Existem alguns tipos de derivativos sendo: mercado a termo, mercado futuro, opções e Swaps. Nesse tipo de ativo as transações geram &lt;strong&gt;contratos de direitos ou obrigações&lt;/strong&gt; de compra e venda, com preços e datas definidas, mas que em alguns modelos podem variar conforme o mercado.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CDBs:&lt;/strong&gt; Os Certificados de Depósito Bancário estão entre os mais conhecidos dos rendimentos fixos, nesse modelo você empresta dinheiro para o banco financiar suas atividades de crédito, e em troca é oferecido uma remuneração que no caso seria os &lt;strong&gt;juros&lt;/strong&gt; por um determinado período, como por exemplo um CDB que paga 100% do CDI ao ano.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LCI e LCA:&lt;/strong&gt; A Letra de Crédito Imobiliário e a de Agronegócio são outros dois ativos de renda fixa que ganharam bastante lugar na bolsa e nas carteiras de investidores, ambos são isentos de &lt;strong&gt;imposto de renda&lt;/strong&gt; e assim como os CDBs, você empresta dinheiro para uma instituição e recebe os juros sobre esse valor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/26FPLMDDN5fJCir0A/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Vamos" src="https://i.giphy.com/media/26FPLMDDN5fJCir0A/giphy.gif" width="500" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &amp;gt; Outros protagonistas do mercado financeiro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sistema Sinacor:&lt;/strong&gt; É um sistema integrado de administração de corretoras fornecido pela B3, estruturados em &lt;strong&gt;módulos&lt;/strong&gt;, bem parecido com um ERP, algum deles são: alocação, ordens, faturamento, custódia, tesouraria, contabilidade e cadastro de clientes. Todas as movimentações na bolsa dos clientes das corretoras são controladas pelo Sinacor, tudo fica computado no sistema. Oferecendo uma série de serviços administrativos para as corretoras, cadastrando, armazenando e disponibilizando os dados das transações de seus usuários, você já deve ter ouvido falar sobre as &lt;strong&gt;notas de corretagem&lt;/strong&gt; e é por meio desse sistema que elas são geradas, fornecendo um “extrato” geral de todas as transações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT0GqvzWqa6Jf9c9hK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Associação das entidades" src="https://i.giphy.com/media/xT0GqvzWqa6Jf9c9hK/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Anbima:&lt;/strong&gt; Associação brasileira das entidades dos mercados financeiros e de capitais, fundada em 2009 por uma fusão da Ambid e Andima, conta com mais de 340 associados (bancos, corretoras e gestoras). É uma organização civil que representa os interesses do setor privado do mercado financeiro, oferecendo ferramentas e regulamentações para os profissionais do setor, possui 4 pilares centrais: educar, informar, representar e autorregular. O foco da Anbima é ser um &lt;strong&gt;centro de informação&lt;/strong&gt; para proporcionar transparência ao setor, educando e informando os profissionais da área e assim aumentando a qualidade como um todo. Ela possui as principais &lt;strong&gt;certificações&lt;/strong&gt; do setor para esses profissionais (CPA-10, CPD-20, CEA e outras).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &amp;gt; Agora um pouco de "programação" #SQN
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ji6zzUZwNIuLS/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Obrigado" src="https://i.giphy.com/media/ji6zzUZwNIuLS/giphy.gif" width="292" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As instituições financeiras recebem e enviam diariamente inúmeros dados sobre as transações na bolsa e integrações com outros sistemas, visando deixar essa comunicação padrão e facilitar a integração (aumentando a velocidade de implantação e diminuindo o custo) foi desenvolvido o protocolo FIX. O &lt;strong&gt;Financial Information eXchange (FIX)&lt;/strong&gt; foi lançado em 1992 e vem sendo utilizado como padrão mundial para a troca de informações relacionadas as transações de valores imobiliários, dados de mercado (ambiente de trading), operações, ativos na bolsa, usado em robôs trading e em muitas outras partes do sistema financeiro. O FIX foi desenvolvido pela comunidade em conjunto com diversas instituições financeiras espalhas pelo mundo. Para a sua segurança o protocolo utiliza criptografia de transmissão Stunnel + SSL e para assegurar os dados usa PGP-DES-MD5. Está em constante evolução por ser gratuito e aberto com versões já em 5.0.&lt;/p&gt;

&lt;p&gt;A mensagem transmitida pelo protocolo FIX segue o padrão &lt;strong&gt;ASCII&lt;/strong&gt; (apenas texto), e é construída utilizando o conceito de chave e valor, no caso do protocolo essa chave tem o nome de &lt;strong&gt;Tag&lt;/strong&gt; e são numéricas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TAG=VALUE
8=FIX.4.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;A estrutura padrão das mensagens FIX é composta de 3 tópicos, o &lt;strong&gt;HEADER&lt;/strong&gt; que contém dados gerais e informativos sobre a mensagem, o &lt;strong&gt;BODY&lt;/strong&gt; que é constituído por varias sequências de  dependendo do tipo de mensagem/ação que a mensagem quer passar e tem a função de armazenar os principais dados, como contas bancarias, quantias, identificadores do cliente e dos bancos. E por fim o &lt;strong&gt;TRAILER&lt;/strong&gt; que é usado para separar mensagens e conter as assinaturas e o CheckSum da mensagem (sempre é a última tag da mensagem e com 3 caracteres). Segue um exemplo de uma mensagem no padrão FIX:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8=FIX.4.4|9=122|35=D|34=215|49=CLIENT12|52=20100225-19:41:57.316|56=B|1=Marcel|11=13346|21=1|40=2|44=5|54=1|59=0|60=20100225-19:39:52.020|10=072|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Utilize a ferramenta &lt;a href="https://fixparser.targetcompid.com/"&gt;FIX Parse&lt;/a&gt; para ler a mensagem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SzAjxnsy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ceel9xj2modxcomgjkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SzAjxnsy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6ceel9xj2modxcomgjkc.png" alt="FIX Mensagem" width="474" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para mais informações sobre o FIX deixo aqui um vídeo &lt;a href="https://www.youtube.com/watch?v=wSgAwJyev2Y"&gt;Anatomy of the FIX Protocol&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Você vera algo parecido com essa estrutura, é possível verificar todas as tags e seus usos neste dicionário FIX disponibilizado pela Onixs &lt;a href="https://www.onixs.biz/fix-dictionary/4.4/fields_by_tag.html"&gt;FIX Dictionary&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  &amp;gt; Por enquanto é isso, obrigado! ✌️
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Pnh0Lou03fv92J4puZ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img alt="Obrigado" src="https://i.giphy.com/media/Pnh0Lou03fv92J4puZ/giphy.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qualquer dúvida pode me chamar para um bate-papo, e agradeço a sua atenção até aqui, espero te ver em outras publicações.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__729246"&gt;
  
    .ltag__user__id__729246 .follow-action-button {
      background-color: #000000 !important;
      color: #ffffff !important;
      border-color: #000000 !important;
    }
  
    &lt;a href="/lucastmp" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ln2l9t9n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--fKel4vCK--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/729246/7aad6faa-411a-4ad6-91f2-098e361888e6.jpeg" alt="lucastmp image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/lucastmp"&gt;Lucas Paes&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/lucastmp"&gt;Brasileiro, 22 anos.

Amo tecnologia e estou sempre explorando novos conhecimentos.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



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

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QJQcNDAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wmziqv74ghhgyi9p0om.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QJQcNDAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa" width="548" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>finanças</category>
      <category>investimento</category>
      <category>b3</category>
      <category>vaivoa</category>
    </item>
    <item>
      <title>Desenvolvimento Swift no Windows com WSL</title>
      <dc:creator>Victor Mello</dc:creator>
      <pubDate>Mon, 22 Nov 2021 19:22:53 +0000</pubDate>
      <link>https://dev.to/vaivoa/desenvolvimento-swift-no-windows-com-wsl-3lih</link>
      <guid>https://dev.to/vaivoa/desenvolvimento-swift-no-windows-com-wsl-3lih</guid>
      <description>&lt;p&gt;Com alguns plugins e o Language Server Protocol do Swift e Object-C é possível desenvolver em swift no Windows utilizando o VS Code.&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%2Fkjwjut1fcs7za1higaf4.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%2Fkjwjut1fcs7za1higaf4.png" alt="Intelisense em swift"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Requerimentos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WSL2 - Para instalar basta ir em &lt;a href="http://aka.ms/wsl2" rel="noopener noreferrer"&gt;http://aka.ms/wsl2&lt;/a&gt; e seguir as instruções.&lt;/li&gt;
&lt;li&gt;VS Code - Ide que será utilizada.&lt;/li&gt;
&lt;li&gt;Node - Para compilar a extensão do VS Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  LSP para Swift
&lt;/h2&gt;

&lt;p&gt;O &lt;em&gt;LSP (Language Server Protocol)&lt;/em&gt; é o que permite o VS Code e outras IDEs proverem recursos como auto complete, lint e encontrar referencias para divérsas linguagens de programação.&lt;br&gt;
Para utilizar um precisamos de um servidor LSP da linguagem, e o plugin na IDE.&lt;/p&gt;

&lt;p&gt;O toolchain do swift prove um servidor LSP, e pode ser baixado em &lt;a href="https://swift.org/download/" rel="noopener noreferrer"&gt;https://swift.org/download/&lt;/a&gt; .&lt;br&gt;
Baixe a mesma versão do seu linux. &lt;em&gt;No meu caso Ubuntu 20.04&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para instalar todo o toolchain, basta copiar os arquivos para sua pasta &lt;code&gt;/usr&lt;/code&gt; com os comandos:&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;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; swift-5.5-RELEASE-ubuntu20.04.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;swift-5.5-RELEASE-ubuntu20.04/usr
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ./ /usr/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Para testar, execute o comando &lt;code&gt;sourcekit-lsp -h&lt;/code&gt;. Deve ser retornado o help do mesmo.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft7xu8t2016558yky2p27.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%2Ft7xu8t2016558yky2p27.png" alt="retorno do comando"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Plugin do VS Code
&lt;/h2&gt;

&lt;p&gt;Para o VS Code se comunicar com o servidor, é necessário um plugin.&lt;/p&gt;

&lt;p&gt;Como o plugin compilado não é distribuído pela Apple, é necessário compilar o mesmo. Porem o processo é bem simples.&lt;/p&gt;

&lt;p&gt;Basta rodar os comandos abaixo. Que irão baixar, compilar e instalar o plugin no seu VS Code.&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 https://github.com/apple/sourcekit-lsp.git
&lt;span class="nb"&gt;cd &lt;/span&gt;sourcekit-lsp/Editors/vscode/
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev-package
code &lt;span class="nt"&gt;--install-extension&lt;/span&gt; sourcekit-lsp-development.vsix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  WSL e VS Code
&lt;/h2&gt;

&lt;p&gt;Para que o VS Code se comunique com o linux em WSL, é necessário instalar a extensão &lt;em&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl" rel="noopener noreferrer"&gt;Remote WSL&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Com a &lt;em&gt;Remote WSL&lt;/em&gt; instalada, clique no botão &lt;em&gt;Open a Remote Window,&lt;/em&gt; no canto inferior esquerdo do VS Code.&lt;br&gt;
Selecione &lt;em&gt;New WSL Window&lt;/em&gt; ou &lt;em&gt;Reopen Folder in WSL&lt;/em&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5b3r5urunx6dsfyujjxu.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%2F5b3r5urunx6dsfyujjxu.png" alt="Abrindo o VS Code em WSL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o WSL ativo, é necessário habilitar as extensões para também funcionarem em WSL.&lt;br&gt;
Vá até Extensões, selecione &lt;em&gt;SourceKit-LSP&lt;/em&gt; e clique na opção Install in WSL.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqeqcqaalofonnjfopo3q.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%2Fqeqcqaalofonnjfopo3q.png" alt="SourceKit-LSP Plugin"&gt;&lt;/a&gt;&lt;br&gt;
Agora, assim que um arquivo .swift for aberto, o servidor LSP do swift será iniciado e estará comunicando com o VS Code.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rodando um .swift
&lt;/h2&gt;

&lt;p&gt;Para rodar um código swift, recomendo a extensão formulahendry.code-runner. &lt;br&gt;
Com &lt;em&gt;Code Runner&lt;/em&gt; instalado no WSL, basta clicar no ícone de play ou apertar &lt;code&gt;CTRL + ALT + N&lt;/code&gt;&lt;br&gt;
com o arquivo aberto.&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%2Fuecazkbfedl8naa2jwa7.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%2Fuecazkbfedl8naa2jwa7.png" alt="Swith no VS Code"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  É possível rodar swift em outras IDEs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SIM!&lt;/strong&gt; A ideia do LSP é ter um protocolo padrão para diversas IDEs darem suporte a mesma linguagem.&lt;/p&gt;

&lt;p&gt;É possível encontrar mais detalhes de como rodar swift em outros editores no GitHub do &lt;a href="https://github.com/apple/sourcekit-lsp/tree/main/Editors" rel="noopener noreferrer"&gt;sourcekit-lsp&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__731352"&gt;
    &lt;a href="/victormmello" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F731352%2Fabe21f8c-2229-499c-844c-67d1e73a7308.jpg" alt="victormmello image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/victormmello"&gt;Victor Mello&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/victormmello"&gt;Dev curioso por novas stacks, sempre querendo aprender algo novo e ajudar os outros no processo.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&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%2Fn8bndcx2jkn1jz1dy98v.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%2Fn8bndcx2jkn1jz1dy98v.png" alt="linha horizontal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&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%2F1wmziqv74ghhgyi9p0om.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>windows</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Eliminando o Toil</title>
      <dc:creator>Marcos Rocha</dc:creator>
      <pubDate>Mon, 22 Nov 2021 18:55:41 +0000</pubDate>
      <link>https://dev.to/vaivoa/eliminando-o-toil-4j34</link>
      <guid>https://dev.to/vaivoa/eliminando-o-toil-4j34</guid>
      <description>&lt;h2&gt;
  
  
  Eliminando o Toil
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Se um operador humano precisar tocar seu sistema durante as operações normais, você tem um bug. A definição de normal muda à medida que seus sistemas crescem.&lt;br&gt;
&lt;strong&gt;Carla Geisser, Google SRE&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na SRE, queremos dedicar mais tempo ao trabalho de projeto de engenharia de longo prazo, ao invés do trabalho operacional. Como o termo trabalho operacional pode ser mal interpretado, usamos uma palavra específica: &lt;strong&gt;toil&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definição de &lt;strong&gt;toil&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;toil&lt;/strong&gt; não é apenas “trabalho que não gosto de fazer”. Também não é equivalente a tarefas administrativas ou trabalho sujo. As preferências quanto aos tipos de trabalho que são satisfatórios e agradáveis variam de pessoa para pessoa e algumas pessoas até gostam de trabalhos manuais e repetitivos. Há também tarefas administrativas que precisam ser feitas, mas não devem ser categorizadas como &lt;strong&gt;toil&lt;/strong&gt;: isso é sobrecarga. A sobrecarga costuma ser um trabalho não diretamente vinculado à execução de um serviço de produção e inclui tarefas como reuniões de equipe, definição e classificação de metas, formulários e papelada de RH. O trabalho sujo às vezes pode ter um valor de longo prazo e, nesse caso, também não é &lt;strong&gt;toil&lt;/strong&gt; . Limpar toda a configuração de alerta do seu serviço e remover a confusão pode ser sujo, mas não é &lt;strong&gt;toil&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Então, o que é &lt;strong&gt;toil&lt;/strong&gt;? O &lt;strong&gt;toil&lt;/strong&gt; é o tipo de trabalho vinculado à execução de um serviço de produção que tende a ser manual, repetitivo, automatizado, tático, desprovido de valor duradouro e que escala linearmente à medida que o serviço cresce. Nem toda tarefa considerada &lt;strong&gt;toil&lt;/strong&gt; tem todos esses atributos, mas quanto mais de perto o trabalho corresponder a uma ou mais das seguintes descrições, mais provável será que seja árduo:&lt;/p&gt;

&lt;h4&gt;
  
  
  Manual
&lt;/h4&gt;

&lt;p&gt;Isso inclui trabalhos como a execução manual de um script que automatiza algumas tarefas. Executar um script pode ser mais rápido do que executar manualmente cada etapa do script, mas o tempo prático que um ser humano gasta executando esse script (não o tempo decorrido) ainda é tempo de trabalho.&lt;/p&gt;

&lt;h4&gt;
  
  
  Repetitivo
&lt;/h4&gt;

&lt;p&gt;Se você está realizando uma tarefa pela primeira vez, ou mesmo pela segunda vez, este trabalho não é árduo. O &lt;strong&gt;toil&lt;/strong&gt; é o trabalho que você faz continuamente. Se você está resolvendo um novo problema ou inventando uma nova solução, este trabalho não é árduo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Automatizável
&lt;/h4&gt;

&lt;p&gt;Se uma máquina pode realizar a tarefa tão bem quanto um ser humano, ou a necessidade da tarefa pode ser projetada para longe, essa tarefa é &lt;strong&gt;toil&lt;/strong&gt;. Se o julgamento humano é essencial para a tarefa, há uma boa chance de não ser &lt;strong&gt;toil&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tático
&lt;/h4&gt;

&lt;p&gt;O trabalho é orientado por interrupções e reativo, em vez de orientado por estratégia e proativo. Lidar com alertas constantes é árduo. Talvez nunca possamos eliminar totalmente esse tipo de trabalho, mas temos que trabalhar continuamente para minimizá-los.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sem valor duradouro
&lt;/h4&gt;

&lt;p&gt;Se o seu serviço permanecer no mesmo estado depois de terminar uma tarefa, provavelmente a tarefa foi árdua. Se a tarefa produziu uma melhoria permanente em seu serviço, provavelmente não foi árdua, mesmo se alguma quantidade de trabalho pesado – como mergulhar em códigos e configurações legados e corrigi-los – estivesse envolvida.&lt;/p&gt;

&lt;h4&gt;
  
  
  O(n) com o crescimento do serviço
&lt;/h4&gt;

&lt;p&gt;Se o trabalho envolvido em uma tarefa aumenta linearmente com o tamanho do serviço, volume de tráfego ou contagem de usuários, essa tarefa provavelmente é árdua. Um serviço gerenciado e projetado idealmente pode crescer em pelo menos uma ordem de magnitude com zero trabalho adicional, exceto alguns esforços únicos para adicionar recursos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que menos &lt;strong&gt;toil&lt;/strong&gt; é melhor
&lt;/h3&gt;

&lt;p&gt;Nossa organização SRE tem uma meta anunciada de manter o trabalho operacional (ou seja, &lt;strong&gt;toil&lt;/strong&gt;) abaixo de 50% do tempo de cada SRE. Pelo menos &lt;code&gt;50%&lt;/code&gt; do tempo de cada SRE deve ser gasto no trabalho do projeto de engenharia que irá reduzir o trabalho futuro ou adicionar recursos ao serviço. O desenvolvimento de recursos normalmente se concentra em melhorar a confiabilidade, o desempenho ou a utilização, o que geralmente reduz o &lt;strong&gt;toil&lt;/strong&gt; como um efeito de segunda ordem.&lt;/p&gt;

&lt;p&gt;Compartilhamos essa meta de 50% porque o &lt;strong&gt;toil&lt;/strong&gt; tende a se expandir se não for verificado e pode preencher rapidamente 100% do tempo de todos. O trabalho de redução de &lt;strong&gt;toil&lt;/strong&gt; e ampliação de serviços é a “Engenharia” em Site Reliability Engineering. O trabalho de engenharia é o que permite que a organização SRE se expanda sublinearmente com o tamanho do serviço e gerencie os serviços de forma mais eficiente do que uma equipe de Dev ou de operações pura.&lt;/p&gt;

&lt;p&gt;Além disso, quando contratamos novos SREs, prometemos a eles que a SRE não é uma organização de operações típica, citando a regra de 50% mencionada acima. Precisamos cumprir essa promessa, não permitindo que a organização SRE ou qualquer subequipe dentro dela se transforme em uma equipe operacional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculando o &lt;strong&gt;toil&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Se buscamos limitar o tempo que um SRE gasta com &lt;strong&gt;toil&lt;/strong&gt; para 50%, como esse tempo é gasto?&lt;/p&gt;

&lt;p&gt;Há um limite mínimo para a quantidade de trabalho que qualquer SRE precisa lidar se estiver de plantão. Um SRE típico tem uma semana de plantão primário e uma semana de plantão secundário em cada ciclo. Segue-se que, em uma rotação de 6 pessoas, pelo menos 2 de cada 6 semanas são dedicadas a turnos de plantão e tratamento de interrupção, o que significa que o limite inferior do trabalho potencial é &lt;code&gt;2/6 = 33%&lt;/code&gt; do tempo de um SRE. Em uma rotação de 8 pessoas, o limite inferior é &lt;code&gt;2/8 = 25%&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Consistente com esses dados, os SREs relatam que sua principal fonte de trabalho são as interrupções (ou seja, mensagens não urgentes relacionadas ao serviço e e-mails). A próxima fonte principal é a resposta de plantão (urgente), seguida por comunicados e envios. Mesmo que nossos processos de release e push sejam geralmente tratados com uma boa quantidade de automação, ainda há muito espaço para melhorias nesta área.&lt;/p&gt;

&lt;p&gt;Pesquisas trimestrais dos SREs do Google mostram que o tempo médio gasto trabalhando é de cerca de &lt;code&gt;33%&lt;/code&gt;, então nos saímos muito melhor do que nossa meta geral de &lt;code&gt;50%&lt;/code&gt;. No entanto, a média não captura outliers: alguns SREs alegam &lt;code&gt;0%&lt;/code&gt; de &lt;strong&gt;toil&lt;/strong&gt; (projetos de desenvolvimento puro sem trabalho de plantão) e outros alegam 80% de &lt;strong&gt;toil&lt;/strong&gt;. Quando SREs individuais relatam trabalho excessivo, geralmente indica a necessidade de que os gerentes distribuam a carga de trabalho de maneira mais uniforme pela equipe e incentive-os a encontrar projetos de engenharia satisfatórios.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que se define como Engenharia?
&lt;/h3&gt;

&lt;p&gt;O trabalho de engenharia é novo e requer intrinsecamente julgamento humano. Produz uma melhoria permanente no seu serviço e é orientada por uma estratégia. Frequentemente, é criativo e inovador, adotando uma abordagem orientada ao design para resolver um problema – quanto mais generalizado, melhor. O trabalho de engenharia ajuda sua equipe ou a organização SRE a lidar com um serviço maior, ou mais serviços, com o mesmo nível de pessoal.&lt;/p&gt;

&lt;p&gt;As atividades SRE típicas se enquadram nas seguintes categorias aproximadas:&lt;/p&gt;

&lt;h4&gt;
  
  
  Engenharia de software
&lt;/h4&gt;

&lt;p&gt;Envolve escrever ou modificar o código, além de qualquer projeto associado e trabalho de documentação. Os exemplos incluem escrever scripts de automação, criar ferramentas ou estruturas, adicionar recursos de serviço para escalabilidade e confiabilidade ou modificar o código de infraestrutura para torná-lo mais robusto.&lt;/p&gt;

&lt;h4&gt;
  
  
  Engenharia de sistemas
&lt;/h4&gt;

&lt;p&gt;Envolve configurar sistemas de produção, modificar configurações ou documentar sistemas de uma forma que produza melhorias duradouras a partir de um esforço único. Os exemplos incluem configuração e atualizações de monitoramento, configuração de balanceamento de carga, configuração do servidor, ajuste de parâmetros do sistema operacional e configuração do load balancer. A engenharia de sistemas também inclui consultoria em arquitetura, design e produção para equipes de desenvolvedores.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;toil&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Trabalho diretamente vinculado à execução de um serviço que é repetitivo, manual, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  Sobrecarga
&lt;/h4&gt;

&lt;p&gt;Trabalho administrativo não vinculado diretamente à execução de um serviço. Os exemplos incluem contratação, papelada de RH, reuniões de equipe/empresa, higienização de filas de bugs, formulários, revisões de pares, auto avaliações e cursos de treinamento.&lt;/p&gt;

&lt;p&gt;Cada SRE precisa despender pelo menos &lt;code&gt;50%&lt;/code&gt; de seu tempo em trabalho de engenharia, em média em alguns trimestres ou um ano. O &lt;strong&gt;toil&lt;/strong&gt; tende a ser pontiagudo, portanto, &lt;code&gt;50%&lt;/code&gt; do tempo gasto em engenharia pode não ser realista para algumas equipes de SRE, e eles podem cair abaixo dessa meta em alguns trimestres. Mas se a fração de tempo gasto em projetos fica em média significativamente abaixo de 50% no longo prazo, a equipe afetada precisa dar um passo atrás e descobrir o que está errado.&lt;/p&gt;

&lt;h3&gt;
  
  
  O &lt;strong&gt;toil&lt;/strong&gt; é sempre ruim?
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;toil&lt;/strong&gt; não torna todos infelizes o tempo todo, especialmente em pequenas quantidades. Tarefas previsíveis e repetitivas podem ser relaxantes. Elas produzem um sentimento de realização e vitórias rápidas. Elas podem ser atividades de baixo risco e baixo estresse. Algumas pessoas gravitam em torno de tarefas que envolvem &lt;strong&gt;toil&lt;/strong&gt; e podem até gostar desse tipo de trabalho.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;toil&lt;/strong&gt; nem sempre é invariavelmente ruim, e todos precisam estar cientes de que alguma quantidade de &lt;strong&gt;toil&lt;/strong&gt; é inevitável na função de SRE e, na verdade, em quase qualquer função de engenharia. É bom em pequenas doses, e se você está feliz com essas pequenas doses, o &lt;strong&gt;toil&lt;/strong&gt; não é um problema. O trabalho torna-se tóxico quando experimentado em grandes quantidades. Se você está sobrecarregado com muito trabalho, deve se preocupar e reclamar em voz alta. Entre as muitas razões pelas quais trabalhar demais é ruim, considere o seguinte:&lt;/p&gt;

&lt;h4&gt;
  
  
  Estagnação de carreira
&lt;/h4&gt;

&lt;p&gt;O progresso de sua carreira diminuirá ou será interrompido se você investir pouco tempo em projetos. O Google recompensa o trabalho sujo quando é inevitável e tem um grande impacto positivo, mas você não pode fazer carreira fora da sujeira.&lt;/p&gt;

&lt;h4&gt;
  
  
  Baixa moral
&lt;/h4&gt;

&lt;p&gt;As pessoas têm limites diferentes para a quantidade de &lt;strong&gt;toil&lt;/strong&gt; que podem tolerar, mas todos têm um limite. Muito &lt;strong&gt;toil&lt;/strong&gt; leva ao esgotamento, ao tédio e ao descontentamento.&lt;/p&gt;

&lt;p&gt;Além disso, gastar muito tempo trabalhando em detrimento do tempo gasto com engenharia prejudica uma organização SRE das seguintes maneiras:&lt;/p&gt;

&lt;h4&gt;
  
  
  Cria confusão
&lt;/h4&gt;

&lt;p&gt;Trabalhamos muito para garantir que todos os que trabalham na ou com a organização SRE entendam que somos uma organização de engenharia. Indivíduos ou equipes dentro de SRE que se envolvem em muito &lt;strong&gt;toil&lt;/strong&gt; prejudicam a clareza dessa comunicação e confundem as pessoas sobre o nosso papel.&lt;/p&gt;

&lt;h4&gt;
  
  
  Retarda o progresso
&lt;/h4&gt;

&lt;p&gt;O trabalho excessivo torna a equipe menos produtiva. A velocidade do recurso de um produto diminuirá se a equipe SRE estiver muito ocupada com trabalho manual e combate a incêndios para lançar novos recursos imediatamente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Define precedente
&lt;/h4&gt;

&lt;p&gt;Se você estiver muito disposto a trabalhar, seus colegas Dev terão incentivos para sobrecarregá-lo com ainda mais trabalho, às vezes mudando as tarefas operacionais que deveriam ser desempenhadas pelos Devs para SRE. Outras equipes também podem começar a esperar que os SREs realizem esse trabalho, o que é ruim por razões óbvias.&lt;/p&gt;

&lt;h4&gt;
  
  
  Promove atrito
&lt;/h4&gt;

&lt;p&gt;Mesmo que você não esteja pessoalmente infeliz com o &lt;strong&gt;toil&lt;/strong&gt;, seus atuais ou futuros companheiros de equipe podem gostar muito menos. Se você construir muito trabalho nos procedimentos de sua equipe, você motiva os melhores engenheiros da equipe a começar a procurar em outro lugar por um trabalho mais gratificante.&lt;/p&gt;

&lt;h4&gt;
  
  
  Causa violação de fé
&lt;/h4&gt;

&lt;p&gt;As novas contratações ou transferências que ingressam na SRE com a promessa de um projeto de trabalho se sentirão enganadas, o que é ruim para o moral.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Se todos nós nos comprometermos a eliminar um pouco de trabalho a cada semana com alguma boa engenharia, iremos continuamente limpar nossos serviços e podemos mudar nossos esforços coletivos para a engenharia em escala, arquitetando a próxima geração de serviços e construindo SRE cruzado conjuntos de ferramentas. Vamos inventar mais e trabalhar menos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fonte
&lt;/h3&gt;

&lt;p&gt;Escrito por Vivek Rau&lt;br&gt;
Editado por Betsy Beyer&lt;br&gt;
Traduzido por &lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__723603"&gt;
    &lt;a href="/marcosrocha" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F723603%2F70c0929a-eb7e-4107-8fc6-22c2e9322d2d.png" alt="marcosrocha image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/marcosrocha"&gt;Marcos Rocha&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/marcosrocha"&gt;Meu nome é Marcos Rocha.
Os artigos aqui escritos tem como objetivo de ajudar, documentar e sedimentar novos conhecimentos.
Seja bem vindo!&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
Texto Original: &lt;br&gt;
&lt;a href="https://sre.google/sre-book/eliminating-toil/" rel="noopener noreferrer"&gt;Eliminating Toil Written by Vivek Rau and Edited by Betsy Beyer&lt;/a&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%2Fn8bndcx2jkn1jz1dy98v.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%2Fn8bndcx2jkn1jz1dy98v.png" alt="linha horizontal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&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%2F1wmziqv74ghhgyi9p0om.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vaivoa</category>
      <category>devops</category>
      <category>iniciantes</category>
      <category>valores</category>
    </item>
    <item>
      <title>Princípios de Design da Apple para iOS</title>
      <dc:creator>Pedro Calado</dc:creator>
      <pubDate>Mon, 22 Nov 2021 17:57:27 +0000</pubDate>
      <link>https://dev.to/vaivoa/principios-de-design-da-apple-para-ios-5baa</link>
      <guid>https://dev.to/vaivoa/principios-de-design-da-apple-para-ios-5baa</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1bV5d3xh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjj798xjj1wmemi4ypy4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1bV5d3xh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjj798xjj1wmemi4ypy4.png" alt="Human Interface Guidelines" width="880" height="783"&gt;&lt;/a&gt;&lt;br&gt;
 Por trás de todo bom aplicativo no ecossistema da Apple, que possuem excelente &lt;em&gt;user experience,&lt;/em&gt; estão boas práticas e padrões de design fornecidos pela própria Apple para cada um dos seus dispositivos, o &lt;a href="https://developer.apple.com/design/human-interface-guidelines/ios/overview/themes/"&gt;Human Interface Guidelines&lt;/a&gt; (HIG). Desde o design dos ícones até a interação dos usuários com objetos de realidade aumentada, a ideia do HIG é fornecer padrões para que o time de produto como um todo, desde designers até desenvolvedores, consiga entregar produtos extraordinários, que os usuários gostem de usar, que sejam bonitos e simples ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos tratar especificamente do guia de design para iOS, trazendo um overview dos princípios do guia e alguns pontos essenciais que temos que levar em consideração ao projetarmos nossas aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que faz o iOS ser único na visão da Apple
&lt;/h2&gt;

&lt;p&gt;Existem 3 princípios que norteiam e diferenciam o iOS das demais plataformas de acordo com a Apple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clareza&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O foco do design deve ser em guiar o usuário de maneira simples e intuitiva. Textos legíveis, ícones precisos, adornos sutis e apropriados, tendo como fim principal a funcionalidade, todas essas características fazem o iOS ser diferente. Quando você precisa enviar uma mensagem, compartilhar uma foto ou até mesmo saber se uma funcionalidade está ativa ou não, você consegue facilmente identificar o que cada ícone faz, trazendo clareza para o usuário.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--40P_x64c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvuhr1o15x7itz47qrlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--40P_x64c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvuhr1o15x7itz47qrlo.png" alt="Exemplo de ícones" width="880" height="346"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deferência&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se olharmos o significado da palavra deferência no dicionário, encontraremos algo como "atitude de respeito e consideração a um superior ou a pessoa mais velha". E aqui a ideia é exatamente essa: o design deve realçar o conteúdo, sendo este o mais importante e o que deve ser destacado. O design deve "trabalhar" para o conteúdo. Como exemplo, quando temos um fundo borrado, o conteúdo que não está borrado é pra onde nosso foco vai, fazendo com que foquemos no que realmente importa.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iL7WCyBQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i3x7u9p9knr9nhc7qlwl.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iL7WCyBQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i3x7u9p9knr9nhc7qlwl.jpeg" alt="Exemplo de foco no conteúdo" width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Profundidade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A ideia aqui é que sua aplicação seja dividida em camadas, tendo uma certa hierarquia que facilita o usuário ao navegar pelas informações, com transições entre telas que forneçam um senso de profundidade e permitam que o usuário acesse funcionalidades sem perder o contexto.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PS1HqGkY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q70s64fhw4qyqnqgmfhq.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PS1HqGkY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q70s64fhw4qyqnqgmfhq.jpeg" alt="Exemplo de camadas" width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Princípios de Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Integridade Estética
&lt;/h3&gt;

&lt;p&gt;Esse ponto se refere ao quão bem a aparência e comportamento de um app se comunica com a sua funcionalidade. Uma aplicação crítica, como, por exemplo, que faz o controle de um sistema aéreo, deve focar em ter comportamentos previsíveis, evitando inserir elementos essencialmente estéticos que só trarão ruídos e não acrescentarão funcionalidade. Já uma aplicação mais imersiva como um jogo, por exemplo, deve possuir uma aparência mais cativante e até usar comportamentos imprevisíveis, permitindo que o usuário faça descobertas enquanto usa o app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistência
&lt;/h3&gt;

&lt;p&gt;Consistência se refere a fazer com que o app funcione da maneira com que o usuário espere que ele se comporte, trazendo padrões de gestos familiares, usando elementos já fornecidos pelo sistema, ícones (como ícones de lixeira, compartilhamento, etc.) e palavras conhecidas. De maneira geral, os usuários de smartphones já adquiriram hábitos de utilização que são difíceis de mudar, então devemos ao máximo tentar manter esses comportamentos. &lt;/p&gt;

&lt;h3&gt;
  
  
  Manipulação Direta
&lt;/h3&gt;

&lt;p&gt;O ponto aqui é fazer com que o usuário possa ver alterações imediatas ao interagir com o app, seja rotacionando o celular ou interagindo com gestos e toques no conteúdo da tela.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--APEiNr16--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai8rm3v6wrd6shqc9z24.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--APEiNr16--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ai8rm3v6wrd6shqc9z24.gif" alt="Gif de gesto para acessar a home no iPhone" width="700" height="880"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Feedback
&lt;/h3&gt;

&lt;p&gt;O feedback corresponde a manter os usuários informados sobre suas ações como, por exemplo, por meio de indicadores de progresso do download de arquivos, sons, alertas e a vibração do celular que ajuda o usuário a identificar o resultado de suas interações com o dispositivo e suas aplicações.&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HzfMCUnO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4rr269hu9xoz0q6u8y6p.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HzfMCUnO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4rr269hu9xoz0q6u8y6p.jpeg" alt="Indicador de loading e progresso" width="750" height="1334"&gt;&lt;/a&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2fBrQtwz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t3xahy3mzaqv5mbgmk7s.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2fBrQtwz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t3xahy3mzaqv5mbgmk7s.jpeg" alt="Silent mode ativado" width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Metáforas
&lt;/h3&gt;

&lt;p&gt;Metáforas são como uma digitalização de algo da vida real. Desde ícones dos apps, como o ícone do app de e-mail que representa uma carta, até aplicativos como o de gravação de áudio que simula as frequências conforme a intensidade do som gravado.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FT6Qp-3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7d5t4ymdkg87odbcleer.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FT6Qp-3m--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7d5t4ymdkg87odbcleer.jpeg" alt="Frequência de sons" width="750" height="1334"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Pw3fbBHE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/21sbaw86op8mwxzw57kb.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Pw3fbBHE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/21sbaw86op8mwxzw57kb.jpeg" alt="Ícones usando metáforas" width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Controle do Usuário
&lt;/h3&gt;

&lt;p&gt;A ideia aqui é que o usuário esteja no comando, e não os apps. As aplicações devem guiar o usuário, alertar sobre erros, dar feedback, mas nunca ter o controle. Por exemplo, uma aplicação que requer o uso da localização, como o Google Maps, solicitará ao usuário permissão para usar esse dado, explicando a necessidade dessa utilização. Com isso, o usuário está no controle, o que dá ao app certa confiabilidade.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DrXBjIyg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfwhep6smjp55uh1c8hy.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DrXBjIyg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfwhep6smjp55uh1c8hy.jpeg" alt="Google maps solicitando uso da localização" width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Esses são os princípios que guiam o design dos produtos da Apple e o que fazem, de acordo com eles, o iOS diferente das demais plataformas em termos de &lt;em&gt;user experience&lt;/em&gt;. No meu ponto de vista, ficou claro que o usuário é ponto principal em tudo o que fazem, mantendo-o no centro das decisões e fornecendo ferramentas que vão facilitar o uso das aplicações e trazer conforto e confiança.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__743191"&gt;
  
    .ltag__user__id__743191 .follow-action-button {
      background-color: #000000 !important;
      color: #ffffff !important;
      border-color: #000000 !important;
    }
  
    &lt;a href="/pedrohcalado" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7WqJJnXb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--jMtztxAn--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_auto%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/743191/a945fa4f-86cc-437b-99fb-bbab45e33c02.jpeg" alt="pedrohcalado image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/pedrohcalado"&gt;Pedro Calado&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/pedrohcalado"&gt;Software Developer 👨🏻‍💻  | 
Always learning and sharing.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;br&gt;
.&lt;br&gt;
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KAgiXlrF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n8bndcx2jkn1jz1dy98v.png" alt="linha horizontal" width="880" height="3"&gt;

&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QJQcNDAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wmziqv74ghhgyi9p0om.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QJQcNDAe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa" width="548" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>design</category>
      <category>vaivoa</category>
    </item>
    <item>
      <title>C#10 e ASP.NET 6, oque esperar dessa dupla?</title>
      <dc:creator>Lucas Paes</dc:creator>
      <pubDate>Thu, 04 Nov 2021 20:15:43 +0000</pubDate>
      <link>https://dev.to/vaivoa/c10-e-aspnet-6-oque-esperar-dessa-dupla-14k6</link>
      <guid>https://dev.to/vaivoa/c10-e-aspnet-6-oque-esperar-dessa-dupla-14k6</guid>
      <description>&lt;p&gt;A Microsoft já anunciou que o lançamento do .Net6 está previsto para novembro de 2021, ou seja, para o próximo mês (ebaaa! 😊), pretendendo lançar uma nova versão todo ano nesta mesma data, como pode ser observado no cronograma abaixo.&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%2Fdc4d2eze7a85zt901ly8.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%2Fdc4d2eze7a85zt901ly8.png" alt="Cronograma de lançamento .Net"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por conta dessa constante inovação da plataforma a empresa tende a realizar "poucas mudanças" e continuar com o suporte LTS de três anos, possibilitando migrações continuas de seus usuários para as novas atualizações de maneira mais fácil.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://dotnet.microsoft.com/platform/support/policy/dotnet-core" rel="noopener noreferrer"&gt;Microsoft: Política de suporte .NET&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &amp;gt; Ok, mas cadê as novidades? 🤔
&lt;/h3&gt;

&lt;p&gt;Alguns dos principais pontos que chegaram com a nova versão estão elencados aqui, caso queria se aprofundar no assunto recomendo visualizar as postagens do &lt;code&gt;Daniel Roth&lt;/code&gt; dentro do portal da Microsoft.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documentação e Posts sobre atualizações: &lt;a href="https://devblogs.microsoft.com/aspnet/author/danroth27/" rel="noopener noreferrer"&gt;Daniel Roth&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Api/hosting&lt;/strong&gt;: Está é a grande novidade que vai facilitar em muito a construção de pequenos Endpoints e melhorar a performance em geral do &lt;em&gt;warm-up&lt;/em&gt; (tempo de "aquecimento") para as Apis, esse ponto foi levado em consideração pela Microsoft pelo fato do BOOM do Serverless + functions que necessitam de um desempenho de inicialização maior. A Startup.cs "Morreu" 😥 e agora o Program.cs "faz tudo", sendo possível desenvolver apenas com ele, sim, com cara de Node.Js. Segue exemplo dos novos endpoints:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Github com exemplo de uso: &lt;a href="https://github.com/DamianEdwards/MinimalApiPlayground/blob/main/src/Todo.Dapper/Program.cs" rel="noopener noreferrer"&gt;DamianEdwards/MinimalApiPlayground&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
using System.ComponentModel.DataAnnotations;
using Microsoft.Data.Sqlite;
using Dapper;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("TodoDb") ?? "Data Source=todos.db";
builder.Services.AddScoped(_ =&amp;gt; new SqliteConnection(connectionString));
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

app.MapPut("/todos/{id}/mark-incomplete", async (int id, SqliteConnection db) =&amp;gt;
    await db.ExecuteAsync("UPDATE Todos SET IsComplete = false WHERE Id = @Id", new { id }) == 1
        ? Results.NoContent()
        : Results.NotFound())
    .WithName("MarkIncomplete")
    .Produces(StatusCodes.Status204NoContent)
    .Produces(StatusCodes.Status404NotFound);

app.MapDelete("/todos/{id}", async (int id, SqliteConnection db) =&amp;gt;
    await db.ExecuteAsync("DELETE FROM Todos WHERE Id = @id", new { id }) == 1
        ? Results.NoContent()
        : Results.NotFound())
    .WithName("DeleteTodo")
    .Produces(StatusCodes.Status204NoContent)
    .Produces(StatusCodes.Status404NotFound);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MiniValidator / Metadata&lt;/strong&gt;: Com a chegada do conceito de Minimal Api o .Net6 também traz uma validação mais enxuta e performática, a biblioteca MiniValidator é uma versão minimalista dos DataAnnotations que adiciona suporte para as chamadas de validação de linha única e recursão com detecção de ciclo. E para fechar a concepção de Minimal foi desenvolvida diversas Metadatas para facilitar a documentação e estruturação dos novos recursos, como demostrado no exemplo a seguir.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app.MapPost("/todos", async (Todo todo, SqliteConnection db) =&amp;gt;
    {
            //Realiza a validação da DTO
        if (!MiniValidator.TryValidate(todo, out var errors))
            return Results.ValidationProblem(errors); 

        var newTodo = await db.QuerySingleAsync&amp;lt;Todo&amp;gt;(
            "INSERT INTO Todos(Title, IsComplete) Values(@Title, @IsComplete) RETURNING * ", todo);

        return Results.Created($"/todos/{newTodo.Id}", newTodo);
    })
    .WithName("CreateTodo") //Define nome para o endpoint
    .ProducesValidationProblem()
    .Produces&amp;lt;Todo&amp;gt;(StatusCodes.Status201Created) // Documenta o retorno;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Suporte a HTTP/3&lt;/strong&gt;: A Microsoft já introduziu nativamente o suporte a nova versão do nosso conhecido e querido protocolo de transferência, que por sua vez promete manter os padrões atuais e atribuir mais desempenho por meio do uso QUIC, visando tirar o bloqueio das transações em paralelo quando um pacote era "perdido".&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/" rel="noopener noreferrer"&gt;HTTP/3 Support in .NET 6&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hot Reload&lt;/strong&gt;: Este é um recurso muito bacana para nós desenvolvedores pois permite atualizar o código em tempo real sem perder o estado da aplicação, auxiliando em muito as validações UI e funcionando também com o &lt;code&gt;dotnet watch run&lt;/code&gt; no VSCode, já para o Visual Studio basta clicar sobre o ícone de "Fogo 🔥" na parte superior depois de realizar alguma mudança.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/" rel="noopener noreferrer"&gt;Introducing the .NET Hot Reload experience for editing code at runtime&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blazor / .NET MAUI / SPA&lt;/strong&gt;: A nova sensação do front que virá com o .Net6 é o MAUI que tem o foco em criar Apps com visuais mais modernos e compartilhando mais código entre as plataformas, ao longo do tempo ele será compatível com macOS e Windows, mas no momento o suporte é para Android e iOS. Também é importante mencionar a chegada da biblioteca ´Xamarin.Essentials´ que possibilita acessar recursos nativos dos dispositivos, como sensores, armazenamentos e afins. Já para o SPA agora é possível separar o front-end do back-end em dois projetos e foi acrescentado o ecossistema de estruturas JavaScript SPA no Visual Studio, com teste de unidade, gerenciamento de GUI npm, modelos baseados em CLI e mais novidades a serem anunciadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://devblogs.microsoft.com/aspnet/asp-net-core-updates-in-net-6-rc-2/" rel="noopener noreferrer"&gt;ASP.NET Core updates in .NET 6 Release&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Using Global&lt;/strong&gt;: Sim, ISSO MESMO!!🥳 Agora é possível definir usings globalmente, basta acrescentar a palavra global antes de declarar o using, muito útil quando usado em conjunto com arquivos de configuração geral da aplicação, permitindo que todos os outros arquivos possuam acesso aos usings.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;global using System;
global using System.Collections.Generic;
global using System.IO;
global using System.Linq;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File-scoped namespace declaration&lt;/strong&gt;: Agora é possível declarar os namespaces de sua aplicação sem abrir e fechar as chaves, basta colocar um ; (ponto e virgula) no final, como no exemplo abaixo.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace MyNamespace;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extended property patterns&lt;/strong&gt;: O novo C#10 já está apto para trabalhar com  referência a propriedades ou campos aninhados em uma propriedade, como pode ser visto abaixo.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ Prop1: { Prop2: pattern } } // Antiga maneira
{ Prop1.Prop2: pattern } // Nova maneira
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LINQ / CHUCK / MetodosBy&lt;/strong&gt;: Chegou também melhorias para os métodos OrDefault do Linq e afins, agora sendo possível definir no próprio método um valor default, um ponto muito interessante foi a vinda do IEnumerable Chunk para facilitar a paginação e manipulação de dados, em conjunto com diversos métodos *By para utilização de listas.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var list = Enumerable.Range(1, 100);
foreach(var chunk in list.Chunk(10))
  foreach(var item in chunk) 
    Console.WriteLine(item);

var foundValue = hayStack.FirstOrDefault(x =&amp;gt; x == needle, -1);

Console.Write(people.MaxBy(x =&amp;gt; x.Age));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://dotnetcoretutorials.com/2021/09/23/net-6-c-10-top-new-features-recap/" rel="noopener noreferrer"&gt;.NET 6 / C# 10 Top New Features Recap&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &amp;gt; Legal, mas existe algo para chegar ainda?
&lt;/h3&gt;

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

&lt;p&gt;A Microsoft sempre tem projetos "escondidos" que estão sendo trabalhados por baixo dos panos para criar grandes mudanças na sua plataforma, aqui citarei dois desses projetos que estão sendo desenvolvidos para as próximas versões do .Net, o Houdini e o Bedrock.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Projeto Houdini&lt;/strong&gt;: A Microsoft quer modificar a sua Stack para deixa-la mais performática, e esse projeto vem com tudo para cima do MVC, com foco em ACABAR com ele, e tirar todo o peso que seus componentes geram para as Apis e afins.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://www.daveabrock.com/2020/12/05/dotnet-stacks-28/" rel="noopener noreferrer"&gt;The .NET Stacks, #28: The future of MVC and themes of .NET 6&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Projeto BedRock&lt;/strong&gt;: Visando novamente a alta performance da plataforma, esse projeto tem o intuito de abstrair toda a camada de comunicação cliente-server, de forma que o .Net vai verificar as opções disponíveis e escolher a melhor forma de realizar essa troca de dados dependendo do ambiente e da situação. Esse projeto possui três pilares (transporte, middleware e protocolo) e será usado pelo IConnectionFactory e IConnectionListener.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Mais informações: &lt;a href="https://github.com/davidfowl/BedrockFramework" rel="noopener noreferrer"&gt;BedrockFramework&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  &amp;gt; Por enquanto é isso, obrigado! ✌️
&lt;/h3&gt;

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

&lt;p&gt;Qualquer dúvida pode me chamar para um bate-papo, e agradeço a sua atenção até aqui, espero te ver em outras publicações.&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__729246"&gt;
    &lt;a href="/lucastmp" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F729246%2F7aad6faa-411a-4ad6-91f2-098e361888e6.jpeg" alt="lucastmp image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/lucastmp"&gt;Lucas Paes&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/lucastmp"&gt;Brasileiro, 22 anos.

Amo tecnologia e estou sempre explorando novos conhecimentos.&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



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

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&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%2F1wmziqv74ghhgyi9p0om.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>programming</category>
      <category>vaivoa</category>
      <category>net6</category>
    </item>
    <item>
      <title>Criando uma Web API com .NET Core, EntityFramework Core - Número Cartão de Crédito Aleatório</title>
      <dc:creator>Matheus Paixão</dc:creator>
      <pubDate>Mon, 18 Oct 2021 21:07:29 +0000</pubDate>
      <link>https://dev.to/vaivoa/criando-uma-web-api-com-net-core-entityframework-core-numero-cartao-de-credito-aleatorio-2j0i</link>
      <guid>https://dev.to/vaivoa/criando-uma-web-api-com-net-core-entityframework-core-numero-cartao-de-credito-aleatorio-2j0i</guid>
      <description>&lt;p&gt;Este projeto irá te guiar no Passo a Passo de como criar uma Web API aplicando os conceitos REST em .NET Core, usando Entity Framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio 2019 com pacotes de ASP.NET e desenvolvimento web instalados&lt;/li&gt;
&lt;li&gt;.NET Core 3.1 &lt;/li&gt;
&lt;li&gt;Postman&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  O Projeto:
&lt;/h1&gt;

&lt;p&gt;Desenvolver uma aplicação Web API com .NET Core, EntityFramework Core usando arquitetura REST.&lt;/p&gt;

&lt;p&gt;A API deverá gerar números aleatórios para o pedido de um novo cartão de crédito virtual. Cada cartão gerado deve estar associado a um email para identificar a pessoa que está utilizando.&lt;/p&gt;

&lt;h1&gt;
  
  
  EndPoints
&lt;/h1&gt;

&lt;p&gt;GET&lt;br&gt;
Listar todos os números de cartão de crédito indexados a um email fornecido em forma de parâmetro pelo cliente.&lt;/p&gt;

&lt;p&gt;POST&lt;br&gt;
Cadastrar email&lt;/p&gt;

&lt;p&gt;Gerar Número de cartão de crédito aleatório.&lt;/p&gt;

&lt;p&gt;Indexar email criado a Número de cartão gerado.&lt;/p&gt;

&lt;p&gt;Mostrar número de cartão gerado ao final da operação.&lt;/p&gt;
&lt;h1&gt;
  
  
  Relacionamentos
&lt;/h1&gt;

&lt;p&gt;É de extrema importância entender e modelar o projeto em questão antes de avançar para os códigos.&lt;/p&gt;

&lt;p&gt;Esse projeto pode ser feito com apenas uma classe, uma tabela de dados, pois são apenas 2 informações coletadas e o relacionamento exigido permite isso.&lt;/p&gt;
&lt;h2&gt;
  
  
  Classe: ClienteDados
&lt;/h2&gt;

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

&lt;p&gt;int Id&lt;br&gt;
string Email&lt;br&gt;
string CardNumber&lt;/p&gt;

&lt;p&gt;A chave primária dessa classe é o ID, pois será uma forma de indexar o e-mail a seu respectivo cartão de crédito e também porque o atributo Email não poderia ser chave primária pois chave primária não pode ser repetir e podemos ter vários emails iguais. &lt;/p&gt;

&lt;p&gt;Podemos 1 email com vários cartões de crédito (Email 1 para * muitos Cartões de crédito), porém podemos ter apenas 1 email por cartão de crédito, esse é o relacionamento de dados entre os atributos.&lt;/p&gt;

&lt;p&gt;Agora que compreendemos o que o projeto pede, mãos à obra.&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%2Ft8b6twkoc3kiz3o3cika.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%2Ft8b6twkoc3kiz3o3cika.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Digite o nome do projeto e clique em Proximo.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbuhvzg81umgair341xu1.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%2Fbuhvzg81umgair341xu1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em informações adicionais selecione “.NET Core 3.1 (suporte de longo prazo)” e clique em Criar.&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%2Fh89a5ncj6reexwvf3l3k.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%2Fh89a5ncj6reexwvf3l3k.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Instalar pacotes de NuGet
&lt;/h1&gt;

&lt;p&gt;Para instalar o suporte EF Core a um projeto, vá em Gerenciar Pacotes de NuGet para a Solução, para instalar os pacotes necessários para esta API.&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%2Fmhcbf4u8ri0vituckekd.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%2Fmhcbf4u8ri0vituckekd.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Os pacotes a serem instalados são:&lt;br&gt;
Microsoft.EntityFrameworkCore&lt;br&gt;
Microsoft.EntityFrameworkCore.InMemory&lt;br&gt;
Microsoft.EntityFrameworkCore.Design&lt;br&gt;
Microsoft.EntityFrameworkCore.SqlServer&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%2Fgdwxhx6uozn0609snwjy.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%2Fgdwxhx6uozn0609snwjy.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para instalar, digite o nome do pacote em Procurar, selecione o pacote, selecione o nome do seu projeto e clique em instalar.&lt;/p&gt;
&lt;h1&gt;
  
  
  Criar Models e Classes
&lt;/h1&gt;

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

&lt;p&gt;O projeto vem com uma classe e um Controller de exemplos, os WeatherForecast.cs. Exclua esses dois arquivos pois não vamos usá-los.&lt;/p&gt;

&lt;p&gt;Agora vamos criar nosso Modelo e nossa Classe ClienteDados.&lt;/p&gt;

&lt;p&gt;Criar uma pasta chamada Models, clicando com o botão direito no nome do projeto clique em Adicionar &amp;gt; Pasta. Nomear de Models. Models é onde armazenamos nossas classes.&lt;/p&gt;

&lt;p&gt;Dentro da pasta Models criar uma Class chamada ClienteDados. Clicando com o botão direito na pasta Models e depois clique em Adicionar &amp;gt; Classe. Nomear ClienteDados e criar.&lt;/p&gt;

&lt;p&gt;Agora declare os atributos que usaremos neste projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;namespace APICartaoDeCredito.Models
{
    public class ClienteDados
    {
        public int Id {get; set;}
        public string Email {get; set;}
        public string CardNumber {get; set;}
    }   
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Construir o contexto de Banco de Dados
&lt;/h1&gt;

&lt;p&gt;Criar a pasta de banco de dados chamada DataBase e dentro dessa parte criar a nossa classe de contexto a ApiContext.cs. Essa classe é a responsável principal pela comunicação com a Entity Framework Core&lt;/p&gt;

&lt;p&gt;Dentro dessa classe, vamos criar o nosso InMemory Data Base, que será nosso banco de dados em memória.&lt;/p&gt;

&lt;p&gt;Carregue os pacotes que usaremos nessa classe.&lt;br&gt;
using Microsoft.EntityFrameworkCore;&lt;br&gt;
using ApiCartaoDeCredito.Models;&lt;/p&gt;

&lt;p&gt;Olhando o Código pronto abaixo, temos ClientesDb que será nossa propriedade DbSet de acesso ao banco de dados.&lt;/p&gt;

&lt;p&gt;Dentro da classe ApiContex seria onde podemos definir regras de relacionamento, definir quem é chave primária entre outras coisas relacionadas a Banco de Dados, mas não será necessário nesse projeto.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class ApiContex : DbContext

    {
        public ApiContex(DbContextOptions&amp;lt;ApiContex&amp;gt; options) : base(options)
        {

        }
        public DbSet&amp;lt;ClienteDados&amp;gt; ClientesDb { get; set; }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Criar registro do ApiContex
&lt;/h1&gt;

&lt;p&gt;No projeto tem uma classe que foi criada com a criação do projeto que precisamos registrar o banco de dados que criamos. Abra a classe Startup.cs e procure o método ConfigureServices() e adicione essa linha de código.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext&amp;lt;ApiContex&amp;gt;(opt =&amp;gt;
            opt.UseInMemoryDatabase("ClienteDb"));

            services.AddControllers();
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h1&gt;
  
  
  Criar Controllers
&lt;/h1&gt;

&lt;p&gt;Clicar com botão direito na pasta Controllers &amp;gt; Adicionar &amp;gt; Novo Item Scaffold. Na janela que abrir selecione Controlador API com ações, usando o Entity Framework, depois clique em Adicionar. &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%2Frmdxk30m27oy0whzpq81.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%2Frmdxk30m27oy0whzpq81.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na janela que abrir, temos que escolher para qual classe estamos criando nossa Controller. Selecione ClienteDados. Logo abaixo tem a opção da classe de contexto de dados, que é a classe ApiContext, que criamos para ser nossa classe de controle do banco de dados.&lt;br&gt;
Escolher o nome do Controller, mas de default Visual Studio já nos fornece o nome apropriado.&lt;br&gt;
Agora clique em Adicionar.&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%2Fhzd2rrifgbv00ax14t2z.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%2Fhzd2rrifgbv00ax14t2z.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Usar o Scaffold para criar os Controllers, nos dá o benefício de que eles já criam automaticamente os métodos REST, que são os vistos na imagem abaixo. GET PUT POST e DELETE.&lt;/p&gt;

&lt;p&gt;GET: Método onde vamos extrair informações do banco de dados e exibi-los.&lt;br&gt;
PUT: Método que altera informações do banco de dados&lt;br&gt;
POST: Método para adicionar informações no banco de dados.&lt;br&gt;
DELETE: Método para deletar informações do banco de dados.&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%2Fsp4cjr5lb8yn7comgejp.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%2Fsp4cjr5lb8yn7comgejp.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembrando das exigências que vimos anteriormente, neste projeto usaremos apenas o método GET e POST.&lt;/p&gt;
&lt;h1&gt;
  
  
  Método POST
&lt;/h1&gt;

&lt;p&gt;Id - Gerada automaticamente (Chave primária, gerada automaticamente pelo sistema)&lt;br&gt;
Email - Adicionado pelo usuário.&lt;br&gt;
CardNumber - Gerado automaticamente de forma aleatória.&lt;/p&gt;

&lt;p&gt;No método POST adicione as linhas de código abaixo.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public async Task&amp;lt;ActionResult&amp;lt;ClienteDados&amp;gt;&amp;gt; PostClienteDados(ClienteDados clienteDados)
    {        
        Random rnd = new Random();
        int ccn1 = rnd.Next(1000, 9999);
        int ccn2 = rnd.Next(1000, 9999);
        int ccn3 = rnd.Next(1000, 9999);
        int ccn4 = rnd.Next(1000, 9999);
        clienteDados.CardNumber = $"{ccn1} {ccn2} {ccn3} {ccn4}";

        _context.ClientesDb.Add(clienteDados);  
            await _context.SaveChangesAsync();
            return CreatedAtAction("PostClienteDados", new { clienteDados = clienteDados.CardNumber }, clienteDados.CardNumber);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Random rnd - Para gerarmos números aleatórios crie uma instância da classe Random para acessarmos as funções desta classe.&lt;br&gt;
Como não foi especificado no nosso projeto a bandeira do cartão de crédito ou quantos números teria, então decidi que neste projeto serão 4 blocos de 4 números aleatórios. &lt;/p&gt;

&lt;p&gt;int ccn1/2/3/4 - Estas 4 variáveis são os 4 blocos de 4 números.&lt;br&gt;
Para gerarmos de fato os números aleatórios precisamos chamar a função next da classe Random, através da instância rnd.  rnd.Next. Dentro da função Next definimos o range de números que queremos. &lt;/p&gt;

&lt;p&gt;rnd.Next(1000, 9999);&lt;/p&gt;

&lt;p&gt;Agora que temos os números criados, precisamos armazená-los dentro do nosso atributo que representa o número do cartão de crédito no nosso banco de dados, o CardNumber.&lt;br&gt;
Precisamos então concatenar as 4 variáveis ccn para armazená-las em CardNumber.&lt;/p&gt;

&lt;p&gt;clienteDados.CardNumber = $"{ccn1} {ccn2} {ccn3} {ccn4}"&lt;/p&gt;

&lt;p&gt;Aqui usamos a nossa instância (clienteDados) da classe (ClienteDados) do projeto para acessar o atributo CardNumber.&lt;/p&gt;

&lt;p&gt;Bom, já temos nosso número aleatório de cartão de crédito, agora precisamos armazenar tudo no banco de dados.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_context.ClientesDb.Add(clienteDados);
        await _context.SaveChangesAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Usamos a nossa instância do nosso contexto do banco de dados _context.ClientesDb para acessar o banco de dados e executar a função .Add para ADICIONAR informação da classe ClienteDados.&lt;br&gt;
E toda vez que adicionamos algo ao banco de dados precisamos salvar através da função .SaveChangesAsync();&lt;/p&gt;

&lt;p&gt;O projeto pede que após o usuário inserir o seu email, o sistema vai retornar apenas o número de cartão de crédito. Para isso vamos usar o código abaixo.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;            return CreatedAtAction("PostClienteDados", new { clienteDados = clienteDados.CardNumber }, clienteDados.CardNumber);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Se atentar para o método que está sendo chamado, que é o PostClienteDados e para o que vem após de new, pois deve ser o mesmo parâmetro da função PostClienteDados. Para filtrar e mostrar apenas CardNumber é necessário que especifique clienteDados.CardNumber.&lt;/p&gt;
&lt;h1&gt;
  
  
  Método GET
&lt;/h1&gt;

&lt;p&gt;O projeto pede que quando o usuário insere o seu e-mail como parâmetro, retorne em ordem de criação apenas os números de cartão de crédito.&lt;/p&gt;

&lt;p&gt;Antes do método GET precisamos criar um TYPE, para ter acesso aos atributos da nossa classe.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public class NEW_TYPE
    {
        public string Cartao { get; set; }
    };

     // GET: api/ClienteDados/”inserir email aqui”
    [HttpGet("{email}")]
        public async Task&amp;lt;ActionResult&amp;lt;IEnumerable&amp;lt;ClienteDados&amp;gt;&amp;gt;&amp;gt; GetEmail(string email)
        {
            var list = from a in _context.ClientesDb
                        where a.Email.Equals(email)
                        select new NEW_TYPE
                        {
                            Cartao = a.CardNumber
                        };
            var CartoesdeCredito = await list.ToListAsync();
            return Ok(CartoesdeCredito);
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Repare que agora o [HttpGet] está com um complemento, que é o parâmetro que o usuário vai inserir [HttpGet(“{email}”).&lt;/p&gt;

&lt;p&gt;Como estamos recebendo um parâmetro, precisamos receber em uma variável, por isso temos (string email) após a declaração do método.&lt;/p&gt;

&lt;p&gt;public async Task&amp;gt;&amp;gt; GetEmail&lt;/p&gt;

&lt;p&gt;Crie uma instância do nosso banco de dados.&lt;/p&gt;

&lt;p&gt;var list = from a in _context.ClientesDb&lt;/p&gt;

&lt;p&gt;Crie uma estrutura de consulta com filtro.&lt;/p&gt;

&lt;p&gt;var list = from a in _context.ClientesDb&lt;br&gt;
                       where a.Email.Equals(email)&lt;br&gt;
                       select new NEW_TYPE&lt;br&gt;
                       {&lt;br&gt;
                           Cartao = a.CardNumber&lt;br&gt;
                       };&lt;/p&gt;

&lt;p&gt;Agora que temos a informação filtrada, vamos adicionar a uma lista.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var CartoesdeCredito = await list.ToListAsync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;E retornaremos a lista para o usuário.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;return Ok(CartoesdeCredito);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Roteamento
&lt;/h1&gt;

&lt;p&gt;Antes de testarmos nossa API precisamos atualizar o arquivo launchSettings.json adicionando a rota do URL que desejamos acessar nossa API&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "profiles": {
"IIS Express": {
  "commandName": "IISExpress",
  "launchBrowser": true,
  "launchUrl": "api/ClienteDados",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
},
"APICartaoDeCredito": {
  "commandName": "Project",
  "launchBrowser": true,
  "launchUrl": "api/ClienteDados",
  "applicationUrl": "https://localhost:5001;http://localhost:5000",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Atualize o parâmetro “launchUrl” e coloque o caminho desejado, no nosso caso vai ser o api/ClienteDados.&lt;/p&gt;

&lt;p&gt;Na parte superior desse arquivo você pode escolher a porta do localhost a ser usada.&lt;/p&gt;

&lt;p&gt;Caso você queira personalizar a URL, você deve se atentar para mudar o roteamento no Controller também, pois ele vem como de Defaut roteando para api/nome da classe e se você inicializar com outro nome, deve especificar no Controller.&lt;/p&gt;
&lt;h1&gt;
  
  
  Postman
&lt;/h1&gt;

&lt;p&gt;Por conveniência, escolhi a plataforma Postman para realizar os testes do projeto, existem outras formas e plataformas para testar. &lt;/p&gt;

&lt;p&gt;Ao abrir o Postman clique em Create New para criar um novo projeto, e na próxima janela que abrir escolha HTTP Request.&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%2F5oqh9qjateiozqevlruk.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%2F5oqh9qjateiozqevlruk.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na próxima janela que abrir clique em New Collection, dê um nome pra ela, e clique em Create, na próxima janela clique em Save e pronto, projeto criado.&lt;/p&gt;

&lt;p&gt;De volta ao Visual Studio, na barra superior de ferramentas, no símbolo de PLAY para executar nosso projeto.&lt;/p&gt;

&lt;p&gt;O seu navegador padrão deverá abrir no endereço que roteamos no projeto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mgpaixao" rel="noopener noreferrer"&gt;https://localhost:44340/api/ClienteDados&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembrando que a porta do URL pode ser diferente. &lt;/p&gt;

&lt;p&gt;Pegue esse link e cole no Postman. &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%2Freyshzox4o8goba5xmos.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%2Freyshzox4o8goba5xmos.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve receber Status 200 OK que significa que a requisição retornou com sucesso.&lt;/p&gt;

&lt;p&gt;Como não demos nenhuma entrada até esse momento, ele retornou tudo em branco.&lt;/p&gt;
&lt;h1&gt;
  
  
  Endpoint 1
&lt;/h1&gt;

&lt;p&gt;Para realizarmos a primeira entrada, clique no Dropdown menu onde está escrito GET e aparecerá todos os verbos disponíveis de Http para você escolher.&lt;/p&gt;

&lt;p&gt;Clique em Post para acessarmos o método Post do nosso projeto. &lt;br&gt;
Clique em Body, depois em raw, depois troque o método de entrada de Text para JSON.&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%2Foz4z2l0pom4535n1u3in.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%2Foz4z2l0pom4535n1u3in.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código para darmos a primeira entrada no banco de dados, inclui apenas Email, pois as outras informações são geradas automaticamente.&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
    "Email": "digite o email aqui"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Após digitar o email desejado clique em Send para executar o código e o sistema retornará 200 OK e o número de cartão de crédito gerado.&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%2Fvekunwn3dr8kdsugfsoh.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%2Fvekunwn3dr8kdsugfsoh.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para fazer o teste do segundo Endpoint, crie vários números para o mesmo email.&lt;/p&gt;
&lt;h1&gt;
  
  
  Endpoint 2
&lt;/h1&gt;

&lt;p&gt;Mude o verbo Http no Postman para GET novamente.&lt;br&gt;
E no caminho URL adicione o email cadastrado e clique Send novamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mgpaixao" rel="noopener noreferrer"&gt;https://localhost:44340/api/ClienteDados/EmailCadastradoAQUI&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%2Fuploads%2Farticles%2F80io2o6lmy0jnydaah2c.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%2F80io2o6lmy0jnydaah2c.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E o sistema retornou os cartões de crédito que pertencem ao usuário do email cadastrado, e listou-os em ordem de criação.&lt;/p&gt;

&lt;p&gt;É possível testar o método GET no browser também, digitando o caminho  do URL+email &lt;a href="https://github.com/mgpaixao" rel="noopener noreferrer"&gt;https://localhost:44340/api/ClienteDados/emailcadastrado&lt;/a&gt; e ele dará o mesmo retorno que no Postman.&lt;/p&gt;

&lt;p&gt;Com isso concluímos este projeto. &lt;a href="https://github.com/mgpaixao/APICartaoDeCredito" rel="noopener noreferrer"&gt;https://github.com/mgpaixao/APICartaoDeCredito&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__729596"&gt;
    &lt;a href="/mgpaixao" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F729596%2Feea9bd33-293a-4662-ac8a-6f1e6637fe14.jpeg" alt="mgpaixao image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/mgpaixao"&gt;Matheus Paixão&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/mgpaixao"&gt;Gosto de compartilhar conhecimento pois foi assim que eu aprendi a programar. O meu negócio é todo dia saber mais que eu sabia ontem. Pode me chamar, vamos aprender juntos. Prazer =)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



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

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

&lt;h1&gt;
  
  
  Disclaimer
&lt;/h1&gt;

&lt;p&gt;A VaiVoa incentiva seus Desenvolvedores em seu processo de crescimento e aceleração técnica. Os artigos publicados não traduzem a opinião da VaiVoa. A publicação obedece ao propósito de estimular o debate.&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%2F1wmziqv74ghhgyi9p0om.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%2F1wmziqv74ghhgyi9p0om.png" alt="logo vaivoa"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>beginners</category>
      <category>vaivoa</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
