segunda-feira, 28 de outubro de 2019

Gerenciador de pacotes do .Net


Assim como temos o Maven para Java e NPM para JavaScript, também temos um Gerenciador de pacotes para a plataforma .Net, que é o NuGet(https://www.nuget.org/).

É possível hospedar seu próprio servidor NuGet internamente na empresa. A Microsoft disponibilizou uma documentação para isto.

https://docs.microsoft.com/pt-br/nuget/hosting-packages/nuget-server

Após você ou outra pessoa configurar um NuGet interno na empresa, basta configurar o Visual Studio para buscar pacotes neste novo servidor, através do menu Ferramentas > Gerenciador de pacotes NuGet > Configurações de Gerenciador de Pacotes e alterando o item Fonte de pacotes (Package Sources) com o endereço do novo serviço.

.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#.

quarta-feira, 23 de outubro de 2019

Configurando o Maven no Windows

      Para instalar o Maven faça o download do binário do Maven e extraia na pasta "C:". Segue o link:

https://maven.apache.org/download.cgi

       Configure a variável de ambiente JAVA_HOME antes de configurar o Maven (caso já não esteja configurada) conforme os passos abaixo:

1 - Clique com o botão direito em "Meu computador" e selecione "Propriedades";

2 - Clique em "Configurações Avançadas do Sistema";

3 - Clique em "Variáveis de Ambiente";

4 - Em "Variáveis do sistema", clique em Novo;

5 - No campo "Nome da Variável" insira: "JAVA_HOME";

6 - No campo "Valor da Variável", insira o caminho da instalação do JDK na sua máquina;

7 - Clique em OK na primeira janela e Aplicar na janela de propriedades.

       Com a variável de ambiente JAVA_HOME configurada, vamos configurar o Maven. Para isso vamos repetir os passos do 1 ao 4 (Caso ainda esteja na janela de "Propriedades do Sistema", pule para o passo 3):

1 - Clique com o botão direito em "Meu computador" e selecione "Propriedades";

2 - Clique em "Configurações Avançadas do Sistema";

3 - Clique em "Variáveis de Ambiente";

4 - Em "Variáveis do sistema", clique em Novo;
5 - No campo "Nome da Variável" insira: "M2_HOME";

6 - No campo "Valor da Variável", insira o caminho da instalação do Maven na sua máquina;

      Se extraiu a pasta no "C:" o caminho deve ser parecido com "C:\apache-maven-3.6.2";

7 - Ainda na tela de "Propriedades do Sistema" e em "Variáveis de Ambiente", procure a variável com o nome "Path",
selecione e clique em "Editar";

8 - Clique em "Novo" na janela que abriu e coloque o caminho novamente, desta vez incluindo a pasta "bin":
Se extraiu a pasta no "C:" o caminho deve ser parecido com"C:\apache-maven-3.6.2\bin"

9 - Clique em OK nas janelas abertas e reabra o "CMD" caso esteja aberto, após reabrir digite "mvn --version".

      Pronto!

Liberando processo preso no PostgreSQL

       Nesse post vou tratar sobre como achar e matar determinado processo que pode estar prendendo o Postgres acessando pelo próprio PGAdmin.

       Primeiro selecionamos os processos em execução.

SELECT datname,
pid,
usename,
application_name,
client_addr,
client_hostname,
backend_start
FROM pg_stat_activity;

       Agora nós temos um panorama de quem está fazendo o que no banco, e podemos matar os processos por ID:

SELECT pg_terminate_backend( pid );

       Podemos também matar todos os processos menos o atual se este for o caso:

SELECT pg_terminate_backend( pid )
FROM pg_stat_activity
WHERE pid <> pg_backend_pid();

       E a partir daí podemos fazer usando outros filtros de acordo com a necessidade ;) .

sábado, 19 de outubro de 2019

Virtualbox com Ubuntu fica com resolução da tela pequena


