Teclas “faltando” no macbook

Recentemente adquiri um macbook e por nunca ter usado um estranhei a falta das teclas home, end, page up, page down e backspace. Os atalhos para essa funcoes sao (podem ver que nao aprendi a acentuar ainda :) ):

Home – tecla command + seta para esquerda

End – tecla command + seta para direita

Page up – tecla fn + seta para cima

Page down – tecla fn + seta para baixo

Backspace – tecla delete

Delete – tecla fn + tecla delete

Junho 29, 2008. Tags: . offtopic. Deixe um comentário.

Cobertura de testes 100% não indica software perfeito

Existem ferramentas que mostram a cobertura do código conseguida pelos testes automatizados (por exemplo, uma de Java é o Cobertura, que pode ser integrado com Ant e Maven inclusive). Quanto mais código testado melhor e a ferramenta de cobertura vai mostrar as linhas de código por onde os testes estão passando. Olhando os resultados você poderia ver que algum else não está sendo executado nos testes e escrever um teste que passe nesse else.

Mas se por um acaso alguém conseguisse uma cobertura de 100% de testes, o que é difícil (Exceptions de diversos tipos que são difíceis de testar) e não prático (setters e getters simples não precisam ser testados, não tem muito o que dar errado), não teria um software perfeito.

E por que isso? A cobertura pode dar 100%, só que quando tem alguma coisa faltando também é um erro. Posso ter esquecido de escrever algum if no código. Código que não existe não aparece na cobertura.

Outra coisa, os erros podem ocorrer com cada combinação de decisões que o software toma. Um teste pode entrar num if, outro teste pode entrar em outro, mas um bug pode acontecer justamente quando se entra nos dois.

Além dessas razões, só passar pelo código é apenas uma parte do teste. A outra são os assertions, os trechos de códigos exercitados devem ter uma confirmação do teste que o retorno do resultado é correto.

Então, a lição que fica é, não tente uma cobertura de 100% porque vai ser muito difícil e também porque isso não vai indicar um software perfeito. Use a cobertura de testes para encontrar trechos chaves do código que deveriam ser testados, mas não estão sendo.

Junho 17, 2008. Tags: , , . desenvolvimento de software, ferramentas, java, testes. Deixe um comentário.

Buscas no Google por tempo

Muitas vezes estamos procurando algum exemplo de código no Google e aparecem páginas muito antigas, com classes e métodos que não são mais utilizados ou que agora nas novas versões do Java tem maneiras melhores de fazer. Existe um jeito do Google filtrar resultados mais recentes.

Faça a busca normalmente e ao aparecer a página de resultados, vá na caixa do browser onde se digita os endereços. Ali onde tem o endereço do Google cheio de parâmetros, adicione ao final do endereço &as_qdr=y e aperte Enter.

Agora o resultado da busca vai ter um combo onde você poderá filtrar por vários períodos de tempo (último ano, últimos 6 meses, etc).

Junho 9, 2008. Tags: , , , . ferramentas. Deixe um comentário.

Parando uma Thread em Java

Afinal, quando a execução de uma thread acaba? A execução acaba quando o método run() termina.

Ok, mas minha thread é um serviço que fica sempre em loop (ouvindo uma porta, por exemplo), ela não vai terminar nunca!

Uma hora ela vai precisar terminar, ou se seu programa for finalizado ou, caso seja um serviço do sistema, quando o sistema for desligado. Neste caso, o que eu mais vi sendo utilizado é uma variável boolean que é modificada pela classe “dona” que invocou a thread, parando a execução. O código seria nesse estilo:

public class SempreEmLoop implements Runnable {

  private volatile boolean stop = false;

  public void run() {

    while (!stop) {

      // ... faz o que tem que fazer

      try {
        Thread.sleep(100); // para nao deixar a cpu fervendo
      } catch (InterruptedException ex) {
        // nao ligo caso a thread seja interrompida durante o sleep
      }
    }

    // o laco acabou... alguem parou a execucao, liberar recursos
    finalizaFechandoArquivosSocketsEOutrasCoisas();
  }

  /**
   * Método que vai ser chamado para parar a thread
   */
  public void parar() {
    this.stop = true;
  }

}

Agora na classe que chama a Thread:

public class DonaDaThread() {

  private SempreEmLoop meuRunnableSempreEmLoop;

  public void iniciaMinhaThread() {
    meuRunnableSempreEmLoop = new SempreEmLoop();
    Thread minhaThread = new Thread(meuRunnableSempreEmLoop);
    minhaThread.start();
  }

  public void paraMinhaThread() {
    meuRunnableSempreEmLoop.parar();
  }
}

A classe DonaDaThread é que vai controlar a execução da thread que contém SempreEmLoop. Chamando o método donaDaThread.iniciaMinhaThread() vai inicializar uma thread que roda o método run() da classe SempreEmLoop. Chamando o método donaDaThread.paraMinhaThread() vai chamar o método parar() da SempreEmLoop que faz com que o laço while pare e libere os recursos que a thread estava utilizando.

Note que a variável boolean da SempreEmLoop é definida como volatile. O que eu li em outros lugares é que ela deve ser volatile para que o compilador não tente otimizar o laço while. Como a variável stop nunca é alterada dentro do laço, o compilador pode querer supor que stop é sempre false. Se colocar volatile o compilador não faz essa suposição e deixa stop do jeito que está, fazendo com que stop seja sempre verificada a cada iteração de while.

Existe também o método interrupt() na classe Thread, só que esse método interrompe a thread somente se ela estiver bloqueada (pelos métodos wait, join ou sleep).

Junho 5, 2008. Tags: . java. Deixe um comentário.