sexta-feira, 23 de dezembro de 2011

Feliz Natal e um Prospero Ano Novo (2011)


Pessoal,

Desta vez vou pedir desculpas, estava muito enrolado com alguns problemas e não deu para enviar aquele "spam" padrão de Feliz Natal e Próspero Ano Novo á todos...

Então, agora, estou escrevendo este post. :)

Vamos lá!

A turma da EEPG Orosimbo Maia (vulgo, Zimbão), de 1984 a 1991, principalmente ao Jefferson, ao Marcelo, ao Denis, ao Peterline, a Luciana e a Márcia, um grande Natal e um Ano Novo com muitas realizações pessoais e profissionais (saudades de vocês). :)

Ao pessoal do EESG Culto á Ciência, noturno e diurno, de 1992 á 1994. Passamos por muitas dificuldades, mas espero que vocês estejam bem!

A turma de Análise de Sistemas da PUCCAMP (1995) do noturno, foi com vocês que aprendi a programar. :D

Ao pessoal de Informática Noturno do COTUCA (de 1999 a 2000). A Suzi, a Edilene, ao Márcio, ao Perna, ao Denilson, ao Zé Maria, ao Mário, ao Gilson, ao Ielon, ao Wander, a Marly e a Giane. Vocês sabem que tenho um carinho enorme por todos e sinto muito orgulho desta turma.

A turma de Análise de Sistemas da PUCCAMP (2001) do noturno, principalmente a "minha" equipe: Diego, Saulo e Sérgio, finalmente nós concluímos o curso!

Ao pessoal da Especialização de OO da Unicamp (2005), foi uma dura batalha acordar no Sábado de manhã, mas valeu a pena conhece-los.

E a todos os professores que me ajudaram a me formar, meu muito obrigado. :)

Agora, do trabalho:

Ao pessoal do boteco (não, não sou tão bebum assim, e sim, fui filho do dono do bar...), onde foi meu primeiro emprego (dava uma canseira, mas valeu!).

A turma da Sonda (meu primeiro emprego como programador), principalmente para a Suzi, a Carol, a Fer, a Andrezza, ao Luciano e ao Igor, que apoiaram este programador júnior que só estava começando.

Ao pessoal do Yahoo! Brasil, especial para a equipe do Search: Fabio, Pater, Castilho e Morilha, foram momentos divertidos aí dentro! Aprendi demais com vocês.

A turma da Dextra, que me deu oportunidade de voltar a minha cidade, agradeço à vocês.

E ao pessoal da Ci&T, para todas as pessoas de todos os projetos que eu participei (são muitos e não dá para citar a todos...:P).

De novo, um Feliz Natal a todos vocês e um Ano Novo repleto de realizaçőes!

Até o ano que vêm!

Obs.: E desculpem mesmo por não ter enviado os "spams"... Ano que vêm, vou tirar férias no fim do ano, só para fazer isso...
E ao pessoal que não citei o nome, desculpem... É que é difícil colocar todos em um post. :P

Valeu,
Take, Ricardinho, Ricardo, Takemura, Rica, Rick, etc. :P

quinta-feira, 17 de novembro de 2011

Dicas de Programação: Comando delete em Javascript

Sabia que existe um comando que desaloca da memória uma variável em Javascript?
Pois, ele existe e é bem parecido com o de C++.
Ele se chama "delete"! :)

<script>
var str = new String("Vamos usar javascript?");
alert(str);
delete str;
alert(str);
</script>

Meio estranho desalocar memória em Javascript... Acho, mas não tenho certeza, que ele já faz isso por que é uma linguagem interpretada...
Em todo caso, nāo faz mal usá-la... :P
E percebi que nem todo navegador funciona... :P
Mais informações no site do MDN:
https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete

É isso aí! Até mais!

terça-feira, 25 de outubro de 2011

Dicas de Programação: Como ordenar um Array em Javascript?

Desculpem por este tempo fora, acho que a preguiça me pegou uns tempos para cá...
Vou tentar voltar a minha "programação normal". :P
Existem várias soluções na mão para ordenar uma lista: bubble sort, quick sort, table sort, gambiarra sort... :P 
Mas muita gente não sabe que existe um "facilitador" para isso em Javascript, um método chamado sort na própria "classe" Array:

var frutas = ["Limão", "Laranja", "Goiaba", "Abacaxi"];
frutas.sort();
document.write(frutas);

Legal, não?

E ainda você pode implementar seu método de comparação, igual a Java:

//Numeros em ordem decrescente
var numeros = [1, 2, 3, 4];
numeros.sort(function (a, b) {
     if (a > b) {
          return -1;
     } else if (a < b) {
          return 1;
     }
     return 0;
});
document.write(numeros);

Acho que isso vai facilitar a vida de muita gente (a minha, com certeza!). :)

Até mais!

terça-feira, 27 de setembro de 2011

Rhino: Rodando Javascript em Java

Rhino é um framework para a linguagem Java que permite executar scripts em Javascript. Ele foi feito pelo "mesmo" pessoal da Mozilla Foundation.
O mais legal é que dá para criar um console javascript em prompt de comando (coisa de nerd, eu sei... :) ).
Muito bom para quem gosta de Javascript e quer fazer aplicações em Shell/Terminal/Console/Prompt. :P

Para mais informações, acesse o site:
http://www.mozilla.org/rhino/doc.html

Obs.: A ferramenta de teste Selenium usou ele para executar Javascript em sua versão RC.

Até mais!

quinta-feira, 22 de setembro de 2011

Alguém se lembra do Jaspion?

Esse foi meu terceiro seriado live action japonês que assisti aqui no Brasil (os outros dois eram Spectreman e Changeman)


A série contava as aventura de um rapaz chamado Jaspion, que foi adotado e treinado pelo grande sábio Odin para lutar contra as forças malignas de Satan Goss.
Era uma loucura: tinha um passaro dourado, um bicho esquisito chamado Mia, uma androide gost..., quer quiser, muito bonita chamada Anri e um vilão que era a cara do Darth Vader.

Sei que a maioria que assistiu, aguardava a luta final contra McGaren. É..., foi legal e tudo mais, mas a luta que mais gostei foi contra a bruxa Kilza! :)


Meribegan Katabanga, Meribegan Katabanga, Meribegan Katabanga, Kikera!

Até mais!

segunda-feira, 19 de setembro de 2011

10 dicas para se trabalhar em equipe

Minhas dicas. :P

1) Tente ouvir mais do que falar, é mais importante saber ouvir do que saber falar.

2) Nunca ache que você sabe tudo e nunca ache que você não sabe nada.

3) Tente respeitar as pessoas, por mais que não pareça, elas tem sentimentos.

4) Tente trabalhar cooperativamente: nunca tente apontar os erros das outras pessoas. Se ocorreu um erro, o erro é da equipe como um todo.

5) Seja honrado em suas palavras: dizer que vai entregar amanhã e não entregar, só demonstra sua falta de confiança. É melhor dizer que errou a estimativa e que vai demorar do que prometer uma coisa que nunca vai cumprir.

6) Sempre que possivel, ajude o próximo e peça ajuda. Todos nós temos dificuldades e, algumas vezes, só conseguimos superá-las juntos.

7) Nunca duvide da capacidade de sua equipe, todos os membros da equipe são importantes, independente do seu status e/ou cargo.

8) Saiba receber críticas e evite criticar as pessoas de sua equipe.

9) Seja responsável pelos seus atos. Sei que é díficil apontar seus próprios erros, mas é importante para saber que não devemos repeti-los novamente.

10) Tenha paciência, pessoas não são iguais a você. Nunca as trate com desrespeito por que pensam diferente de você.

Não sou especialista e nem doutor nesta area, mas é aquilo que eu acho... :P

Aqui vai uma dica extra: 11) O mais importante: seja feliz no trabalho, faça aquilo que você gosta e se sente bem.

Preciso seguir minhas próprias dicas. :)

Até mais!

sábado, 17 de setembro de 2011

My new project in IOS!

Hi people! 

I was thinking about the IOS course in last week (yes, it's finalized! :D) and I resolved to start my new project: a music/dance game for IOS (iPhone and iPad) that will be to call DJam. 
I created any screens (but,  I obtained the images from Google Images... sorry guys by copyright... :P) and I will begin the coding in next week (this week, I will be very busy...).

Bellow, any screens:




Thanks for Ederson, Rampazzo (my colleagues in this course), Giuliano (my "mentor") and Paul Hegarty (the professor from the Stanford University).

And sorry people, about my english (in next post, I will use the Google Translate before publishing).

PS.: I won't publish this game in the Apple Store because I'm learning Objective C (my "target" is not money :) ).

quarta-feira, 14 de setembro de 2011

One song, 55 youtubers

Hi people,

I need to train my english... :P

One day, I was seeing any news about the japan earthquake/tsunami (was in March, 2011) and fortunately, I found a music video (clip) in youtube about this.



It's a great idea! Congratulations everyone (55 great youtubers) that participated in the video!
And thanks J. Rice for having created the song and having organized the people.

P.S.:  Sorry about my english... (this continue very bad)

Now, in portuguese:

Achei legal a idéia de reunir alguns youtubers para fazer uma canção para arrecadar fundo as pessoas que foram atingidas pelo tsunami no Japão.

