Mostrando postagens com marcador Resumos. Mostrar todas as postagens
Mostrando postagens com marcador Resumos. Mostrar todas as postagens

domingo, 4 de agosto de 2024

Metodologia Twelve-Factor

         A metodologia Twelve-Factor App é um conjunto de 12 regras para manter uma aplicação de forma eficaz, sendo elas:


  1. Codebase (Código-fonte único): Uma aplicação deve ser armazenada em um único repositório de código, com múltiplas implantações derivadas do mesmo código-base.

  2. Dependencies (Dependências explícitas): Todas as dependências da aplicação, incluindo bibliotecas e ferramentas de sistema, devem ser declaradas explicitamente e gerenciadas de forma isolada.

  3. Config (Configurações): As configurações da aplicação devem ser armazenadas em variáveis de ambiente, não no código-fonte, para permitir a configuração flexível em diferentes ambientes.

  4. Backing Services (Serviços de Back-end): Os serviços de back-end, como bancos de dados e filas, devem ser tratados como recursos externos, acessíveis por meio de interfaces padrão.

  5. Build, Release, Run (Construir, entregar, executar): O processo de build, entrega e execução da aplicação deve ser separado em etapas distintas, com cada etapa tendo suas próprias responsabilidades e garantindo a consistência entre ambientes.

  6. Processes (Processos): As aplicações devem ser executadas como processos independentes, leves e sem estado (Stateless), para facilitar a escalabilidade e a resiliência.

  7. Port Binding (Ligação de porta): As aplicações devem ser autocontidas e expor serviços por meio de portas, para que possam ser facilmente conectados a outras aplicações e serviços.

  8. Concurrency (Concorrência): As aplicações devem escalar horizontalmente, adicionando instâncias concorrentes para lidar com cargas de trabalho aumentadas.

  9. Disposability (Descartabilidade): As aplicações devem ser fáceis de iniciar e parar rapidamente, sem impacto para outras partes do sistema, para facilitar o deploy e a atualização contínua.

  10. Dev/Prod Parity (Paridade dev/prod): Os ambientes de desenvolvimento, testes e produção devem ser o mais semelhantes possível, para minimizar diferenças e evitar problemas de compatibilidade.

  11. Logs (Registros): As aplicações devem produzir logs estruturados e acessíveis por meio de interfaces padronizadas, para facilitar a depuração e o monitoramento.

  12. Admin Processes (Processos de administração): As tarefas administrativas, como migrações de banco de dados e limpeza de caches, devem ser executadas como processos únicos e rastreáveis.

terça-feira, 10 de novembro de 2020

Principais comandos do Docker Swarm

 Nesse artigo vou trazer o resumo dos principais comandos do Docker Swarm.


·        docker swarm init --advertise-addr <ip_máquina> – Mostra o status do swarm
·        docker info – Mostra o status do swarm
·        docker node ls – Exibe informações sobre os nós
·        docker swarm join-token worker – Mostra o comando necessário para adicionar um
nó como worker ao swarm. O comando que resulta como saída deve ser aplicado na VM 
a ser adicionada.
·        docker service create --replicas 1 --name nome_do_servico -p 8080: 3000 
nome_da_imagem – Cria um serviço no swarm com apenas uma réplica com a porta interna
3000 mapeada para a porta 8080.
·        docker service inspect --pretty id_servico – Mostra detalhes do serviço de forma 
amigável (pretty)
·        docker service ps id_servico – Exibe os nós que estão rodando o serviço 
·        docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS> - Escala o serviço para a 
quantidade desejada.
·        docker service rm id_servico – Remove o serviço.
·        docker service update --image nome_imagem nome_servico – Atualiza os serviços com
a nova versão da imagem.
·        docker node update --availability drain nome_do_no – Deixa o nó indisponível para 
executar containers.
·        docker service update --constraint-add node.role==worker id_servico – Restringe 
determinado serviço a rodar apenas em nós worker.
·        docker service update --constraint-add node.id==id_do_no id_servico – Restringe 
determinado serviço a rodar apenas no nó especificado (também pode ser passado
o nome da VM, mas tem que trocar node.id por node.hostname).
·        docker service update --constraint-rm node.role==worker id_servico – Remove a 
restrição do serviço de rodar apenas em nós worker.
·        docker service update --constraint-rm node.id==id_do_no id_servico – Remove a  
restrição do serviço de rodar apenas no nó especificado ( também pode ser passado 
o nome da VM, mas tem que trocar node.id por node.hostname).

