segunda-feira, 11 de maio de 2020

Pegando o valor de uma sequence no Postgres

    Quando vamos fazer um insert no banco, o ideal é usarmos a própria sequence para inserir a chave primária, evitando que ela fique desatualizada e gerando erros.

    Para chamarmos a sequence para ela gerar o valor a ser inserido na chave primária podemos usar:

select nextval('nome_da_sequence');

    Quando precisarmos atualizar o valor de alguma sequence, podemos usar o seguinte comando:


select setval('nome_da_sequence', valor_aqui);

sexta-feira, 8 de maio de 2020

Evitando o erro: sun.awt.X11GraphicsEnvironment


Para evitar problemas com aplicações Java rodando em servidores Linux sem modo gráfico disponível, é sempre bom usar o parâmetro:

-Djava.awt.headless=true

Isso vai evitar que em algum momento você se depare com um erro no servidor e gaste um bom tempo até se lembrar desse problema. E qual o problema que esse parâmetro evita?

Bom, você pode diretamente usar alguma classe do pacote sun.aws ou alguma biblioteca que use classes desse pacote (como o IReport, etc), e o problema é que esse pacote trabalha com algumas coisas que precisam ser renderizadas e tenta usar bibliotecas que se comunicam com a interface gráfica do servidor pra isso, e ao serem usadas suas classes ele verifica se o servidor tem modo gráfico disponível ou não, caso não, ele lança uma exceção.

Provavelmente a exceção vai ter algo a ver com sun.awt.X11GraphicsEnvironment

O parâmetro indicado acima a grosso modo diz ao Java pra ignorar o uso das bibliotecas do modo gráfico do servidor.

Então esse é um bom parâmetro pra usar sempre.  



Fonte:
http://www.jguru.com/faq/view.jsp?EID=222296

quarta-feira, 8 de abril de 2020

Como fazer sua Aplicação Web transformar texto em áudios (Text-To-Speech)

       Nesse post eu vou falar sobre algo muito útil, a transformação de texto em voz em aplicações web. Sabe quando você quer fazer aqueles paineis de chamada de clientes, ou mesmo ler um texto para o usuário por questões de acessibilidade? Quando pensamos nisso achamos que pode ser algo muito complexo né? Na verdade é algo bem simples!
         
Os navegadores já trazem por padrão um reprodutor de áudio pronto para ser usado via JavaScript, basta passar as frases e o navegador irá reproduzir na linguagem na qual está configurado. Também é possível configurar outras línguas.
         
          Vamos ver esse simples código:

<html>
        <body>
                 <h1 id="speech">Olá, bem vindo ao blog "Olá Mundo - Java"</h1>
        </body>
        <script>
        /**
         *
         * @author Daniel Oliveira
         */
       
        function reproduzirNome(){
                 var falar = document.getElementById('speech');
                 var synth = window.speechSynthesis;
                 var utterNome = new SpeechSynthesisUtterance();
                 var utterSala = new SpeechSynthesisUtterance();
       
                 utterNome.volume = 1; // 0 to 1
                 utterNome.rate = 1; // 0.1 to 10
                 utterNome.pitch = 1.5; // 0 to 2
                 utterNome.lang = "pt-PT";
                
                 for(var i = 0;i < 2; i++){
                         sleep(1000);
                         utterNome.text = falar.textContent; //campos input pega-se o "value"
                         sleep(1000);
                         synth.speak(utterNome);
                                         
                 }
                
        }
       
        function sleep(milliseconds) {
                 const date = Date.now();
                 var currentDate = null;
                 do {
                         currentDate = Date.now();
                 } while (currentDate - date < milliseconds);
        }
       
        window.onload = reproduzirNome();
        </script>
</html>

          Basta pegar esse código e colocar em um projeto seu para ver funcionando. Uma observação importante é que qualquer áudio ou vídeo para ser reproduzido automaticamente precisa de permissão do usuário. Essa permissão é dada no navegador no cadeado(se for https) ou no “i” (se for http) ao lado do endereço:







          Existem outras configurações de controles, tipo de voz, etc, basta dar uma pesquisada nos links abaixo:


          Viu como é fácil?! Isso era o que eu tinha para esse post, até a próxima!

sexta-feira, 27 de março de 2020

Multiplas SSHs Key para Repositórios Git

As vezes precisamos de mais de uma chave SSH para podermos acessar repositórios Git com usuários diferentes, como por exemplo seu usuário pessoal e o usuário do trabalho. 

       Se os projetos estiverem no mesmo repositório a configuração é um pouco diferente; se forem em locais difetentes: GitHub, GitLab, BitBucket, etc,  é mais simples.

       Vamos começar. A primeira parte é igual, não importa se os projetos estão em um mesmo repositório ou não, que é a geração da chave.

Estamos assumindo que você já possui uma chave configurada para um usuário e quer criar a segunda chave SSH. Então, vamos começar executando o git-bash, um terminal Linux para o Windows que também faz parte da instalação do Git. Após aberto o git-bash, digite:

ssh-keygen -t rsa -b 4096 -C "seu-email-outro-usuario@aqui.com"

Você será indagado sobre onde salvar a chave, sendo que não podemos criar a chave SSH no caminho e nome default, pois já existe uma chave SSH lá. Mude o caminho ou o nome do arquivo, por exemplo, acrescentando .ssh/id_rsa_trabalho no final do nome da chave. Continue a geração, entrando com a senha e confirmando:

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Caso não queira informar uma senha, pode apenas confirmar sem digitar nada (é recomendado criar uma senha, claro!). Então o prompt lhe informa que a sua chave privada e a sua chave publica estão no caminho indicado previamente, que se for o default é: C:\Users\seu-usuario\.ssh.