Parabéns ao pessoal e a J. Rice que organizou e escreveu a canção.

See you later! ;)

segunda-feira, 12 de setembro de 2011

Vestibulinho do COTUCA

Abriram as inscrições para o vestibulinho do COTUCA! (para quem não sabe, o COTUCA é o Colégio Técnico da Universidade de Campinas)
Para maiores informações, no site:
http://examesel.cotuca.unicamp.br/

Obs.: Acho que este ano, vou fazer Eletronica (ano retrasado eu fiz e até passei, mas tive uns problemas de saúde...). :)
Poxa, sou da turma de Informática Noturno de 1999 e ainda sinto saudades de lá.

Ah... Parece que vai ter escola aberta este ano, no dia 24/09/2011. Quem quiser ir... ;)

Ops... Quase esqueci: Valeu Diego pela dica! :)

Até mais!

domingo, 11 de setembro de 2011

Dicas de Programação: Como copiar dados de um bean ao outro em Java?

Não há nada mais trabalhoso do que copiar os dados de um bean ao outro, sendo que estes tem os mesmos nomes nas propriedades...

Por exemplo:

@Entity
@Table(name="CLIENTE")
public class Cliente {
       private String nome;
       private String endereco;
       ...
}

@WebForm
public class ClienteForm {
       private String nome;
       private String endereco;
       ...
}

Se as classes tiverem uns 100 campos, eu precisaria obter e colocar os dados, um por um (ou seja, fazer get e set de todos os campos...), 100 vezes!

Ai, as pessoas perguntam/respondem (dependendo do entendimento): "Não é para isso que serve o estagiário?"

Ai, eu respondo: "Não, não é para isso que serve o estagiário!" :P

Sei que é muito mais rápido na execução de um programa se não usarmos reflexão (eu já falei disso? Se não falei, seria um ótimo assunto para um próximo post :) ) mas, neste caso, acho muito mais fácil utilizá-la do que fazer um monte de get e set (sei lá, dependendo do caso, o código fica até mais bonito...).

Bem, já escrevi demais, vamos ao código:

public class ObjectUtil {

//Método que copia os campos de um objeto a outro.
public static void copyFields(Object from, Object to) {
        //Obtenho os campos que estão declarados no objeto de origem
        Field fields[] = from.getClass().getDeclaredFields();
        for (Field fromField: fields) {
                try {
                      //Obtenho o campo do objeto de destino que possue o mesmo nome do campo do objeto de origem
                      Field toField = to.getClass().getDeclaredField(fromField.getName());
                     //Modifico a acessibilidade...
                      toField.setAccessible(true);
                      fromField.setAccessible(true);
                      //Obtenho o valor do campo do objeto de origem
                      Object value = fromField.get(from);
                       //Coloco o valor no campo do objeto de destino
                       toField.set(to, value);
                } catch (Exception e) {
                       //Se der erro, não copio e passo para o próximo campo
                }
        }
}

}

Hum... Será que isso funciona bem?

Até mais!

sexta-feira, 9 de setembro de 2011

10 dicas para ser um bom arquiteto de sistemas

As dicas que peguei com os caras de arquitetura, durante estes anos:

1) Saber que você SEMPRE terá que estudar novas metodologias/tecnologias que SEMPRE aparecem todo ANO (ou seja, enfia a sua cara no livro, meu filho...). :P

2) Saber que você NÃO sabe tudo.

3) Saber que você TEM que saber tudo.

4) Ter paciência e calma por que, por mais que você seja uma pessoa precavida, SEMPRE as coisas tendem a dar errado.

5) Utilizar SEMPRE a regrinha do Mais ou Menos 7. (Que regra é essa? Sei lá, vou ter que estudar... :P)

6) Saber que você SEMPRE terá problemas com ambiente (seja de desenvolvimento, testes, homologação, implantação, etc.).

7) Se possivel, utilizar SEMPRE as tecnologias que você conhece.

8) NUNCA criar uma arquitetura mirabolante para validar o login e a senha de um usuário. (Hã? Acho que esta eu vou entender quando for arquiteto...)

9) SEMPRE dar suas opiniões, para que depois você possa falar: "Eu não avisei?" :P

10) Ser SIMPLES (sim, das duas maneiras que você entendeu).

Será que eu consigo seguir estas dicas? :D

Até mais!

quinta-feira, 8 de setembro de 2011

Alguém já jogou Ninja Gaiden?

Eu jogava Shinobi do Master System na época (era um dos meus jogos preferidos, além de Castle of Illusion e Out Run).
Mas tinha um pouco de inveja de quem tinha um Phantom System.
Principalmente, por causa de games como Super Mario da Nintendo e Ninja Gaiden da Tecmo.



Ninja Gaiden contava as aventuras do ninja Ryu Hayabusa contra as forças do mal (que mudava a cada versão do jogo... :P).
Em relação ao game Shinobi, a velocidade, as músicas e a dificuldade dava de dez a um (não vou dizer zero, por que eu gostava de Shinobi...) neste concorrente (eu sempre achei que o personagem de Shinobi tinha algum problema com a coluna, por que ele andava duro... - aos engraçadinhos de plantão, pense no que quiserem :P).

O melhor Ninja Gaiden, na minha opinião, era a de número 3. :)

Obs.: Eu já disse que sou um saudosista de plantão?

Ah... Obrigado ao pessoal do Classic Game Room, por disponibilizar o vídeo.
The Classic Game Room team, thanks a lot! :)

Até mais!

quarta-feira, 7 de setembro de 2011

Analista (de Sistemas?)

Uma vez, uma pessoa (que era analista de sistemas em uma empresa), me disse:

"Um bom analista de sistemas não deve saber programar!"

Na época, achei estranho a afirmação, principalmente por que eu estava fazendo o curso de "Analise de Sistemas" para aprender programação! (falando nisso, eu acho que eu menti no outro post, dizendo que não fiz um jogo descente - bem, tenho que dizer adeus a carreira de Diretor de TI... :P)

Achei que o que ela estava falando era uma loucura (ou algo parecido), que ela estava revoltada por repetir em Estrutura de Dados pela segunda vez. (humm..., talvez este seja o real motivo, mas vamos dizer que não é...)

Mas, pensando agora, depois de me formar e de longos anos de trabalho, não é que ela pode ter um pouco de razão?

Não vou dizer que um bom analista de sistemas não deva ter conhecimento em programação, mas acho que isso não é o mais importante.

Penso que o mais importante para a (nossa) profissão é ter lógica, bom senso e, principalmente, saber quem é a sua equipe e o que você faz por ela.

Lógica, por que cabe ao analista decidir quais coisas são importantes ao seu cliente e tentar enxergar um sistema que possa ser informatizado através das dificuldades que este possue.

Bom senso, para definir o que pode ou não ser aplicado no sistema, ou seja, definir um escopo factível sem coisas mirabolantes que não agregam valor e nem caibam no prazo.

Saber sobre sua equipe, do conhecimento que ela possue, suas dificuldades e suas "facilidades" para tomada de decisões sobre qualidade, prazo e entrega.

E, finalmente, de como você a trata (quando eu falo de equipe, eu falo das pessoas que você trabalha, incluindo seu cliente...), pois, no final das contas, você depende de todos para realizar o (que não é "seu"...) projeto (poxa, agora pensei naquela frase batida: "Se você não cuidar bem..." :P).

Acho que para estas coisas não é preciso saber "programar"... (mas, se souber, facilita muito a vida de todo mundo... :P)

Obs.: Já disse que isso expressa somente minha opinião e que nada que eu escrever neste blog é uma verdade absoluta? Bem, agora esta dito! :D

Até mais!

terça-feira, 6 de setembro de 2011

Dicas de Programação: Propriedades estáticas em Java

Esta dúvida também apareceu semana passada...

Se eu criar uma propriedade estática do tipo contador e incrementa-la no construtor do objeto...

public class Usuario {
      private static int contador = 0;
      //Construtor
      public Usuario() {
              contador++;
      }
      //Exibe o valor
       public void exibirContador() {
               System.out.println("No. de Usuarios: " + contador);
       }
}

E criar e instanciar 5 objetos desta classe, não importa em qual objeto chamar o método exibirContador, que ele sempre retornará o mesmo valor, ou seja, 5 (é como se a variável fosse global):

Usuario u1 = new Usuario();
Usuario u2 = new Usuario();
Usuario u3 = new Usuario();
Usuario u4 = new Usuario();
Usuario u5 = new Usuario();

u2.exibirContador(); //Tente trocar para qualquer outro objeto que sempre dará o mesmo valor...

Outra dúvida que surgiu é a chamada desta variável. Será que é possível chamar assim:
      public Usuario() {
              contador++;
      }
Ou assim:
      public Usuario() {
              this.contador++;
      }

Ou assim:
      public Usuario() {
              Usuario.contador++;
      }


Sim, por incrivel que pareça, é possível. (agora, não me pergunte o porque... - parece que isso tem haver com escopo da variável e outras coisas a mais que não faço a menor idéia de como funciona...)

Que confusão... Será que eu consegui explicar alguma coisa?
Bem, de qualquer forma, é bom testar o código acima... :P

Até mais!


segunda-feira, 5 de setembro de 2011

Dicas de Programação: Qual é a diferença entre classe abstrata e interface em Java?

