Lucas Teixeira

@lucastex

Criando um tipo de dados personalizado no Grails + Hibernate

com 11 comentários

Olá Pessoal,

Estou invadindo o Blog do meu grande amigo Lucas para postar uma solução que encontrei para um problema no mapeamento de dados de uma base de dados existente. Gostaria, em primeiro lugar, de agradecer o espaço cedido pelo Lucas e parabenizá-lo pelo excelente Blog.

Hoje em dia são poucos os projetos que precisamos desenvolver do zero — criar modelagem, tabelas e etc… — por isso é muito comum depararmos com padrões proprietários que muitas vezes não se “encaixam” na ferramenta de desenvolvimento. Não preciso dizer que não é uma tarefa fácil convencer os desenvolvedores a se adequarem aos novos padrões, então, se não pode com eles, una-se a eles.

Bom, vamos direto ao assunto, no meu projeto atual me deparei com um padrão que utiliza ‘S’ e ‘N’ para o mapeamento de propriedades booleanas no banco de dados Oracle. Na pesquisa que realizei encontrei várias pseudo-soluções mas a única que atendeu 100% as necessidades foi a implementação de um tipo de dados do Hibernate.

Abaixo a implementação da classe SNUserType, não tem segredo é apenas a implementação da interface org.hibernate.usertype.UserType. Salve este código no pacote persistence na pasta de src/groovy do seu projeto Grails.

package persistence;

import org.hibernate.*;
import org.hibernate.usertype.*;
import java.sql.*;
import java.util.*;
import java.io.Serializable;

public class SNUserType implements UserType {

   def SQL_TYPES = [Hibernate.YES_NO.sqlType()];

   public int[] sqlTypes() {
      return SQL_TYPES;
   }

   private Class targetClass;

   public void setParameterValues(Properties params) {
      String targetClassName = params.getProperty("targetClass");
      try {
         targetClass = Class.forName(targetClassName);
      } catch (ClassNotFoundException e) {
         throw new HibernateException("Class " + targetClassName + " not found ", e);
      }
   }

   public Class returnedClass() {
      return targetClass;
   }

   public boolean isMutable() {
      return false;
   }

   public Object deepCopy(Object value) {
      return value;
   }

   public Serializable disassemble(Object value) {
      return (Serializable) value;
   }

   public Object assemble(Serializable cached, Object owner) {
      return cached;
   }

   public Object replace(Object original, Object target, Object owner) {
      return original;
   }

   public boolean equals(Object x, Object y) {
      if (x == y)
         return true;
      if (x == null || y == null)
         return false;
      return x.equals(y);
   }

   public int hashCode(Object x) {
      return x.hashCode();
   }

   public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
      String value = rs.getString(names[0]);
      if ("S".equals(value))
         return true;
      else
         return false;
   }

   public void nullSafeSet(PreparedStatement ps, Object value, int index) throws HibernateException, SQLException {
      if (value == null) {
         ps.setNull(index, Hibernate.YES_NO.sqlType());
      } else {
         if((Boolean)value) {
            ps.setString(index, "S");
         } else {
            ps.setString(index, "N");
         }
      }
   }
}

Pronto, agora tudo que você precisa fazer é utilizar o novo tipo de dados no mapeamento de suas classes de domínio.

class Pessoa {

   String nome
   Boolean ativo

   static mapping = {
      ativo type: "persistence.SNUserType"
   }

}

Com isso, resolvi o problema de integração e concluímos este post.

Um abraço

Volnei

Postado por Volnei Munhoz

July 19th, 2010 at 8:39 am

Instalando o iOS 4 em seu iPhone 3G ou 3Gs

com 17 comentários

Oi pessoal,

Essa semana teve na WWDC o lançamento oficial do iPhone 4, o novo aparelho da apple, e junto com isso, também o lançamento da nova versão do sistema operacional, antigo iPhone OS, que agora é chamado de iOS, na versão 4.

A mudança de nome era fato que estava pra acontecer, já que o sistema já está sendo usado no iPad, e não fazia mais sentido o nome ‘iPhone’ nele.

