domingo, 30 de novembro de 2014

Regex para validar URL

Como você faria para validar uma URL ? Na verdade, você sabe o que é uma URL ? Então para você que não sabe, URL é a sigla para Uniform Resource Locator e consiste em um endereço de um recurso disponível em uma rede.

A estrutura de uma URL é:

esquema://domínio:porta/caminho/recurso?querystring#fragmento

Agora que você já sabe o que é uma URL, voltamos à primeira pergunta: Como você faria para validar uma URL ?

Para responder à essa pergunta, você pode adotar duas abordagens. A primeira é: construir funções gigantescas e a segunda: construir uma regex.

A validação a qual, estou abordando, é de estrutura. Não há nenhuma questão semântica (de significado) por trás. Então, mãos à massa.

Em primeiro lugar, é importante ressaltar que eu não criei esta regex. Peguei ela do livro abaixo.


Este livro não é caro e é muito bom. Recomendo à todos.

Realizei algumas modificações e melhorias na regex. Pus ela para aceitar URLs de ftp e aceitar endereços que comecem sem o esquema. Segue abaixo.

 ((https?:\/\/)|(ftp:\/\/)|(^))([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+([a-zA-Z]{2,9})(:\d{1,4})?([-\w\/#~:.?+=&%@~]*)  

Vamos aplicar a regex no nosso código.

 function validarURL(url){  
      if(/((https?:\/\/)|(ftp:\/\/)|(^))([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+([a-zA-Z]{2,9})(:\d{1,4})?([-\w\/#~:.?+=&%@~]*)/.test(url)){  
           alert('Formato correto !');  
      } else {  
           alert('Formato incorreto !');  
      }  
 }  

Pronto !! Em poucas linhas já possuímos algo funcional. A função acima foi escrita em Javascript.

Dicas ? Sugestões ? Críticas ? Deixe aí nos comentários.

Referência:

http://pt.wikipedia.org/wiki/URL

Leia Mais ››

sexta-feira, 21 de novembro de 2014

Quebra de linha em Java (não é tão banal quanto você pensa)

Saudações leitores !!!

O objetivo deste post será mostrar que não é tão banal executar uma instrução de quebra linha em Java. Então, nesse momento você deve estar pensando:

"Porque ele tá complicando um assunto tão fácil ? É só aplicar um \n caso, queria pular linha e pronto !."

Então, eu respondo: "Não é tão banal assim !!". Existem particularidades que, se não forem consideradas podem causar uma certa dorzinha de cabeça.

Sem mais tardar, vamos começar a por a mão na massa. Pegue um café, acenda seu cigarro e vamos lá.

Existe mais de uma forma de pular linha em Java sem usar o \n. Você pode usar o seguinte comando:

 System.getProperty("line.separator");  

ou, você pode usar o \r ou (char) 13 ou (char) 10.

Agora, acalma-se pois, as explicações irão começar.

Devemos nos lembrar que estamos em um ambiente Windows e isso faz toda a diferença. O comando acima recupera os metacaracteres de quebra de linha do sistema operacional e para cada sistema operacional essa valor muda. Como estamos no Windows, os metacaracteres são o \n e o \r. No Unix é somente o \n e no Mac, somente o \r.

Você ainda deve estar se perguntando para que serve o (char)13 e o (char)10. Isto é nada mais, nada menos que, a invocação desses metacaracteres pelo seu keyCode, ou seja, atingiremos os mesmos resultados se executarmos essas expressões.

 System.out.println("foo" + (char)13 + "foo2");  
 System.out.println("foo" + (char)10 + "foo2");  
 System.out.println("foo" + '\n' + "foo2");  
 System.out.println("foo" + '\r' + "foo2");  
 System.out.println("foo" + System.getProperty("line.separator") + "foo2");  

Resultado esperado

 foo  
 foo2  

Agora que você entendeu o que é cada um, você se pergunta: "Qual devo usar ?"

Para dar uma boa resposta à essa pergunta, devemos nos questionar em qual contexto estamos. Se estivermos em um contexto de um sistema que terá de funcionar em qualquer plataforma, abono as abordagens: \n, \r, (char)10, (char)13; porque não serão soluções que funcionarão em qualquer SO, sobrando assim System.getProperty("line.separator").

Em situações em que sabemos que o sistema funcionará somente em uma plataforma, recomendo a sua própria abordagem de quebra de linha ou o System.getProperty("line.separator"). Porém, como programador, não recomendo você a usar o (char) 13 ou (char)10 para situações "mundanas" pois, você está adicionando complexidade desnecessária ao seu código, visto que existem soluções mais conhecidas por todos os desenvolvedores. Lembre que um dia o código que você escreveu, sofrerá manutenção por outras pessoas. É importante ressaltar também que para outro SO, os keyCodes podem mudar. Logo, você estará engessado em uma plataforma.

Galera, espero ter agregado um conteúdo de alto nível com este post. Se você achou erros, tem sugestões, elogios ou críticas, deixe aí embaixo nos comentários.

Até a próxima.


Leia Mais ››

quinta-feira, 13 de novembro de 2014

Regex para identificar possíveis causas de NullPointerException

 Olá amigos leitores, o objetivo do post de hoje será construir uma regex que possa identificar possíveis causas de NullPointerException em nosso código Java.

Para que você possa entender o que está sendo falado aqui, é de suma importância que você tenha algum conhecimento sobre regex.

Bem, vamos começar !!! Você sabe o que é um NullPointerException ?

NullPointerException é uma exceção da linguagem Java que, denota um acesso à algum conteúdo(atributo ou método) a partir de uma referência (instância) nula.

Vamos ao exemplo.

 public void foo(){  
      MinhaClasse obj = null;  
      obj.foo2();  
 }  

O código acima irá gerar um NullPointerException porque a instância obj é nula. Sendo assim, não será possível executar o método foo2(). Caso você possua dúvidas com a exceção NullPointerException, deixe sua dúvida nos comentários que eu responderei.

Agora, imagine que você está em um projeto onde existem vários programadores trabalhando ao mesmo tempo e você não tem idéia de como analisar ou, impedir que erros de NullPointer aconteçam por erro de escrita de código do desenvolvedor. Logo, você só tem uma única opção, que é: esperar e ver o que irá acontecer quando o programa for executado.

Pensando nisso, desenvolvi uma regex que pode ser usada no search da sua IDE favorita a fim de, identificar trechos de código que podem ser NullPointerException em potencial.

 [^\"\"]\.(equals|equalsIgnoreCase|startsWith|endsWith)\((\".*\")\)  

Vamos às explicações. Primeiro,  temos que ter noção de estamos trabalhando com intervalos abertos logo, não podemos usar o ^ e o $. Agora, vamos destrinchar ela.

[^\"\"] -> Intervalo de caracteres que não quero encontrar. Representa uma operação de complemento. O acento circunflexo é necessário nesta operação porque, ele que representa o complemento.
\. -> Representa o caracter ponto(.) de acesso à métodos. Utilizo a barra (\) pois o ponto (.) tem significado em regex.
(equals|equalsIgnoreCase|startsWith|endsWith) -> Represento a inferência lógica "or" onde, os valores são os métodos que queremos verificar.
\( -> Representa o caracter parênteses (. Utilizo a barra pois, o parênteses possui significado em regex.
(\".*\") -> Representa o qualquer coisa escrita entre aspas. O ponto (.) representa qualquer caracter e o asterisco (*) representa várias ocorrências de algo.
\) -> Representa o caracter parênteses ). Utilizo a barra pois, o parênteses possui significado em regex.

Viu ??? Não é difícil ! Agora é só usar e ser feliz !!! Boa sorte na sua otimização de código.

Dúvidas ? Sugestões ? Melhorias ? Comente aí embaixo.
Leia Mais ››

segunda-feira, 10 de novembro de 2014

Diferença entre NOW(), CURDATE(), CURTIME()

Olá a todos !!!

O objetivo desse post será dizer as diferenças entre as funções NOW(), CURDATE(), CURTIME() do MySQL. Pensei em fazer este post porque ele pode ajudar bastante gente que, precisa operar com datas e horários correntes.

Vamos às explicações !!!

A função NOW() retorna o dia e hora corrente no formato: yyyy-mm-dd hh:mm:ss. Já as funções CURDATE() e CURTIME() retornam, respectivamente, a data e hora corrente, nos respectivos formatos: yyyy-mm-dd e hh:mm:ss.

Pronto !!! Você já sabe o que precisa destas funções. Agora, vamos trabalhar !!!

Exemplos de uso:

1 - Inserção de dados em tabela

 INSERT INTO FUNCIONARIO (ID, NOME, DTA_ADMISSAO) VALUES (1, 'JOAO PAULO', CURDATE());  

 INSERT INTO FUNCIONARIO (ID, NOME, DTA_HORA_ADMISSAO) VALUES (1, 'JOAO PAULO', NOW());  

 INSERT INTO DESPERTADOR (ID, NOME, HR_DESPERTADOR) VALUES (1, 'ACORDAR PARA TRABALHAR', CURTIME());  

2 - Recuperação de dados

 SELECT F.*, CURTIME() AS HORA_INSTRUCAO_SELECT FROM FUNCIONARIO AS F;  

 SELECT F.*, CURDATE() AS DIA_ATUAL FROM FUNCIONARIO AS F;  

Agora, que vocês viram o quanto é fácil usar as funções dentro de uma querys, já podem começar a trabalhar. Lembre-se que também é possível usar as funções em instruções de update.

Dúvidas ? Sugestões ? Críticas ? Elogios ? Deixe nos comentários

Referências:
http://www.w3schools.com/sql/sql_dates.asp
http://www.w3schools.com/sql/func_now.asp

Leia Mais ››

segunda-feira, 3 de novembro de 2014

Subtração de datas em SQL

Caros leitores, a tutorial hoje será rápído pois, o assunto também não é muito extenso. É possível fazer subtração de datas por SQL ? Será que isso sempre tem que ser feito via linguagem de programação ? É difícil ?

Bem, vamos responder as perguntas na mesma ordem que foram feitas. Para a primeira pergunta, a resposta é: sim. Para a segunda pergunta, a resposta é: nem sempre. A resposta é "nem sempre" pois isso depende da vontade do desenvolvedor e do cenário em que ele está. Para a terceira pergunta, a resposta é: não, muito fácil.

Para subtrair as datas, usaremos a função do MySQL chamado DATEDIFF(data1, data2), onde os parâmetros são as datas que usaremos na nossa operação.

Exemplo:

Vamos subtrair 12/07/2014 de 13/09/2011.

 SELECT DATEDIFF('2014-07-12','2011-09-13') AS DATE_DIFF;  



O resultado esperado deve ser algo parecido com isto:


É importante notar algumas coisas:

  • Os parâmetros da função DATEDIFF devem ser datas válidas ou expressões date/time.
  • Caso seja usada expressões date/time, somente a parte referente à data será usada no cálculo.
Esta função é muito simples de usar. O uso dela quem define é você.

Sugestões ? Elogios ? Críticas ? Deixe nos comentários. Espero ter ajudado você que está lendo este post. Deixo abaixo o link que usei como referência.

Leia Mais ››