quinta-feira, 20 de dezembro de 2012

Feliz Natal!

Como alguns de vocês sabem, todo fim de ano tento mandar e-mails de "Feliz Natal" para todos com quem trabalhei... É uma tarefa "difícil", mas vale a pena por cada lembrança de cada um de meus colegas, sejam boas ou não tão boas assim.

Mas a cada ano que passa, vivo esquecendo um ou outro por aí (desculpem :P) ou perdi o contato com a pessoa.

E para vocês, eu desejo, através deste post, um Feliz Natal e um Próspero Ano Novo!

Que o ano que virá (se passarmos de amanhã - 21/12/2012) seja de muita saúde e paz!

E que todos nós reflitamos (existe isso?!?) do que aconteceu este ano, assim como lembramos das pessoas de "nossa" equipe.

A melhor equipe do mundo! :)

Até mais!

terça-feira, 11 de dezembro de 2012

Dicas de Programação: Existe try catch em Objective-C?

Existe sim! Vamos ao código de exemplo:

//Código que pode dar exceção
@try {
     NSInteger a  = 1;
      ...
     if (a > 0) {
          //Lanço a exceção
         @throw [NSException exceptionWithName: @"GenericException" reason: @"Exceção Genérica" userInfo: nil];
    }
}
//Se der exceção, executo o código abaixo...
@catch (id theException) {
         NSLog(@"%@", theException);
}
//As instruções abaixo sempre executam, lançando ou não exceção
@finally {
        NSLog(@"Fim da instrução");
}

No final, ficou parecido com Java... :P

Até mais!

quinta-feira, 29 de novembro de 2012

Sistema Operacional Java?


O projeto já tem um tempo, mas descobri um sistema operacional de código aberto feito em Java, chamado JNode:
http://www.jnode.org/

Agora, quem reclamar que a JVM demora para interpretar o bytecode, pode tentar usar um sistema operacional nativo para ver se fica mais rápido. :)

Até mais!

domingo, 25 de novembro de 2012

Jogue xadrez com os heróis da DC Comics

Não, você não vai desafiar o Batman em uma partida de xadrez... (seria divertido mas, mesmo que desse, acho que nenhum de nós teria capacidade de vencê-lo... :P).

Eu não sabia, mas descobri que existem peças colecionáveis de xadrez com os heróis da DC:


Legal! Duas coisas que eu gosto em uma coisa só (colecionáveis e xadrez)!

Como esta chegando o Natal, se algum de vocês que leêm este blog for uma pessoa generosa, rica e que esta nos EUA, me dar um destes de presente, eu aceito de coração... :P

Já pensou ver esta peça em seu tabuleiro:


É um dos sonhos, de um nerd, realizado!

Até mais!

domingo, 11 de novembro de 2012

Que bicicletas são estas nas avenidas de Campinas ?


Alguém já viu alguma coisa assim em Campinas?

Pois é, sabe que, quando volto para casa de fretado, o ônibus passa na Avenida Princesa d'Oeste e sempre via estas bicicletas, mas nunca havia me perguntado o por que delas estarem lá...

Até que um colega, que me deu uma carona, me perguntou o que era aquilo...

Como não sabia, resolvi pesquisar.

E descobri que o projeto Viva Bike Campinas esta disponibilizando, a seus associados, aluguel de bicicletas nas avenidas Orozimbo Maia, José de Souza Campos (também chamada de Norte-Sul) e Princesa do Oeste.

É uma iniciativa legal, principalmente por causa da vida estressante que uma pessoa passa em uma cidade "grande", com o transito absurdo (não sei em outras cidades, mas em Campinas, o transito no horário de pico é realmente absurdo...).

Para mais informações, no site: http://www.brasilemovimento.com.br/.

Até mais!

Antixadrez



Não, não é um vilão de HQ que quer acabar com o xadrez do universo! :P

Antixadrez, também chamado de Xadrez Suícida, é uma variação de xadrez onde quem ganha é quem perde!

Hã, como assim?

O jogo consiste em fazer o jogador perder todas as peças do jogo (ou seja, o jogador que perder todas as peças, ganha).

As regras são bem simples:
- As peças se movimentam igual ao do xadrez normal;
- Não existem o roque, o xeque e o xeque-mate;
- O rei pode ser capturado como qualquer peça;
- É obrigado capturar (dãããã... senão o jogo não ia ter fim :P);
- Se o jogador tiver opções de captura (2 ou mais peças), ele pode escolher a peça;
- O peão pode se promover a rei;

Hum..., deve ser bem esquisito querer "perder"... :P

Até mais!

quinta-feira, 8 de novembro de 2012

JSPerf.com: Teste a performance de seu Javascript


Tem vez que a gente fica em dúvida se tal código é mais eficiente que outro (principalmente em linguagens interpretadas...).

Pensando nisso, um pessoal resolveu criar um site que testa código Javascript, chamado jsperf.com.

Muito bom! Dá para saber online, se um código é mais eficiente que outro em um determinado navegador (lembrando que os navegadores usam diferentes interpretadores javascript e cada um pode ter uma performance diferente da outra).

E o legal é que guarda os históricos dos testes feitos. :)

Para mais informações, entre no site http://jsperf.com/.

Se quiser ver os testes criados, vá em http://jsperf.com/browse

Até mais!

segunda-feira, 5 de novembro de 2012

Alguém já jogou: E.V.O.?


Um dia desses, me lembrei de um jogo para Super NES que vi na antiga revista "Ação Games", chamado E.V.O..

Na época, E.V.O. era um jogo revolucionário, pois contava a história de um ser (o jogador) que, escolhido pela deusa Gaia, deveria se desenvolver até tornar-se o mais inteligente e forte animal do mundo.

A evolução do "personagem" ocorria durante o gameplay, mas poucas pessoas conseguiam chegar ao final com a última espécie (a mais "evoluida") que existia: o homem.

Quem tiver oportunidade, vale a pena conhecer o jogo (nem que for só por curiosidade :P ).

Até mais!

domingo, 4 de novembro de 2012

O problema de Dileram


O problema de Dileram é um dos mais famosos problemas de xadrez que existem (de acordo com o Wikipédia). Este possui uma história interessante:

"O califa havia apostado sua esposa Dileram em um jogo de xadrez. Porém, em certo momento, vendo que o jogo não estava bom para o lado de seu marido, a esperta esposa deu uma dica em forma de súplica:

- Meu marido, entregue suas duas Torres mas não entregue Dileram.

Através disso, o califa percebeu as jogadas, e assim, foi possível vencer o jogo com apenas 5 movimentos.

E eles viveram felizes para sempre... :P"


A pergunta é, como o califa ganhou o jogo e qual foi a dica da Dileram?

Observação: A peça "Elefante" possue um movimento diferente da peça "Bispo". Ele anda em diagonal uma casa e pode pular a peça. Para uma melhor explicação, no site do Wikipedia: http://pt.wikipedia.org/wiki/Elefante_%28xadrez%29

Ops... Esqueci de dizer: as vermelhas começam e ganham :P

Clique aqui para ver a resposta

Até mais!

quarta-feira, 24 de outubro de 2012

Alguém se lembra: MotoMachine?


Alguém já ouviu falar na Gurgel?

Não? Então vale uma explicação: a Gurgel foi uma empresa que fabricava automóveis genuinamente brasileira (nasceu, cresceu e morreu aqui no Brasil), sendo que o carro mais famoso criado por eles era o chamado BR-800.

Quer saber mais sobre a Gurgel? A Wikipédia explica.

Num dia desses, me lembrei de uma Quatro Rodas (revista da Editora Abril, especializada em "automóveis") que tinha um artigo que falava de um carro desta fabricante que seria customizável, ou seja, você poderia comprar "partes" do carro e monta-lo como quisesse (como se fosse um Lego).

Este se chamaria MotoMachine.

Fazendo uma pesquisa na Internet, soube que este carro realmente "saiu". Porém a customização do "carrinho" ficou somente na capota (que era "removível" e "trocável" por outra) e somente acionistas da empresa poderiam comprá-lo.

Hum... Seria este um dos motivos da Gurgel ter falido? :P

Até mais!

quinta-feira, 18 de outubro de 2012

Crie jogos para Mega Drive!


Sei lá, mas quando eu era adolescente, escolhi informática como profissão pois queria saber fazer jogos (já comentei isso em algum lugar? :P ).

Hoje, até que consegui programar alguma coisa para games, não foi nenhum Halo ou God of War, mas pelo menos, matei a vontade. (claro que o código não esta aquelas coisas, porém o mais importante é que funciona... :P )

Voltando ao passado, eu só queria saber programar, por que era um gamemaníaco (existe esta expressão ainda?) que ficava fissurado em jogos do Master System e do Mega Drive (quando a Tec Toy era "o ó do borogodó" -- essa sim é uma expressão velha (quase idosa...)).

Naquela época, pensava comigo mesmo: "Um dia, vou fazer o jogo para Mega Drive".

Depois desses anos todos que se passaram, agora achei um jeito de desenvolver para o console.

Esta disponível um kit de desenvolvimento para criar jogos para Mega Drive/Genesis chamado SGDK:
http://code.google.com/p/sgdk/

Não sei se funciona, mas parece legal (pelo que li, não é tão difícil de programar, pelo menos, eu acho...)
Pena que não tenho a eprom e a "plaquinha" para gerar o cartucho... :P

Até mais!

terça-feira, 16 de outubro de 2012

Alguém se lembra: Xadrez Eletrônico?


Isso faz parte da minha infância (era 1984): eu vivia no comércio do Centro de Campinas e, de vez em quando, via na vitrine de uma loja de presentes um tabuleiro de xadrez eletrônico.



Naquela época, achava a coisa mais fantástica do mundo, pois as peças se mexiam sozinhas! (como eu tinha 7 anos, achava que era algum tipo de fantasma ou coisa parecida :P )

Agora sei que, na verdade, era só um imã que fazia as "jogadas"... (hum... me veio uma dúvida: como seria o "programa" da inteligência artificial dele???)

Até mais!

domingo, 14 de outubro de 2012

A jornada de uma andorinha

Uma andorinha, em sua primeira viagem de migração para o sul, se perdeu de seu bando. Triste, mas sabendo que não poderia parar, ela procurava um de seus semelhantes para lhe indicar o caminho.

Nesta, uma outra andorinha que também estava atrasada, passava por perto.

"Desculpe pelo incômodo cara amiga, mas você pode me indicar o caminho para o sul?" -- perguntou

Sua semelhante, que já havia feito várias viagens, sabendo que a jovem teria mais chances de acasalar quando chegasse lá, apontou para a direção contrária e disse:

"Siga esta direção, com certeza você chegará lá rapidamente".

"Obrigada! Muito obrigada!" -- agradeceu, feliz.

Com isso, o pássaro seguiu a rota indicada, porém, cada vez que seguia a viagem, mais frio este sentia.

De repente, uma coruja voava perto e, estranhando aquele pequeno ser naquele lugar, perguntou:

"O que o pequenino faz por estes lados?"

"Estou indo para o sul, a fim de perpetuar minha espécie..." -- respondeu a andorinha.

"Mas esta é a direção errada! Você não sente que esta cada vez mais frio e que a paisagem nesta região está cada vez mais desolada?" -- contestou a coruja.

"Não, você esta tentando me enganar! Foi um de meus semelhantes que me indicou este caminho..." -- falou com fúria o pequeninho.

"Esta certo... Tudo bem você não acreditar em mim, afinal, não sou de sua espécie... Mas pense um pouco: por que eu a enganaria? E você não sente como o ambiente esta estranho para ser a primavera do sul?" -- indagou a coruja.

Porém, ignorando os avisos da coruja e de seus instintos, o pássaro continuou seguindo sua jornada, acreditando fielmente no que sua prima disse.

E, depois disso, ela nunca mais foi vista pelas redondezas...

quinta-feira, 4 de outubro de 2012

Dicas de Programação: Desenhando na tela do Android

Esta foi um pedido de um colega meu.

Para os acostumados em "desenhar" pelo método paint do Java AWT/Swing, sabia que dá para "converter" este tipo de coisa para Android?

Para isso, o primeiro passo seria reescrever o método onDraw de uma View:

/**
 *Classe que herdar de android.view.View
 **/