quinta-feira, 5 de novembro de 2020

Principais comandos Docker-Machine

Instalar:

base=https://github.com/docker/machine/releases/download/v0.16.0 && mkdir -p "$HOME/bin" && curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" && chmod +x "$HOME/bin/docker-machine.exe"
 

Executar o comando no GitBash. Nesta versão do Docker-Machine os comandos precisam ser executados nele.

Principais comandos:


⦁    docker-machine ls  - lista máquinas disponíveis
⦁    docker-machine create --driver virtualbox nome_maquina  -  cria uma máquina virtual. É preciso especificar do driver e o nome da máquina.
⦁    docker-machine ip nome_maquina  -   mostra o ip da máquina criada.
⦁    nome_maquina  start  nome_maquina - starta a máquina.
⦁    nome_maquina  stop  nome_maquina  -  para a máquina.
⦁    nome_maquina  restart  nome_maquina - restarta a máquina.
⦁    nome_maquina  ssh  nome_maquina  -  acessa a máquina.
⦁    nome_maquina  inspect  nome_maquina  -  mostra configurações da máquina.
⦁    nome_maquina  status  nome_maquina  - exibe o status da máquina.

Outros:


⦁    nome_maquina  config  nome_maquina.
⦁    nome_maquina  env  nome_maquina.
⦁    nome_maquina  kill  nome_maquina.
⦁    nome_maquina  upgrade  nome_maquina.
⦁    nome_maquina  url  nome_maquina.
⦁    nome_maquina  provision  nome_maquina.


Fonte:
https://docs.docker.com/engine/swarm/swarm-tutorial/
https://docs.docker.com/machine/

segunda-feira, 2 de novembro de 2020

Resumo dos principais comandos Docker

 

Resumo dos principais comandos Docker para acesso rápido:


  • docker ps - exibe todos os containers em execução no momento, equivale ao "docker container ls". Temos algumas opções interessantes nesse comando:
    • -a -> exibe todos os containers, independentemente de estarem em execução ou não.
    • -q -> exibe apenas os ids dos contaners.
    • -s -> exibe o tamanho do volume.
  • docker exec -it nome_ou_id_do_container comando - executa um comando dentro do container de forma interativa (-it). Ex: docker exec -it nome_ou_id bash -> inicia um bash dentro do container especificado.
  • docker run -it NOME_DA_IMAGEM - conecta o terminal que estamos utilizando com o do container.
  • docker stop ID_CONTAINER - interrompe o container com id em questão. Mata os processos internos.
  • docker stop $(docker ps -q) - interrompe todos os containers.
  • docker start ID_CONTAINER - inicia o container com id em questão.
  • docker pause ID_CONTAINER - pausa o container com id em questão. Não mata os processos internos.
  • docker unpause ID_CONTAINER - volta a execução do container pausado com id em questão, com os mesmos processos internos.
  • docker start -a -i ID_CONTAINER - inicia o container com id em questão e integra os terminais, além de permitir interação entre ambos. (-a de attach). 
  • docker attach ID_CONTAINER - Dessa forma vc acessa um terminal já em execução. Para "desanexar" o container do terminal e ele continuar em background use CTRL+P,  CTRL+Q.
Apagando imagens e contaners
  • docker rm ID_CONTAINER - remove o container com id em questão. Se estiver rodando pode usar o --force no final do comando.
  • docker container prune - remove todos os containers que estão parados.
  • docker rmi NOME_DA_IMAGEM - remove a imagem passada como parâmetro.
  • docker container prune - remove todos os containers parados.
  • docker images prune -a - remove todas as imagens não ligadas a containers.
Portas e variáveis de ambiente
  • docker run -d -P --name NOME dockersamples/static-site - ao executar, dá um nome ao container(--name). A opção -d é de "detached", para que o terminal não fique preso no container. O -P (maiúsculo) atrela as portas internas do container à portas aleatórias na minha máquina local para poder acessar.
  • docker run -d -p 12345:80 dockersamples/static-site - define uma porta específica da nossa máquina (12345) para ser atribuída à porta 80 do container.
  • docker port ID_CONTAINER - mostra as portas mapeadas.
  •  docker run -d -P -e AUTHOR="Fulano" dockersamples/static-site - o -e define uma variável de ambiente AUTHOR com o valor Fulano no container criado. (Neste caso, a imagem usada espera o valor da variável de ambiente.)