Bom, o aparelho iPhone 4 veio com vários recursos legais, mas que dependem de hardware, ou seja, só conseguiremos brincar quando tivermos o aparelho em mãos, como filmagem em HD pela câmera, a tela tipo ‘retina’, que segundo o Jobs, foi a maior melhoria no iPhone, já que trouxe *muito* mais precisão e sensibilidade para a tela do iPhone, que já era simplesmente animal. Além disso, também o giroscópio, processador melhor, e outras coisas.

Já outras funcionalidades que não dependem de hardware, apenas de software (no caso, o iOS4), podem ser atualizadas pra quem tem o iPhone 3Gs, (e alguns itens dela no iPhone 3G). Ontem atualizei o meu iPhone 3Gs e estou aproveitando muito. Hoje vou atualizar o iPhone 3G da @kapiologo pra ver efetivamente o que de diferente ele vai ficar.

Recursos legais do iOS4 (alguns já em uso massivo por aqui):

  • Pastas de aplicativos – Chega daquela bagunça nas páginas, agora está enfim, tudo organizado em “Jogos”, “Financeiro”, “Inutil”, “Social”, e outras categorias
  • Multi-task – Enfim o tão esperado multi-task. Agora basta um duplo clique no botão home para que todos os programas que estejam abertos venham a tona, e você pode alterar entre eles sem perder tempo de recarregar ou perder o estado da app atual, muito bom mesmo.
  • Novo cliente de e-mail: Com e-mails agrupados em threads, como o gmail, agora fica mais fácil acompanhar listas de discussão também.
  • Bluetooth para teclados: Ainda não usei, nem sei se serviria para alguma coisa, mas vou fazer o teste hoje a noite com o teclado do iMac.
  • Camera fotográfica: Zoom digital – legal, e até mantém uma qualidade bem aceitável.
  • Personalização com papel de parede no home – particularmente não muda nada pra mim, mas pra quem gosta… :)

Entre outros pontos, também existem os novos softwares como um tal de “Game Center” que não vi explicações muito convincentes em lugar algum, mas me parece ser uma app no estilo do antigo GameSpy (alguém jogava quake?) ou do Steam, para os jogos do iPhone, mas não tenho certeza. Também o iBook (que não está presente ainda, acredito que virá na atualização oficial do iOS4).

Bom, só que, como o mel nem sempre é tão doce, a Apple prometeu a atualização do iOS4 pra quem tem iPhone 3G/3Gs apenas para quando o iPhone4 começar a ser vendido nos EUA, e isso será no dia 21 de junho.

Só que como o pessoal que faz parte do Developer Program da Apple já tem acesso a versão, isso acabou vazando pela internet e pode ser encontrado facilmente, só que com um detalhe: Apenas para usuários — abençoados — que possuem um Mac em casa.

Por quê? Pelo fato que só se consegue usar o ipsw do iOS4 se for atualizado a partir do iTunes 9.2, que ainda está na versão beta.

Então se você é um desses felizardos de ter um iPhone 3G/3Gs e um Mac em casa, pode correr pra instalar a nova versão.

Eu encontrei o link para baixar o beta do iTunes 9.2 pro Mac aqui: http://hotfile.com/dl/47027679/1629379/itunes_9.2_beta.dmg.html
O ipsw do iPhone 3G: http://hotfile.com/dl/47027501/b933959/iPhone12_4.0_8A293_Restore.ipsw.html
O ipsw do iPhone 3GS: http://depositfiles.com/en/files/imajjlubx (links retirados do blog Addictive Tips)

Bom, como fazer? Depois de baixar, é o procedimento normal de atualização. Execute o DMG do iTunes, e faça a instalação (mantenha sua versão do iTunes fechada durante o procedimento). Depois de instalar, abra o iTunes, e ele irá atualizar toda sua Library, esse processo demorou uns 5 minutos em minha library com 50gb aproximadamente.

Depois, é sempre bom dar uma verificada se a versão foi instalada corretamente, então vá no ‘About iTunes’, no menu para checar se está com a 9.2 e pronto.

