sábado, 19 de outubro de 2019

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


Recentemente fui usar o Virtualbox para montar uma máquina com o S.O. Ubunto 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

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)
{
    ...
}


sábado, 27 de julho de 2019

Resolvendo problema CORS no Angular

Olá, hoje vou falar sobre o CORS – Cross-Origin Resource Sharing que significa compartilhamento de recursos de origem cruzada.

Antes era muito comum o uso de iFrames ou similares para fazer com que um site acessasse diretamente conteúdo de outros o que também era válido para aplicações web mais complexas, o problema é que isso começou a ser explorado por pessoas mal intencionadas para se passarem por um site ou serviço que não são e roubar informações ou outras atividades ilícitas. Então os navegadores começaram a “bloquear” esse tipo de coisa, validando antes se a origem tem acesso ao backend vindo de um IP diferente ou não configurado em uma digamos “White list”.

Trarar o CORS é obrigação do backend ou infra, mas é possível e também uma boa prática tratar no frontend. Para isso criamos um Proxy no nosso frontend. Como funciona um proxy? Ele recebe a requisição e a repassa com uma nova configuração de rede.

Vamos criar o nosso proxy, crie um arquivo chamado proxy.config.js no mesmo diretório em que se encontra o seu package.json  com o seguinte conteúdo:

{
"/api": {
    "target": "http://localhost:8080", //endereço do backend
    "secure": false
}
}
Agora configure dentro do seu angular.json o uso do proxy:
...
"defaults"
:{
     "serve":{
          "proxyConfig":"./proxy.config.js"
      }
...


Fonte:
Para ver todas as opções da configuração de proxy veja:
https://webpack.js.org/configuration/dev-server/#devserver-proxy