Isso foi me perguntado semana passada....

A resposta:

Classe Abstrata é uma classe que não pode ser instanciada, pode possuir métodos abstratos (ou seja, sem implementação) e que somente pode ser extendida (ou seja, as classes filhas somente podem herdar de uma única classe abstrata).

Interface é uma estrutura que também não pode ser instanciada, possui sempre métodos abstratos e podem ser implementadas em várias classes (ou seja, as classes filhas podem herdar de uma ou mais interfaces).

Exemplo:

//Classe abstrata Som
abstract class Som {
    public abstract void tocar();
    public void info() {
           System.out.println("Testando som, 1, 2, 3");
    }
}

//Classe abstrata Video
abstract class Video {
     public abstract void exibir();
     public void info() {
            System.out.println("Luzes, Camera e Acao");
     }
}

//Classe Musica que extende a classe Som (funciona!)
class Musica extends Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");
       }
}

//Classe Filme que extende as classes Video e Som (não funciona...)
class Filme extends Video, Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");

       }
       public void exibir() {
               System.out.println("Vendo o filme");
       }

}

A classe Filme somente funcionaria, se as classes abstratas Video e Som fossem interfaces:

//Interface Video (não há implementação de método)
interface Video {
      public void exibir(); 
}

//Interface Som (não há implementação de método)
interface Som {
      public void tocar();
}

//Classe Filme que implementa as interfaces Video e Som (funciona...)
class Filme implements Video, Som {
       public void tocar() {
              System.out.println("Do re mi fa sol la si");

       }
       public void exibir() {
               System.out.println("Vendo o filme");
       }

}

Complicado, não? Mas com o tempo, a gente pega a prática... :)

Até mais!

domingo, 4 de setembro de 2011

Para o Dia do Estagiário (18/08)

Sei que estou atrasado (era dia 18/08...), mas parabéns a todos os estagiários! :)

Você deve perguntar: Porque estou fazendo isso agora?

Eu respondo: Por que eu quero! :P

Mas, mais do que isso, por que eu tenho que agradecê-los.

Uma vez, eu agradeci a todos, que durante minha carreira de 10 anos, trabalharam e me ensinaram a ser como eu sou profissionalmente (apesar de ainda ter que aprender, acho que estou no caminho certo...). :P

Mas devo muito do que sou hoje, aos estagiários com quem eu trabalhei.

Agradeço ao Vinicius, que durante o pouco tempo que fiquei no projeto, me fez ver como alguém pode se dedicar tanto aos estudos e ao trabalho, sendo competente nos dois.

Agradeço ao Eduardo, que teve paciência comigo e me fez ver o quão um estagiário pode ser mais maduro que muitos implementadores.

Agradeço a Mariângela, que me mostrou o quanto uma pessoa pode ser competente através de sua própria força.

Agradeço ao Lucas, por me fazer ver que existem mais coisas do que informática no mundo.

Agradeço ao Andrius, que me mostrou o quanto a empolgação pode faze-lo chegar a seus objetivos.

Agradeço ao Marcos que, com sua garra e força, esta demonstrando que se pode se superar, mesmo com as adversidades.

Aos demais, que já foram estagiários, que sigam em frente, mas que se lembrem sempre de seu passado.

Obs.: Pessoal, estou orgulhoso de vocês! :)

Obrigado e até mais!

sábado, 3 de setembro de 2011

Vamos Jogar?

Como é Sábado, nada melhor que fazer um post que não fale sobre trabalho... :P

A maioria de meus amigos e colegas, sabe que eu era aficcionado em games no passado (desde do Odyssey (que vi de relance...), passando pelo Atari (que eu acho que nunca tive..., pode não parecer, mas antigamente era caro pra dedéu... :P), pelo Phantom System (uma das versões do NES, distribuido pela antiga Gradiente...), pelo Master System (meu primeiro video-game oficial!) e pelo Mega Drive (meu segundo :P).

Então, por uma bela noite dessas, durante a semana, resolvi procurar no Youtube por jogos antigos, só para matar as saudades (depois de velho, a gente gosta de lembrar da infância...).

E encontrei um "Let's Play" (são videos e/ou imagens que alguns jogadores postam para mostrar um jogo do começo ao fim, geralmente feitos em inglês) em português!

Matei as saudades do Kid Chameleon! (para quem nunca jogou, eu recomendo!)


Agradeço ao senhor Owen pelos seus projetos (o do Sonic foi animal, apesar de ficar preocupado que o senhor começou a falar consigo mesmo... - por acaso, trabalha com informática? :P).

Abaixo, o link para o canal dele (isso soou meio estranho...), no Youtube:
http://www.youtube.com/user/owenglndwr

Obs.: De novo, eu não conheço ele e não faço a menor idéia de quem ele seja.

Até mais!

sexta-feira, 2 de setembro de 2011

Sonhos, Desejos e Etc.


Acho que todo sonho de um garoto que é ou foi fanático por video-games, é saber como um jogo é feito...

E assim, com 18 anos, ele entra no curso de Análise de Sistemas para ver o estranho e fantástico mundo de informática.

Mas, como todo mundo, meio que se decepciona quando a primeira aula da sua faculdade é de Metodologia Científica (tem gente que decepciona com Cálculo, mas aí vai do gosto... :P).

Ele pensa:

"Vai ter mais coisas que isso! Eu vou aprender a fazer um joguinho!"

E aparece a primeira aula de programação.

Ele pensa:

"Opa, vou aprender a fazer joguinho!"  :)

Mas, no final do curso, a única coisa que sabe fazer é ordenação de um array (e olhe lá...).

Ele pensa:

"Ok, ainda não foi, mas nas próximas, com certeza eu vou aprender..."

Então passa por LAP II, Estrutura de Dados, Banco de Dados, Engenharia de Software I, Engenharia de Software II, Sistemas Operacionais, Analise de Sistemas I, Analise de Sistemas II e Orientação á Objetos (ufa...).

E percebe que, ao fazer o TCC (Trabalho de Conclusão de Curso), no último ano, com seu conhecimento adquirido, ainda não dá para fazer um jogo...
Portanto, meio a contragosto, faz um sistema de video-locadora para apresentar no final do curso...

E entra em desespero, por causa que o sistema de video-locadora dá mais trabalho do que imaginava...
No final,  entrega o TCC (que sabe que esta meia boca...) e reza para passar...

E, graças ao bom Deus, passa.

Ai, entra como estagiário em uma empresa... Mais tarde, é registrado e vira programador.
E depois, com os anos, vira lider técnico, arquiteto, analista de sistemas, gerente de projeto e diretor de TI.

No final das contas, ele conseguiu um bom cargo e um bom salário em uma boa empresa!

Porém, não conseguiu criar seu joguinho... :P

Obs.: Estou longe de ser diretor de TI, mas como ainda não fiz um jogo decente, ainda tenho chances de chegar lá! :)

Até mais!

quinta-feira, 1 de setembro de 2011

Bibliotecas para aplicações Desktop: QT e GTK


QT é uma biblioteca de desenvolvimento para aplicações Desktop para multiplas plataformas (MS-Windows, GNU/Linux, Mac OS X, Embedded Linux e Windows CE). Possui várias ferramentas de geração e edição de código, como KDeveloper e QT Design.

Atualmente, é desenvolvido pela Nokia:
http://qt.nokia.com/

GTK é também uma biblioteca de desenvolvimento para aplicações Desktop para multiplas plataformas (MS-Windows, GNU/Linux e Mac OS X). Também possui ferramentas para geração de interface e algum código.

É sustentado por uma comunidade Open Source:
http://www.gtk.org/

quarta-feira, 31 de agosto de 2011

Alguém já jogou Trilha?


Sabe aqueles pacotes de jogos de tabuleiro antigos que a maioria das distribuidoras de brinquedos vende?

Eu tinha um! :)

Era um pacote que continha Ludo (eu nunca entendi este jogo...), Damas e Trilha.

Acho que a maioria sabe o que são Damas e como são suas regras (pelo menos, 90% das pessoas...). :P

Mas, desses jogos, o que eu mais gostava era Trilha.

A pergunta que a maioria de vocês devem fazer:
"O que diabos é Trilha?"

Explicando:

Trilha é um jogo que consiste em um tabuleiro, 9 peças pretas e 9 peças brancas.
O tabuleiro é composto por 3 quadrados, um dentro do outro, interligados por linhas que estão bem no meio de cada vertice.
O tabuleiro inicialmente esta vazio e cada jogador (das peças pretas e das peças brancas) vai colocando alternadamente a peça nas intersecções entre as linhas.
Se o jogador formar uma trinca na vertical ou horizontal, pode-se retirar uma peça do adversário que não esta em uma trinca (caso não exista, pode-se retirar a peça da trinca).
Quando todas as peças estiverem no tabuleiro, é possivel mover qualquer peça do tabuleiro uma casa para formar uma nova trinca.
Perde o jogador que ficar com somente duas peças.

Parece complexo, mas é bem fácil.

Por que estou falando disso?

Por causa que terminei meu projeto final de IOS e fiz um jogo de Trilha. :P

Legal, não?

Existem deuses entre nós?

Sabe, algumas vezes acho que pessoas misturam admiração com "endeusamento"...

E isso me dá medo...