Conecte seu iPhone no Mac, após o iTunes reconhecê-lo, faça o backup do seu aparelho (botão direito no item iPhone -> backup).

Selecione o iPhone no menu esquerdo e na direita existirá uma opção “UPDATE”, clique nesta opção com a tecla “ALT-OPTION” do Mac pressionada, e uma janela de localização de arquivo será aberta. Basta agora selecionar o firmware ipsw para o modelo do seu aparelho que você baixou, e aguardar a instalação.

No final, o backup será restaurado, e o iPhone pronto para ser usado.

Incrível :)

Postado por Lucas Teixeira

June 10th, 2010 at 4:07 pm

Postado em Mac

Com as tags , , , , , , , , ,

Palestra sobre Grails, meus agradecimentos

com 25 comentários

Como postado antes, ontem falei sobre Grails no SESTINFO – “Grails: Java produtivo e divertido”, evento aberto da UMESP (Universidade Metodista de São Paulo).
O evento foi incrível, com muita gente presente. O último número que recebi é que tinham 98 pessoas na sala assistindo e mais dois professores. Ainda depois do início da palestra cerca de 15 a 20 pessoas chegaram mas não puderam entrar pelo limite de pessoas na sala.

Pra quem não pode estar presente, comecei a apresentação falando de groovy e fazendo um paralelo de uma aplicação Java e a mesma em Groovy, passo-a-passo mostrando os benefícios e vantagens que o groovy pode trazer para o desenvolvimento (o antigo caso do seletor de palavras).
Tentei deixar bem claro o tempo inteiro que o importante é gastarmos tempo *PENSANDO* em resolver o problema e não tentando aprender e entender como a linguagem de programação funciona.

Logo depois, passei por vários pontos do Grails, tentando mostrar como ele trazia os benfícios do Groovy para o desenvolvimento web. Passei pelo GORM (mapeamento objeto-relacional dinâmico), plugins, convenções e vários outros pontos. Pra encerrar a parte teórica, deixei alguns links e sites interessantes para que o pessoal pudesse consultar além de oferecer para os presentes cupons de desconto para a GroovyMag, revista focada em desenvolvimento Groovy e Grails.

Ao fim, apresentei uma aplicação simples, desenvolvida em bem pouco tempo que funcionava como um ‘twitter wall’, ou seja, fazendo buscas automaticamente no twitter de palavras previamente cadastradas, inclusive capturando automaticamente tweets do pessoal que estavam assistindo a palestra e twittando… :)

Bom, como eu já falei, foi muito bom, e além de satisfeito, fiquei muito agradecido, então não posso deixar de agradecer:
Principalmente ao Prof. Mauro Schneider (@muschneider), professor da Universidade que me fez o convite e viabilizou tudo isso, a Universidade não só o meu agradecimento, mas também os meus parabéns pelo ótimo evento. Aos meus amigos que me confirmara, e foram me apoiar e ajudar, Emerson (@erbernardino), Paulo (@paulosuzart), Leonardo (@leonardofigs), Rafael (@rafaelfelini), Luca (@lucabastos) e Jailton (@jailton). Ao Jailton, não só pela presença, mas também pelo apoio divulgando o evento na lista do SOUJava.

Pra quem quiser, a apresentação segue abaixo. E também 2 repositórios que criei no github, um com os fontes do projeto apresentado, e outro com a apresentação em HTML.

Repositório da apresentação: http://github.com/lucastex/slides-grails-umesp
Repositório dos fontes do projeto: http://github.com/lucastex/projeto-grails-umesp

Grails: Java produtivo e divertido

View more presentations from Lucas Teixeira.
Ah, e uma foto do pessoal se arrumando antes da palestra comecar:
palestra
palestra
[]s,

Lucas

Postado por Lucas Teixeira

May 26th, 2010 at 11:20 pm

Postado em Grails

Com as tags , , ,

Palestra aberta de Grails na Universidade Metodista

com 25 comentários

Pra quem estará em São Paulo na próxima terça-feira, eu irei apresentar uma palestra sobre Grails na SESTINFO – Semana de Estudos em Tecnologia da Universidade Metodista de São Paulo.