Recentemente fui usar o Virtualbox para montar uma máquina com o S.O. Ubuntu e me deparei com a seguinte situação, a máquina virtual estava com a tela com a resolução de tela super baixa, e estava “cortando” a imagem do sistema operacional.

Tentei mudar a resolução pela interface gráfica, porém, como mencionei, a tela não estava completa e não conseguia mudar a resolução.

Então foi o jeito descobrir uma forma de fazer via terminal, e vejam só, é bem simples!

Usando o comando “xrandr” é possível ver as resoluções disponíveis e escolher uma para usar, abaixo vou mostrar como.

Digite no terminal o comando:

$ xrandr

          Veja que foram listadas as resoluções disponíveis para o seu sistema, como a seguir:

Screen 0: minimum 1 x 1, current 1920 x 1200, maximum 8192 x 8192
Virtual1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
800x600         60.00 +  60.32
2560x1600     59.99
1920x1440     60.00  
1856x1392     60.00
1792x1344     60.00
1920x1200     59.88*
1600x1200     60.00
1680x1050     59.95
1400x1050     59.98
1280x1024     60.02
1440x900       59.89
1280x960       60.00
1360x768       60.02
1280x800       59.81
1152x864       75.00
1280x768       59.87
1024x768       60.00
640x480         59.94
Virtual2 disconnected (normal left inverted right x axis y axis)
Virtual3 disconnected (normal left inverted right x axis y axis)
Virtual4 disconnected (normal left inverted right x axis y axis)
Virtual5 disconnected (normal left inverted right x axis y axis)
Virtual6 disconnected (normal left inverted right x axis y axis)
Virtual7 disconnected (normal left inverted right x axis y axis)
Virtual8 disconnected (normal left inverted right x axis y axis)

Agora você pode ir testando as resoluções que você acha mais próximo do seu monitor real até encontrar a que melhor se adapte setando a resolução com o comando:

$ xrandr -s 7

Note que 7 é a posição da lista que corresponde a resolução 1680x1050, já que a contagem começa a partir do “0” (zero).

Você também poderia setar direto uma resolução da lista:

$ xrandr -s 1680x1050

          Último detalhe, e mais importante, essa configuração precisa ser setada no arquivo .profile para ser carregada sempre que o sistema iniciar. Coloque na última linha e não apague nada que tem lá! Pronto!

quinta-feira, 17 de outubro de 2019

Resumo sobre o VI - Editor de Texto para linha de comando


Sempre gosto de fazer resumos das coisas para facilitar na hora que é preciso fazer uma busca rápida para lembrar algo. Esse resumo é sobre o VI, editor de texto para linha de comando.

Navegação

Setas - Navegam no arquivo.
"$" - Vai para o final da linha atual.
"0" (zero) - Vai para o ínicio da linha.
Shift + "g" - Vai para a última linha do texto.
"Número da linha" + Shift + "g" - Para ir pra uma linha específica do texto (3 + Shift + "g" => vai para a linha 3).
"/" + "palavra ou frase" + Enter - Faz uma busca no arquivo pelo texto especificado.
"n" - Vai para a próxima ocorrência do texto especificado.
Shift + "n" - Vai para a ocorrência anterior do texto especificado.

Edição de texto

"i" - inclui texto (na posição atual).
"a" - adiciona texto (na posição posterior).
Shift + "a" - adiciona texto (fim da linha).
"Esc" - Sai do modo edição de texto para o modo navegação.

"x" - Remove caracteres (n x remove n caracteres).
"dd" - Remove uma linha (n dd remove n linhas).
"yy" - Copia a linha atual.
"Número de linhas" + "yy" - Copia X linhas a partir da atual.
"p" - Cola o texto no arquivo a partir da posição atual.
"Número de vezes" + "p" - Cola um texto N vezes a partir da posição atual.
":w"- Salva o arquivo.
":q!" - Sai do arquivo sem salvar.
":wq" - Salva e sai do arquivo.