sexta-feira, 24 de agosto de 2012

Upload de arquivos em Grails

Fala galera..

Aqui vai uma útilidade, simples e fácil. Nos últimos dias venho me aventurando com Grails, e já estou bem inclinado a mudar minha linguagem web número 1 de Java para Groovy, usando o Grails! São  inúmeras as facilidades nesse framework, sem contar a linguagem dinâmica e produtiva. Neste poste vou mostrar uma delas. Já perdi algumas horas fazendo essa mesma tarefa em Java, pois precisamos de bibliotecas de terceiros, configuração no web.xml e tudo mais. Com grails não, em poucos mínutos, sem ter ne noção de como funcionava, consegui configurar. Vamos lá!

Primeiramente, na classe de modelo você precisa ter um campo do tipo array de bytes (supondo que você vai gravar a imagem no banco)

class User{
   String name
   byte[] avatar
   
   static constraints = {
       avatar(size:0..131072, nulable: true)
   }
}


Se gerarmos as views automáticamente, o upload já vai estar pronto para o uso, assim:

grails create-controler User
grails generate-all User

Caso o campo seja configurado manualmente em uma tela existente, temos que adicionar na tag g:form o seguinte valor:

enctype="multipart/form-data"


Ex.:


Esse parâmetro é quem faz toda a mágica. Sem ele, nosso upload não vai funcionar.

Aqui o campo para download, que fica na tela:


   



Isso já será o suficiente para fazer o upload de uma imagem. Um detalhe importante, é que na edição do registro, quando não informado nenhum avatar, o valor existente é substituido por nada. Então, o interessantes é testarmos isso no método edit.


def oldAvatar = userInstance.avatar

userInstance.properties = params

if(!userInstance.avatar){
    userInstance.avatar = oldAvatar;
}

E pronto. O avatar já está sendo carregado e salvo no banco de dados. No próximo post, vou mostrar como salvar esse arquivo em disco, caso não queira salvar no banco de dados.


Até a próxima!

terça-feira, 5 de junho de 2012

Alterar senha padrão Glassfish

Salva galera! Aqui vai uma dica de como alterar o passowrd padrão do glassfish após sua instalação. O password padrão é changeit.

 Para alterar, entre no console administrativo do glassfish e dê o seguinte comando

change-master-password

Ele vai pedir a senha atual e a nova senha.

E era isso! até a próxima.

quinta-feira, 10 de maio de 2012

Apache + PHP + .htc

Salve galera,

Na construção de um site, precisei usar alguns recursos avançados de css3. Dito isso, contarei brevemente minha historinha triste. Eu estava bem belo e feliz construindo o site e testando no firefox (normal), após deixar ele do com a cara que eu queria, como todo bom desenvolvedor, comecei a fazer os testes em resoluções diferentes e com navegadores diferentes. Como era de se esperar, e não é novidade pra ninguém, tentem adivinhar em qual deu incompatibilidade?! Alguém? Se alguém "chutou" Internet Explorer, está redondamente certo.

O efeito que eu estava aplicando é como esse, que podemos gerar no site http://css3pie.com/, para arredondar os cantos de uma div e colocar sombra, dando um efeito bacana.

Como tudo tem uma solução, descobri que tem uma gambiarra um pack de arquivos que adicionamos no servidor para funcionar no nosso amigo IE =)

Mas como nada é tão simples quanto deveria, temos que adicionar uma configuração no nosso servidor Apache, para ele reconhecer a extensão .htc, e ai sim corrigir o bug para o IE.

Primeiro temo que baixar o arquivo em:

http://cloud.github.com/downloads/lojjic/PIE/PIE-1.0beta5.zip

Depois temos que colocar o arquivo PIE.htc dentro da pasta onde temos nossos arquivos css.

O próximo passo é configurar o servidor para reconhecer esse arquivo:

No Slackware edite o arquivo /etc/httpd/mime.types, e adiciona a seguinte linha:

text/x-component .htc

No CentOS, edite o arquivo /etc/apache/conf/httpd.conf

AddType text/x-component .htc


Agora só reinicie o Apache e parta para o abraço!
Para testar, podemos usar o código gerado no site http://css3pie.com/.

Ex.:

 