O título da palestra será – “Grails – Java produtivo e divertido” e a entrada é liberada para quem quiser assistir. Vou falar de Groovy e Grails além da comunidade envolvida em torno dessas tecnologias. E ao final da apresentação, vou fazer algum hands on com o pessoal, desenvolvendo uma aplicação live com todos.

Divulgue em suas listas de discussões, empresa, amigos e inimigos, aproveitem que a entrada é liberada!

Data: 25 de maio
Horário: A partir das 19:00
Local: Universidade Metodista
Endereço: Rua Alfeu Tavares, 149 – Rudge Ramos – São Bernardo do Campo – SP

Mapa: http://maps.google.com.br/maps?f=q&source=s_q&hl=pt-BR&geocode=&q=Rua+Alfeu+Tavares,+149+Rudge+Ramos+-+S%C3%A3o+Bernardo+do+Campo+%E2%80%93+SP&sll=-23.581689,-46.642769&sspn=0.020551,0.046756&ie=UTF8&hq=&hnear=R.+Alfeu+Tavares,+149+-+Rudge+Ramos,+S%C3%A3o+Bernardo+do+Campo+-+S%C3%A3o+Paulo,+09641-000&ll=-23.609924,-46.548729&spn=0.16437,0.37405&z=13&iwloc=A

Depois da palestra, vou divulgar os slides e os fontes do hands on aqui no blog.

Ajude a divulgar, retwittando esta mensagem: http://twitter.com/lucastex/status/14333780136

[Atualizado!]

Vou distribuir uma edição grátis da Groovy Magazine (groovymag.com) para cada pessoa presente no local, compareça!

Postado por Lucas Teixeira

May 19th, 2010 at 11:30 pm

Postado em Grails

Com as tags ,

Usando o textmate como editor de texto padrão do Mac

sem comentários

Uma coisa bem chata que acontece, é que quando tentava abrir arquivos com a extensão txt no Mac, sempre abria o TextEdit, o editor padrão do Mac OS.

É um editor muito simples e pouco funcional, o que me fazia todas as vezes buscar o textmate para editar e trabalhar com os arquivos. Resolvi definir ele como padrão da seguinte forma

  1. Localize algum arquivo com a extensão que quer mudar (no meu caso, .txt)
  2. Vá em propriedades deste arquivo (ou selecione-o e aperte cmd+I)
  3. Na ‘aba’ “Open with”, selecione o programa que deseja usar
  4. Selecione o botão “Change All” para setar como padrão para todos os arquivos deste tipo.

Pronto, agora os arquivos TXT serão abertos diretamente no Textmate!

Postado por Lucas Teixeira

April 20th, 2010 at 7:18 pm

Postado em Mac

Com as tags , ,

Plugin grails para calcular valor de frete dos correios

com 11 comentários

Acabei de lancar um novo plugin grails.

Este calcula o valor do envio de uma encomenda através dos Correios. Contempla SEDEX, SEDEX 10, SEDEX a cobrar e outros. O texto explicativo está bem simples e legal, e está no github junto com os fontes:

http://github.com/lucastex/correios-br

Mesmo os fontes no github, você pode instalar o plugin usando o comando padrão do grails:

grails install-plugin correios-br

Deem uma olhada nos docs do github, vale a pena!

Postado por Lucas Teixeira

April 14th, 2010 at 3:46 pm

Postado em Grails

Com as tags , , , , ,

Google agora analisa a velocidade dos sites

com 2 comentários

O google iniciou no fim da semana passado com mais um fator de relevância para indexação e rankeamento dos sites que são retornados por ele. Por incrível que pareça, “velocidade do site” agora também conta.

Isso impacta diratamente em arquivos e chamadas externas do site (imagens, css, js), e traz a tona com MUITA importância um assunto que já estava ganhando foco nos ultimos tempos que é a otimização dos sites. Otimização de tudo, desde tamanho de imagens, estrutura de HTML bem formatado, compactação de JS, união de estilos e funções JS em menos arquivos e etc.

