sexta-feira, 7 de outubro de 2016

REST - Como passar um parâmetro que contém ponto (.) pela Url com Spring Mvc



Esse post é curto, somente para dar uma dica de como fazer para que seu controller entenda um parâmetro que possui  (.) ponto e não quebre.

Alguns casos precisamos no get buscar algo que seja filtrado por determinado parâmetro, por exemplo quando buscamos um usuário, uma Url basicamente ficaria assim:

GET    "/user/{username}"

O problema é quando esse essa variável que é passada na uri possui um ponto, que ocasiona a quebra do valor. Ex

GET  "/user/tiago.ribeiro"

O spring entenderia que foi passado somente "tiago" descartando então tudo que vem após o (.).  Existem algumas estrategias para burlar isso, como colocar outro nome após o username do seu path,  por exemplo:

GET  "/user/{username}/search"

Assim ele não descartaria o que viesse após o ponto. Existe uma outra maneira e que na minha opinião é a mais elegante que seria a inserção de  (:.+) após a declaração do parâmetro. 

GET  "/user/{username:.+}"

Dessa maneira o Spring entenderá que o ponto faz parte do parâmetro passado e não quebrará.

Bem como falei esse post foi curto, espero que tenham gostado.


terça-feira, 4 de outubro de 2016

Forçar atualização do JavaScript usando Gulp



Todos sabemos como o uso de bibliotecas JavaScript vem crescendo nos últimos anos, muito se deve por conta do Node que permitiu a evolução da linguagem, assim como o uso de padrões na construção de apps no lado cliente.
 Um dos grandes problemas do uso de js é o cache que muitas vezes mascaram mudanças feitas de uma versão para outra, quase nenhum usuário é atento á limpar o cache de tempos em tempos.

Existem varias maneiras de evitar esse problema, uma delas é incluir uma tag no header de sua pagina informando quando o cache deve expirar. Ex:


               <META HTTP-EQUIV="EXPIRES" CONTENT="Mon, 22 Jul 2002 11:12:01 GMT">

Outra opção é o versionamento dos arquivos JS e CSS para forçar ao browser busca-los novamente quando perceber que existe um arquivo novo no app.


Essa foi a solução que adotamos para nosso sistema, com o uso do gulp para fazer esse controle. Explicarei nesse post as bibliotecas necessárias para fazer isso funcionar no seu problema. Para isso irei considerar que quem está lendo esse artigo está usando uma aplicação com NodeJs e Gulp.

Decidimos usar o timestamp para dar a "versão" dos arquivos. Para fazer a atualização do nome dos arquivos no nosso index.html usamos a biblioteca gulp-html-replace para fazer o replace do nome dos arquivos.



Para instala-la basta um simples Npm install:

npm install --save-dev gulp-html-replace

É preciso de importa-la também no seu arquivo gulpfile.js.

var htmlreplace = require('gulp-html-replace');

Crie uma variável global chamada de timestamp para recuperar o horário local e  adiciona-la nos arquivos que deseja "versionar". 

var timestamp = new Date().getTime();

Então na hora que eu faço o build meu arquivo assume a forma de algo assim: app_1475179620498.js assim como o css.

Na hora da construção do app eu inclui a seguinte tarefa para fazer o replace do nome dos arquivos:

gulp.task('htmlreplace', function() {
     gulp.src( '/index.html')
       .pipe(htmlreplace({
           'css_vendor': 'css/'+ filename.vendor.css,
           'css_app': 'css/'+  filename.app.css,
           'js_vendor': 'js/'+  filename.vendor.js,
           'js_app': 'js/'+  filename.app.js
       }))
       .pipe(gulp.dest('./dist'));
    });

No metódo task eu inicio a tarefa de replace passando uma função como parametro, o src é onde está localizado o arquivo que quero modificar. pipe é a função propriamente dita.
css_vendor, css_app, js_vendor, js_app são chaves que incluirei no index.html para que sejam trocados os nomes dos arquivos pelos nomes novos criados com um timestamp.
O filename "ponto" alguma coisa são variáveis que estarão armazenando o novo nome dos arquivos que foram criados.

Por fim a mágica onde tudo acontece, na página que você quer que sejam trocados os nomes do arquivos, voc~e incluirá tags que funcionarão como chaves. Tal como a imagem abaixo. 


Notem que onde contém as chaves   <!-- build:css_vendor -->,  <!-- build:css_app -->, <!-- build:js_vendor -->,
<!-- build:js_app -->  é onde será trocado o nome do arquivo pelo novo.
Resultado final é esse da imagem abaixo.


É isso, espero que esse pequeno e simplificado artigo seja util para quem quiser utilizar uma estrategia para forçar o browser a buscar novo arquivo js/css sempre que uma nova versão de sua aplicação for publicada.

x

quinta-feira, 21 de julho de 2016

ElasticSearch, algumas coisas que você precisa saber.




Voltando a escrever após 4 anos, e o que me fez voltar a escrever? ElasticSearch, esse fantástico motor de busca distribuído, feito pela Apache. Sua busca funciona no modelo full-text, onde você tem a mágica busca no estilo Google, que você digita um texto que no ElasticSearch é tratado como Termo e ele faz todo o trabalho de busca para você.


Algumas das vantagens do ES é que ele possui uma api  RESTfull, trabalha com Documentos tal qual um banco NoSql, seus dados são disponibilizados em tempo real e pode ser distribuído e configurado para apresentar alta confiabilidade.


Como falei ele armazena dados em  Documents no formato Json, formato universal suportado por quase todas as linguagens de programação hoje em dia.


O ES trabalha com alguns termos para simbolizar seu banco de dados, são eles:
Index, Type, Document, Field, onde:


Index ou índice representa um banco de dados.
Type ou tipo representa uma tabela do seu banco de dados.
Document ou documento simboliza uma linha de dados da tabela.
Field ou campo é uma coluna de uma tabela.


Fazendo uma analogia com um banco de dados relacional onde teríamos o banco MeuBancoTeste com a tabela usuário, com o as seguintes colunas id, login e senha e dados:


No ES teríamos a seguinte representação para esses dados.

O documento corresponde ao json dentro do _source, esse documento possui 3 campos: id, login e senha. O campo _id no json principal corresponde ao id que o elastic usa pra indexar aquele documento.
Simples não é?

Outra simplicidade é o uso de Rest para manipulação, com as operações já conhecidas. POST, PUT, DELETE e GET.

Criar um indice é muito simples, basta usar um metodo post informando o nome do indice que gostaria de criar. Usando nosso exemplo ficaria assim:
<pre name="code" class="delphi">
curl -XPUT 'localhost:9200/MeuBancoteste?pretty'
</pre>
O retorno dessa chamada seria algo como:
<pre name="code" class="delphi">
{
           "acknowledged": true
}
</pre>

Criando nossa tabela usuário e já populando no Es.
<pre name="code" class="delphi">
curl -XPUT 'localhost:9200/MeuBancoteste/usuario/0?pretty' -d '
{
  "login": "aluno",
  "senha" : "1"
}'
</pre>
Como podem perceber é muito simples de se trabalhar.
Mas o mais fantástico do ES na minha opinião é a busca por algo nele, ele tem um sistema de busca
por relevância, onde ele vai pontuando internamente cada vez que aquele termo é procurado, e assim ele
irá aparecer na frente quando você fizer um busca.

Bem esse foi um post simples mais para apresentar o ElasticSearch, essa poderosa ferramenta para indexação de documentos. Postarei mais sobre o seu uso, mais a frente.