Cuidado com sessions no heroku

Só uma passada rápida por aqui. Estava mexendo no Agendatech para melhorar o processo de participar de uma promoção ou de informar que a pessoa vai em um evento. O problema era o seguinte: quando você clicava no botão, a aplicação redirecionava o usuário para a página do twitter e na volta, mesmo com o usuário já logado, ele era obrigado a clicar novamente para participar da promoção.

A minha solução, não que tenha sido a melhor, foi guardar uma session com o evento e o tipo de botão que ele clicou e, na volta do login realizado no twitter, eu pego esse objeto que ficou guardado na session e faço a associação com o usuário que acabou de se logar. Dessa forma, ele não precisa clicar novamente para confirmar a participação, isso já fica sendo feito automaticamente.

O problema foi que eu guardei na session um objeto do tipo Evento, que é o principal do sistema. Por conta disso ele tem alguns relacionamentos, além dos atributos como data do evento, descrição, etc… Parece que o Heroku não gostou muito do tamanho do objeto que ele teve que serializar e começou a soltar uma exception do tipo CookieOverflow. A solução foi guardar apenas o id do evento na session :) .

Bom, essa blogada é mais para eu sempre ficar com isso em mente. Quando você tá num ambiente de Cloud no estilo PAAS da vida, temos sempre que tomar cuidado quando o assunto é guardar coisas aleatorias no disco. Afinal de contas, isso não te pertence mais, pelo menos no plano básico :) .

Posted in ruby | Tagged , , , | Leave a comment

Getting into the new Scala’s 2.10 Reflection API

The newer version of Scala brings us some new features. In this post, Simon Ochsenreither listed many of these new things. One of  the most expected, at least for me,  is the new Reflection API. In my last project at Caelum, we faced a lot of problems using Java’s Reflection API to discover things that just existed in a Scala class. For example, we needed to know if a method was implicit or not and this information was not clearly pointed at the bytecode. In order to solve this problem, we had to use the scalap library and I can tell, the code is not beautiful.

So my point here is just that, show you how to use the new Reflection API to discover if a method is or not a implicit. The code must be a starting point to do whatever you might need with the rest of the API.

To get started I was looking for a way to get information about the class, such as methods implicitness, existence of companion objects and so on. So I created an Object with an implicit method just to test:

 object Pimps{
    implicit def pimp(str:String) = new {
       def test = println("hello")
    }
 }
 

Now I need to get information about this class, all the traits that you must know to work with Scala’s Reflection are at Scala’s github repository, and that was my starting point. The Mirror trait is the entry point of the api, its implementation can be found here. So let’s get started retrieving all the informations about our class. Here is the code:

val aType:Type = Mirror.typeOfInstance(Pimps)

Now we have the Type instance of our class. This object provides informations about your class, for example we can pick all the members. Let me show you the code:

 val members:List[Symbol] = aType.members
 

The Symbol trait is the abstraction of everything that you have in your class, constructors, methods, variables and the class declaration itself. And, at least for me, this was my savior. With an instance of Symbol is possible to get information about the Scala code. For instance, let’s filter all the Symbols that contains an implicit modifier in our Pimps class:

val justImplicits = members.filter(member => member.hasModifier(Modifier.`implicit`))

I think this is a good starting point to test the new API. All the code was tested in REPL with the 2.10 version, milestone 2. Also, there is a gist with the example code. Don’t forget the imports :) .

Thanks to @adrianoalmeida7 for kindly reviewing this post.

Posted in java, jvm, scala | 4 Comments

Evitando Null Pointer Exception em Scala

No meu post anterior foi discutido uma maneira de tentar evitar os famigerados NPE nas aplicações escritas em Java. Atualmente, uma linguagem que tenho gostado bastante é Scala. Uma das idéias da linguagem é a de fornecer soluções prontas para problemas comuns que encontramos quando fazemos código em Java. Um exemplo muito bom disso é a idéia para evitar os NPEs.

Para exemplificar, será usada a mesma agenda que foi escrita no post anterior. Abaixo segue o código da agenda escrito em Scala:

 import scala.collection.mutable.Map
 class Agenda {
   private val contatos = Map[String,Contato]()
  //aqui adicionamos um contato no mapa usando o email como chave
   def adiciona (contato:Contato) {
        contatos += contato.email -> contato
   }
   def  buscaPor(email:String) = {
         if(contatos.contains(email)){
            contatos.get(email).get
         }
         else{
            null
         }
    }
 }

Aqui está sendo retornado o mesmo null que era retornado no post anterior. Vale salientar que dei uma forçada no código para deixar ele parecido com o escrito em Java. E o cliente segue abaixo:

 object TesteAgenda {
      def main(args : Array[String]) : Unit = {
             val agenda = new Agenda
  	     agenda.adiciona Contato("alberto","teste@teste.com.br")
 	     val contato = agenda buscaPor "teste2@teste.com.br"
             if(contato==null){
                  println("Nao foi achado")
             }
             else{
                  println(contato.nome)
             }
      }
 }

Para tentar evitar esse tipo de retorno, a linguagem já vem com uma implementação mais esperta do que a sugerida pelo Null Value Object e muito mais elegante do que a exibida no post anterior. A implementação está abaixo:

 def buscaPor(email:String):Option[Contato] = {
    if(contatos.contains(email)){
        Some(contatos.get(email).get)
    }
    else{
      None
    }
 }