Este recurso entrou em uso no Google.com, e ainda está no famoso “beta” do google. Em algum tempo, conforme for ganhando maturidade, será estendido a todos outros, incluindo Brasil. Vou deixar aqui o link oficial do anuncio pra que quem esteja interessado possa ler, e também ver as dicas de frameworks e tecnologias que o google recomenda para este trabalho de otimização.

http://googlewebmastercentral.blogspot.com/2010/04/using-site-speed-in-web-search-ranking.html

:)

Postado por Lucas Teixeira

April 13th, 2010 at 8:01 am

Postado em Uncategorized

Unboxing do meu iMac de 27″

com 8 comentários

Enfim chegou meu novo PC. Faz um tempo já que estava adiando comprar um computador de mesa para desenvolver e ficar mais a vontade em casa. Com o uso intensivo apenas de  notebook a alguns anos, meu pescoço e minhas costas começaram a reclamar feio esse ano.

Resolvi aproveitar a promoção de lançamento do site do carrefour, que dava 20% de desconto em qualquer produto do site e comprei o tão sonhado iMac de 27″. 20% de desconto em cima do preço da Apple Store fez uma grande diferença, pode acreditar :) Cheguei de viagem este fim de semana e enfim hoje uma notícia boa, chegou meu iMac. :)

Ponto mega-positivo: Tela. Não podia imaginar a qualidade desse display de LED. É fantástico. Em relação a tamanho, já estava usando um Samsung de 24″, mas o brilho, a definição do display de LED da Apple é fora de sério. Tirando ainda a resolução alcançada, de 2560 por 1440.

Preciso agora encontrar uma maneira efetiva de manter um sincronismo REAL entre os dados do iMac e do MacBook. Não queria nem algo web-based como dropbox ou sugarsync, seria alguma coisa normal mesmo, talvez até quem sabe um rsync possa ajudar. Se você tiver alguma opinião ou sugestão, me salve :)

Sobre o problema de flickering reportado por aí a alguns meses, achei que pudesse estragar a minha alegria, mas não, logo que liguei, junto com as atualizações, já veio um firmware do LED pra deixar tudo OK. :)

Segue algumas fotos do unboxing.

Postado por Lucas Teixeira

March 9th, 2010 at 12:46 am

Postado em Mac

Com as tags , ,

Como, e por que usar um DataSource JNDI.

com 5 comentários

Recebi uma pergunta esses dias por aqui.

Lucas,
gostaria de saber como trabalhar com arquivos .properties pra conexão com o banco de dados.
No Grails a gente nota que a conexão fica no código-fonte (DataSorce.class)…
Estou tentando descobrir como faço para ter um arquivo de propriedade com os parametros da conexão. Caso eu precise apontar para outro banco, não terei que recoompilar tudo.

Quem enviou foi o Felipe Juliani.

Neste caso, devemos usar ao invés das conexões declaradas no DataSource.groovy, uma declaração de conexão com banco de dados via JNDI.

JNDI é uma árvore de ‘nomes’ que referenciam ‘recursos externos’. O que isso quer dizer? Basicamente, que a sua aplicação poderá pegar uma configuração de fora da aplicação, diretamente de um “lugar” na JVM que alguém colocou. Seria mais ou menos um clipboard compartilhado, só que de objetos é claro :)

Então para o caso acima, nada melhor que deixar toda essa ‘configuração’ de conexão com o banco de dados do lado de fora da aplicação e fazer com que ela vá buscar apenas pelo ‘nome’ desta conexão. Pronto, desta maneira a configuração fica externa a nossa aplicação e feita diretamente no nosso container.

Bom, eu particularmente vejo três grandes razões para o uso de DataSources JNDI. A primeira é quando devemos tirar do desenvolvedor a (ir)responsabilidadade de dimensionar/configurar a utilização de banco de dados. Isso é um trabalho de infra estrutura, e se em algum determinado momento infra estrutura resolver aumentar o pool de conexões de banco da aplicação, consegue fazer isto sem encostar na aplicação, diretamente no container onde ela está rodando.