Sei lá, pode ser preconceito ou loucura da minha parte, mas percebo algumas coisas exageradas, tipo:

Passo fome, não pago a luz e nem aluguel pois quero ir ao show do Justin Bieber (seja lá quem for esse cara...).

Exemplo forçado este acima não? (apesar de acreditar que tem gente que fez isso...) :P

Mas falando sério, uma vez ouvi de uma pessoa:

"Coitado do Steve Jobs (ex-presidente da Apple), ele não merecia isso (a doença que atualmente ele tem) por ser o cara que ele é (ele criou o iPhone, iPad e outras coisas mais)".

Não vou dizer que não vou ter pena (eu sei o que é ter uma doença...), realmente ter uma doença não é fácil e claro que eu espero que ele melhore, mas só por que ele criou o iPhone, ele não merecia ficar doente?

E as pessoas que trabalham duro, sustentam a família e ganham aquele salário mínimo, merecem?

Sei lá, eu preferia ser o Steve Jobs doente do que um trabalhador brasileiro doente na fila do INSS... :P

Está bem, estou sendo bem ao pé-da-letra na frase que a pessoa disse, mas é que demonstra o "endeusamento" do "cara"...

Claro, eu admiro o Steve Jobs, que realmente tem uma grande equipe com idéias geniais e que, com isso, conseguiram "ressuscitar" a Apple. Mas não acho que ele deve ser exemplo a ser seguido (ou copiado), principalmente, por que eu não faço a menor idéia de quem ele seja (e, acredito, que a maioria também não...).

Eu não fico achando que Bill Gates deveria ser morto para que Steve Jobs vive-se...

Esta bem, forcei a amizade. :P

Sei lá, coisas para se pensar...

segunda-feira, 29 de agosto de 2011

Dicas de Programação: Lendo um arquivo-texto em C

Sei lá, estou realmente sem assunto...
Para ler um arquivo-texto em C, basta abrir o arquivo para leitura com o comando fopen:

//Abre o arquivo para leitura
FILE* arq = fopen("<nome_do_arquivo>","r");

Para pegar linha por linha, basta utilizar o comando fgets:
//Enquanto não chegar no fim do arquivo
while(!feof(arq)) {
char linha[256];
//Lê uma linha do arquivo
fgets(linha, 255, arq);
//Imprime a linha no prompt
printf("%s\n", linha);
}

Ai, é só fechar o arquivo (senão, ele fica preso e não poderá ser aberto de novo...).
//Fecha o arquivo
fclose(arq);

Acho que é isso...

Até mais!

sábado, 27 de agosto de 2011

Alguém se lembra de Autorama?


Quando criança, eu sempre quis um Autorama da Estrela, mas nunca tive (na época, era um brinquedo caro...).
Mas tive um amigo que tinha. :P
Era muito legal fazer disputas na casa dele.
Sei lá, me deu saudades de "jogar" (apesar de não me lembrar direito como funciona...).

Para quem quiser lembrar, existe uma casa de Autorama em Vinhedo, chamado Autorama Café:
http://www.autoramacafe-net.com.br/

Nunca fui lá (e não, eu não conheço o dono :P), mas deve ser bacana para matar as saudades.

Até mais!

terça-feira, 23 de agosto de 2011

Dicas de Programação: Upload de arquivo com DWR

DWR é um framework Java que simula chamadas de métodos Java em Javascript.

Legal, não? :)

Aqui, vou mostrar um exemplo de upload de uma imagem...

Primeiro, a gente cria a classe que vai fazer o upload:

package com.blogspot.blogdotakemura.test;

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class UploadFile {

public String uploadImage(BufferedImage image) {
try {
File file = new File("teste.png");
ImageIO.write(image, "png", file);
return file.toURI().toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}

}

Depois, crio o arquivo dwr.xml em WEB-INF e adiciono as seguintes linhas:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "http://getahead.org/dwr/dwr30.dtd">

<dwr>
<allow>
<!-- file upload -->
<create creator="new">
<param name="class" value="com.blogspot.blogdotakemura.test.UploadFile"/>
</create>
</allow>
</dwr>

Agora, é só criar a página JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='/DWRTest/dwr/engine.js'></script>
<script type='text/javascript' src='/DWRTest/dwr/util.js'></script>
<script type='text/javascript' src='/DWRTest/dwr/interface/UploadFile.js'></script>
<title>Upload test</title>
<script>

function uploadFile() {
var imageData = dwr.util.getValue("imageUpload");
UploadFile.uploadImage(imageData, function(data) {
alert(data);
});
}

</script>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="imageUpload" id="imageUpload"/>
<input type="button" value="Send" onclick="uploadFile();"/>
</form>
</body>
</html>

Se tudo der certo, agora você pode fazer upload de imagens com javascript!!!!

Uau! :P

Obs.: Para que isso funcione, é preciso configurar o dwr corretamente na aplicação web.

terça-feira, 16 de agosto de 2011

World YoYo Contest 2011

Shinji Saito foi campeão da A2 na World YoYo Contest 2011:



Poxa, não sou tão bom quanto ele (para falar a verdade, eu só conseguia fazer, no máximo, a manobra "pendulo" ou "balanço"...), mas me deu saudades dos ioios da Coca-cola que eu tinha:


Nisso, era bom ser filho de dono de buteco. :)

Obs.: O ioio preto da Coca-cola era do tipo "Master" (não sei qual era a diferença, mas me diziam que era o mais fo...rte :) ).

Valeu ao pessoal da YoyoFactory!
Congratulations to YoyoFactory team!

Até mais!

quinta-feira, 11 de agosto de 2011

Dicas de Programação: Métodos inline em C++

Saiba que dá para escrever código no header (.h ou .hpp) do C++?
Pois é, para isso a gente utiliza a palavra reservada "inline" na declaração:
//inline.hpp
#ifndef INLINE
#define INLINE
class Inline {
public:
int soma(int a, int b);
};

inline int Inline::soma(int a, int b) {
return a + b;
};

#endif

Ou coloca-se diretamente o código na declaração do método:

#ifndef INLINE
#define INLINE
class Inline {
public:
int soma(int a, int b){
return a + b;
};
};

#endif

Não sei se isso ajuda alguém, mas é que estou meio sem assunto ultimamente... :P

Até mais!

segunda-feira, 8 de agosto de 2011

Google Developer Day 2011

Prepare-se para a mais famosa reunião de nerds do Brasil (ou do mundo, dependendo do caso...).
As inscrições, para o evento de São Paulo, deverão ser abertas hoje (dia 08/08/2011).

Para saber mais do evento acesse:
http://www.google.com/events/developerday/2011/sao-paulo/

Aos que forem, um bom evento á todos. :)

Até mais!

quarta-feira, 3 de agosto de 2011

Alguém já jogou Combate?

Combate é um jogo de tabuleiro, distribuído no Brasil pela Estrela, onde o objetivo final é capturar a bandeira adversária, que é protegida por outras peças, que são geralmente representadas por "patentes do exército".

Era divertido jogar, principalmente quando a peça "espião" captura o "marechal" (é como se um peão captura-se a dama no jogo de xadrez :) ).

Puxa, eu tinha 10 anos quando joguei... Será que ainda existe o jogo? :P

É... estou ficando velho...

Até mais!

terça-feira, 2 de agosto de 2011

Dicas de Programação: Como "chamar" o telefone no iPhone em Objective C?

Pelo que me disseram (tentei testar no emulador, mas não funciona... :P), é só criar uma "URL" com o protocolo "tel:" mais o número do telefone. Exemplo:

...
//Cria o objeto NSURL com uma String ("protocolo:numero_do_telefone")
NSURL* phoneURL = [NSURL URLWithString: @"tel:1234567890"];
//Chama a aplicação externa para abrir a URL
[[UIApplication sharedApplication] openURL: phoneURL];
...

Também é possivel criar uma página web para iPhone, com o mesmo protocolo:

...
<a href="tel:1234567890">Ligue-me</a>
...

Sei lá, tomara que isso ajude alguém... :)

Até mais!

sexta-feira, 29 de julho de 2011

Dicas de Programação: Enum em Objective C

Estou fazendo um curso de Objective C e me surpreendi que a maioria das estruturas em C podem ser utilizadas nesta linguagem.

Portanto, você pode criar um tipo struct do mesmo jeito em C:

typedef struct Usuario {
char* nome;
char* senha;
} Usuario;

E também um tipo enumerado:

typedef enum Estado {
AC,
AM,
AP,
SP
} Estado;

Utilizando estas, do mesmo jeito que você utiliza em C:

+(NSString*) obtemNomeEstado: (Estado) estado {
switch (estado) {
case AC: return @"Acre"; break;
case AM: return @"Amazonas"; break;
}
return nil;
}

Legal, não? :)

Até mais!

Dicas de Programação: Argumentos variaveis em C/C++

Primeiramente, precisamos saber o que são argumentos variaveis...
Argumentos variaveis são instruções que podem receber 1 ou mais parâmetros, não contendo um número definido destes.
Um exemplo clássico é o método printf do stdio.h:

int a = 10;
char* b = "dez";
printf("%d %s", a, b);

Para criar uma função assim, primeiramente é necessário incluir a biblioteca stdarg.h:

#include <stdarg.h>

Depois, podemos criar a função com o último parâmetro definido com 3 pontos (...):

