segunda-feira, 23 de julho de 2012

IceScrum?

IceScrum é uma ferramenta interessante para gerenciamento do processo ágil de desenvolvimento de software chamado Scrum. Desenvolvido em Java na plataforma web, o IceScrum é um software de código aberto e grátis (download).

Entre algumas ferramentas grátis que testei para auxiliar no gerenciamento do processo de desenvolvimento, o IceScrum foi a ferramenta que me deixou mais confortável porque implementa os conceitos da metodologia Scrum de forma concisa e quase natural.

Instalação & Configuração

A instalação da ferramente pode ser feita pela implantação de um arquivo WAR no Tomcat, ou noutro servidor compatível, ou então baixar a versão 'bundled' que já vem com o Tomcat embutido e executar scripts para execução.

A versão atual  R5#1.2 dispensa maiores configurações para banco de dados, pois utiliza o banco de dados embutido HSQLDB, também baseado em Java. Apesar desta facilidade, outras configurações ainda são necessárias e as instruções apresentada no site não são tão precisas. Tive problemas com as duas opções de instalação, mas consegui colocar em funcionamento apenas a versão 'bundled' após diversas tentativas (mas isso está fora do escopo deste artigo). O fórum de suporte da ferramenta ajudou, mas tem várias respostas dos próprios administradores do fórum sem explicações técnicas sobre o problema, apenas indicando um download para resolvê-lo.

Funcionalidades

Mesmo não registrado no sistema (logado), qualquer pessoa pode visualizar parcialmente os projetos cadastrados. Esta visualização parcial significa ver o painel inicial do projeto, os registros de atividades e incluindo os gráficos, a área livre (sandbox) e a lista do produto (product backlog); também é possível ver a estórias detalhadamente.

Ainda, qualquer pessoa que acessa o sistema pode fazer um registro, criar um projeto e montar uma equipe para este projeto adicionando usuários cadastrados na ferramenta ao projeto.

Somente após pesquisar no fórum de discussão da ferramenta, descobri que existe um usuário administrador. Este usuário consegue acessar todos os projetos, aparentemente sem restrição, mas não tem o controle dos usuários cadastrados. Isso chegou a ser um problema para mim, pois, aqui, um desenvolvedor chegou a esquecer a identificação e senha da própria conta; eu não tive como pesquisar a sua identificação no sistema, para que mais tarde, o próprio usuário pudesse fazer a sua recuperação de senha.

Gostei bastante da possibilidade de criar estórias por qualquer membro da equipe, ficando estas estórias numa área livre esperando aceitação do dono do projeto ou scrum master. Uma estória pode ser priorizada e também estimadas por 'story points' após aceita. Também é possível adicional testes de aceitação à estórias.

As iterações são programadas de forma fácil, onde as estórias aceitas e estimadas (atribuição de peso) são listadas e adicionadas à iteração via drag-and-drop. A partir de uma estória, criam-se as tarefas que automaticamente assumem a coluna 'Para Fazer' do painel de iteração.

A imagem ao lado mostra o painel de um projeto em andamento; nomes de projeto, de algumas tarefas e de colaboradores foram ofuscados por motivos óbvios! Os post-its das tarefas apresentados no painel podem ser movidos entre as colunas  'Para Fazer', 'Em Andamento' e 'Concluído' via drag-and-drop

Os desenvolvedores do projeto devem mover uma tarefa com estado 'Para Fazer' para a coluna 'Em Andamento'; automaticamente o sistema associa o desenvolvedor à tarefa. Uma vez a tarefa concluída, o post-it deve ser movido para a coluna seguinte. Muito intuitivo!

Problemas...

Uma desvantagem da ferramenta é a quantidade de memória alocada para sua execução. O tamanho de 512 MB é a quantidade mínima recomendada, mas eu tive que alocar um pouco mais. Para fazer isso na versão 'bundled' foi preciso modificar os scripts de execução do Tomcat, o que não está prontamente documentado no site da ferramenta!

Em alguns momento, a ferramenta travou, mesmo com mais de 512MB de memória alocada. Apenas dois projetos com pouquíssimas estórias e tarefas estavam cadastradas na ferramenta. Ainda estou acompanhando e analisando a frequência deste tipo ocorrência.