public class DrawView extends View {

//Objeto de auxilio para desenhar
private Paint paint = new Paint();

/**
 *Construtor da classe
 *@param context Contexto da aplicação
 */
public DrawView(Context context) {
      super(context);
}

/**
 *Reescrevendo o método onDraw da View
 *@param canvas Objeto para "desenhar" na tela
 */
@Override
protected void onDraw(Canvas canvas) {
        //Chamando o método reescrito da "superclasse" (classe-pai)
super.onDraw(canvas);
        //Pintando a tela inteira de preto
canvas.drawColor(Color.BLACK);
        //Pintando um quadrado verde 50x50 na posição 100x100 deste objeto (view)
paint.setColor(Color.GREEN);
canvas.drawRect(100, 100, 150, 150, paint);
}
}

Agora, em sua Activity principal (classe que é executada pelo Android), basta adicionar a view que criamos para mostra-la na aplicação:

/**
 * Classe que herda de android.app.Activity
 */
public class MainActivity extends Activity {
 
/**
 *Reescrevendo o método onCreate da Activity (chamado no inicio da "atividade")
 *@param savedInstanceState Objeto que contém o último estado salvo.
 */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        //chamando o mesmo método da classe-pai ("superclasse")
        super.onCreate(savedInstanceState);
        //obtendo as propriedades da tela
        Display screen = getWindowManager().getDefaultDisplay();
        //criando a view principal
        DrawView drawView = new DrawView(getApplicationContext());
        //adicionando a view para ser mostrada em tela inteira
        addContentView(drawView, new LayoutParams(screen.getWidth(), screen.getHeight()));
    }
}

Se tudo funcionar bem, um quadrado verde aparecerá em seu sistema. :)

Até mais!

sábado, 29 de setembro de 2012

CocosBuilder: Criando interfaces para jogos


Para quem não sabe, Cocos2D é uma biblioteca gráfica que ajuda a criar jogos 2D (ela usa o OpenGL por trás dos panos).

Escrita inicialmente em Python, hoje esta é mais famosa pelo "port" feito em Objective-C para iOS.

Apesar da facilidade de usar a biblioteca (muito mais fácil que usar o OpenGL "puro"), fica difícil saber, via programação, como uma tela pode ficar (além de "perder" tempo ajustando posicionamento e resolução...).

Pensando nisso, algumas pessoas criaram uma ferramenta que auxilia a "moldar" a interface de um jogo feito com Cocos2D, chamada CocosBuilder.

Parece bem legal, ainda mais para quem esta começando agora (que é o meu caso :P).

Para mais informações, no site:
http://cocosbuilder.com/

Obs.: Parece que existe um "port" para AndEngine (que é similar ao Cocos2D, só que para Android) para suporte ao CocosBuilder:
http://www.andengine.org/blog/2012/06/andengine-cocosbuilderextension/

Obrigado Gui, pela dica! :)

Até mais!

quarta-feira, 26 de setembro de 2012

Planejamento e Construção


De tempos em tempos, eu acho que confundo "falta de planejamento" com "metodologia ágil"...

Por várias vezes, me peguei pensando:

"Para que planejar/explicar/escrever estas coisas no quadro, vamos é trabalhar!" (neste caso, o sinônimo de trabalhar é "programar")

"Para que criar uma arquitetura? O sistema é simples!" (seria simples, se o sistema não fosse distribuído, não tivesse que manter as informações no mainframe e que um dos requisitos não funcionais seria a performance...)

"O escopo desta história esta fechado." (na verdade, deu o maior sono na reunião de planejamento...)

"Hum... Acho que poderiamos fazer isso um pouco diferente..." (uma pequena observação nesta frase: em 90% dos casos, vá por mim: é melhor não fazer "diferente")

"Acho que o cliente vai gostar dessa modificação!" (nesta, pelo menos uns 80% dos clientes não vão gostar das modificações que você faz, principalmente por não consulta-los antes...)

"Poderiamos discutir isso mais tarde..." (no final, não discutimos nada :( )

"Para que planejar testes (unitários/regressivos/funcionais/exploratórios), eu sempre faço as coisas direito!" (essa é pura prepotência minha, afinal sou humano e como umano, herro -- pelo menos, um humano normal erra :) )

"Vamos cortar os testes para dar mais tempo de implementar" (tá, e a qualidade, ó!)

"Vou deixar esse prá lá, que este é fácil de alterar" (é, se não tivesse que alterar o pedaço em 1000 linhas de código que você copiou e colou por toda parte...)

"Vou deixar esse prá lá, que este vai tomar tempo" (acabei de perceber que frases que começam com "Vou deixar..." são bem perigosas... :P )

Preciso parar de pensar que um projeto de informática é só codificação. Ele é muito mais do que código: é um conjunto de conhecimentos e idéias (e de sonhos, talvez :) ) de várias pessoas que participam direta ou indiretamente de minha equipe.

Só uma observação ao meus "leitores":  Também não menospreze a codificação, pois esta ainda é a "realização" de tal "sonho/idéia/conhecimento". :P

Continuo errando e aprendendo...

Até mais!

sábado, 22 de setembro de 2012

Alguém se lembra da Coleção Vagalume?


Com tantas coisas inovadoras no mundo (tipo: computador, internet, blog, MSN, Facebook, Twitter, Orkut (será que alguém usa isso?), etc), algumas vezes eu sinto saudades daquele tempo em que, a coisa mais legal da aula de Português, era escolher um livro da biblioteca para ler.

Principalmente um livro da série Vaga-Lume da editora Ática!

Da minha época, acho que 90% dos alunos leram pelo menos um livro desta série (isso não é estimativa não, é "chutomêtro" mesmo :P).

E um dos autores que eu mais gostava era do Marcos Rey (já falecido, em 1999), que escreveu "O Rapto do Garoto de Ouro", "Garra de Campeão", "Enigma na Televisão", "Um Cadáver Ouve Rádio" e o "Mistério dos Cinco Estrelas".

Falando nestes dois últimos, parece que eles vão virar filme, de acordo com o site Omelete:

Obs.: Se estes filmes ficarão bons, só o tempo dirá, mas, pelo menos, a estória (que eu me lembre) é boa. :)

Até mais!

quinta-feira, 20 de setembro de 2012

O Poder da Fé