void printNumber(int a, ...) {
}

Para percorrer os parâmetros passados (onde a quantidade não esta definida), devemos usar o tipo va_list e as funções va_start, va_arg e va_end:

void printNumber(int a, ...) {
va_list args;
int i = a;
va_start(args, a);
while (i) {
printf("%d ", i);
i = va_arg(args, int);
}
va_end(args);
}

Agora, é só chamar assim:

int main(int num_args, char** args) {
printNumber(1,2,3,4,5,6,7,8,9,10, NULL);
return 0;
}

Obs.: Como se utiliza a função printf é necessário incluir a biblioteca stdio.h

Até mais!

quinta-feira, 28 de julho de 2011

Dicas de Programação: Como executar um programa Java dentro de seu programa Java?

Pergunta estranha não?

É que eu não tinha mais nada para inventar... :P

É possivel executar um programa Java dentro de outro de várias maneiras... Vou citar duas delas:

1) Rodando via a classe/objeto Runtime:
Runtime.getRuntime().exec("java HelloWorld");

2) Chamando diretamente o método estático main da outra classe:
public static void main(String[] args) throws Exception {
...
HelloWorld.main(args);
...
}

É isso aí... Será que isso é interessante para alguém? :P

Até mais!

Alguém já jogou Cilada?

Lembrando o passado (de novo...). :P

Cilada (não a série do Multishow, mas o brinquedo) é um jogo de quebra-cabeça que não tinha uma figura definida, no caso, constituia em um jogo de encaixe de peças, essas tinham figuras geométricas vazadas e se encaixavam no "tabuleiro".


Eu tinha um... Era um jogo meio solitário (para um jogador), mas muito divertido.

Sei lá, deu saudades de falar da infância...
Logo, logo vou falar de Aquaplay, Cara a cara, Pula-pirata... :P

Até mais!

quarta-feira, 27 de julho de 2011

Dicas de Programação: Como criar um captcha em PHP?

Para criar um simples Captcha em PHP, basta usar a biblioteca GD. Veja como instalar e configurar no site do PHP:
http://www.php.net/manual/pt_BR/book.image.php

Depois de instalado e configurado, basta usar as funções imagecreate (cria um objeto "imagem"), imagecolorallocate (seta a cor do desenho), imagechar (desenha um caracter na imagem), imageline (desenha uma linha na imagem) e imagepng (cria a imagem do tipo png):

<?php
class Captcha {
var $img;
var $characters;
//Construtor da classe
function __construct() {
//Cria o "objeto" imagem
$this->img = imagecreate(80,20);
//Obtem 4 caracteres randomicos
for ($i = 0; $i < 4; $i++) {
$this->characters .= chr(rand(ord("A"), ord("Z")));
}
}

function draw() {
//Seta o content no header da "página" para imagem do tipo png
header('Content-type: image/png');
//Seta a cor de fundo da imagem em "branco"
$bg = imagecolorallocate($this->img, 255, 255, 255);
//Para cada caracter (um dos 4 caracteres)
for ($i = 0; $i < strlen($this->characters); $i++) {
//Seleciono uma cor randomica...
$color = imagecolorallocate($this->img, rand(0,255), rand(0,255), rand(0,255));
//Obtenho o caracter
$character = substr($this->characters, $i, 1);
//Desenho o caracter
imagechar($this->img, 5, (20 * $i), 0, $character, $color);
//Desenho uma linha em posicao randomica
imageline($this->img, rand(0,80),rand(0,20),rand(0,80),rand(0,20),$color);
}
//Crio a imagem
imagepng($this->img);
}
}
//Crio o objeto Captcha
$captcha = new Captcha();
//Crio a imagem
$captcha->draw();
?>

Acho que é isso... Não é o melhor captcha do mundo, mas funciona. :P

Até mais!

Dev C++ - IDE livre de C++ para MS-Windows

Pessoal, desculpe por não postar nada nestes últimos dias... É que estava ocupado com alguns problemas de saúde, nada para se preocupar, mas precisava realmente me cuidar...

Agora, voltamos a programação normal. :)

Muita gente reclama das IDEs disponiveis para C/C++... O Visual Studio custa caro e é pesado, o Eclipse C/C++ é pesado e precisa da JVM para rodar... Procurando o aí, encontrei uma IDE free e leve chamada Dev C++.


Ele já vem com o compilador GCC/G++ e o depurador GDB integrados.

Não é uma maravilha, mas quebra um galho para quem não tem dinheiro para comprar outras ferramentas (o que é o meu caso...). :)

Para saber mais e baixa-lo, utilize o link abaixo:
http://www.bloodshed.net/devcpp.html

Até o próximo post. ;)

sexta-feira, 1 de julho de 2011

JQuery - Framework para Javascript

Acho que este framework, todo programador conhece, mas não custa falar dele... :P

O JQuery é uma biblioteca de javascript que facilita (e muito) em colocar "efeitos" nas páginas HTML. O legal, é que esta biblioteca é compatível com a maioria dos "grandes" navegadores (entende-se MS-Internet Explorer, Mozilla Firefox, Google Chrome e Apple Safari :P), ou seja, não é necessário fazer os "grandes ifs" para detecção da versão do navegador.

Colocando em poucas palavras: Este framework é muito bom!

Para mais informações, entre no site do produto:
http://jquery.com/

Até mais!

segunda-feira, 27 de junho de 2011

Dicas de Programação: O que é synchronized em Java?

Como prometido, vou falar do que seja o synchronized em Java. :)

Sincronizar métodos significa que, ao rodar sua aplicação e um mesmo método for chamado ao mesmo tempo (por exemplo, em uma execução de Thread), a execução da primeira chamada será feita por completo para que, depois, a próxima chamada seja feita, ou seja, o bloco sincronizado não é executado de forma paralela e sim, em forma de uma fila (um depois do outro).

Sei que não é fácil entender (e nem de explicar...), mas com o tempo a gente pega a prática...

O importante é saber que, na maioria das vezes, prefira usar classes que não usam métodos sincronizados (tipo ArrayList em vez de Vector, StringBuilder em vez de StringBuffer), pois são mais performáticos.

Somente utilize classes com métodos sincronizados, se você precisar que o bloco de execução seja executado por inteiro, sem interrupções (isso é mais para sistemas que usam Thread...).

Acho que em vez de explicar, compliquei mais a vida dos programadores... :P

Exemplo? Fica para a próxima (é díficil de fazer... :P), mas se quiser, a declaração do método é assim:

public synchronized void incA() {
a++;
}

Até mais!

quinta-feira, 23 de junho de 2011

Referências da cultura pop dos anos 80 em "The Revenge of Shinobi"

Sabia que o game "The Revenge of Shinobi" do Mega Drive faz um monte de referências a personagens de filmes e de HQs?

Na fase do quartel, existe um personagem parecido com o Rambo.

Na fase da sucata, o chefe da fase é um androide que joga pedaços de entulho no herói (de certa maneira, faz referência ao Exterminador do Futuro).

Na fase do metro, os chefes são descaradamente cópias do Batman e do Homem-Aranha.

Na fase do museu, o chefe é o Godzilla!

Bacana, pena que os desenvolvedores não pediram licença a ninguém (por isso, tem várias versões deste mesmo jogo). :)

Acho que só estou falando nisso, que o pessoal da SEGA vai lançar Shinobi para Nintendo 3DS...

Até mais!

quarta-feira, 22 de junho de 2011

Vamos jogar Xadrez online?

Essa é para as pessoas que gostariam de jogar xadrez, mas não arranjam nenhum parceiro de jogo (ou, se arranjam, ele mora do outro lado da cidade...). :P

Existem vários aplicativos online disponibilizados de graça na Internet mas, quando dá tempo, eu utilizo dois deles, mais especificamente:

Este, do Chess.com:
http://www.chess.com/play/computer.html
Que é um Applet em Java, tem uma aparência bonita e dá para jogar sozinho ou contra outro membro do site.

E este do FreeChess.com:
http://www.freechess.org/cgi-bin/Download/FICS_Download_Interface.cgi
Também feito em Java. Este aplicativo tem até um pequeno chat para conversar. :)

É bem divertido, você pode trocar umas idéias com as pessoas e tudo mais.

Quem quiser jogar com as outras pessoas, basta se cadastrar nos sites acima.

Até mais!

terça-feira, 21 de junho de 2011

OpenMusic: Componha músicas programando!

Quem disse que um bom programador não pode ser um bom compositor de músicas?


Pois é, existe um software chamado OpenMusic, que é um ambiente visual de programação orientada á objetos para composição de músicas! A "linguagem" é baseada em Common-Lisp.

Quem estiver interessado e quiser mais informações, basta acessar o site:
http://repmus.ircam.fr/openmusic/home

Lá existem os links para download dos programas em MacOSX e em MS-Windows.

Até mais!

segunda-feira, 20 de junho de 2011

Alguém já jogou Hero Quest?

O pessoal que tinha seus 12 a 16 anos em 1994 deve se lembrar deste jogo (a Estrela tinha feito uma grande campanha publicitária do jogo nesta época).

Para quem não sabe, Hero Quest foi um jogo de tabuleiro distribuído pela Estrela em 1994, onde os jogadores (de 2 á 5) deveriam enfrentar o perverso Zargon (que também era um jogador) e suas hordas, para livrar o povo de sua tirania.