Ainda, mensagens de erro com a conexão com banco de dados foi apresentada, todavia não foi notado maiores problemas além da mensagem.

Conclusão

IceScrum, versão R5#1.2, é uma ferramenta com uma interface gráfica agradável e até um tanto intuitiva. Sua instalação não foi tranquila para mim e a documentação do site está desatualizada; todavia o fórum de discussão pode ajudar. A alocação de memória superior se comparada à outras ferramentas não chega a ser um impeditivo real, já os problemas de travamento da ferramenta e mensagem de erro de conexão com o banco de dados deixa uma impressão ruim e uma sensação de insegurança para adotar a ferramente integralmente. 

segunda-feira, 2 de julho de 2012

Configurando Launch4J para Maven

Launch4J é um aplicativo famoso usado para transformar arquivos JAR em arquivos executáveis para o sistema operacional Windows. É natural que se queira utilizar este aplicativo em conjunto com o Maven para gerar os arquivos finais do projeto para distribuição. Neste cenário, a intenção é atualizar sempre o número da versão e build do aplicativo automaticamente, antes mesmo de gerar o arquivo executável.

A primeira opção para rodar o Launch4J integrado ao Maven é a utilização de plugin. Nos links de referência, no final deste artigo, estão listados alguns websites para o plugin Launch4J para Maven e outros links com exemplos de uso.

A utilização do plugin pode ser mais limitada (ainda não testei) e ainda talvez se deseja utilizar a configuração já existentes do Launch4J do projeto, sem correr o risco de perder alguma configuração; este motivo justificaria a utilização do Launch4J era como um tarefa do Ant.  Não vou ensinar como criar este arquivo de configuração, pois já está razoavelmente documentado no próprio website do Launch4J. Assim, com um mínimo de adaptação, o Launch4J fica pronto para o Maven, como uma tarefa do Ant, como mostra o código abaixo:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
        <execution>
            <id>launch4j</id>
            <phase>package</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>                                
                    <copy file="config.xml" tofile="config-temp.xml"/>                                
                    <replace file="config-temp.xml" token="0.0.0.0" value="${project.version}.${BUILD_NUMBER}"/>
                    <taskdef name="launch4j" classname="net.sf.launch4j.ant.Launch4jTask" classpath="${launch4j.dir}/launch4j.jar:${launch4j.dir}/lib/xstream.jar" />
                    <launch4j configFile="./launch4j-client-temp.xml" jar="${project.build.directory}\my-application-${project.version}.jar" outfile="${project.build.directory}\my-application.exe"/>
                    <delete file="${project.build.directory}\my-application-${project.version}.jar"/> 
                    <delete file="config-temp.xml"/>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin> 

Aqui, utilizei o plug-in Antrun.  Da linha 13 à linha 18 estão as configurações das tarefas Ant para execução.

A linha 13 copia o arquivo de configuração do Launch4J para um arquivo temporário, que é manipulado na sequência (linha 14). Neste arquivo, todas as sequências de caracteres 0.0.0.0 serão substituídas pelo número da versão do projeto (variável do próprio Maven: ${project.version}) e o número da build (variável do Hudson: ${BUILD_NUMBER}). Só lembrando, caso não esteja trabalhando com o Hudson, você deve remover esta última variável da composição dos números da versão do seu aplicativo.

A definição da tarefa do Launch4J é feita na linha 15. Pressupõe-se que o aplicativo esteja instalado no ambiente de execução do Maven. Aqui, a variável ${launch4j.dir} fora definida anteriormente no arquivo pom.xml do projeto com o caminho da instalação do aplicativo. Observe que tal variável aparece duas vezes no atributo 'classpath' desta linha.

Na sequência, linha 16, vem a chamada da própria tarefa definida da linha anterior. Esta tarefa demanda 2 atributos, sendo o nome do arquivo JAR e o nome do executável que será gerado. As variáveis utilizadas aqui são do próprio Maven.

As linhas 17 e 18 fazem uma limpeza: remove o arquivo JAR, que agora já está encapsulado como um arquivo executável, e depois remove o temporário criado na linha 13.