.cssClass{

border: 1px solid #696;
padding: 60px 0;
text-align: center; width: 200px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
-webkit-box-shadow: #666 0px 2px 3px;
-moz-box-shadow: #666 0px 2px 3px;
box-shadow: #666 0px 2px 3px;
background: #EEFF99;
background: -webkit-gradient(linear, 0 0, 0 bottom, from(#EEFF99), to(#66EE33));
background: -webkit-linear-gradient(#EEFF99, #66EE33);
background: -moz-linear-gradient(#EEFF99, #66EE33);
background: -ms-linear-gradient(#EEFF99, #66EE33);
background: -o-linear-gradient(#EEFF99, #66EE33);
background: linear-gradient(#EEFF99, #66EE33);
-pie-background: linear-gradient(#EEFF99, #66EE33);
behavior: url('PIE.htc');

}





Até a próxima

domingo, 6 de maio de 2012

WP7 Unit - Testes Unitários para Windows Phone

Salva galera,

Através desse poste, gostaria de informar o porte da API de testes unitários desenvolvida para Android, chamada Droid Unit, para sua versão Windows Phone. Ela tem mesmo objetivo que a versão Android, o objetivo de fornecer uma maneira muito simples de realizar testes unitários em aplicações para Windows Phone. Agora podemos realizar os testes da mesma maneira, tanto em aplicativos para Android ou para Windows Phone, e mantermos um bom nível de padronização em portes de apps.

Ela funciona da mesma maneira que a versão Android, inclusive em sua simplicidade. Como na versão para Android, na versão para Windows Phone o projeto está sendo liberado a créditos da Mobile Mind, e também espera obter feedback dos usuários.

Area OpenSource da Mobile Mind:

http://www.mobilemind.com.br/open-source.php

Página do projeto no CodePlex:

http://wp7unit.codeplex.com/

ScreensShot de um caso de teste funcionando



Até a próxima!

Droid Unit - Testes Unitários para Android

Salve galera,

Através desse poste, gostaria de comentar um sobre projeto que dei início a alguns mêses.. mas somente agora liberei como um projeto livre, a créditos da Mobile Mind. Se trata de uma simples e pequena API de testes unitários para o sistema operacional Android, ou para aplicativos desenvolvidos para Android. Essa API, apesar de ser "ridiculamente" simples, tem tudo o que esperamos em um teste unitário:

  • Garantia de consistência do código
  • Nos dá o feedback do que está acontecendo
Bom, poderiamos agregar inúmeras coisas a essa API, e justamente por esse motivo, seu projeto está sendo liberado como Open Source.. Então, se alguém se interessar em melhorar o projeto, ou até mesmo usar a api, fique a vontade, e se possível, dê seu feed back sobre o projeto.

Na página inícial do projeto, tem uma explicação de como a API é usada. É tão simples que pode ser explicada em algumas linhas. Hoje a Mobile Mind está usando ela em vários projetos, e astá satisfeita com seus benefícios.

Área OpenSource Mobile Mind:

http://www.mobilemind.com.br/open-source.php

Página do projeto no Google Code:

http://code.google.com/p/mobilemind-droid-unit/


ScreensShot de um caso de teste funcionando






Até a próxima!

quinta-feira, 3 de maio de 2012

Client Restfull Jersey

Salve galera!

Gostaria de compartilhar a solução de um erro que tive a poucos dias, e que me fez perder algumas horas...

Quando eu tentava converter uma lista no formato JSON em objeto, usando a api Jersey, era apresentado um erro. O formato da mensagem JSON que retornava era:


[{"id":2,"descricao":"RESTAURANTE"},{"id":3,"descricao":"MERCEARIA"}]


O erro era:

[com.sun.istack.SAXParseException2;
 lineNumber: 0; columnNumber: 0; unexpected element (uri:"", 
local:"id"). Expected elements are <{}categoria>]


Ou também:

XMLStreamException: JSON expression can not be empty



A configuração do cliente era:

ClientConfig config = new DefaultClientConfig();
client = Client.create(config);
client.addFilter(new LoggingFilter());
webResource = client.resource(BASE_URI).path(resourceName);


E forma de busca do servidor era:

WebResource resource = webResource;
ClientResponse response = resource.path(java.text.MessageFormat.format("{0}/{1}", new Object[]{max, first})).getRequestBuilder().accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class);
GenericType> genericType = new GenericType>(){};
List categorias = response.getEntity(genericType);





Então, após algum tempo de pesquisa, descobri que faltava uma linha de código na configuração do cliente:

config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);


E pronto, após adicionar essa configuração, tudo funcionou perfeitamente. Espero que ajude!

Até a próxima!




terça-feira, 24 de abril de 2012

Tag Cloud Computing

Salve galera,

Essa vai para aqueles que querem adicionar uma interessante e atrativa tag de Coud Computing no seu site, mas, assim como eu, não entendem nada de flash. Nesse caso, basta conhecer alguém que saiba, a final, não da pra saber tudo não é?! E o site a seguir com certeza sabe =D

http://www.flashxml.net/tag-cloud.html

É só customizar conforme a necessidade, baixar e usar.

Até a próxima!