quarta-feira, 30 de maio de 2012

A Árvore e o Balanço no Desenvolvimento de Software


Alguém já viu a imagem acima?

Pois é, faz uns 10 anos atrás que vi esta imagem e parece que a gente nunca aprende...

Quando me falam de um projeto novo, já fico pensando em customizações do sistema, em efeitos visuais (ter drag n'drop, menu rotativo, fade in, fade out, etc.) ou em tecnologias novas... Mas, que se formos pensar,  são coisas que, no final, não são prioritárias ou agregam pouco ou nenhum valor para a aplicação ou o usuário final.

Acho que, algumas vezes, precisamos focar no que é realmente necessário para o nosso cliente. Esta certo que fazer algo realmente bonito é muito legal, mas o importante, na minha singela opinião, é que a aplicação que construimos tem que ser algo mais que bonito, tem que ser algo útil para ele.

De que me adianta um sistema que faz relatórios 3D na tela, se no final o que a pessoa precisa é de uma simples listagem dos produtos mais vendidos?

"Quanto mais simples, melhor..." -- já me dizia um professor meu na faculdade.

É, errando e aprendendo... ;)

Até mais!

Teste sua aplicação Android com Robotium

Alguém já usou Selenium?

Se sim, você sabia que existe uma ferramenta de teste que se diz parecido com o Selenium mas que testa aplicações nativas em Android?

Pois é, ele existe e se chama Robotium (até o nome é parecido... :P ):
http://code.google.com/p/robotium/

Obs.: Para quem não sabe o que é Selenium: ele é uma ferramenta de testes automatizados para web que não só checa a "lógica" do sistema, como também o fluxo e as estruturas das páginas. Mais informações: http://seleniumhq.org/

Até mais!

domingo, 27 de maio de 2012

Tutorial - Parte 2 - Fazendo um Genius em PhoneGAP


Vamos continuar o tutorial, agora escrevendo uma parte do javascript (aquela que "liga" e "desliga" as "luzes"):

Primeiramente, vamos criar uma funçāo que obtem um elemento e troca a cor deste para uma mais clara ou escura, dependendo do estado anterior:

<SCRIPT>
      /*
       * Função que "liga" ou "desliga" a "luz"
       * Parametros: x - posição horizontal da "luz" (0 (coluna 1) ou 1 (coluna 2)), y - posição vertical da "luz" (0 (linha 1) ou 1 (linha 2))
       */
        function switchLight(x, y) {
            //Obtenho o elemento que exibe a cor
            var el = document.getElementById('genius['+ x +']['+ y +']');
            //Obtenho a cor do elemento
            var color = "" + el.style.backgroundColor;
            //Troco a cor deste (se ele estiver mais escuro (por exemplo RGB(0,153,0)) , coloco uma cor mais clara (RGB(0,255,0) ou vice-versa)
            color = color.indexOf('153') >= 0 ? color.replace(/153/gi,'255') : color.replace(/255/gi,'153');
            //Coloco a nova cor para o elemento a ser exibido
            el.style.backgroundColor = color;
        }
</SCRIPT>

Para ver se a função deu certo, coloco esta no evento onclick (ou ontouchstart, em mobile) no botão:

<!-- Acende ou apaga a "luz" verde-->
<BUTTON id="start" ontouchstart="switchLight(0,0);">Start!</BUTTON>

Se tudo ocorrer bem, quando você clicar no botão "Start!", ele vai acender a luz verde e, quando clicar de novo, apagar! :)

Próximo passo: precisamos guardar a seqüência das luzes a cada nova interação. Para isso, criamos uma variável global (array):

var sequence = [];

E também uma função que gera e guarda a seqüência:

/* Função que gera uma seqüência: escolhe uma linha (zero ou um) e uma coluna (zero ou um) e guarda em um array
 */
function addSequence() {
//Gera um número aleatório de 0 ao 1
var x = Math.round(Math.random());
//Gera um número aleatório de 0 ao 1
var y = Math.round(Math.random());
//Guarda em um array
sequence.push({"x": x, "y": y});
}

Agora vem a parte mais difícil, que é reproduzir a seqüência na tela. Vamos criar as funções que lê um item da seqüência, acende a luz indicada por este item e depois apaga:

//Variável global que indica o item da seqüência a ser utilizada
var index = 0;
//Variável global que contém o item selecionado na seqüência
var selected = null;
//Variável que faz referência ao botão html
var btnStart = null; 
...