Outro motivo é a melhor utilização de recursos de banco de dados. Vamos imaginar um cluster de servidores de aplicação com 3 nós. Cada um dos nós roda uma instância da sua aplicação, que está configurada (diretamente no DataSources.groovy) com um pool de 10 conexões, ou seja, só de subir as aplicações, você terá 30 conexões com o banco já feitas. Com DataSources neste caso, todas as instâncias da aplicação poderiam ir buscar conexões com o banco de dados no mesmo DataSource, configurado uma única vez. Com isso, não precisamos necessariamente possuir 30 conexões abertas com o banco, pois quando uma instância necessita de todas elas, outra instância pode estar usando apenas 3 ou 4.  É claro que para isso, além dos servidores e da aplicação, o seu DataSource também precisa estar deployado no cluster todo.

E o terceiro motivo, é o apontado pelo Felipe acima, que precisa deixar uma maneira fácil de trocar o banco de dados da aplicação. Com estes DataSources JNDI fica fácil também, já que a url do banco, driver, e credenciais estão do lado de fora, na configuração do DataSource.
E para criar este DataSource?
Bom, o primeiro passo é levantar em que container você está rodando a sua aplicação, pois cada um tem a sua maneira particular de configuração, seja jetty, tomcat, jboss ou weblogic. Além das diferenças durante a criação do DataSource, temos também diferenças na ‘formação’ do nome deles. No caso do weblogic por exemplo, o mais simplista neste quesito, você poderia ter um datasource com o nome de “PedidosDS”, já no JBoss, ele fica prefixado desta maneira: “java:<nome_datasource>”.

E depois disso, na configuração da sua aplicação Grails, na closure do environment específico que você quer, basta descrevê-lo desta maneira:

production {
   dataSource {
      jndiName = "<nome_datasource>"
   }
}

Vale lembrar que estes dias postei sobre como criar um datasource no jboss e usá-lo em uma aplicação grails. Não deixe de ler também.

Postado por Lucas Teixeira

March 4th, 2010 at 3:36 am

[GSolr] Beans declarados automagicamente

com 3 comentários

GSolr, é o nome do plugin de solr que estamos fazendo de solr para grails. Para quem quiser acompanhar o trabalho, o repositório está no github: http://github.com/lucastex/gsolr.

Uma coisa que já está feita é a leitura da configuração do gsolr e a declaração mágica de beans, um para cada servidor solr que estiver configurado. Exemplificando, vamos imaginar que a configuração esteja declarando três servidores Solr que serão consultados:

gsolr {
   solr {
      produtos {
         (...)
      }
      noticias {
         (...)
      }
      usuarios {
         (...)
      }
   }
}

Particularmente, achei bem interessante usar o nome da closure para o nome do servidor ao invés de termos um atributo name = produtos :)
A mágica legal mesmo, é que o plugin vai ler esta configuração quando a aplicação for para o ar, e depois disso irá declarar / criar beans spring dinâmicamente, usando a Spring DSL. E os beans vão ter no nome a declaração feita na closure do usuário.

Ou seja, para os servidores solr declarados acima, o plugin irá declarar os Spring Beans produtosGSolr, noticiasGSolr e usuariosGSolr .

Desta maneira, vamos garantir que se você quiser o usar o plugin, o processo como um todo ficará o menos intrusivo possível, e você poderá usar os métodos (de pesquisa e outros) do GSolr apenas injetando o bean do servidor Solr que você quiser.

class PesquisaService {
   def noticiasGSolr

   def pesquisar = {
      (...)
   }
}

Achei no mínimo, muito prático. Tudo isso graças a Spring DSL que temos em groovy. Com um pouco mais de tempo, coloco o procedimento passo a passo para declarar os beans desta maneira. Enquanto isso, conheça um pouco mais sobre a Spring DSL aqui, ou veja o código fonte aqui e também aqui.

Tem alguma idéia ou sugestão para o plugin? Deixe um comentário!

Postado por Lucas Teixeira

February 28th, 2010 at 11:18 pm

Postado em GSolr, Grails, Solr

Com as tags , , , ,

Get Adobe Flash playerPlugin by wpburn.com wordpress themes