O ambiente do jogo era medieval (castelos, reis, magos, etc.) e constituia de labirintos que continham monstros e um chefe final.

Existiam quatro personagens jogadores: o mago (fraco em combate, mas possuia magia), o elfo (meio á meio, sem ou com trocadilhos... :P ), o bárbaro (forte, porém o menos "inteligente" de todos -- para não dizer, burro...) e o anão (que conseguia desarmar armadilhas e abrir portas -- estranho, eu achava que o ladino fazia isso...).

E mais o jogador Zargon, que queria ver os outros jogadores se f...errarem. :P

Mas sabia que, além destes quatro personagens, foram criados mais quatro outras por uma revista brasileira?

A antiga Dragão Brasil, em uma edição (que eu não me lembro...), lançou as personagens Fada, Amazona, Minotauro e Centauro, totalizando 8 jogadores contra o perverso Zargon (para quem gostava de ser o Zargon, na época, não deveria ter ficado nada feliz...).

E sabia que foi lançado um jogo no MS-DOS chamado Hero Quest?

Ele esta para download no site do abandonia:
http://www.abandonia.com/en/games/157/Hero+Quest.html

Para jogar, é necessário instalar o emulador DOSBox.

Essa é para matar saudades...

Até mais!

domingo, 19 de junho de 2011

Dicas de Programação: O que é transient em Java?

Afinal, para que serve a palavra reservada transient?

Hum... Sei lá, deve servir para alguma coisa. :P

Falando sério, serve para deixar a propriedade de uma classe "gravável", não "gravável".

Está bem... Concordo que a explicação ficou meio "tosca". Vamos ao exemplo, que é melhor:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;

public class Usuario implements Serializable {

private static final long serialVersionUID = 2898873189053002193L;
private String username;
//Password é uma propriedade "transient"
private transient String password;

//Construtor da classe
public Usuario(String username, String password) {
this.username = username;
this.password = password;
}

//Método que salva o estado do objeto
public void save() {
ObjectOutputStream output = null;
try {
output = new ObjectOutputStream(new FileOutputStream(hashCode() + ".obj"));
output.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
} finally {
close(output);
}
}

//Fecha o arquivo de saída
private static void close(OutputStream output) {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}

//Carrega o último estado do objeto salvo
public void load() {
ObjectInputStream input = null;
try {
input = new ObjectInputStream(new FileInputStream(hashCode() + ".obj"));
Usuario usuario = (Usuario)input.readObject();
this.username = usuario.username;
this.password = usuario.password;
} catch (Exception e) {
e.printStackTrace();
} finally {
close(input);
}
}

//Fecha o arquivo de leitura
private static void close(InputStream input) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}

//Transforma o objeto em uma String
public String toString() {
return "Username:" + username + " Password:" + password;
}

//Método principal
public static void main(String[] args) {
//Cria um novo usuário
Usuario usuario = new Usuario("ricardo", "takemura");
//Salva ele
usuario.save();
//Exibe as informações
System.out.println(usuario);
//Carrega ele
usuario.load();
//Exibe as informações
System.out.println(usuario);
}
}

Agora, se executarmos o código acima, veremos que o sistema exibirá as seguintes linhas:

Username:ricardo Password:takemura
Username:ricardo Password:null

Ué... Cadê o valor da password na segunda linha?

Então, é isso que a palavra "transient" significa, ou seja, mesmo que o objeto seja "gravável" (estendendo de "Serializable"), uma propriedade transient não será salva.

Agora, para que isso?

Para informações sigilosas, calculadas ou "não importantes" (e deixar um objeto grávavel custa processamento...).

Deu para entender? :P

Até mais!

terça-feira, 14 de junho de 2011

Robomind: Robocode + Logo


Robomind é mais uma aplicação educacional para ensinar as pessoas a entender este mundo louco e maravilhoso dos programadores (ou seja, ela ensina a programar :P).

O conceito básico do aplicativo: você tem um "robô" que é comandado por instruções do tipo "ande para frente", "vire a esquerda" e outros. O objetivo é criar programas que façam o robô caminhar sem bater nos obstáculos (ou algo parecido...).

Quem estiver interessado, pode obter mais informações e baixar o aplicativo no site:
http://www.robomind.net/pt/index.html

Até mais!

segunda-feira, 13 de junho de 2011

Dicas de Programação: Qual é a diferença de String, StringBuilder e StringBuffer em Java?

Essa foi uma pergunta que surgiu aqui na empresa...

E essa vai ser a resposta:

String é uma classe que define um objeto imutável, ou seja, que uma vez criado, o estado do objeto não pode ser mudado (isso significa que os valores que estão na classe nunca mais mudam...):

//Nova string
String str = new String("Ola mundo!");
//Concatena a String
str.concat("Ola pessoal!");
//Exibe o valor
System.out.println(str);

Se você perceber, o método concat devolve uma String com o valores concatenados, portanto, uma nova instância do objeto da classe String (ele não modificou o objeto atual...).

Agora, se fizermos isso com o StringBuffer ou com o StringBuilder:
//Novo objeto
StringBuffer buffer = new StringBuffer("Ola mundo!");
//Concatena a String
buffer.append("Ola pessoal");
//Exibe o valor
System.out.println(buffer);

Ele atualiza o estado do objeto!

Você deve perguntar: Qual é a vantagem disso?
As vantagens de atualizar o mesmo objeto:
- Não cria um novo objeto a cada atualização (economia de memória);
- É mais rápido (performático, como dizem alguns especialistas :P);

Mas então, a classe imutável não deve ser usada?
Deve sim, para coisas que, geralmente, não mudam (tipo: mensagens e constantes), pois classes mutáveis exigem mais da alocação e do gerenciamento de memória (ponteiros).

E qual é a diferença em StringBuilder e StringBuffer?
A primeira cria objetos não sincronizados e a segunda sincronizados. :P

Não entendeu? Essa explicação fica para um próximo post!

Ah... só uma coisa: a partir do Java 5, não é preciso se preocupar com estas coisas, que qualquer instrução dessa:

String b = "a";
int c = 2;
String a = b + "=" + c;

O compilador já otimiza para, mais ou menos, isso:

String b = "a";
int c = 2;
StringBuilder a = new StringBuilder(b).append("=").append(c);

Compilador inteligente, não? :P

Até mais!

domingo, 12 de junho de 2011

Whitespace: Programando com espaços em branco

Essa sugestão é de um colega meu. :)

Sabia que dá para programar somente com espaços em brancos, tabs e enters?

Pois é, existe uma linguagem chamada Whitespace, onde você programa somente com caracteres não visuais.

Quer saber mais da linguagem e baixar ela? Entre no site:
http://compsoc.dur.ac.uk/whitespace/index.php

Abaixo, o exemplo de "Hello World": Say hello. Estranho, não? (não testei, portanto, nem sei se funciona...) :P

Até mais!

sábado, 11 de junho de 2011

SQuirrel - Ferramenta livre para Banco de Dados


O SQuirrel é uma ótima ferramenta livre, feita em Java, para execução de instruções SQL (select, insert, update, delete, create, drop, etc.) em Banco de Dados. Possui vários drivers para vários tipos de DBMS (Oracle, PosgreSQL, MySQL...), pois usa o JDBC para se conectar (ou seja, é só baixar o driver JDBC do fabricante).

Quem quiser dar uma olhada, pode fazer download na página oficial do aplicativo:
http://squirrel-sql.sourceforge.net/

Um bom fim-de-semana á todos!

Até mais!

sexta-feira, 10 de junho de 2011

Alguém já jogou Detetive?

Então, acho que 90% das pessoas irá responder que "Sim". :)

Este jogo participou da minha infância por um longo tempo...

O jogo constitui em decifrar quem, onde, e qual foi a arma do assassino.

Mas você sabia que existia um filme baseado nele, com vários finais diferentes?


Pois é, ele se chama "Os 7 Suspeitos" (ou "Clue", em inglês).

Como é do tempo do VHS, para interagir no filme, você tinha que rebobinhar ou avançar a fita.

É..., coisas antigas que, de vez em quando, a gente se lembra...

Estou ficando velho... :(

Até mais!

quinta-feira, 9 de junho de 2011

Curiosidade: O que são Ovos de Páscoa em Informática?

Sabia que alguns programas vem com um "bônus" dentro deles?

Pois é, alguns programadores quando tem um tempo (eu acho...), colocam um "plus" em vários aplicativos.

Isso é o chamado "Ovo de Páscoa" em informática.

Exemplos clássicos são do MS-Excel e do MS-Word.

Tem também no OpenOffice. :)

No BROffice 3.2, crie uma nova planilha e coloque a seguinte expressão na primeira célula desta:
=GAME("StarWars")

Agora, basta jogar!

Mais uma:

Nos sites feitos em PHP 5.0, basta colocar o seguinte parâmetro para aparecer o nome dos caras que trabalharam nesta versão:
?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000

Isso deve funcionar em qualquer site de PHP.

Estava meio sem assunto nestas semanas... :P

Até mais!

segunda-feira, 6 de junho de 2011

Dicas de Programação: Script dentro de script em Javascript :P