/**
 * Evento onload
 */
window.onload = function() {
btnStart = document.getElementById('start');
}

/**
 * Função de acende a luz do item da seqüência selecionada
 */
function swithOnLight() {
//Se o indice esta na seqüência...
if ((index >=0) && (index < sequence.length)) {
   //Obtem o item da seqüência
   selected = sequence[index];
   //Acende a "luz" do item indicado
   switchLight(selected.x, selected.y);
   //Espera meio segundo para apagar o item selecionado
   setTimeout('switchOffLight();', 500);
} else {
    //Se o indice não estiver seqüência ou chegou no fim da seqüência, habilito o botão "Start!" 
    btnStart.disabled = false;
}
}

/**
 * Função que apaga a luz e vai acender (se existir) o próximo item da sequência 
 */
function switchOffLight() {
//Se existe um item "acendido" (selecionado)
if (selected != null) {
     //então apago
     switchLight(selected.x, selected.y);
     selected = null;
}
//Vai para o próximo item da seqüência
index++;
//e tento acender este
setTimeout('swithOnLight()', 500);
}

Agora, retiramos o evento ontouchstart ou onclick (se foi colocado) do botão "Start!" e colocamos os eventos para criar a animação das luzes:
              
/**
 * Função que inicia a animação da sequência de cores
 */
function startSequence() {
     //Animação começa desde do inicio da sequência
     index = 0;
     //Desabilita o botão
     btnStart.disabled = true;
    //Adiciona um item na sequência
    addSequence();
    //tenta acender a primeira luz da sequência e executa as demais.
    swithOnLight();
}

/**
 * Evento onload

 */
window.onload = function() {
    btnStart = document.getElementById('start');
    if (btnStart != null) {
         //Adiciono o evento onclick ou ontouchstart para executar a sequência
         if (typeof(btnStart.ontouchstart) != 'undefined') {
              btnStart.ontouchstart = function() {
            startSequence();
            }
         } else if (typeof(btnStart.onclick) != 'undefined') {
              btnStart.onclick = function() {
            startSequence();
            }
         }          
    }
}

Por enquanto é só (mas agora falta pouco... :) ).

Até mais!

sexta-feira, 18 de maio de 2012

Bill Gates versus Steve Jobs - O Jogo

Esta certo que Steve Jobs já esta no céu..., mas a "briga" entre ele e seu "inimigo" Bill Gates sempre foi notícia no mundo de informática.

E, pensando nisso, certa pessoa (ou pessoas) fizeram um jogo de luta com estes dois protagonistas:
http://www.flashninjaclan.com/zzz2013_Gates_vs_Jobs.php

Está certo que não é um grande jogo, mas é mais pela sacada. :P

Até!

terça-feira, 15 de maio de 2012

Tutorial - Parte 1 - Fazendo um Genius em PhoneGAP

Ultimamente ando meio sem assunto (e também um pouco ocupado...).

Mas, finalmente, tive um tempinho para postar aqui e resolvi fazer um tutorial de PhoneGAP (esta certo, não sou um especialista, mas na hora, foi o que deu para pensar...).

Pensei então em fazer um Genius.

Para quem não sabe, o Genius era um jogo, lançado pela Estrela, que basicamente era um jogo da memória. Consistia em decorar a seqüência de luzes e reproduzi-las a seguir.

Na época era o jogo mais "tecnologicamente" avançado, só perdendo para o Odissey e o recém lançado Atari.
Bem, chega de conversa, e vamos lá:

Primeiramente, vamos criar o HTML e o CSS para a tela:


<!-- DOCTYPE HTML -->
<HTML>
<HEAD>
<META name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
</HEAD>
<BODY>
<TABLE borderspacing="0" borderpadding="0">
<TR><TD id="genius[0][0]" style="background:#009900;width:100px;height:100px;border:1px solid #000;" ></TD><TD style="background:#990000;width:100px;height:100px;border:1px solid #000;" id="genius[0][1]"></TD></TR>
<TR><TD id="genius[1][0]" style="background:#999900;width:100px;height:100px;border:1px solid #000;" ></TD><TD style="background:#000099;width:100px;height:100px;border:1px solid #000;" id="genius[1][1]"></TD></TR>
</TABLE>
<BUTTON id="start" >Start!</BUTTON>
</BODY>
</HTML>

Abra no navegador, e veja como fica. :)

Por enquanto, ficamos só nisso, no próximo post, vamos fazer a animação de acender o "pedaço".

Até mais!