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. Etiquetas: . offtopic. Não Há Comentários.

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. Etiquetas: , , . desenvolvimento de software, ferramentas, java, testes. Não Há Comentários.

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. Etiquetas: . ferramentas. Não Há Comentários.

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. Etiquetas: . java. Não Há Comentários.

Software perfeito

Estou relendo o livro The Pragmatic Programmer, e num dos capítulos tem a seguinte frase “You Can’t Write Perfect Software” (Você não pode escrever software perfeito). Mas é lógico que a culpa vai ser das outras pessoas que não sabem usar seu programa. Estas pessoas quando chamarem seu método perfeito vão passar aquele parâmetro que somente uma anta passaria. :)

Agora dê uma olhada no Java, a classe Date, por exemplo, e veja quantas coisas foram marcadas como deprecated. Deu pra perceber que houve um certo arrependimento na forma como a classe foi escrita? É que pra trabalhar no desenvolvimento do Java, a Sun só deve contratar gente ruim. :D

A conclusão que eu chego (e quase todo mundo pelo que eu percebo) é que software perfeito não existe. Portanto, não perca tempo em escrever o software perfeito, porque 99,9999% de chance que não vai ser.

PS.: Na verdade só escrevi esse mini post porque, usando o Stumbleupon, me apareceu um site com um vídeo mostrando a evolução dos patches do jogo Starcraft e que a Blizzard deu suporte ao jogo por nada menos que 10 anos, fazendo correções e melhorias. Parabéns a Blizzard por se importar com seus clientes!

Maio 31, 2008. Etiquetas: . filosofia. Não Há Comentários.

Grids CSS com blueprint

Eu estava precisando fazer um site com um layout de 4 colunas e como CSS não é o meu forte, saí procurando alguma solução já pronta. Acabei encontrando o blueprint e com a configuração padrão dele você consegue fazer um grid com até 24 colunas de 30 pixels e com largura total de 950 pixels.

Para fazer um grid você cria um “container” e dentro do “container” você define divs para cada coluna usando a classe “span-x” onde x vai ser o número de colunas a serem ocupadas pelo div. No meu caso eu queria 4 colunas de tamanho igual (total 24 colunas dividido por 4 partes = 6 para cada span), então fiz:

<div class="container">
        <div class="span-6">
                Coluna 1
        </div>
        <div class="span-6">
                Coluna 2
        </div>
        <div class="span-6">
                Coluna 3
        </div>
        <div class="span-6 last">
                Coluna 4
        </div>
</div>

Note também que no último div ainda temos que colocar a classe “last” para informar qual a última coluna.

Dá pra fazer mais coisas com grids, como grids aninhados (um dentro do outro) e customizar o tamanho do grid. O blueprint ainda possui mais algumas coisas como estilos para fontes e forms, mas no geral o blueprint é bem básico e enxuto.

Para maiores informações o site do blueprint é esse: http://code.google.com/p/blueprintcss/

Outra solução é usar o YUI (Yahoo! User Interface Library), mas especificamente para essa parte de layout achei que o html do YUI fica mais poluído que o blueprint. Só que o YUI tem muito mais funcionalidades, quem sabe uma hora eu faço algum post sobre ele.

Maio 25, 2008. Etiquetas: , . css. Não Há Comentários.

Atalhos do Eclipse

Olá a todos!

Vou falar aqui sobre alguns atalhos úteis do Eclipse que é a IDE que eu uso.

ctrl-shift-t - Open Type - Atalho para abrir o código de um tipo do Java para edição. Por exemplo, em algum lugar do seu projeto tem uma classe GenericDAO. Então se você quiser abrí-la para edição, aperta crtl-shift-t, começa a escrever GenericDAO e clica nela na lista.

ctrl-shift-r - Open Resource - Serve para você abrir um arquivo qualquer. Por exemplo, você tem um arquivo header.html, aperta ctrl-shift-r, começa a escrever header.html e clica nele na lista.

ctrl-o - Com o cursor numa classe, navega dentro dela abrindo uma lista de métodos e atributos. Aperte ctrl-o e vá digitando o nome do método, por exemplo, getName. Selecione na lista que o cursor vai direto para o método getName.

alt-shift-R - Rename - Refatoração para mudança de nome de um atributo, método, nome, classe em que o cursor estiver em cima. Usando a refatoração, todos os lugares onde estiver sendo utilizado o alvo da mudança também serão modificados.

alt-shift-L - Extract Local variable - Refatoração que transforma a parte selecionada numa variável local. Por exemplo, você seleciona no código:

if (number >= 0) { …

Aperta alt-shift-L, e escreve isPositiveNumber, ficando assim:

boolean isPositiveNumber = number >= 0;
if (isPositiveNumber) { …

alt-shift-M - Extract Method - Refatoração que transforma a parte selecionada num método. Por exemplo, você seleciona no código:

if (number >= 0) { …

Aperta alt-shift-m, e escreve isPositiveNumber. Isso irá criar um novo método ficando assim:

if (isPositiveNumber()) { …

E mais abaixo terá o método:

private boolean isPositiveNumber() {
return number >= 0;
}

Aprender a usar bem os métodos de refatoração é muito importante, pois assim naturalmente o seu código fica mais legível, limpo e organizado (que é o objetivo de refatorações :) ).

Fico por aqui, espero que tenha ajudado!

Maio 16, 2008. Etiquetas: , . ferramentas, java. Não Há Comentários.

Conhece o Hudson?

Conhece o Hudson? Aquele que… faz Continuous Integration. :D

Página do Hudson: https://hudson.dev.java.net/

Descobri esta ferramenta através do livro Java Power Tools - edição de 2008.

Achei fácil de usar, você configura seu projeto todo por tela (nada de xml), com uma interface bem limpa e ele é extensível com o uso de plugins. Tem vários plugins no site, para todos os gostos.

Para meu projeto com Maven e Subversion foi muito simples fazer a configuração.

Maio 14, 2008. Etiquetas: , . ferramentas, java. Não Há Comentários.

Hello world!

Olá a todos! (alguém aí? :P )

Aqui vou escrever coisas sobre desenvolvimento de software que ocorrem no meu dia a dia. E também outras coisas que não ocorrem, mas que eu lembre.

Não sou um bom escritor, mas vou tentar na base do método KISS (Keep It Simple Stupid). :)

Sejam bem vindos!

Maio 14, 2008. Etiquetas: . offtopic. Não Há Comentários.