Algumas vezes, por mais que se queria, não é possível executar um script dentro de um script usando o elemento.innerHTML ou document.write:

document.write("<script>alert('teste');</script>");

Isso não executará por motivos de segurança na maioria dos navegadores...

Mas existe uma alternativa (para não falar em "gambiarra"...) para que alguns navegadores considerem a instrução: basta separar a palavra "script".

Não entendeu? Pois é bem simples. :)

document.write("<scr" + "ipt>alert('teste');</scr" + "ipt>");

Isso sim que é um jeitinho alternativo... :D

Até mais!

domingo, 5 de junho de 2011

Dicas de Programação: O que são uma final Class e uma classe default em Java?

Saiba que dá para fazer as seguintes coisas:

public final class ClasseFinal {
...
}

class ClasseDefault {
...
}

Agora a pergunta: Para que servem os dois tipos de classe?

A resposta: Para dar dor-de-cabeça a outros programadores. :P

Na verdade, quando você tem um final da declaração de uma classe, isso quer dizer que você não pode herdar dela (ou seja, ela não possui filhos...). Uma classe para este exemplo, é a String (que é final):

//Impossível!!!
public class MinhaString extends String {
...
}

E quando uma classe não possui "public" (ou seja, seu "tipo de acesso" é "default"), a classe é utilizada somente por classes que estejam no mesmo pacote (ela também pode ser declarada no mesmo arquivo de uma que tenha acesso "public"):

package org.teste.publico;

public class ClassePublica {
private ClasseDefault classeDefault;
...
}
class ClasseDefault {
...
}

Bizarro, não?

Até mais!

terça-feira, 17 de maio de 2011

Dicas de Programação: Como obter o código-fonte de uma página on-line (Java) ?

Fácil! Utilizando as classes URL e HttpURLConnection:

import java.net.*;
import java.io.*;

public class App1 {

public static void main(String args[]) throws Exception {
//Seta a URL
URL url = new URL("http://blogdotakemura.blogspot.com/");
//Abre conexão
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//Abre o buffer para leitura
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = "";
//Lê linha a linha da página
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
}

Para quem programa em Android, isso também pode ser feito lá. (as classes URL e HttpURLConnection existem na API) :)

Até mais!

Jogos de tabuleiro: Scotland Yard

Alguém já jogou Scotland Yard da Grow?

Eu já e posso dizer que é muito legal! :)

Este jogo de tabuleiro é baseado nas histórias (ou estórias -- que, de acordo com o professor Pasquale, tanto faz...) de Sherlock Holmes onde você encarna o detetive que, através das pistas dadas em determinados locais, deve descobrir quem foi o culpado, onde ocorreu o fato e qual foi a arma usada no crime antes de seus concorrentes.

O legal que os "casos" são baseados em aventuras do personagem de Sir Arthur Conan Doyle.

A coisa triste, é que, quem leus os livros, vai saber alguns dos resultados :P

Até mais!

domingo, 15 de maio de 2011

Alguém se lembra de Chrono Trigger?

Putz, este faz tempo...

Eu nunca tive um Super Nintendo (era um console caro, na época), mas sempre ouvia falar dos jogos deste console: o Street Fighter' II (que eu jogava, em uma época onde as locadoras tinha o que chamavam de "cabine" e a gente pagava por hora...), o Super Mário World e um RPG que foi um dos maiores sucessos da Square na época -- Chrono Trigger.

Foi um dos primeiros grandes sucessos da Square, possuia uma história muito bem elaborada e gráficos belíssimos para o console (os personagens foram desenhados por Akira Toriyama, criador de Dragon Ball).

Esse sucesso foi tanto, que alguns fãs saudosistas tentaram criar uma versão com gráficos poligonais, chamado Chrono Resurrection:



O projeto foi parado... E não há nenhuma previsão de volta...

O site do projeto:
http://www.opcoder.com/projects/chrono/

Até mais!

sábado, 14 de maio de 2011

Dicas de Programação: O que é uma Final Class em Java ?

Resposta: Classes que tem o modificador final não podem ser herdadas. Ou seja, não possuem filhos e nem pode possui-los.

Um exemplo de final Class é a classe String:

//Impossivel a herança
public MinhaString extends String {
}

Para criar uma Final Class é simples, basta colocar o modificador na declaração da classe:

public final class ClasseSemHeranca {
...
}

Se quiser, você também pode fazer isso com o método da classe. (assim, ninguém pode reescrever o método):

public class MinhaClasse {
public final void ninguemMeReescreve() {
...
}
}

Por que fazer isso?

Talvez, por orgulho. (não quero que ninguém mexa na minha classe -- gentalha, gentalha, gentalha! :P)

Brincadeira! :)

Até mais!

Alguém se lembra do Virtual Boy?



Apesar da maioria de "meus" leitores terem entre 18 a 40 anos, acho que alguns nem devem ter ouvido falar deste video-game da Nintendo. (acho que nem a Nintendo quer mais ouvir falar dele... :P)

Antes mesmo do Nintendo 3DS, a empresa já pensava em criar um video-game 3D. Tanto que, em 1995, foi lançado no Japão o Virtual Boy.

Era um video-game totalmente diferente do habitual: não precisava ligar na TV para jogar, pois o sistema tinha um formato de óculos onde você colocava a "cara" nele. (no sentido literal da coisa :) )

Evolucionário para a época!

Mas, por que não deu certo?

Sei lá, talvez os jogadores não estava muito afim disso... As más linguas diziam que era desconfortável colocar a cara no aparelho e que ver tudo em vermelho (tons de vermelho era a única cor exibida pelo console...) era muito desanimador.

Só sei que o console foi "um fiasco" e terminou sua produção em 1996.

Talvez seja por isso que a Nintendo não que lançar o novo console (projeto "Café") com tecnologia 3D.

É..., algumas vezes, inovação de"mais" faz mal para a saúde da empresa. :P

Até mais!

Design Patterns: Singleton

Pessoal, desculpe por não postar nada nos últimos dias...
Tive uns problemas de saúde. (nada grave, mas precisava me cuidar...)
Ainda não estou 100%, mas dá para levar. :)

Mas voltando ao assunto do título:

Design Patterns, em computação, é uma receita de bolo de como fazer certas coisas recorrentes que aparecem no código-fonte. Por exemplo: "Como criar uma instância única para todo objeto de uma certa classe?"

Como faço isso? -- você pergunta.

Fácil, utilizando o "design pattern" chamado Singleton!

A "receita de bolo":

public class MinhaClasse {

//Declarando um objeto estático da classe
private static MinhaClasse instancia = null;

//Construtor privado !?! (somente a própria classe consegue instanciar)
private MinhaClasse() {
//Inicializando objeto
}

//Cria uma única instância para o objeto
public static MinhaClasse getInstance() {
if (instancia == null) {
instancia = new MinhaClasse();
}
return instancia;
}
}

Para todo objeto que precisar de uma instância (no caso, a mesma instância), é só usar o método getInstance:

...
MinhaClasse obj1 = MinhaClasse.getInstance();
...
MinhaClasse obj2 = MinhaClasse.getInstance();
...

Qual é a vantagem de se utilizar este "design pattern"? -- pergunta você, de novo. :P

Talvez, por economia de memória (já que existe somente uma instância) e o sistema "guarda" o último estado da instância (este último, talvez não seja uma vantagem...).

Quando eu devo usar? -- pergunta você, outra vez. :P

Geralmente em classes úteis, do tipo que não precise guardar valores (funções matemáticas, de formatação, de ordenação e outras mais).

Hum... Espero que eu não tenha complicado e sim, explicado. :P

quarta-feira, 11 de maio de 2011

Dicas de Programação: Como verificar se um valor é infinito ou NaN em C?

Então, como eu posso verificar se um float possui um valor válido (sem ele ser infinito ou NaN)?

Simples, usando as funções isnan e isinf da biblioteca math:

#include <math.h>
#include <stdio.h>

int main(int num_args, char* args[])
{
float a = 0.0/0.0;
if (isnan(a))
{
printf("a=NaN\n");
}
a = 1.0/0.0;
if (isinf(a))
{
printf("a=Infinite\n");
}
a = 3.0/1.0;
printf("a=%f\n",a);
return 0;
}

Vi que alguém procurou isso no meu blog, por isso resolvi escrever. :)
Espero que ajude...

Até!

Dicas de Programação: Existe destrutor no Java?

Se existe destrutor em Java?

Não sei se posso dizer que é um destrutor, mas existe um método que é chamado quando o Garbage Collection vai limpar o "objeto". Esta função é a finalize:

public class App1 {

public App1() {
System.out.println("Uma instância de App1 esta nascendo. :)");
}

protected void finalize() {
System.out.println("Uma instância de App1 esta morrendo. :(");
}

public static void main(String... args) {
App1 app = new App1();
app = null;
System.gc();
}
}

Não sei se funciona todas as vezes (pode ser que o gc limpe depois que o programa termine...) :P

Até!

domingo, 8 de maio de 2011

Pier Solar - Jogo do Mega Drive feito por fãs!

Sei como deve ser díficil fazer um jogo, principalmente para quem não sabe nem desenhar (como eu... :P ).
Imagina criar um jogo em um hardware que você nem esta acostumado...
Mas o pessoal da WaterMelon conseguiu este feito!