Se alguém pensou que eu vou falar sobre religião, pode deixar o santo em paz, pois não é nada disso (santo -> religião, entenderam a pegadinha?  hum... essa foi a coisa mais tosca que escrevi... :P).

Estava lendo um artigo de uma revista (Old! Gamer, que trata de jogos antigos) onde falava sobre o acessório Activator do Mega Drive (ou Sega Genesis, dependendo do lugar que você mora).

Para quem não sabe, o Activator é um dispositivo que detectava os "movimentos" dos jogadores e passava estes "comandos" ao console...

Hum... De onde será que vi isso? :P

Mas, ao contrário dos consoles atuais, este foi um dos acessórios do Mega Drive que menos venderam (vendeu até menos que o fatídico 32X -- este, um outro dispositivo que incrementava o console, tornando-o "32 bits").

Como será que, na época, não deu certo e agora, nos tempos atuais, só se "fala" nesta tal de interatividade?

Obs.: Até comentei um assunto parecido em um outro post (Quer ver? Clique aqui! :) ).

Em uma parte da revista dizia, mais ou menos assim, sobre o fracasso do acessório: "as pessoas dentro da própria equipe (ou empresa) não acreditavam naquele produto (Activator)".

Será que ter fé no que você e sua equipe faz, realmente move montanhas?

Ou será que rezar para São Judas Tadeu (o Santo das Causas Perdidas) dá mais resultado?

Obs. 2: No meu caso, estou rezando para Santa Edwiges (Padroeira dos Endividados) que tenho um monte de contas a pagar... (quem pensou que blog da dinheiro, pode ir desistindo -- ou tenha bastante fé, pois quem sabe um dia... :P)

Até mais!

segunda-feira, 17 de setembro de 2012

Alguém se lembra de Robotech?


Pois é, o meu primeiro OVA (que na época, eu nem sabia que era isso...) que vi no video-cassete (Panasonic G-21) foi Codinome: Robotech.

O filme resumia a estória do anime através das memórias do diário do capitão da nave, que voltava a Terra depois de vários anos.

O OVA foi bem executado para época, com muita ação, romance e muitos batalhas.

Para quem é fã de desenhos japoneses e gosta de guerra intergaláctica é um prato cheio (mesmo que o filme seja de 1986).



Obs.: Meio bizarro eu lembrar disso, mas acho que existia uma cantora chamada Mina na nave. :)

Até mais!

quarta-feira, 12 de setembro de 2012

Escola Aberta - COTUCA


No dia 15/09/2012 (se nada ocorrer até lá...) vai ter escola aberta no COTUCA (Colégio Técnico de Campinas).

Para quem não sabe, "escola aberta" é quando a escola abre ao público para mostrar quais as atividades, como são e o que fazem os cursos que nela são administrados.

Para mais informações, no site oficial do COTUCA:
http://www2.cotuca.unicamp.br/

Até mais!

terça-feira, 4 de setembro de 2012

Gorilla.bas