Anexando DISCO(Volume)
  • docker run -v "[CAMINHO_VOLUME_LOCAL]:CAMINHO_VOLUME_CONTAINER" -w /var/www NOME_DA_IMAGEM - cria um container com volume (-v) no respectivo caminho do container, caso seja especificado um caminho local monta o volume local no volume do container. O -w especifica o diretório que o Docker vai iniciar o container, muito útil para quando se precisa executar certos comandos ao iniciar um servidor por exemplo.
  • docker run --mount type=bind,source=[CAMINHO_VOLUME_LOCAL], target=[CAMINHO_VOLUME_CONTAINER] NOME_DA_IMAGEM - cria um container com um volume usando o mount. Essa forma faz um bind do contaner para um local da nossa maquina.
  • docker volume create NOME_DO_VOLUME - cria um volume gerenciado pelo Docker. É parecido com associar uma pasta diretamente ao contaner, mas assim ele fica salvo em um lugar específico do Docker(dentro de /var/lib/docker/volumes) e pode ser trabalhado com alguns comandos do docker. 
  • docker volume ls - retorna a lista de volumes criados.
  • docker run --mount source=[NOME_DO_VOLUME], target=[CAMINHO_VOLUME_CONTAINER] NOME_DA_IMAGEM - cria o contaner com o volume gerenciado, note que nesse caso o type não precisou ser especificado, apenas o nome do volume gerenciado e o destino.
  • docker run --tmpfs=CAMINHO/NOME_DA_PASTA - cria pastas temporárias no volume. Algumas aplicações podem fazer bastante uso de pastas temporárias. Funciona com Linux apenas.
Informações
  • docker inspect ID_CONTAINER - retorna diversas informações sobre o container.
  • docker history ID_CONTAINER - retorna as camadas do container.

Build e publicação

  • docker build -f Dockerfile .  - cria uma imagem a partir de um Dockerfile passando o diretório atual (".").
  • docker build -f CAMINHO_DOCKERFILE/Dockerfile -t NOME_USUARIO/NOME_IMAGEM .  - constrói e nomeia uma imagem não-oficial informando o caminho para o Dockerfile. O ponto (".") indica o caminho do Dockerfile (diretório atual no caso).
  • docker login - inicia o processo de login no Docker Hub.
  • docker push NOME_USUARIO/NOME_IMAGEM:versao - envia a imagem criada para o Docker Hub.
  • docker pull NOME_USUARIO/NOME_IMAGEM - baixa a imagem desejada do Docker Hub.
  • docker tag NOME_USUARIO/NOME_IMAGEM:versao NOVO_NOME_USU/NOVO_NOME_IMG:versao - muda o nome da imagem, isso pode ser necessário para fazer o upload de imagens no repositório.
Rede

  • docker network ls - mostra as redes disponíveis. Embora já exista uma rede bridge, para termos controle somos obrigados a criar a nossa.
  • docker network create --driver bridge NOME_DA_REDE - cria uma rede especificando o driver desejado.
  • docker run -it --name NOME_CONTAINER --network NOME_DA_REDE NOME_IMAGEM - cria um container especificando seu nome e qual rede deverá ser usada. Quando uma rede é usada e o container tem um nome, o Docker se encarrega de fazer o DNS entre os nós da rede, podendo assim chamarmos as máquinas pelos nomes atribuídos.
  • hostname -i - mostra o ip atribuído ao container pelo docker (funciona apenas dentro do container).
Docker Compose

  • docker-compose build - Realiza o build dos serviços relacionados ao arquivo docker-compose.yml, assim como verifica a sua sintaxe.
  • docker-compose up -d - Sobe todos os containers relacionados ao docker-compose, desde que o build já tenha sido executado.
  • docker-compose down - Para todos os serviços em execução que estejam relacionados ao arquivo docker-compose.yml.
  • docker-compose ps - lista os serviços que estão rodando.
Atenção! Nas versões mais novas foi retirado o hífen ("-") entre as palavras "docker  compose" nos comandos. 