Copie e adicione sua chave pública à sua conta no repositório, o comando abaixo copia sua chave para a memória e deixa pronto para colar no lá:

clip < ~/.ssh/id_rsa_trabalho.pub

Nesse momento temos a nossa segunda chave SSH, precisamos configurar quando usar cada uma. Para isso, dentro do diretório do C:\Users\seu-usuario\.ssh que é onde ficam as chaves por padrão, crie um arquivo chamado config. Nesse arquivo vamos configurar o acesso a cada repositório por uma chave.

      Segue o exemplo de um arquivo para acessar o GitHub e o Bitbucket com usuários diferentes, e o bitbucket sendo acessado através da nossa nova chave:

Host bitbucket.org
    HostName bitbucket.org
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_trabalho

Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa


Pronto! Se você queria acessar projetos em repositórios diferentes com chaves diferentes sua máquina já está configurada, basta clonar normalmente seus projetos.

     Agora se você quer acessar com duas chaves no mesmo repositório, precisamos do pulo do gato. Já viu que quando vai clonar um projeto seu a URL é mais ou menos assim:

git@github.com:GbDanielO/p-calendar-ptbr.git

      Veja que vem o nome do repositório, como no destaque, depois o nome do projeto. Vamos usar isso pra diferenciar qual chave usar, mas ao invés de separar por ":" vamos separar por "traço". Vamos imaginar que a nossa url fosse: git@github.com:trabalho/p-calendar-ptbr.git. Você precisa fazer dessa forma:


Host github.com-trabalho
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_trabalho

Host github.com
    HostName github.com
    PreferredAuthentications publickey

    IdentityFile ~/.ssh/id_rsa

       Note que o HostName é igual para as duas configurações, o que muda é o Host, que identifica qual chave usar. ATENÇÃO! Agora com essa mudança, sua forma de fazer o clone do projeto no repositório trabalho mudou. O outro acesso continua como antes.

       Ficará dessa forma:

git clone git@github.com-trabalho:trabalho/p-calendar-ptbr.git

       Pronto, no demais é tudo igual.




Fonte:
https://superuser.com/questions/366649/ssh-config-same-host-but-different-keys-and-usernames
https://backefront.com.br/diferentes-sshkey-mesmo-computador/
https://victortorres.net.br/2018/12/03/mais-de-uma-chave-ssh-no-git 



sexta-feira, 6 de março de 2020

E se eu tiver o persistence.xml e o hibernate.cfg.xml na mesma aplicação?

    As vezes existem projetos legados que usam a implementação do hibernate diretamente ao invés do JPA, e pode ser de interesse passar a usar a especificação ao invés da implementação diretamente. Porém nem sempre isso pode ser feito de uma vez: imagine um aplicação que usa muita criteria do hibernate.

    Nesse caso, você pode criar um arquivo persistence.xml e dentro dele chamar o arquivo do hibernate para aproveitar as configurações do arquivo que já existe, isto é possível através da seguinte propriedade dentro do persistence.xml:


<property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/>

sexta-feira, 28 de fevereiro de 2020

Configurando Context-Params no Tomcat

    É comum um aplicação precisar de parâmetros de contexto para algumas definições, e nesse artigo vou mostrar como fazer isso no Tomcat 7. Em outras versões pode mudar um pouco mas o princípio é o mesmo para criar os parâmetros e para lê-los.

    No Tomcat, a pasta conf tem dentro dela arquivos de configuração, entre eles o context.xml. Nesse arquivo criamos configurações como o DataSource e parâmetros que podem ser acessados pela aplicação.

    Nesse arquivo, podemos criar parâmetros de duas formas:
  
<Environment name="nomeEmpresa" value="Minha Empresa.com" type="java.lang.String" 
override="false"/>
 
    Ou: 
 
<Parameter name="nomeEmpresa" value="Minha Empresa.com" override="false"/> 


   
    A diferença entre elas é a forma de acesso pela aplicação. A primeira pode ser acessada via InitialContext do pacote javax.naming através de um lookup e a segunda via ServeletContext.

    Vamos ver o acesso ao parâmetro declarado como Environment:

InitialContext context = new InitialContext();
Context xmlNode = (Context) context.lookup("java:comp/env");
String nomeEmpresa = (String) xmlNode.lookup("nomeEmpresa");

    Agora vamos ver o acesso ao parâmetro declarado como Parameter:

String nomeEmpresa = request.getSession().getServletContext().getInitParameter("nomeEmpresa");

  Pronto, dessa forma você pode declarar quantos parâmetros precisar.


Fonte: https://stackoverflow.com/questions/41227888/i-want-to-read-the-parameters-of-tomcat-context-xml  

quinta-feira, 23 de janeiro de 2020

Construindo um converter para JSF

    Nesse poste vou mostrar um converter simples do JSF. A diferença entre converters do JSF 1.* para o 2.* é que no 1.* é necessário declarar o converter no arquivo faces-config.xml enquanto que no 2.* é usado a anotação @FacesConverter.

    O papel do converter é dizer ao JSF como levar para o lado cliente e trazer de volta os objetos das classes que você construiu. É exigido, por exemplo, para a construção de Selects.

    Na prática, pela grande quantidade de classes de um projeto, geralmente se constrói um converter genérico para evitar o trabalho de ter que construir um converter para cada classe.

@FacesConverter(forClass=Paciente.class)
public class PacienteConverter implements Converter {
   
    PacientesDAO pacientesDAO = new PacientesDAO();
   
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null) {
              return null;
        }
        Long id = new Long(value);
            Paciente paciente = (Paciente) pacientes.porId(id);
        return paciente;
         
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null) {
              return null;
        }
             
        Paciente paciente = (Paciente) value;
             
        return  paciente.getId().toString();
    }

}

    Para este artigo é isso, abraços.