Alguém já teve um MS-Windows NT 4.0 instalado em um Pentium 100 Mhz?
Eu não! :(

Na época, eu me lembro que tinha um 486 DX 2 66 Mhz (vinha com um botão de turbo, que se você não "ligasse", o clock ficava entre 40Mhz). :P

Mas, para os felizardos que possuíam esta "super-máquina", o NT 4.0 vinha com um bônus a mais para os desenvolvedores de plantão.

Um ambiente de desenvolvimento para linguagem BASIC chamado QBASIC:


Uau! Era uma tela azul com umas bordas feitas caracteres (não tinha autocomplete) e um menu com algumas opções.

Mas, o mais legal (e que pouca gente sabe), é que ele vinha com o código-fonte de um jogo chamado "Gorilla":


Putz, um jogo em BASIC (e eu, tentando aprender C/C++... :P)

Quem quiser, o código-fonte esta disponível em:
http://hem.passagen.se/hedsen/prg/games/gorilla.bas
O QBasic pode rodar no DOSBox:
http://www.dosbox.com/
O problema é o download do QBasic, que já não é mais suportado pela Microsoft...

Mas, se alguém quiser, existe uma conversão do código-fonte para Python:
http://inventwithpython.com/blog/2010/06/25/gorilla-py-a-remake-of-gorilla-bas/

Até mais!

domingo, 2 de setembro de 2012

Críticas e Soluções


Esta semana, eu vi uma coisa interessante no site do Kibeloco (http://www.kibeloco.com.br) que me deixou pensativo...

Uma crítica humorada com o sistema de atendimento de restaurantes do tipo "escolha seus ingredientes" feita pelo pessoal da Porta dos Fundos (http://www.youtube.com/portadosfundos).

A rede de restaurantes Spoleto (que possui tal sistema) provavelmente viu o vídeo no Youtube (que já possuía vários acessos) e resolveu...

Resolveu patrocinar o pessoal da Porta dos Fundos e ainda encomendou um outro vídeo para eles! :)

A sacada foi tão boa, que em vez de gerar críticas negativas contra a rede de restaurantes, fez com que ela saísse "bem na fita", com a mídia especializada aplaudindo a "virada de marketing" da empresa.

Parabéns ao pessoal da Spoleto (http://www.spoleto.com.br/), que viu em uma crítica, uma maneira de virar a situação a seu favor. :)

Isso me faz lembrar que eu preciso também "ouvir" as críticas e atuar em cima (e não ficar reclamando/criticando de quem as fez... :P ).

Quem sabe, também não dou uma virada em minha vida? ;)

Ah... Os links dos vídeos:
A crítica:
http://www.youtube.com/watch?v=Un4r52t-cuk&feature=player_embedded
A resposta:
http://www.youtube.com/watch?v=ebe-3s4TLfQ&feature=player_embedded

Até mais!

Construindo jogos Atari com CreateJS


Dica de um colega meu.

Muito se fala em HTML5, principalmente em Canvas, para criação de jogos.

E pensando nisso, a Atari (sim, aquela empresa que criou o primeiro video-game que todo mundo queria em 1984, e que custava os olhos da cara para a maioria dos brasileiros -- inclusive para mim...) criou um tutorial de boas práticas para desenvolvimento de jogos com o framework CreateJS (em inglês):
http://www.atari.com/arcade/developers/building-atari-createjs

Muito legal! Este artigo explica muito bem várias coisas e dá muito exemplos. :)

Valeu Giuliano!

Até mais!

segunda-feira, 27 de agosto de 2012

Leak Finder - Javascript


Sabia que o Javascript dá vazamento de memória?
Pois é, eu não sabia até agora... (e nem me preocupava com isso...) :P

Mas, um colega meu passou um link de um artigo que fala sobre isso e uma nova ferramenta para descobrir este tipo de problema:
http://google-opensource.blogspot.com.br/2012/08/leak-finder-new-tool-for-javascript.html

Muito legal! Principalmente para quem faz ou esta fazendo sites para dispositivos móveis (onde o recurso de memória é um pouco mais escasso...).

Valeu pela dica, Morilha!

Até mais!

quarta-feira, 22 de agosto de 2012

A árvore e o pássaro


Certo dia, uma árvore, que vivia sozinha por várias primaveras, foi visitada por um pássaro.
- Boa tarde! -- cumprimentou ele -- Como andam as coisas nestas terras?
- Tudo na mesma tranquilidade -- respondeu a árvore -- As coisas aqui mudam pouco: o Sol é o mesmo, a Lua também, até a chuva vem aqui em tempos regulares... E você, que vive sua liberdade? O que já viu neste mundo?
- Muita coisa! -- respondeu o pássaro -- Vi culturas diferentes, vi belas construções e comi variadas refeições, mas também já vi guerras e mortes... 
- Interessante! -- exclamou a planta -- Conte-me mais.
E assim, por um dia inteiro, a ave contou suas aventuras que viveu em sua passagem pelo mundo. A árvore ficou admirada com tantas maravilhas que aquele pequeno ser participou.
- Meu amigo, venha visitar toda vez que passar por estas bandas -- falou a árvore -- para que você possa me atualizar das coisas que acontece neste mundo.
- Por que não faz você mesma? -- indagou o pássaro -- Ao vivo, tudo isso é muito mais belo!
- Como pode ver, não tenho como sair daqui -- respondeu triste -- tenho certas restrições e não posso viajar como você...
- Esta certo... Então venho visitá-la uma vez ao ano, neste mesmo dia!
- Perfeito, estarei esperando ansiosamente! -- falou feliz, a árvore. 
E, cumprido com a promessa feita, o pássaro visitou por vários anos a sua amiga, contando sempre as suas novidades...
Até que um dia, ele, que já sofria com os anos vividos, falou para a grande planta:
- Acredito que esta seja minha última visita...
- Por que? -- indagou ela.
- Por causa que estou velho... O tempo passou rápido para mim, velha amiga. Mas vejo que não passou tanto a você, continua tão bela e formosa como quando nos encontramos...
- Sim, eu sei como você esta cansado... Mas por que tem que ser assim?
E, com o ar daqueles que viveram plenamente, o pássaro respondeu:
- Por que é assim que deve ser...
E assim, ele partiu para sua viagem final e se despediu da árvore pela última vez...

quinta-feira, 9 de agosto de 2012

Ouya: Console Open-Source?


Alguém já ouviu falar no Ouya?

Não? Eu também não, mas um dia eu vi um vídeo do Guilherme Gamer falando do console e resolvi dar uma olhada...

E me surpreendi com o que vi: um console open-source, rodando um Android 4.0, com um belo design, um hardware razoável e um preço convidativo (US$99,00).
Pelo vídeo de apresentação dele, parece muito promissor. :)

Tanto parece promissor, que quando eles pediram doações para as pessoas (para investimentos no console), conseguiram um total de US$ 8.596.475,00 (e eles precisavam de US$950.000,00!).

E isso parece só o começo, empresas como Square Enix e a Bandai Namco já anunciaram que irão lançar jogos para o console.

Quem quiser saber mais sobre o console, pode ir ao site:
http://www.ouya.tv/

A Wikipédia também apresenta várias informações:
http://pt.wikipedia.org/wiki/Ouya

O site da arrecadação, pelo que consta:
http://www.kickstarter.com/projects/ouya/ouya-a-new-kind-of-video-game-console

A previsão de lançamento é entre Março/Abril de 2013.

É esperar para ver. :)

Até mais!

quinta-feira, 2 de agosto de 2012

JMonkeyEngine: ferramentas 3D para Java


JMonkeyEngine é um conjunto de ferramentas e bibliotecas feitas em Java para manipulação de objetos 3D. Ele é open-source e usa a biblioteca OpenGL.

Para mais informações, no site oficial:
http://jmonkeyengine.com/

A versão disponível, esta em beta (ou seja, ainda não é a definitiva...). :P

E existe um tutorial para suporte no Android:
http://jmonkeyengine.org/wiki/doku.php/jme3:android

Para quem quer começar a criar jogos 3D e ama Java é uma boa pedida. ;)

Até mais!


segunda-feira, 30 de julho de 2012

Slender - The Game


Descobri um jogo através do canal Ze Graça Games no YouTube chamado Slender.

Pelos vídeos, parece bem simples, mas dá algum medo... :P

O objetivo do jogo é recuperar 8 páginas de um caderno sem que a criatura (chamada Slender) te pegue...

Para mais informações no site oficial:
http://www.parsecproductions.net/slender/

Ou no fansite do jogo:
http://slendergame.com/

Ah, só para citar, o jogo foi feito com a engine Unity 3D e, por enquanto, a versão 0.9.5 (beta) esta de graça para MacOSX e MS-Windows.

Bons sustos e até mais!

quinta-feira, 26 de julho de 2012

Xadrez + Card Game = Knightmare Chess


Para os "nerds" de plantão:

Já pensou se juntassem o jogo de xadrez com um jogo de cartas (do tipo Magic)?

Pois é, e não é que imaginaram isso! :)

Knightmare Chess é um jogo de xadrez que usa cartas feito pela Steve Jackson Games (a mesma produtora de GURPS).

Nunca joguei, mas pelo que pesquisei na Internet, as regras parecem um tanto "caóticas" (seja o que isso quer dizer...).

Para maiores informações, no site da Steve Jackson:
http://www.sjgames.com/knightmare/

Ou na Wikipédia:
http://en.wikipedia.org/wiki/Knightmare_Chess