Exemplo de arquivo docker-compose: docker-compose.yml


OBS: para acessar as máquinas caso esteja usando o Docker Tool Box ao invés do Docker for Windows é preciso ver o IP da máquina. Isso pode ser feito com o comando: docker-machine ip.

OBS2: $docker ps -q  retorna os ids dos containers.


segunda-feira, 28 de outubro de 2019

.NET para Java Developers


O .NET é uma plataforma como a plataforma Java que roda sobre diferentes Sistemas Operacionais, ou seja, é um ambiente de desenvolvimento e execução de programas multilinguagem e multiplataforma que visa facilitar o desenvolvimento e execução de programas, disponibilizando bibliotecas, compilador, máquina virtual, controle de memória, e outras coisas mais.

Por ser da Microsoft ela começou focada apenas no ambiente Windows com o .NET Framework, mas desenvolveu o .NET Core que é multiplataforma como o Java, desde que o S.O. destino tenha implementado as especificações para rodar o .NET Core.

1 - Plataforma .Net Framework (Ambiente de execução para Windows)

O .NET Framework é usado para construir aplicações desktop e/ou aplicações ASP.NET rodando no IIS (Internet Information Server). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Biblioteca .Net Framework - Biblioteca de classes
- Aplicação .NETProgramas que fazemos (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: VB, ASP, ASP.net, C#, etc.

2 - Plataforma .NET Core

O .NET Core é uma implementação grátis, de código aberto, cross-platform do .NET Framework. Ele suporta quatro tipos de aplicações: console, ASP.NET Core, cloud, e Universal Windows Platform (UWP). O ambiente resume-se nesses 4 pontos:

- CLR - Common Language Runtime (Maquina virtual como a JVM no Java)
- Bilbioteca .Net Core - Biblioteca de classes
- Aplicação .NET - Programas que fazemos  (Escritos a partir das linguagens do próximo ponto e compiladas para MSIL - Microsoft Intermediate Language)
- Linguagens suportadas: C#, Visual Basic, F#, etc...

3 - .NET Standard

O .NET Standard é uma especificação para implementar a BCL(Base Class Libraries - uma coleção de Bibliotecas de Classe).

Uma vez que uma implementação .NET (Framework ou Core) precisa seguir esse padrão, desenvolvedores de aplicações não terão que se preocupar com diferentes versões do BCL pra cada implementação de framework de código gerenciado.

Resumindo, o .NET Standard funciona como as especificações Java.

OBS: O .NET Framework implementa o .NET Standard mas tem coisas a mais específicas para o Windows, já que o Standard visa justamente a questão da multiplataforma.

4 - Tipo de dados principais:

byte [0-255]
short, int, long
float, double, decimal
bool
string (com 'S' minúsculo)
String (deve importar o namespace System)
object (com O minúsculo)
enum

5 - Cast com C#

Cliente outroCliente = (Cliente) obj; //tradicional como no Java
Cliente outroCliente = obj as Cliente; //Testa se é do mesmo tipo, se não setta nulo, evitando a exceção de tipo imcompatível

6 - Concatenando Strings no C# com propriedades

string a = "Número " + Numero + ", Agência " + Agencia + ", Saldo " + Saldo;
string b = $"Número {Numero}, Agência {Agencia}, Saldo {Saldo}";
string c = @"Texto de várias linhas sem precisar ficar concatenando com ‘+’ ";

7 - Modificadores de Acesso

public = Pode se acessado por todo mundo
private = Apenas acesso interno
protected = Apenas acesso interno e por classes filhas
internal = Deixa a visibilidade apenas para o projeto ao qual pertence (padrão para classes no C#)
internal protected = Modificador formado por duas palavras e que une a funcionalidade do protected e internal

8 - Campos de uma classe

Campos de classes no C# são equivalentes as propriedades de uma classe no Java, a partir deles podemos construir as Propriedades no C#, conceito explicado pouco mais a frente.

Uma coisa interessante sobre os campos é que podemos usar a palavra reservada "readOnly" para definir um campo que pode ter seu valor setado apenas no construtor, e que não pode mais ser alterado depois, mesmo dentro da própria classe!

9 - Properties (Propriedades) no C#

Em Java, propriedades são os campos de uma classe, podendo ser de tipo primitivo ou objetos, geralmente privados com acesso via getters e setters.

Em C#, Propriedades são um conceito um pouco diferente, como se juntassem em uma única coisa as propriedades do Java (campos da classe) e seus métodos getter's e setter's. As Properties (Propriedades) começam com letra maiúscula. Sua declaração na versão simplificada é:

public double Altura {get; set;}

Isso serve para tipos primitivos, objetos, listas etc...

public Pessoa Funcionario {get; set;}

public List<Card> MeuCard {get; set;}

public int Abc {get; private set;}

No C#, o método set por padrão recebe uma variável de nome "value", portanto, para os casos em que se deseja fazer uma validação ou outra coisa no método set, usa-se o value.

OBS: Quando não escrevemos o método setter de uma Propriedade, o compilador cria um campo privado e "readOnly" e apenas o getter do campo.

10 - Herança no C#

Para dizer que uma classe implementa uma interface ou estende uma classe em C# basta colocar ":" entre o nome da classe atual e a classe que ela estende e/ou lista de interfaces separadas por virgula.

Não há diferença a declaração de implementar e estender em C#. Porém, a classe estendida deve vir primeiro que as interfaces.

Exemplo, temos o seguinte:
Classe B, Interface C, D e E. A classe A estende B e implementa C,D e E:

public class A : B, C, D, E {
    ...
}

A classe filha pode fazer referência aos membros da classe pai com uso palavra reservada "base", que seria o mesmo que "super" em Java.

11 - Sobrescrita de métodos (Polimorfismo):

Na classe pai é preciso usar a palavra "virtual" depois do modificador de acesso:

public virtual double GetBonificacao()
{
   return Salario * 0.10;
}

Na classe filha é preciso usar a palavra "override" depois do modificador de acesso:

public override double GetBonificacao()
{
   return Salario + base.GetBonificacao();;
}

OBS: As propriedades no C# (Lembrando que o conceito de propriedades no C# é diferente do Java) também podem fazer uso de "virtual" e "override" para sobrescrita, já que elas contém os métodos getter's e setter's e é possível que seja necessário a sobrescrita de um desses ou até dos dois.

12 - Construtores

Construtores da classe filha chamando construtores da classe pai é bem diferente no C#.

Pai:
public Funcionario(string cpf)
{
    CPF = cpf;
}

Filha:
public Diretor(string cpf) : base(cpf)
{
}

Também é diferente a chamada de construtores da mesma classe. Um construtor pode chamar outro construtor da própria classe com o uso da palavra reservada "this":

public Funcionario(string cpf) : this(1500, cpf) // chama o construtor abaixo!
{
}

public Funcionario(double salario, string cpf)
{
    Salario = salario;
    CPF = cpf;
}

13 - Foreach

No C# o foreach é diferente do Java:

ContaCorrente[] itens = new ContaCorrente[10];
foreach(ContaCorrente conta in items)
{
...
}

14 - Trabalhando com Datas

DateTime dataFimPagamento = new DateTime(2019, 10, 21);
DateTime dataAtual = DateTime.Now;

TimeSpan diferencaEntreDatas = dataFimPagamento - dataAtual;

Console.WriteLine("Diferença em dias: " + diferencaEntreDatas.Days);

OBS: Existe uma biblioteca chamada "Humanizer" que vem com vários métodos para trabalhar com TimeSpan e exibir intervalos de datas de forma amigável para o usuário final.

15 - Comentários

Comentários de documentação (equivalente ao javadoc)

Além de escrever os comentários, precisa-se configurar o build para gerar o xml dos comentários quando compilar o código. Vamos ver o comentário de documentação:


/// <summary>
/// Verifica a senha fornecida.
/// </summary>
/// <param name="senhaUsuario">Recebe a senha salva no parâmetro <paramref name="senhaUsuario"/>.</param>
/// <param name="senhaTentativa">Recebe a senha fornecida no parâmetro <paramref name="senhaTentativa"/>.</param>
/// <returns>bool</returns>
public bool CompararSenha(string senhaUsuario, string senhaTentativa)
{
   return senhaUsuario == senhaTentativa;
}

Demais comentários são como o Java.

       Essas são as diferenças básicas entre o C# e o Java, porém a medida que se aprofunda no uso do C# com certeza existirão outras diferenças entre as linguagens. O objetivo aqui é fazer um resumo para quem precisa começar com o C#.