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 .NET – Programas 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.

terça-feira, 24 de setembro de 2019

Forçando o Maven a colocar as libs em WEB-INF/lib

    Quando o Maven não colocar as libs dentro do pacote WEB-INF/lib no projeto por algum motivo, nós podemos dizer ao Maven para fazer isso através da seguinte instrução a ser adicionada no pom.xml:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>./WebContent/WEB-INF/lib</outputDirectory>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

   
    Assim estamos especificando como ele deve executar um goal (objetivo) dentro de uma phase (fase) de build. Verifique se no seu projeto o outputDirectory realmente é "./WebContent/WEB-INF/lib".

    Espero ter ajudado!

quinta-feira, 12 de setembro de 2019

Passando argumentos para a JVM usando a IDE Eclipse e o Tomcat

    Nesse artigo vou mostrar como pasar para parametros para JVM como a quantidade mínima e máxima de memória que deve ser alocada e outros parâmetros que sejam necessários.
   
    Na aba Servers do eclipse, já com o Tomcat adicionado, clique duas vezes sobre o servidor desejado, isso irá abrir o overview do servidor, uma janela de "visão geral".



    Nessa tela, em General Information você encontra a opção open launch configuration,  clicando nela, será aberta a tela de configuração:



    Vá para a aba Arguments e passe os argumentos que você precisa no campo VM Arguments:


  
    Pronto, coloque os argumentos que deseja, aplique e clique em ok!

domingo, 8 de setembro de 2019

Trabalhando com múltiplas versões do Node e Angular na mesma máquina


Nesse post eu vou trazer algo bem interessante que aprendi na minha primeira semana no novo emprego: como trabalhar com mais de uma versão do Node e do Angular na mesma máquina de forma simples.

Quem costuma trabalhar em projetos diferentes e por vezes com versões diferentes do Angular, sabe que este pode exigir versões diferentes do Node, e justamente para facilitar essa tarefa existem dois carinhas muito interessantes: um é o NVM e o outro o NPX. Na verdade, existe um projeto chamado NVM (Node Version Manager) para Linux/Mac e outro projeto homônimo para Windows. Já o NPX vem no próprio NPM.

Basicamente a tarefa do NVM é manter versões do Node diferentes instaladas na máquina, e ao dizer para ele qual usar (com o comando nvm use) ele vai preparar as variáveis de ambiente e disponibilizar a versão de forma transparente.

O uso da versão para Windows depois de instalado basicamente se resume a:

nvm install 10.16.3
nvm use 10.16.3

E a partir de uma versão selecionada do Node, escolhe-se a versão do Angular:

npm install @angular/cli@19

Segue o link para os projetos NVM:       

Versão para Windows:

Versão para Linux/Mac:

Agora vamos falar sobre o NPX. Como já mencionei ele vem com o NPM a partir da versão 5.2.x pelo que pesquisei, e o que ele faz é executar projetos a partir das libs do próprio projeto, onde estão os binários necessários, sem ter que instalar nada globalmente. É o package runner do npm. E caso algo que eu queira executar não exista na máquina, ele baixa e executa, depois apaga o que foi baixado para não deixar sujeira na máquina. Inclusive ele roda projetos diretamente a partir do GitHub.

Para instalar basta digitar:

npm install -g npx

          E como estamos falando de Angular, para executar os comandos basta colocar o npx na frente e pronto! Lembre-se! A partir de agora você não precisa mais instalar coisas globais, apenas nas dependências do seu projeto!

          Para rodar um projeto Angular então, basta de dentro do diretório do projeto executar:

npx ng serve

          Segue o link do projeto com exemplos e a documentação:         


          Abraços!

quinta-feira, 1 de agosto de 2019

Como exibir mensagens de erros específicas para Constraints no Java

      Nesse post vou mostrar uma forma de pergar um erro mais específico a partir de uma Exception (nesse caso uma PersistenceException mas poderia ser qualquer outra). Estou assumindo que estamos em uma aplicação JSF e tentamos persistir uma informação que já existe no banco de dados e acaba violando uma constraint, então queremos exibir uma mensagem mais precisa ao usuário. Podemos fazer da seguinte forma:

... //declaração da classe e outras propriedades e métodos
 
private static final String MENSAGEM_PADRAO = "Não conseguimos consultar as informações, favor informar a área de negócio responsável.";

...

try{
    ...  //seu código
 
}catch ...{ //outros blocos catch

}catch (final PersistenceException e) {
            Exception cause = e;
            Integer count = 0;
            while (cause != null && cause.getMessage() != null
                    && cause.getMessage().contains("NOME_CONSTRAINT_BANCO")
                    || count == 10)
            {
                if ( cause != null )
                {
                    cause = (Exception) cause.getCause();
                }
                count += 1;
            }
            String mensagem = null;
            if ( cause != null && cause.getMessage() != null
                    && cause.getMessage().contains("NOME_CONSTRAINT_BANCO") )
            {
                mensagem = gerarMensagem("Sua mensagem");
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_ERROR, mensagem, null));

            }
            mensagem = gerarMensagem(
                            MENSAGEM_PADRAO);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                FacesMessage.SEVERITY_ERROR, mensagem, null));
        }
}catch (final Exception e)
{
    ...
}