Option é uma trait, que pode ser encarada como uma interface do Java, porém com mais poderes. Ela vem com duas implementações: Some(…), quando você quer indicar que algum objeto vai ser retornado e None para indicar que nada vai ser retornado. Agora no código cliente podemos usá-la da seguinte maneira:

  println(contato.getOrElse(Contato("nao encontrado", "email@email.com.br")).nome)

Dessa maneira é evitado o NPE a um custo bem pequeno. Sem a necessidade de herança ou implementações mais complexas, já está pronto :) . E o método getOrElse faz o papel do if else que era feito antes.  O post de Tony Morris cita vários exemplos de uso dos métodos das Options, mostrando o que cada um faz por baixo do pano. O mais interessante é que a própria linguagem faz bastante uso de Options para resolver problemas.

O exemplo de buscar um valor no mapa é um caso típico de retornar uma Option, e o método get já foi implementado dessa forma.  Segue o código:

  def buscaPor(email:String) = contatos.get(email)

Pretendo continuar explorando a linguagem nos próximos posts do blog. Acredito que as possibilidades que ela nos traz durante o desenvolvimento do código valem bastante a pena.  Outros blogs a serem acompanhados, que vem escrevendo sobre Scala são os da Caelum e de Urubatan.

Posted in java, jvm, plataforma java, scala | Tagged , , | Leave a comment

Uma abordagem para evitar NullPointerException

Invocar métodos que podem ou não retornar o objeto esperado é algo bem comum no nosso dia-a-dia de programação. Abaixo segue um exemplo bem simples:

public class Agenda {

private Map contatos = new HashMap();

public void adiciona(Contato contato) {
contatos.put(contato.getEmail(), contato);
}

public Contato buscaPor(String email){
return contatos.get(email);
}
}

O método que realiza a busca retorna o contato encontrado ou, no meu caso, retorna null caso não encontre nada. Agora imagine que temos uma classe que faz uso dessa agenda. Por exemplo a que segue abaixo:

public class TesteAgenda {

public static void main(String[] args) {
Agenda agenda = new Agenda();
agenda.adiciona(new Contato("alberto","teste@teste.com.br"));

Contato contato = agenda.buscaPor("teste2@teste.com.br");
System.out.println(contato.getNome());
}
}

Mesmo sendo um exemplo muito simples, caimos num problema bem comum. O método buscaPor(email) vai retornar null porque não encontrou nada e o cliente que está usando o código toma o velho NullPointerException. No caso exposto, o código que utiliza este tipo de método, e eles se espalham que nem uma praga pelo sistema, começa a defender-se utilizando as velhas checagens com ifs para verificar se o objeto retornado é null ou não. Abaixo o exemplo:

if(contato!=null){
System.out.println(contato.getNome());
}
else{
System.out.println("Não encontrado");
}

O grande mal dessa abordagem é que você tem que ficar lembrando o tempo todo de ter que verificar isso. Exato, o problema não é colocar os ifs, if ou não, algum código vai ter de ser colocado para verificar isso.

Uma abordagem para tentar minimizar o problema da lembrança é usar o pattern Null Object, onde um objeto com semântica Nula é retornado para o invocador do método. É uma maneira um pouco mais elegante de resolver o problema.  Por exemplo, para o caso da agenda, poderia fazer uma classe chamada ContatoNaoEncontrado. O exemplo segue abaixo:

public class ContatoNaoEncontrado extends Contato {

@Override
public String getNome() {
return "Não encontrado";
}

@Override
public String getEmail() {
return "Não encontrado";
}

}

Fariamos uma alteração no método buscaPor(email) para que faça a verificação, ficando com ele da seguinte forma:

public Contato buscaPor(String email){
Contato contato = contatos.get(email);
if(contato!=null){
return contato;
}
return new ContatoNaoEncontrado();
}

E no código que utiliza este método podemos substituir os ifs pelo classico polimorfismo:

Contato contato = agenda.buscaPor("teste2@teste.com.br");
System.out.println(contato.getNome());
System.out.println(contato.getEmail());

Caso a checagem ainda seja necessária, pode-se adicionar um método na classe mãe indicando se foi encontrado ou não. Dessa forma o Null Object sempre retornaria false. Aplicando essa alteração ficamos com o seguinte código:

if(contato.foiAchado()){
System.out.println("Achamos seu contato... => "+contato.getNome());
}
else{
System.out.println("Não foi possivel...");
}

O ponto, um tanto quanto questionavel, é o fato de usar herança para implementar o Null Object. Poderia ser utilizado a mesma classe setando tudo para os valores apropriados, mas aí seria perdido a idéia da semântica do objeto nulo.

Pelo menos na minha opinião, não existe uma regra certinha para desenvolver, a que tento seguir é a de sempre deixar o código mais auto-explicativo possivel e de fácil manutenção. Caso você tenha apenas um lugar para fazer a checagem do objeto nulo, é claro que não precisa gastar seu tempo implementando isso. Agora, se essa checagem começar a se espalhar muito, essa abordagem pode salvar você de tomar uns NPE pelo caminho. No próximo post vou mostrar a mesma abordagem utilizando a linguagem Scala, a qual já possui implementado uma abordagem para resolver este mesmo problema.

Posted in java | Tagged , | 7 Comments