Obs.: O jogo não é recente (foi lançado em 1996).
Obs.2: Não tenho certeza, mas acho que não tem versão em português... :(

Até mais!

terça-feira, 17 de julho de 2012

Drag'n Drop de elementos gráficos (Java-AWT)

Um rapaz me perguntou como seria fazer um drag'n drop (na mão) de um elemento gráfico em uma tela.
Então resolvi postar uma resposta aqui no blog. :)
Como ele não especificou a linguagem, vou fazer em Java/AWT (será que alguém ainda usa isso?!? :P ), que foi a linguagem que mais trabalhei nos últimos 10 anos...

Primeiramente, vamos criar uma janela de tamanho fixo (no caso, 300x300):

//Herda de Frame (Janela)
public class MainClass extends Frame {

    //Construtor da classe
    public MainClass() {
        //Tamanho da janela
        this.setSize(300, 300);
        //Título da janela
        this.setTitle("Exemplo Gráfico");
    }

    //Método principal que inicia a aplicação
    public static void main(String arg[]) {
        //Instância o objeto
        MainClass main = new MainClass();
        //Exibe a tela
        main.setVisible(true);
    }
}

Para evitar que a janela fique "ad-eterno" na tela, mesmo clicando no "X", vamos implementar a função de fechar da janela em seu construtor:

...
    //Construtor da classe
    public MainClass() {
         ...
         //"Escutador" de eventos de janela
         this.addWindowListener(new WindowAdapter() {
             //Método que é executado quando o usuário clicar no botão de fechar da janela (ou algum evento que tenha a mesma funcionalidade, como o Ctrl+X no MS-Windows)
            @Override
            public void windowClosing(WindowEvent e) {
                //Encerra a aplicação
                System.exit(0);
            }
        });
        ...    
    }

...

Legal, temos uma janela feita em Java! :)

Vamos para o segundo passo: criamos um objeto gráfico (neste caso, um retângulo) como uma propriedade da classe e instanciamos esta em seu construtor:

public class MainClass extends Frame {
    private Rectangle rect;
    ...
    public MainClass() {
          ...
          //Retângulo a ser desenhado
          rect = new Rectangle(50, 50, 60, 30);
          ...
    }
    ...
}

E agora vamos desenhar este retângulo na tela, reescrevendo os métodos paint e update:

...

   //Para evitar o "pisca-pisca" (efeito de blink) da tela
    @Override
    public void update(Graphics g) {
        this.paint(g);
    }
   
    //Desenha um retângulo vermelho em um fundo preto (retângulo do tamanho da tela)
    @Override
    public void paint(Graphics g) {
        //Pinta a tela de preto
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        //Pinta um retângulo vermelho
        g.setColor(Color.RED);
        g.fillRect((int)rect.getX(), (int)rect.getY(),
                (int)rect.getWidth(), (int)rect.getHeight());
    }
...


Executamos e temos um retângulo vermelho em um fundo preto (eu já disse isso em algum lugar?). :)

Nesta terceira etapa, precisamos identificar os eventos de drag'n drop, que são (eu acho...):
1) O evento de botão do mouse pressionado para obter o efeito de "pegar" o retângulo;
2) O evento de soltar o botão do mouse para obter o efeito de "largar" o retângulo;
3)  E o evento de movimento do mouse, para que o retângulo acompanhe o "ponteiro" do mouse enquanto ele não for solto;

Com isso, a classe vai ficar mais ou menos assim:


import java.awt.*;
import java.awt.event.*;


//Herda de Frame (Janela)
public class MainClass extends Frame {

    //Retângulo a ser desenhado
    private Rectangle rect;
    //Flag que indica se o objeto esta sendo "arrastado"
    private boolean elementDragged;
    //Ponto (x,y) da tela onde o ponteiro do mouse estava inicialmente
    private Point initial;
 
    //Construtor da classe  
    public MainClass() {
        //Retângulo a ser desenhado
        rect = new Rectangle(50, 50, 50, 50);
        //Tamanho da janela
        this.setSize(300, 300);
        //Título da Janela
        this.setTitle("Exemplo Gráfico");
        this.addEventListener();
    }
   
     //Método privado que adiciona os eventos
    private void addEventListener() {
        //"Escutador" de eventos de janela
        this.addWindowListener(new WindowAdapter() {
             //Método que é executado quando o usuário clicar no botão de fechar da janela (ou algum evento que tenha a mesma funcionalidade, como o Ctrl+X no MS-Windows)
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        //"Escutador" de eventos do mouse
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                mousePressedEvent(e);
            }           
            @Override
            public void mouseReleased(MouseEvent e) {
                mouseReleasedEvent(e);
            }
        });
        //"Escutador" de eventos de movimento do mouse
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mouseDraggedEvent(e);
            }
        });
    }
   
    //Quando o botão do mouse é pressionado, este método é executado
    private void mousePressedEvent(MouseEvent e) {
        //Se o ponteiro do mouse esta dentro do retângulo...
        if (rect.contains(e.getPoint())) {
            //Obtenho o ponto inicial do ponteiro do mouse
            initial = new Point((int)(e.getPoint().getX() - rect.getX()),
                    (int)(e.getPoint().getY() - rect.getY()));
            //E digo que o retângulo pode ser "arrastado"
            elementDragged = true;
        }       
    }
   
    //Quando o mouse é "arrastado", este método é executado
    private void mouseDraggedEvent(MouseEvent e) {
        //Se o retângulo pode ser "arrastado"
        if (elementDragged) {
            //Faço ele movimentar-se de acordo com a posição do ponteiro do mouse
            rect.setLocation((int)((e.getPoint().getX() - initial.getX())),
                    (int)(e.getPoint().getY() - initial.getY()));
            //Redesenho a tela
            this.repaint();
        }
    }           
 
   //Quando o botão do mouse é "solto", este método é executado
    public void mouseReleasedEvent(MouseEvent e) {
        //Digo que o retângulo não esta mais "arrastavel"
        elementDragged = false;
        //E "zero" a posição inicial
        initial = null;
    }
   
    //Para evitar o "pisca-pisca" (efeito de blink) da tela
    @Override
    public void update(Graphics g) {
        this.paint(g);
    }
   
     //Desenha um retângulo vermelho em um fundo preto (retângulo do tamanho da tela)
    @Override
    public void paint(Graphics g) {
        //Pinta a tela de preto
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        //Pinta um retângulo vermelho
        g.setColor(Color.RED);
        g.fillRect((int)rect.getX(), (int)rect.getY(),
                (int)rect.getWidth(), (int)rect.getHeight());
    }
 
    //Método principal que inicia a aplicação (tudo começa aqui... :) )
    public static void main(String arg[]) {
        //Instância a classe
        MainClass main = new MainClass();
        //Exibe a tela
        main.setVisible(true);
    }
}