Criaram um jogo de RPG para Mega Drive, em 2010, chamado Pier Solar. O jogo, de acordo com o que foi divulgado, tem 64 Mega! (acho que deve ser o único no Mega Drive com tanto megabits ... :P)


Fizeram manual, caixinha e tudo mais! Como se fosse um jogo original da SEGA.
Muito legal!!! O pessoal caprichou!
Quem quiser compra-lo (se alguém ainda tiver um Mega Drive modelo 1 ou 2), pode faze-lo no site oficial do jogo:
http://www.piersolar.com/

Obs.: Só para avisa-los: o jogo não é licenciado pela SEGA.

Até!

sábado, 7 de maio de 2011

Alguém se lembra do Alex Kidd?

Deu vontade de matar a saudade...

Alex Kidd foi o mascote principal da SEGA antes de Sonic: The Hedgehog, nos tempos do antigo Master System.
Ele era um garoto com roupa vermelha, meio gordinho, com grandes orelhas, e que tinha um cabelo tipo emo (dizem que foi o primeiro emo da história do video-game...) e que era fanático por jogar Pedra, Papel e Tesoura (o famoso Jan Ken Po)!

Seu maior sucesso foi "Alex Kidd in Miracle World" do Master System. Jogo, que álias, vinha na memória na versão 2 do console (substituindo o Safari Hunt, um jogo de tiro, o Hang-On, jogo de corrida, e um jogo de labirinto, sem título, que vinha escondido no console).

Uma pessoa tão saudosista quanto eu, criou um estágio bem parecido com a primeira fase deste jogo, para o Little Big Planet 2 do PS3:


Parabéns a DizaumBR pela iniciativa! :)

Quer saber como se habilita o jogo do labirinto no Master System I ?
Essa eu digo (afinal, acho díficil alguém ainda ter o console...): No logo da SEGA, aperte os botões 1 e 2 juntos, depois coloque o direcional para cima.

Até!

sexta-feira, 6 de maio de 2011

Xadrez - Abertura de Peão do Rei

Sei lá, o assunto que dominou no meu e-mail esta semana foi Xadrez, portanto, resolvi escrever sobre isso (não que eu seja um mestre de Xadrez, longe disso...). :)

Vou falar de uma abertura que a maioria dos jogadores de Xadrez usa, que é a abertura de Peão do Rei.

Mas primeiramente, vamos explicar algumas coisas:
- O Xadrez que eu estou falando, é um antigo jogo de tabuleiro e não um sinonimo de prisão.
- Abertura, em Xadrez, são os lances iniciais dos jogadores (ou seja, os primeiros movimentos).
- Peão é uma peça de Xadrez e não o trabalhador braçal.
- Rei é a peça principal do jogo de Xadrez, sendo que se ele for "morto", indica que se deu "Xeque-Mate" e termina o jogo. Não se refere a nenhuma giria soteropolitana ("Meu Rei..." -- essa eu forcei mesmo :P ).

Então vamos a abertura:
A abertura consiste em mover o Peão da casa e2 para a casa e4 (o Peão que esta na frente do Rei, dai o nome).

"Qual é a vantagem desta abertura?" - alguns devem se perguntar.

Pelo que eu soube das pessoas, as vantagens são:
- Você libera mais peças do seu jogo (além dos Peões e dos Cavalos, você libera a Dama e um Bispo logo de cara);
- Se um dos jogadores for desprevenido, é possível dar xeque-mate em 4 "rodadas" (não vou dizer que é fácil, mas existe o "esquema"...).

O "esquema" fica para a próxima vez. :P

Um bom fim-de-semana a todos!

Até!

quinta-feira, 5 de maio de 2011

Composite C1 - CMS para .Net


Composite C1 é um CMS feito em .Net com código aberto (até soa meio estranho, mas é verdade :P).

Para usuários comuns (editores, designer, etc.) tem a vantagem de ser parecido com uma aplicação nativa do MS-Windows (tem a mesma cara do XP :P). Já para os desenvolvedores, o código é simples e de fácil manutenção.

Quem gostou, pode saber mais sobre a aplicação no link abaixo:
http://www.composite.net/C1.aspx

quarta-feira, 4 de maio de 2011

DOSPad: DOSBox para iPad

Uma vez, eu falei do DOSBox, um emulador de DOS especifico para jogos.

Então, existe uma versão para iPad chamada DOSpad.



Ou seja, agora dá para jogar DOOM ou Indiana Jones: Fate of Atlantis em seu iPad!

O link do projeto:
http://www.litchie.net/blog/?page_id=123

Rhodes: Ruby para Smartphone

Poxa...

Quem programa em Java pode criar aplicação para Android e alguns celulares com J2ME...
Para programar em iPod, iPhone e iPad tem que aprender uma linguagem nova (Objective C)...

Mas quem programa em Ruby, o que será que faz?

Programa em Rhodes! :)

Rhodes é um framework para criar aplicações em iPhone e Android feito em Ruby.

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

Dicas de Programação: Como executar um programa dentro do Java?

Esse foi uma dúvida de um colega aqui. :)

Para executar um programa dentro do Java, basta usar as classes Runtime e Process da API:

public class App1 {
public static void main(String args[]) throws Exception {
Runtime runtime = Runtime.getRuntime();
//Executa o notepad
Process process = runtime.exec("notepad.exe");
//Espera o processo terminar
process.waitFor();
//Exibe mensagem que terminou
System.out.println("Terminou!");
}
}

Simples, não? :P

Até mais!

domingo, 1 de maio de 2011

Cedega/WineX: Execute jogos de Windows no Linux

Bons jogos para GNU-Linux sempre foram difíceis de encontrar... Por mais que procuramos, 90% dos jogos lançados são para o sistema operacional MS-Windows.
Mas existe uma possibilidade de rodar jogos MS-Windows no GNU-Linux ou no MacOSX!

Como? - você deve perguntar.

Eu respondo:

Com o Cedega/WineX!

O Cedega/WineX é uma aplicação que "emula" a API do MS-Windows (mais especificamente, o DirectX) para jogos.

Ainda possui alguns bugs, mas dá para rodar alguma coisa. :P

Só para exemplo, veja World of Warcraft no Linux:


Obs.: Não é free, esta sobre licença comercial.

Mais informações no Wikipédia:
http://en.wikipedia.org/wiki/Cedega_%28software%29

Até mais!

sábado, 30 de abril de 2011

Time Traveler: Arcade 3D!

Da série: alguém se lembra?


Alguém já jogou este jogo?

Eu nunca joguei, principalmente por que, na época, a máquina só existia no shopping Morumbi em São Paulo.
E as fichas custavam caro...

Mas este é o primeiro arcade 3D que se tem notícia.

Feito pela empresa SEGA, o jogo constituia em um viajante do tempo que tinha a missão de salvar a princesa de um vilão através do tempo.

História básica de bandido e mocinho. :P

O "efeito" 3D era conseguido através de vários espelhos que tinham na máquina.

Uma revolução na época (década de 90)!

Até mais!

sexta-feira, 29 de abril de 2011

Dicas de Programação: Como colocar um DIV em qualquer posição da página?

Fácil! É só usar colocar o valor "absolute" no atributo "position" estilo (CSS) no div e colocar os valores de posição nos atributos "left" (horizontal) e "top" (vertical) do mesmo:
<html>
<head>
<title>CSS</title>
<style>
div#id-do-elemento.minha_classe_css {
background-color: red;
width: 100px;
height: 100px;
position: absolute;
top: 20px;
left: 20px;
}
</style>
</head>
<body>
<div id="id-do-elemento" class="minha_classe_css"></div>
</body>
</html>

Até mais!

quinta-feira, 28 de abril de 2011

Dicas de Programação: Qual é a diferença de . e # no CSS?

A diferença entre o ponto e a cerquilha, é que o ponto (.) representa a classe e a cerquilha (#) representa o id do elemento (tag) na folha de estilo (CSS). Por exemplo, se eu usar o css:

div.elemento1 {
background: red;
}

E eu criar dois divs:

<div id="elemento1">Primeiro</div>
<div class="elemento1">Segundo</div>

O segundo div será vermelho!

Se fosse assim:

div#elemento1 {
background: blue;
}

O primeiro div seria azul!

Espero que isso ajude!

Até mais!

quarta-feira, 27 de abril de 2011

DOSBox: Jogue antigos jogos de DOS

Quando eu comecei minha carreira de programador, eu tinha em casa um Intel 486 DX 2 66MHz com 4 mega de memória!
E o que eu tinha instalado de sistema operacional era o MS-DOS 6.22 com MS-Windows 3.1.

Isso me lembrou de alguns antigos bons jogos que eu tinha no meu HD de 512MB. :)
Pois é, o tempo passou, e aqueles jogos nem rodam mais no MS-Windows novos, nem em Linux e nem em MacOSX...

Mas encontrei um jeito de executar estes. É só usar um emulador chamado DOSBox.

O DOSBox é um emulador de DOS adaptado para executar aplicações gráficas feitas para esse S.O. (ou seja, além de rodar jogos, ele pode rodar o antigo MS-Windows 3.11 :) ).

Para quem tem um CD (como eu) do Ultima VIII: Pagan ou do Wing Commander é uma mão na roda. :P

O link do emulador:
http://www.dosbox.com/

Boa diversão!