Conclusão

A solução apresentada para se trabalhar com Launch4J e Maven atende aqueles que estão começando a trabalhar tanto com um ou outro destes aplicativos, sem exigir muita configuração por parte Maven. O plugin Antrun utilizado para fazer toda a configuração é da Apache e portanto se espera uma compatibilidade com as futuras versões do próprio Maven, facilitando assim uma possível atualização de versão.

Referências

http://launch4j.sourceforge.net/
http://ant.apache.org/
http://9stmaryrd.com/tools/launch4j-maven-plugin/
http://mvnrepository.com/artifact/com.akathist.maven.plugins.launch4j/launch4j-maven-plugin
http://stackoverflow.com/questions/6060560/trying-to-integrate-launch4j-in-a-maven-project-using-alakai-plugin

Jogo da Memória em JavaFX 2.1

Aqui, disponibilizo o código fonte de um jogo da memória feito em JavaFX 2.1. O código foi desenvolvido pelo NetBeans 7.1.1. O arquivo compactado contém todo o código fonte, arquivos e áudio e um arquivo JAR que consiste no jogo pronto para ser executado. Ao clicar no botão ou no link para download, você será direcionado para o Google Drive e todos os arquivos do projeto serão listados. Para fazer efetivamente o download, tecle CTRL+S ou vá no menu 'File' e selecione a opção 'Download' para fazer um único download de todos os arquivos.

Vale lembrar que para compilar o jogo, você precisa do JDK 6 ou superior com o módulo para JavaFX, que pode ser baixado pelo site da Oracle. Se você possui o JDK 7 atualizado, então o JavaFX já está incorporado.

No código deste jogo, vocês verão a criação de formas, aplicação de transformações e efeitos, animação sincronizada com áudio e interação com usuário. Tudo isso já foi descrito nos artigos anteriores, de forma didática.

Este jogo da memória é baseado naquele famoso jogo eletrônico da década de 80 chamado Genius. Nesta implementação, a lógica basicamente é a repetição pelo usuário de uma sequência determinada pelo jogo. A sequência pode ser mais rápida ou mais lenta, até atingir uma sequência de 10, começando sempre com 4.

Durante o jogo, é sempre informado a sequência criada pelo sistema e quando o usuário deve iniciar sua interação. As mensagens são sempre exibidas no centro do círculo e desaparecem após 3ms com efeito de 'fading'.

Ao iniciar o jogo, o botão fica desabilitados até a sua finalização. Todavia, o controle para modificar a velocidade do jogo continua habilitado.

A sequência criada pelo jogo é apresentada ao usuário pela animação de cada quarto de círculo, causando a sensação de que fora ligado/aceso e depois apagado. Aqui foi usado o RadialGradient para produzir o efeito desejado, ou seja, para que mais ou menos no centro de cada forma fosse mais claro e no restante mais escuro. Ainda, para cada cor do círculo existe um som associado, executado de forma síncrona com a animação.

Durante a exibição automática da sequência criada pelo jogo, o usuário não tem como interagir com o sistema (exceto mudando a velocidade do jogo).

Após ser informado pelo jogo, com a mensagem 'Sua vez!', o usuário pode então tentar repetir a sequência criada. Não foi criado um tempo limite (timeout) para início da interação do usuário.

Caso o usuário erre a sequência exibida pelo jogo, um som, uma mensagem e efeito de 'fading' do círculo e da mensagem são executados paralelamente. Após 3ms, o jogo volta ao estado inicial, habilitando o botão inciar, pronto para um novo jogo.

Se o usuário conseguir repetir a sequência de 10, sem errar, o jogo também emite som, exibe mensagem e um efeito de rotação de 360 graus horário. Da mesma forma, após 3ms, o jogo volta ao estado inicial, habilitando o botão inciar, pronto para um novo jogo.


Para finalizar, não posso deixar de referenciar o artigo de João Paulo chamado "Genius em C#". Neste artigo, o autor também disponibiliza o código-fonte do seu jogo, junto com arquivos de áudio. Estes mesmos arquivos de áudio são utilizados neste exemplo em JavaFX.