Parece que funciona... (eu testei no MacOSX 10.7.4, com o JDK 1.6.0_33)

Até mais!

segunda-feira, 9 de julho de 2012

Python para IOS


Para quem não sabe, Python é uma linguagem de programação interpretada onde sua característica principal é distinguir blocos de execução através de indentação.

Se você não entendeu a explicação, a Wikipédia pode te ajudar. :P

Mas até ai, tudo bem. A linguagem até que é famosa e nem estou falando nada que a maioria dos programadores sabe...

O que me surpreendeu, foi saber que alguém teve a idéia de criar um interpretador Python para iOS:

http://pythonforios.com/

E que a Apple liberou esta aplicação na App Store (ou seja, não usa um JailBreak)!

Até mais!

segunda-feira, 25 de junho de 2012

Curiosidade: Qual o primeiro jogo que teve uma música cantada?

Por incrível que pareça, o jogo que eu "conheci" que teve a primeira música cantada, vem antes da invenção do CD (Nota: descobri que o CD foi inventado em 1979! Então, desconsiderem a burrada que eu escrevi :P ).
Ele se chama "Psycho Soldier" da antiga SNK e foi lançado em 1987!



Os fãs de "The King of Fighters" devem reconhecer a música do estágio do time da Athena de 94 e 96 (sim, é a mesma personagem :) ).

Faya, faya, saiko soruja! (e pior de tudo, acho que isso não é japonês, pois ela quis dizer: "Fire, fire, psycho soldier!") :P

Até mais!

terça-feira, 19 de junho de 2012

O jogo mais difícil que já joguei!

Lembrando de minha adolescência, recordei do jogo mais difícil que já joguei para Mega Drive. Ele se chama "Shadow of the Beast":



O jogo tinha uma vida (a que você esta usando), nenhum continue e somente 12 pontos de "life" (ou seja, com 12 acertos você já era...).

Este jogo era muito mais difícil que "Ghouls'n Ghosts" e o "Comix Zone" juntos (e olha que eu já joguei este dois).

Para quem gosta de desafios, este é o jogo. :)

Obs.: Dizem que a versão americana (a que eu tinha) era muito mais difícil que a japonesa, pois a velocidade do jogo é diferente (parece que tinha a ver com o sistema de cores e freqüência).

Para mais informações, no Wikipédia:
http://en.wikipedia.org/wiki/Shadow_of_the_Beast

E, se quiser experimentar, você pode usar o emulador Kega e tentar baixar a ROM.

Até mais!

domingo, 17 de junho de 2012

Os 7 pecados

Em uma jantar de família, os sete pecados estavam jogando conversa fora, quando a Vaidade perguntou, em voz alta, a todos:
- Que tal decidirmos quem é o líder da nossa família?
Todos concordaram, menos a Gula que continuava comendo e não se manifestou.
Ignorando a "não resposta" da Gula, Ira foi a primeira falar (mais necessariamente, a gritar):
- Sou eu a lider dessa porcaria, pois  eu que causo todos os males para o homem. Sou eu que causo estresse, parada cardíaca, obesidade... Sou eu que faço as pessoas brigarem por suas tolas futilidades e eu que trago as guerras e o caos.
E Gula, continuava comendo... Deixando a Ira mais furiosa do que comumente...
- Deixa disso, irmã -- disse a Ganância -- Eu sou a líder dessa família.
- Por que?!? -- perguntou a Ira -- Você nunca fez nada para a humanidade!
- Como assim? -- resmungou em resposta -- Sou eu a quem as pessoas mais ricas e poderosas procuram, é a mim que cada pessoa do mundo pede para sair do "buraco", é a mim que todos recorrem para conseguir o que desejam e nunca conseguem, pois nunca estão satisfeitas com nada.
E isso deu mais discussão entre os membros da família, menos a Gula que continuava comendo:
- Espera aí... -- sussurrou a Preguiça -- eu... sou... importante... pois... sem... mim... as... pessoas... não... relaxariaaaaaam.... ZZZZ...
- Dormiu de novo! -- exclamou a Avareza -- Mas, voltando ao assunto, quem deveria ser a líder sou eu, pois sem mim, a pobreza e a fome, que são os maiores problemas do mundo, nem existiriam...
- Espera um pouco -- falou Vaidade, com um certo ar de arrogância -- Eu que comecei toda esta discussão, nada mais justo que eu seja a líder!
- Quem deveria ser a líder sou eu, pois vocês só trazem desgraças aos humanos, e eu, ao contrário, trago satisfação e prazer... -- interrompeu a Luxúria.
E assim foi toda a noite, até que seis dos sete irmãos sentiram fome... E acabaram vendo que a Gula, que se omitira da discussão, havia comido tudo...

quinta-feira, 14 de junho de 2012

Alguém já jogou Star Wars Chess?

Essa é para aqueles que viveram o início da década de 90. :)

Não sei se vocês sabem, mas existiu um jogo de xadrez para o DOS e para Sega-CD chamado Star Wars Chess:



Vendo agora este vídeo, percebi o quanto o jogo era meio "tosco". :P

Sei lá, o Dark Side de Dama no Xadrez soa meio estranho...

Mas, o importante, é que juntaram duas coisas que eu gostava (e acho que a maioria dos nerds gosta): Star Wars + Xadrez.

Quem quiser dar uma olhada, pode usar emuladores como o Gens (Sega-CD) ou o DOSBox e baixar a ISO.

Até mais!

quarta-feira, 13 de junho de 2012

Tutorial - Parte 5 - Fazendo um Genius em PhoneGAP

Agora é a última parte. :)

Para iOS:

- No arquivo zipado do PhoneGap, vá na pasta lib/ios e execute o arquivo "Cordova-X.X.X.dmg";
- Clique duas vezes (ou uma vez, dependendo de como seu Mac esteja configurado...) no item "Cordova-X.X.X.pkg";
- Clique nos botões "Next" (ou "Continuar"), até que finalize a instalação (quando o botão exibido é o "Close" (ou "Fechar"));
- Clique no botão "Close" (ou "Fechar");
- Abra o "Xcode";
- Clique no item "Create a new Xcode project";


- Escolha o template "Cordova-based Application";
- Preencha os campos, retire o "check" "Use Automatic Reference Counting" (na versão 1.7 do Cordova ainda não tinha suporte...) e finalize (clique no botão "Next");
- Vá para a pasta www do projeto criado;
- Copie ou crie o arquivo html de sua aplicação na pasta www e renomeie para index.html (se já existir um, remova-o e coloque o seu);
- Clique no menu "File"->"Add Files to <Projeto>" do Xcode;
- Selecione a pasta www, selecione o item "Create folder references for any added folders" e clique no botão "Add";
- No Xcode, selecione o projeto/dispositivo a ser rodado e clique no botão "Run";

Se tudo der certo, a aplicação aparecerá assim:


Uia, iguar quenhem a otra! :)

E, finalmente, terminamos o tutorial...

Obs.: Eu dei uma arrumada nas outras partes do tutorial (isso que dá fazer sem testar...), agora deve estar tudo certo para que este pequeno jogo funcione. :P

Desculpem pelas mancadas!

Até mais!

terça-feira, 12 de junho de 2012

Tutorial - Parte 4 - Fazendo um Genius em PhoneGAP

Vamos instalar a nossa aplicação?
- Primeiro, baixe o PhoneGap: http://phonegap.com/download;
- Expanda o arquivo zip;

Para Android:
- Abra o Eclipse e crie um novo projeto Android (selecione a versão 2.2 do Android);
- Crie em seu projeto no Eclipse, as pastas libs e assets/www;
- Jogue na pasta libs o arquivo cordova-X.X.X.jar do diretorio /lib/android que esta dentro do zip;
- Jogue no pasta assets/www o arquivo cordova-X.X.X.js do  diretorio /lib/android que esta dentro do zip;
- Clique com o botão direito no projeto (Eclipse) e vá em Properties;


- Nos itens a esquerda, vá para o item "Java Build Path";
- Na aba "Libraries", adicione o arquivo cordova-X.X.X.jar da pasta libs (interno do projeto);
- Agora, abra o arquivo "AndroidManifest.xml" em um editor (pode ser no Eclipse mesmo) e adicione as seguintes linhas entre as tags "uses-sdk" e "application":

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />

- E na tag "activity" adicione as seguintes propriedades (dentro da tag):

            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden"

- Agora abra a classe <Nome_do_Projeto>Activity (deve ser a única na pasta src) e mude ela para extender de DroidGap e use o método loadUrl no onCreate de sua classe:

package org.toolbox.game.genius;

import org.apache.cordova.DroidGap;

import android.os.Bundle;

public class <Nome_do_Projeto>Activity extends DroidGap {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.loadUrl("file:///android_asset/www/index.html");
    }
}

- Crie ou coloque o arquivo html da aplicação que a gente criou (no caso, o nosso genius) na pasta assets/www e renomeie para index.html (caso este não se chame assim);
- Se você criou um javascript separado, coloque nesta pasta (se ele estiver em outra pasta, coloque ele dentro da mesma hierarquia, ou seja, coloque a pasta completa :) );
- Clique no menu "Window"-> "AVD Manager"


- Crie um emulador, clicando no botão "New" (se já não existir), coloque um nome para este "dispositivo" e escolha em "Target" o valor "Android 2.2 - API Level 8";
- Clique no botão "Create AVD";
- Selecione o projeto no "Package Explorer" e clique no item "Run"->"Run" do menu principal;
- Selecione o item "Android Application" e clique no botão "Ok";

Se der certo, ele abrirá o simulador (agora, você deve esperar um bom tempo...) e aparecerá esta tela:


Legal, não?
O próximo passo é instalar no iOS e, com isso, será o fim de nosso tutorial! :)


segunda-feira, 11 de junho de 2012

Tutorial - Parte 3 - Fazendo um Genius em PhoneGAP

Terceira parte, e vamos que vamos! :)

Depois que a seqüência é exibida, precisamos obter os itens (cores) que o usuário digitar. Para isso, vamos mexer na função swithOnLight():

/**
* 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 os botões para que o usuário possa digitar a seqüência de cores
index = 0;
alert('Sua vez!');
for (var i = 0; i < 4; i++) {
var el = document.getElementById('genius[' + parseInt(i % 2) + '][' + parseInt(i / 2) + ']');
if (typeof(el.ontouchstart)!='undefined') {
el.ontouchstart = play;
} else if (typeof(el.onclick)!='undefined') {
el.onclick = play;
}
}    
}
}

Agora, precisamos verificar se a seqüência que o usuário digitar é válida através da função play:

/**
* Função do evento de click de um dos botões de cores
*/
function play(event) {
   var el = event.srcElement;
        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;
        setTimeout(function() {
            //Verifico se o que o usuário clicou esta correto na seqüência guardada
if (el.id == 'genius[' + sequence[index].x + '][' + sequence[index].y + ']') {
//Se sim passo para o próximo item da seqüência
index++;
//Se for o último item é por que a seqüência esta correta e completa.
if (sequence.length == index) {
alert('Seqüência correta!');
//Desabilito os botões de cores (Removo os eventos)
for (var i = 0; i < 4; i++) {
var btnCores = document.getElementById('genius[' + parseInt(i % 2) + '][' + parseInt(i / 2) + ']');
if (typeof(btnCores.ontouchstart)!='undefined') {
btnCores.ontouchstart = null;
} else if (typeof(el.onclick)!='undefined') {
btnCores.onclick = null;
}
}
//Habilito o botão de Start!
btnStart.disabled = false;
}
} else {
   //Senão, ele errou e deve fazer a seqüência tudo de novo
index = 0;
alert('Errou! Tente de novo!');
}
       //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;
}, 500);
}

Ufa..., agora só falta instalar o PhoneGap para Android ou para iOS (e isso vai ser feito no próximo tutorial) :)

Até mais!

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!