quinta-feira, 31 de março de 2011

Dicas de Programação: Gravando objetos em arquivos

Pergunta: Dá para guardar um objeto em um arquivo de uma aplicação e depois obte-lo em outra aplicação?
Resposta: Se a mesma classe existir nas duas aplicações dá sim! :)

Vamos a um exemplo:

1o.) Criamos um objeto de uma classe comum que será transferido da "aplicação 1" para a "aplicação 2":

import java.io.Serializable;

public class MinhaClasse implements Serializable {

private String nome;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

}

2o.) Agora, vamos criar a "aplicação 1" que grava o objeto com o valor "Takemura":

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class App1 {

public static void main(String... args) throws Exception {
ObjectOutputStream output = null;
try{
MinhaClasse minhaClasse = new MinhaClasse();
minhaClasse.setNome("Takemura");
output = new ObjectOutputStream(new FileOutputStream("output.dat"));
output.writeObject(minhaClasse);
} finally {
output.close();
}
}
}

3o.) Agora criamos a "aplicação 2" que lê do arquivo, o objeto:

import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class App2 {

public static void main(String... args) throws Exception {
ObjectInputStream input = null;
try{
input = new ObjectInputStream(new FileInputStream("output.dat"));
MinhaClasse minhaClasse = (MinhaClasse) input.readObject();
System.out.println(minhaClasse.getNome());
} finally {
input.close();
}
}
}

4o) Execute a App1 e depois a App2 (lembrando que as duas devem ter/enxergar a classe MinhaClasse).

Se tudo funcionar bem, o valor é transferido de uma aplicação para outra.
Legal, não? O mais legal é que dá para transferir via Socket (mas este, fica para um próximo post...)

Até!

Dofus: MMORPG grátis e feito em Flash

Dofus é um jogo de MMORPG (Não sabe o que é isso? O Wikipédia explica!) que pode ser jogado de graça. Foi feito inicialmente em Adobe Flash e, antigamente, rodava no próprio navegador (agora, acho que não dá mais para jogar no navegador...).

Graficamente, seus personagens são desenhados em estilo de Mangá (Também nunca ouviu falar? O Wikipédia também explica!) e possui bonitos cenários, tudo em 2D.

Nunca joguei (alias, eu nunca joguei qualquer coisa online...), mas parece divertido.
Veja abaixo uma introdução do jogo:



Mais informações e download, no site oficial:
http://www.dofus.com/pt

Ah, dica de um colega meu! Valeu!!! :)

quarta-feira, 30 de março de 2011

Serializar variáveis em PHP

Antes de mais nada, "serializar" é deixar uma variável gravavel (seja objeto, estrutura ou de um tipo simples) em disco (arquivo), na rede (através de socket), na serial ou em qualquer dispositivo de escrita.

Para serializar uma variável em PHP é fácil, basta utilizar a função serialize:
class MinhaClasse {
private $_propriedade;

public function getPropriedade () {
return $this->_propriedade;
}

public function setPropriedade ($nova_propriedade) {
$this->_propriedade = $nova_propriedade;
}

public function __toString() {
return $this->_propriedade;
}
}

...
$meuObjeto = new MinhaClasse();
serialize($meuObjeto);
...

E para deserializar, use unserialize:
...
unserialize($meuObjeto);
...

Até mais!

Jogos de fãs para fãs

Um Fangame é um tipo de "categoria" de jogos eletronicos, onde os "desenvolvedores" são fãs de um personagem ou jogo de empresas "oficiais".

Hum... Ficou confuso... É melhor eu dar um exemplo: vamos supor que eu sou fã do Tetris e, por isso, estou desenvolvendo um jogo parecido com Tetris, mas com algumas diferenças (como visão em 3D), com intuito de homenagear os autores.
Veja que, neste caso, não estou querendo lucrar com isso, e sim "agradecer" o pessoal que desenvolveu o jogo, ou seja, o jogo que eu estou criando é um fangame.

Mas, voltando o assunto, existem vários fangames, como do Super Mário, Phantasy Star, Zelda e Sonic.

E falando no último, existe um game chamado Sonic Fan Remix que impressiona pela qualidade gráfica. Para ter uma idéia, veja o video abaixo:



Animal!!! Quem quiser baixar uma versão demo contendo duas fases, pode faze-lo no seguinte endereço:
http://sonicfanremix.com/

Bom divertimento!

terça-feira, 29 de março de 2011

Momento Cultural: Passeio de Trem entre Campinas e Jaguariúna

Sabia que dá para fazer um passeio de Maria Fumaça entre Campinas e Jaguariúna?
Pois é, agora você sabe! :P


No percurso completo, ele sai da Estação Anhumas (perto do Carrefour Dom Pedro e Galleria Shopping) e chega a Jaguariúna.

O passeio é pago, e custa atualmente, R$50,00 (salgado...). :(

Quem quiser saber mais sobre, consulte o site da ABOTTC (Associação Brasileira dos Operadores de Trens Turísticos e Culturais):
http://www.abottc.com.br/trem/?CodTrem=10

Se alguém for, um bom passeio! ;)

Dicas de Programação: Obtendo um screenshot de seu desktop em Java

Para obter o screenshot de seu Desktop (ou Área de Trabalho) em Java é relativamente fácil. :)
Vamos ao passo a passo:

1) Para obter o tamanho da tela de seu Desktop, a gente pode usar a classe Toolkit do pacote java.awt:

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

2) Agora para fazer o screenshot, basta usar a classe Robot do mesmo pacote:

java.awt.Robot robot = new java.awt.Robot();
java.awt.image.BufferedImage screenshot = robot.createScreenCapture(new java.awt.Rectangle(screenSize));

3) Depois, é só salvar em um arquivo:

java.io.FileOutputStream output = new java.io.FileOutputStream("capture.png");
javax.imageio.ImageIO.write(screenshot, "png", output);
output.close();

Simples, não? :P

Embaixo, o código completo:

public class ScreenShot {

public static void main(String... args) throws java.lang.Exception {

java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
java.awt.Robot robot = new java.awt.Robot();
java.awt.image.BufferedImage screenshot = robot.createScreenCapture(new java.awt.Rectangle(screenSize));
java.io.FileOutputStream output = new java.io.FileOutputStream("capture.png");
javax.imageio.ImageIO.write(screenshot, "png", output);
output.close();

}

}

segunda-feira, 28 de março de 2011

Dicas de Programação: Construtor e Destrutor em C++

Vamos falar em Construtor e Destrutor em C++.

Construtor é uma função especial, que é "executada" quando se instancia um objeto. A estrutura da função é que tem o mesmo nome da classe e não tem retorno. Exemplo:

//ArrayList.hpp
#ifndef ARRAYLIST_H
#define ARRAYLIST_H
class ArrayList {
private:
int* array;
public:
ArrayList();
};
#endif

//ArrayList.cc
#include "ArrayList.hpp"

ArrayList::ArrayList() {
this->array = new int[10];
}

Ela poderá ser chamada assim:

int main(int num_args, char **args) {
ArrayList a;
}

Ou assim:

int main(int num_args, char **args) {
ArrayList *a;
a = new ArrayList();
...
}

Destrutor é outra função especial, que é chamada quando um objeto é desalocado da memória. A estrutura da função é que ela possue o mesmo nome da classe com um ~ (til) no começo e não tem retorno. Exemplo:

//ArrayList.hpp
#ifndef ARRAYLIST_H
#define ARRAYLIST_H
class ArrayList {
private:
int* array;
public:
...
~ArrayList();
};
#endif

//ArrayList.cc
#include "ArrayList.hpp"

...
ArrayList::~ArrayList() {
delete this->array;
}

Ela poderá ser chamada assim:

int main(int num_args, char **args) {
ArrayList *a;
...
delete a;
}

Ou simplesmente quando a função que chamou termina, se não for instanciada como ponteiro:

int main(int num_args, char **args) {
ArrayList a;
...
}

Até mais!

Dicas de Programação: Como passar um parâmetro por referência sem ponteiro em C++

Esta vai para um colega que me pediu mais dicas em C++.

A coisa mais chata em C++ (e em C) é passar um parâmetro por referência através de ponteiro:

#include <stdio.h>

void somaMaisDois(int* num) {
(*num) = (*num) + 2;
}

int main(int num_args, char** args) {
int num = 0;
somaMaisDois(&num);
printf("%d\n",num);
return 0;
}

Mas existe uma artimanha para evitar de colocar estrelinhas no código... :P
Basta usar o & "E comercial" em vez do ponteiro!
Exemplo:

#include <stdio.h>

void somaMaisDois(int& num) {
num = num + 2;
}

int main(int num_args, char** args) {
int num = 0;
somaMaisDois(num);
printf("%d\n",num);
return 0;
}

Uia, reduziu as estrelas da minha constelação (quer dizer, da minha codificação). :P

Obs.: Ah... Isso só vale para compiladores C++.

Até mais!

domingo, 27 de março de 2011

SharpDevelop: Uma IDE Open Source para .Net

Nem tudo em .Net é pago! :P

Existe um framework de desenvolvimento de aplicações desktop para .Net de graça e open source chamado SharpDevelop.
http://www.icsharpcode.net/opensource/sd/

É bem simples de usar (parecido com o MS-Visual Studio, com componentes visuais arrastaveis), utiliza as linguagens C# e VB.Net, e parece robusto (sem grandes problemas ou erros).

Falando em open-source e .Net, alguém já ouviu falar em Mono?
http://www.mono-project.com/Main_Page
Pois é, é o framework .Net open source com IDE de desenvolvimento próprio e que roda em Windows, Linux e MacOSX.

Até mais!

MSX: O que é isso, é marca de bicicleta?


Para quem não sabe, MSX era um computador pessoal de 8 bits fabricado nos anos 80 ou, em termos mais simples, é o pai do PC (familia X86). :P

Não se sabe bem o que a sigla significa, mas existem boatos: os mais "fortes" eram "MicroSoft eXtend", "Machine with Software eXchangeability"e "Matsushita Sony X-power".

Para quem tinha dinheiro naquela época (o que não era meu caso...), era o sonho de consumo de cada 10 entre 10 nerds (quem não queria jogar aqueles games com gráficos com mais de 16 cores!).

O interessante que o computador usava cartucho (tipo de video-game, como Atari 2600, Master System e NES) e fitas magnéticas (também chamadas de fitas K-7).

Quem tem saudades daquela época, pode baixar o emulador OpenMSX:
http://openmsx.sourceforge.net/

Sou um saudosista... (para não dizer velho) :)

sábado, 26 de março de 2011

Dicas de Programação: Transparência no HTML

Essa é uma dica de um colega meu! :)
Para fazer um elemento de HTML ficar transparente, basta usar a propriedade opacity do CSS:

<html>
<body>
<style>
div.box {width: 90px; height: 90px; background: blue; opacity: 0.4; filter: alpha(opacity=40);}
</style>
<div class="box">Teste</div>
</body>
</html>

Obs.: A propriedade filter é do IE (sem ela, não funciona...).

Até mais!

RPGs brasileiros de graça na rede

O RPG que estou falando não é reeducação postural global, mas sim, um jogo onde as pessoas representam personagens ficticios criados por elas. Elas tem um desafio proposto por um outro jogador (neste caso, este se chama mestre) que "gerencia" a aventura.

Existem vários RPGs no exterior, os mais famosos são D&D, GURPS e Vampiro: A máscara.

E também existem RPGs brasileiros:


Tagmar é o primeiro RPG brasileiro, que usa o cenário/tema medieval:
http://www.tagmar2.com.br/


O Opera RPG (não confundir com o navegador...) é um jogo de RPG genérico (ou seja, sem cenário/tema específico) feito pela Confraria dos Observadores, um grupo de rpgistas sediado em Catanduva-SP (minha cidade natal :) ). Mais informações no site:
http://www.rpgopera.tk/


Outro, já mais famoso, é o 3D&T de Marcelo Cassaro:
http://www.jamboeditora.com.br/produtos/3d&t.htm

E existem muito mais! Para mais informações, no site do Wikipédia:
http://pt.wikipedia.org/wiki/Role-playing_game

sexta-feira, 25 de março de 2011

Robocode: Aprenda a programar através deste jogo


Robocode é um jogo com o intuito de programar um robo capaz de sobreviver em uma luta contra outros robos (simplificando: que seja capaz de ser mais "esperto" e detonar os outros sem que ele próprio seja o detonado :P).

O legal, é que além de ser divertido de desenvolver, existem campeonatos em que vários programadores deste "aplicativo" fazem/participam. :)

Para saber mais sobre o Robocode e baixa-lo de graça, vá ao site deles no Sourceforge:
http://robocode.sourceforge.net/

As linguagens utilizadas pelo Robocode são Java e .Net até o momento.

Até mais!

O Sonhar, Sete Irmãos e a Morte

Alguém sabe o que é Sandman?


Pelo menos, no Brasil, Sandman é uma coleção de HQs (História em Quadrinhos) que conta a saga do "herói" Sonho e sua família.

E o que isso tem demais? -- pergunta você.

Apesar de muito gente considerar HQ coisa de criança, esta série, com certeza, não é nem um pouco...
Com temática adulta, uma mistura de mitologia e suspense, Neil Gaiman, o autor da HQ, literalmente refez uma personagem secundária da DC Comics (detentora dos direitos) em um dos "heróis" mais famosos e populares dos anos 90, que até hoje possue fãs.

Só para ter idéia da fama da "obra", o autor recebeu por 4 anos seguidos, o prêmio Eisner como Melhor Escritor.

Acreditem, para quem gosta de quadrinhos ou dos enredos de Frank Miller e Alan Moore ou do filme Constantine, tem minha recomendação máxima. :)

Ainda não li o final da série (sim, esta é uma das poucas (ou única) séries de super-heróis com começo, meio e FIM -- coisa rara em HQs americanas), estou vendo se consigo as edições que não vi.

Se alguém se interessar, sempre tem algum Sebo que vende a um preço camarada (a Panini lançou um tempo atrás, edições absolutas, mas custam em torno de R$150,00! -- Como sou pobre... :( )

Hã? Você quer saber o por que do título deste post?
Então..., agora vou ser chato: leia a HQ que você vai entender. :P

Uma ótima leitura!


Ah... Uma dica para aqueles que já leram e gostaram: Livros da Magia.

quinta-feira, 24 de março de 2011

Street Chaves e outros

Alguém já jogou Street Chaves?

Se não, dê uma olhada no vídeo abaixo:



Street Chaves é um clone do jogo Street Fighter II da Capcom©, mas com personagens do seriado Chaves. É muito tosco, mas muito legal! :P

Para saber mais deste e de outros jogos (existe um Super Mario com o Seu Madruga como personagem principal!) entre no site do desenvolvedor (ou desenvolvedores):

http://www.cybergamba.com.br/

Obs.: Não sei quem ele é (ou eles são), mas os jogos são muito divertidos! (principalmente para quem jogava video-game no fim da decada de 80 e começo da 90) :)

Até mais!

Aprenda a Programar com Logo

Para quem não sabe, Logo é uma linguagem de programação com objetivos didáticos, que serve para introduzir os estudantes neste mundo louco de desenvolvimento de software. :P


O "programador" deve instruir uma tartaruga a desenhar objetos na tela, através de instruções simples, do tipo "desenhe um quadrado":

repita 4 [pf 90 pd 90]

Isso é o mesmo que "tartaruga, repita 4 vezes: 90 passos para frente e vire para a direita 90 graus".

Parece fácil não? O problema é pedir algumas formas mais complicadas como uma estrela:

repita 5 [pd 15 pf 100 pd 150 pf 100 pe 78]

Coisa de maluco, não? :P

Quem quiser baixar de graça uma versão feita pelo NIED da Unicamp (Superlogo), pode faze-lo em:
http://www.nied.unicamp.br/softwares/software_detalhes.php?id=33

quarta-feira, 23 de março de 2011

XBill - O Jogo

Alguem já teve, um dia, ódio dos travamentos do Windows que deu vontade de matar seu criador?

Se sim, seus problemas acabaram!


O XBill é um jogo com um objetivo específico: impedir o criador de um sistema operacional que trava o tempo todo, de instalar este nos computadores.

Mate esta "praga", bastando clicar o mouse em cima dele.

Para download e mais informações, acesse:
http://www.xbill.org/

Obs.: Existe uma versão para o Windows, ele só esta escrito errado: Wingdows (por que será?) :P

Até mais!

Dicas de Programação: Entendendo posicionamento de memória em C/C++

Isso foi uma dúvida de um colega meu sobre alocação de memória em C/C++:

Vamos ver a seguinte instrução:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
//Aloco na memória, um inteiro
int* inteiro = (int*)(malloc(sizeof(int)));
//Veja qual endereço de memória, ele alocou (Ex.: 4074488)
printf("%d\n", inteiro);
//Adiciona mais um no endereço, teoricamente vai para 4074489
inteiro++;
//Exibo o endereço (4074492 (???))
printf("%d\n", inteiro);
//Libero memória
free(inteiro);
//Espero um <enter> :P
getchar();
//Finalizo a função
return 0;
}

A dúvida: Por que diabos quando eu somo um em ponteiro, ele vai para um outro número nada a ver?

Não é bem assim...
Quando eu somo +1, ele vai para o próximo endereço que é alocavel para um inteiro, ou seja, se o tamanho do inteiro é 4 bytes (em gcc, eu acho que é...), então se tenho o endereço 4074488, se eu somar +1, ele vai para 4074492, 4 bytes a mais, por causa que o que ele tem que alocar é um inteiro.

Se eu utilizar um char em vez de inteiro no código:

#include <stdio.h>
#include <malloc.h>

int main(int num_args, char** args) {
char* b = (char*)(malloc(sizeof(char)));
printf("%d\n", b);
b++;
printf("%d\n", b);
free(b);
getchar();
return 0;
}

Agora vai "aparecer corretamente", pois o char em gcc é um byte (eu acho...), então se tenho 4074488 se somo +1 no endereço, ele vai para 4074489 :)

Até mais!

terça-feira, 22 de março de 2011

Curiosidade: Que computador é esse?


Alguém sabe que computador é esse?

Eu não sabia, mas este é um computador da Apple! :o

Lançado em 1997, para comemorar os 20 anos da Apple, o TAM (Twentieth Anniversary Macintosh) foi um computador pessoal que possuia um processador PowerPC (RISC) e memória de no máximo 128 MiB.

Custava a bagatela de US$ 7449,00! :P
E foram feitos apenas 12000 unidades.

Ah... E este computador apareceu em filmes, como Batman & Robin, e em séries, como Friends.

Mais informações, no site do Wikipédia:
http://en.wikipedia.org/wiki/Twentieth_Anniversary_Macintosh

Momento Cultural: Planetário de Campinas

Sabia que existe um planetário em Campinas?
Pois é, existe! :)


Sabe aquele prédio/casa triangular que fica dentro do Taquaral/Parque Portugal? Então, é lá. :)
É aberto as visitações aos domingos das 15:30hs ás 17:00hs (não sei se ainda funciona, mas a última vez que fui (1999), estava aberto :P ).

Para quem não tem nada para fazer no domingo, é uma boa pedida. :)

Mais informações no site do Museu Dinâmico de Ciências de Campinas (MDCC):
http://www.abcmc.org.br/mdcc/planetario_atividades.htm

Ah... Falando em ciências, o Museu Exploratório de Ciências da Unicamp, lança mais um Grande Desafio para crianças, jovens e adultos:
http://www.mc.unicamp.br/5-grandedesafio/o_desafio/index

Aos que participarem, boa sorte!

segunda-feira, 21 de março de 2011

Star Wars: ASCIImation


Sabia que dá para assistir uma parte da antiga triologia de Star Wars pelo telnet?

É só digitar o seguinte comando no Prompt/Terminal:

telnet towel.blinkenlights.nl

Também existe uma versão web (html) disponível:
http://www.asciimation.co.nz/

Para que não sabe, este "filme" foi feito em ASCII Art.

Ah... falando em ASCII Art, sabia que dá para assistir um filme neste modo (via terminal/prompt de comando)?

Utilizando o MPlayer com o plugin ASCII Art (aalib), ele consegue exibir um filme no modo texto!
Para isso, basta usar o seguinte comando:

mplayer -vo aa video.avi

Mais informações no site do MPlayer:
http://www.mplayerhq.hu/DOCS/HTML/en/aalib.html

MUD: Jogos de RPG online em modo texto!


O MUD (Multi-User Dungeon/Domain/Dimension) é, em linhas gerais, uma sigla que define qualquer tipo de jogo multi-usuário, real-time, online em um mundo de fantasia (ou virtual), ou seja, um jogo de RPG on-line.

Inicialmente, os MUDs eram jogos feitos em modo texto pois, na época em que foram criados, por volta do fim da década de 70 e ínicio da 80, nem a internet e nem os computadores eram coisas "rápidas e eficientes" como é hoje. (pois é, não reclame da sua atual conexão, antigamente era bem pior! :P)

Geralmente para jogar este tipo de jogo, basta ter um conexão para internet, um programa telnet e um computador. (de resto, é só se divertir :) )

Se alguém estiver interessado, existem MUDs em português:

Mundo de Arkadia
Acesso pelo Telnet: telnet arkadiamud.com.br 2442

DeBo MUD
Acesso pelo Telnet: telnet debomud.org 4000
Acesso pelo navegador: http://debomud.org/play/

Obs.: Acho que errei quando disse para alguém que era um jogo via FTP (não é, é via telnet com outros protocolos :P)

Até mais!

domingo, 20 de março de 2011

Dicas de Programação: Chamando uma classe dinamicamente em Java

Isso é bem estranho... Mas é possível usar um objeto de uma classe sem importar e/ou declarar ela. (vamos usar, em Java, o que chamamos de reflexão :) )

Por exemplo, quero usar a classe Vector e adicionar uma String nela, mas não desejo importa-la ou declara-la explicitamente.

O primeiro passo é usar o método estático forName da classe Class, passando como argumento uma String com o nome do pacote e da classe que quero usar:

Class clazz = Class.forName("java.util.Vector");

Agora, quero criar uma instância de Vector:

Object obj = clazz.newInstance();

Coloquei em obj, que é um objeto (variável) da classe Object, que toda classe herda (o chamado classe "genérica", que aceita de tudo :P ).
Vamos obter o método add do objeto Vector:

Method method = clazz.getMethod("add", Object.class);

A instrução acima, obtem o método a ser chamado (no caso, o método chamado "add"), sendo o primeiro parametro é o nome do método, e os demais parametros (opcionais) são as classes dos parametros deste método.
Ixi... Agora complicou! :P
Acho melhor passar um exemplo... Se um método é declarado assim:

public void escreve(String s1, String s2) {
...
}

Para chama-lo, você deve fazer assim:

clazz.getMethod("escreve",String.class, String.class);

Ou seja, se tem dois argumentos do "tipo" String, então passo estas classes no getMethod.

Vamos executar o método que temos, através do método invoke:

method.invoke(obj, "Teste");

O primeiro argumento, é o objeto/instância da classe, e o segundo valor passado é o valor do parametro do método "add". Ou seja, isso é como se eu estivesse fazendo:

((Vector)obj).add("Teste");

Agora, para ver se deu certo, eu mando escrever o objeto:

System.out.println(obj.getClass().getName() + ".toString() = " + obj);

Deve aparecer a String "java.util.Vector.toString() = [Teste]"

Putz, que coisa estranha...

Até mais!

Dicas de Programação: Como passar uma função como parametro em C++

Essa é meio complicada, mas dá para passar uma função como parametro em C++. Primeiramente, a gente declara a função que vou passar para a outra:

#include <stdio.h>

void println(const char *str) {
printf("%s\n",str);
}

Agora vamos criar a função que recebe a anterior como parametro:

void alo_mundo(void (func)(const char *str) ) {
func("Alo mundo");
}

Vendo a função acima, a gente percebe que o parametro passado tem a seguinte estrutura:

void -> o tipo do retorno da função passada
(func) -> o nome da função (variável)
(const char *str) -> o argumento da função passada

Ou seja, quando você passa uma função, você precisa saber a estrutura do cabeçalho dela (o retorno e os parametros). Existe um jeito de deixar genérico, mas isso vai para uma outra dica. :P

Com isso, a gente pode executar a função assim:

int main(int num_args, char** args) {
alo_mundo(println);
}

Em Javascript também dá para passar uma função como argumento, só que de um jeito bem mais fácil:

//Função que será passada como argumento
var println = function(str) {
document.write(str + "\n");
}

//Função que recebe outra função como argumento
var alo_mundo = function(func) {
func("Alo mundo");
}

//Executa a função
alo_mundo(println);

Coisa de doido não? :P

Até o próximo post!

sábado, 19 de março de 2011

Criando extensões para Firefox

Vamos ao passo a passo de criar uma extensão para Firefox:

1o.) Crie seu projeto com os seguintes diretórios:
<nome_do_projeto>/
<nome_do_projeto>/components
<nome_do_projeto>/defaults
<nome_do_projeto>/plugins
<nome_do_projeto>/chrome
<nome_do_projeto>/chrome/content
<nome_do_projeto>/chrome/icons
<nome_do_projeto>/chrome/icons/default

2o.) Na raiz do projeto, crie o arquivo install.rdf com as seguintes linhas:

<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:em="http://www.mozilla.org/2004/em-rdf#">
<!--Descrição de seu plugin-->
<Description about="urn:mozilla:install-manifest">
<!--Identificador (email)-->
<em:id>exemplo@email.com.br</em:id>
<!--Número da versão-->
<em:version>1.0</em:version>
<!--Tipo: extensão-->
<em:type>2</em:type>

<!-- Características da extensão -->
<em:targetApplication>
<Description>
<!--Identificador do Firefox (valor fixo para qualquer extensão do Firefox)-->
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
<!--Versão mínima suportada-->
<em:minVersion>1.5</em:minVersion>
<!--Versão máxima suportada-->
<em:maxVersion>4.0.*</em:maxVersion>
</Description>
</em:targetApplication>

<!-- Mais informações -->
<!--Nome da extensão-->
<em:name>olamundo</em:name>
<!--Descrição-->
<em:description>Uma extensão de teste</em:description>
<!--Criador-->
<em:creator>Takemura</em:creator>
<!--Página da extensão-->
<em:homepageURL>http://blogtotakemura.blogspot.com</em:homepageURL>
</Description>
</RDF>

3o.) Crie o arquivo olamundo.xul em <nome_do_projeto>/chrome/content (XUL é o arquivo que utiliza a aplicação Firefox para criar componentes visuais -- é onde podemos criar janelas nativas e/ou colocar ícones e botões dentro do Firefox). Neste caso, eu estou reescrevendo a barra de status do Firefox (colocando mais um item):

<?xml version="1.0"?>
<overlay id="olamundo"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<statusbar id="status-bar">
<script src="olamundo.js"></script>
<statusbarpanel id="my-panel" label="Ola mundo!!!!!" onclick="OlaMundo.show();"/>
</statusbar>
</overlay>

4o.) Crie o arquivo olamundo.js no mesmo lugar que olamundo.xul (aqui, ele vai mostrar um alert ao clicar na frase "Ola mundo!!!!" no status bar):

var OlaMundo = function() {};

OlaMundo.show = function() {
alert("Ola mundo !!!!");
}

5o.) Crie o chrome.manifest na raiz do projeto com as seguintes linhas (a primeira diz onde esta o conteúdo do projeto e o segundo diz que o componente status bar do Firefox esta sendo reescrito pelo arquivo olamundo.xul):

content olamundo chrome/content/
overlay chrome://browser/content/browser.xul chrome://olamundo/content/olamundo.xul

6.) Verifique se os arquivos estão nos lugares corretos:

<nome_do_projeto>/install.rdf
<nome_do_projeto>/chrome.manifest
<nome_do_projeto>/components
<nome_do_projeto>/defaults
<nome_do_projeto>/plugins
<nome_do_projeto>/chrome
<nome_do_projeto>/chrome/content/olamundo.xul
<nome_do_projeto>/chrome/content/olamundo.js
<nome_do_projeto>/chrome/icons
<nome_do_projeto>/chrome/icons/default

7.) Zipe (ou comprima :P) a estrutura de diretórios (sem o diretório <nome_do_projeto>) e renomeie o arquivo gerado para olamundo.xpi

8) Abra o arquivo no Firefox e reinicie a aplicação.

9) Se tudo ocorrer bem, aparece na barra de status (lá embaixo…), a frase "Ola mundo!!!!" :)

Legal, não?

Para coisas mais complexas, verifique no blog da turma do Mozilla:
http://blog.mozilla.com/addons/2009/01/28/how-to-develop-a-firefox-extension/

E quem tiver interesse em como fazer "telinhas nativas" em Firefox, dê uma olhada no item XUL do site de desenvolvedores do Mozilla:
https://developer.mozilla.org/pt/XUL

Projetos Open Source feito por brasileiros

Vamos ajudar os amigos a divulgar seus projetos! :)



GFD - Gerenciador de Finanças Pessoais
Criado por Igor Régis, o Gerenciador de Finanças Pessoais é uma aplicação Java que cria uma base de dados com as despesas e gastos pessoais, calculando e informando seus valores ao usuário. Para mais informações e download, entre no seguinte endereço: http://sourceforge.net/projects/gfd



Xadrez 3D - Jogo produzido por brasileiro
Criado por Mauro Persano, o Vulcan é um jogo de xadrez 3D (baseado no xadrez de Jornadas das Estrelas - Star Trek) feito em C com a biblioteca OpenGL. Ele é open-source e roda em diversas plataformas. Apesar de ainda estar em fase de desenvolvimento, é jogável (funcional) e muito bem feito. :)
Downloads: http://www.fzort.org/mpr/projects/vulcan/



Protux - Digital Media Workstation
Criado por Luciano Giordana , o PROTUX é uma aplicação em Java que trabalha com mídia de som. Sua versão atual é a 0.70 e pode ser baixada no seguinte endereço: http://protux.sourceforge.net/Download.php

Se alguém quiser me mandar alguma coisa que queria divulgar, pode enviar para meu e-mail :)

sexta-feira, 18 de março de 2011

Compiladores alternativos para Java

Eu acreditava que só existia o compilador da Sun (ou Oracle, no caso...) para gerar aplicações Java (tanto que uso ele até hoje... :P ).

Mas descobri que existem alternativas para ele, como:

O Kaffe, que possui até uma VM própria (ele diz que não é Java, mas tem compatibilidade de 70%...):
http://www.kaffe.org

O GCJ da GNU, que é livre e de código-aberto. Ah..., o mais legal dele é que ele pode gerar código nativo para o sistema operacional:
http://gcc.gnu.org/java/

E o Jikes, que é um compilador que diz ser o mais rápido:
http://jikes.sourceforge.net/

Até o próximo post!

Qual é o primeiro jogo em video-game com advertisement?

Advertisement é, na conjuntura atual, a publicidade colocada em um produto ou serviço (muita usada em sites e aplicativos).

Para quem não entendeu, sempre tem a explicação do Wikipédia :P :
http://en.wiktionary.org/wiki/advertisement


Eu sempre achei que o primeiro jogo com advertisement era o Cool Spot (7-Up) do Mega Drive.


Mas descobri que o primeiro jogo que muita gente considera o primeiro é o Pepsi Invaders para o Atari 2600.

Que coisa..., uma garrafa de Coca-cola disparando um líquido que mata o logo da Pepsi... :P

Até o próximo post!

quinta-feira, 17 de março de 2011

Protozoa: um jogo feito por brasileiros



Protozoa é um jogo de tiro (ou shooting game :P), feito por Mauro Persano, Cristina Sato e Rafael Coelho, que participou do "Intel Game Demo Contest 2008" e ficou entre os 10 classificados em uma categoria (pelo menos, que eu me lembre :P).

Mais informações no site:
http://www.fzort.org/protozoa/

Legal, né? Isso me empolga em terminar meu "joguinho" (o desenvolvimento está lento, mas vai indo...). :P

O Fabuloso Gerador de Lero-Lero

Você precisa fazer aquele trabalho chato sobre geografia política e esta com preguiça de escrever ou digitar?

Seus problemas acabaram!!!! :)

O Fabuloso Gerador de Lero-Lero é a ferramenta ideal para impressionar seus colegas e professores com um palavreado complexo e sem o menor sentido.

Ele é capaz de criar um artigo de mais de 100 linhas em menos de 10 segundos!
As pessoas ficarão impressionadas com seu conhecimento e sua capacidade de raciocínio de não explicar nada com coisa nenhuma (o chamado "embromation").

Entre no site do Dicas-L, para mais informações:
http://www.dicas-l.com.br/lerolero/

Até a próxima, quando o sistema metodológico do país, na qual todos nós vivemos, estará em via de um desenvolvimento sustentável, perante a organização da sociedade multi-facelada onde cada indivíduo participa. :O

Obs.: E não é que fica bom! :P

quarta-feira, 16 de março de 2011

Erinia - O primeiro e talvez o único jogo MMORPG feito no Brasil!

Até pouco tempo atrás, o Brasil não era um lugar muito bom para criar jogos eletrônicos, principalmente por causa do alto custo e do pouco investimento que o governo dava para esta área.

Mas, por incrivel que pareça, sempre aparece um grupo de pessoas que tentam engatar algo no país! :)


Um dos primeiros que eu soube, era o pessoal da Perceptum, com o jogo "Incidente em Varginha".

Foi corajoso da parte deles lançar o jogo em 1998, uma época em que as grandes desenvolvedoras de games dos EUA dominavam o mercado brasileiro.


E existiu um outro grupo, que lançou o primeiro (e talvez, o único...) MMORPG feito no Brasil, chamado Ignis Games. O jogo se chama Erinia.

Erinia é um MMORPG baseado no foclore brasileiro, usa gráficos 3D e é multiplayer.

Não sei se os servidores encontram-se ainda no ar, mas a página do jogo ainda existe:
http://erinia.com.br/2009/

E tem uma entrevista na UOL com um dos produtores da empresa, falando sobre Erinia:
http://jogos.uol.com.br/pc/ultnot/2010/08/23/ult182u8472.jhtm

Será que o mercado de jogos eletrônicos no Brasil mudou? Ou será que ainda há muitas dificuldades e pouco investimento?

Dicas de Programação: 2 elevado a N

Normalmente, para fazer a expressão acima, eu faria da seguinte maneira:
int n = 10;
int resultado = 1;
for (int i = 0; i < n; i++) {
resultado *= 2;
}

Mas um colega me passou a seguinte artimanha:
int n = 10;
int resultado = 1 << n;

E o legal, que mesmo mudando o n (variei de 1 a 10), o resultado dos dois é igual!

Mas, por que isso ocorre?
Por causa que o computador trabalha com números binários!

Hum... Vejamos como explicar: o número 1 é definido como:
int i = 1; //00000001 (bits)

Se deslocarmos os bits para esquerda com o operador <<:
i = i << 1; //00000010 (bits)

Temos que o resultado é 2!

E se deslocarmos de novo:
i = i << 1; //00000100 (bits)

O valor virou 4!

Concluimos que se deslocarmos um bit para esquerda, sempre multiplicaremos este número por 2. Então, se deslocarmos "n" bits para esquerda, multiplicaremos por 2 "n" vezes, o que equivale a 2 elevado a "n" !

Eureka! :P

Valeu pela dica! ;)

Dicas de Programação: Redução de expressões com operadores lógicos

Para quem fez informática: alguém se lembra de aritmética lógica?
Sabia que dá para aplicar no código-fonte de uma aplicação?

Por exemplo, se eu tenho a condição:

if (((x == 0) || (y == 0)) && ((x == 0) || (z == 0))) {
...
}

Eu posso reduzi-la pela equivalência:
(A OR B) AND (A OR C) -> A OR (B AND C)

Assim, eu posso simplificar o código da seguinte maneira:

if ((x == 0) || ((y == 0) && (z == 0))) {
...
}

A mesma coisa, eu poderia fazer com outras expressões:
(A AND B) OR (A AND C) -> A AND (B OR C)
(A AND B) AND (A AND C) -> A AND B AND C
(A OR B) OR (A OR C) -> A OR B OR C

O legal, é que vale para aquelas expressões mais "complicadas" (ou mais "cabeças", como alguns falam :P ) :
NOT A OR NOT B -> NOT (A AND B)
NOT A AND NOT B -> NOT (A OR B)
(NOT A AND B) OR (NOT B AND A) -> A XOR B
(NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B)

Vamos pegar a última expressão acima:

if (((!(a > b)) || (c < d)) && ((!(c < d)) || (a > b))) {
...
}

Aplicando:
(NOT A OR B) AND (NOT B OR A) -> NOT (A XOR B)

Temos:

if (!((a > b) ^ (c < d))) {
...
}

Será que isso ajuda alguém?

Até!

terça-feira, 15 de março de 2011

Video-game: Super Mário foi um vilão anti-ecológico



Para quem não sabe, o Mário, personagem dos jogos Super Mário da Nintendo, já foi um vilão cruel e anti-ecológico!

Em Donkey Kong Júnior, Mário aprisiona o pai (Donkey Kong) do personagem principal que faz de tudo para atrapalhar o filhote de gorila, inclusive, joga jacarés (???) sobre o pobre coitado...
E pelo que se vê na tela, a jaula é apertada pra burro (ou para o gorila, neste caso...).

O Ibama deveria processar a Nintendo© por maltrato aos animais!!!!

Sei lá, acho que estou sem assunto hoje :P

Arquitetura de Software: Quando usar a agregação e quando usar a herança?

Uma vez, eu falei da diferença de agregação, composição e herança.
Agora, vou tentar falar de quando se pode usar um ou outro. Parece fácil diferenciar, mas é muito mais complexo do que se imagina...

Por que eu digo isso?
Porque a própria API do Java SE contém erros de herança/agregação.

Verdade? Como assim?

Vejamos a classe Stack do pacote java.util:

public class Stack<T> extends Vector<T>{
....

public boolean empty() {
...
}

public T peek() {
...
}

public T pop() {
...
}

public T push(T item) {
...
}

public int search(Object o) {
...
}

}

Hum... Ela herda da classe Vector e os métodos parecem corretos para uma classe que representa uma pilha...

Mas existem alguns problemas...

E você me pergunta: Como assim??? Quais???

Vejamos, como Stack herda de Vector, os métodos que a classe Vector possui também existem na classe Stack, gerando o seguinte problema:

Se, em um Vector, eu posso remover um item de qualquer posição do vetor através do método remove(int i), e posso colocar o item em qualquer lugar através do método add(int i, E item), então eu posso fazer o mesmo em um Stack (pilha):

Stack<String> pilha = new Stack<String>();
pilha.push("Primeiro");
pilha.push("Segundo");
pilha.remove(0); //Remove o primeiro item colocado em uma pilha? Não deveria ser sempre o último colocado?
pilha.add(0,"Terceiro"); //Colocando o item abaixo do topo de uma pilha (???)

E isso não esta errado? Por definição, uma pilha deveria somente colocar ou retirar itens do topo? (pelo menos, eu acho que seria o esperado...)

Neste caso, parece que seria melhor usar uma agregação:

public class Stack<T> {

private Vector<T> v;

public Stack() {
v = new Vector<T>();
}

public boolean empty() {
return v.isEmpty();
}

public T peek() {
return v.lastElement();
}

public T pop() {
T t = peek();
v.remove(t);
return t;
}

public T push(T item) {
v.add(item);
return item;
}

public int search(Object o) {
return v.indexOf(o);
}

}

Assim, um Stack (pilha) não seria um Vector (vetor), a classe somente utilizaria um objeto Vector. (o que parece "certo"...)

Para usar herança, é preciso realmente saber se uma classe tem as mesmas caracteristicas de outra (por exemplo: Carro herda de Veiculo por que um Carro também é um Veiculo).
De resto, se você não tiver certeza, ou não souber, vale a dica: é uma agregação. :)

É díficil... mas se não fosse, não seria Orientação á Objetos. :P

Até, espero que isso ajude alguém!
Obs.: Esta dica é de um professor meu! Valeu! :)

segunda-feira, 14 de março de 2011

Ferramentas de Desenvolvimento: JSTL

O JSTL é um conjunto de taglibs "padrão" para JSP (Java).
Com ele é possivel criar JSP sem inclusões de código Java, ou seja, os chamados scriplets:
<%
for (int i=0; i < 10; i++) {
%>
<p>Número: <%=i%></p>
<%
}
%>

Ficando uma forma mais "bonita" no código JSP:
<c:forEach var="i" begin="0" end="10" step="1">
<p>Número: <c:out value="${i}"/></p>
</c:forEach>

Dá para fazer até instruções SQL de forma simples na página:
<!--Data source configurado no web.xml do servidor de aplicação-->
<sql:setDataSource dataSource="jdbc/Banco_de_dados" />
<sql:query var="resultado" sql="select id, nome from tabela where nome=?">
<sql:param value="nome"/>
</sql:query>
<c:forEach var="tupla" items="${resultado.rows}">
<c:out value="${tupla.id}"/>-<c:out value="${tupla.nome}"/><br/>
</c:forEach>
<!--Transação-->
<sql:transaction>
<sql:update sql="delete from tabela where nome=?">
<sql:param value="nome"/>
</sql:update>
</sql:transaction>

Legal, não? :)

Essa dica vai para um amigo que esta começando a entrar no díficil e complicado mundo maravilhoso de Java. :P

A página "oficial" do JSTL:
http://jstl.java.net/

Inovar sempre?

Será que inovar é sinônimo de sucesso?

O video-game da Apple: O Pippin
O Pippin foi o primeiro (e único, até agora...) video-game criado pela Apple em conjunto com a Bandai. Foi um dos maiores fracassos das duas grandes empresas, vendeu menos de 50000 unidades...
É considerado um dos 50 piores produtos tecnológicos no mundo.
Foi totalmente ao contrário da Microsoft e seu XBox 360...


O Óculos 3D do Master System:
No final dos anos 80, antes mesmo de falar em cinema 3D, tv 3D e video-game 3D, a Sega lançava o Master System com óculos 3D, uma inovação para a época!
Mas, foram poucos jogos e mesmo assim, a Nintendo continuava lider no mercado de 8 bits com o NES...

O Activator do Mega Drive:
Antes mesmo do Wii, do Kinect e do PS Move, a Sega lançou um controle interativo para Mega Drive, fora dos padrões "joystick", chamado Activator.
Era um tipo de "tapete" infra-vermelho que visualizava os movimentos do jogador.
Muito gente nunca ouviu falar de tal acessório...

Betamax:
Alguém já viu fitas Betamax? Eram menores do que o VHS e possuiam mais qualidade!
O problema é que os vídeos-cassete deste não venderam tanto quanto esperava e o VHS dominou o mercado por vários anos...

IOmega ZIP/JAZ Drive:
Regraváveis (na época, o CD regravável era caro...) e com mais capacidade que um disquete, este tipo de tecnologia tinha tudo para substituir o ultrapassado disquete e o CD gravável...
Mas o CD gravável continua até hoje e nem se ouve mais falar nestas coisas...

Hum... Por que será que estas coisas não deram certo? :(

Até!

domingo, 13 de março de 2011

Dicas de Programação: Como criar uma classe dentro de uma classe?

Pelo menos em Java, é possivel criar uma classe dentro de uma classe.

public class Arvore {
    public class No {
    ...
    }
    public void adicionarNo(Arvore.No no) {
    ...
    }
}

Não sei se isso ajuda alguém, mas é mais para título de curiosidade. (atualmente, estou sem idéias para as dicas de programação...)

Ah... mais uma dica em Java: Existe como fazer um "construtor para classe", utilizando a palavra reservada "static". Exemplo:

public class Portugues {
    public static Locale PT_BR;
    static {
        try {
            PT_BR = new Locale("pt","BR");
        } catch (Exception e) {
            System.out.printf("Erro: %s", e.getMessage());
        }
    }
}

Hum... acho que esta dica é mais util! :P

Até!

Eventos Esportivos: Para o amigo enxadrista!


O SESC Campinas em sua programação de Março/2011 fará uma simultânea de xadrez no dia 27 deste mês das 10hs ás 13hs. Para quem quiser participar, o evento é de graça e contará com a participação do mestre enxadrista Leandro Perdomo.

Para mais informações, no site do SESC SP:
http://sescsp.org.br/sesc/programa_new/mostra_detalhe.cfm?programacao_id=188921
Obs.: Acho que já disse em algum lugar onde fica o SESC, mas não custa nada lembrar:
SESC Campinas
R. Dom José I, 270 / 333 - Bairro Bonfim
Fica perto da nova Rodoviária de Campinas.

Um bom jogo a todos que irem. (e, o principal, se divirtam! :) )

Além da "Rede Social"

Eu ainda não assisti esse filme... :(

Mas, antes do consagrado filme do Facebook (Rede Social), sei que foram feitos outros filmes também falando de informática. Não sei de todos, mas os que eu conheço são:




Revolution OS (documentário).

É uma boa opção de filmes para quem admira/detesta e gosta/odeia deste mundo louco da informática. :P

Até!

sábado, 12 de março de 2011

Eventos de TI em Campinas: Road Show TI 2011


O Senac do estado de São Paulo, promove entre os meses de Março a Maio, palestras sobre TI gratuitas em suas unidades (o que inclui a unidade de Campinas):

Para mais informações acesse o site da instituição:
http://www.sp.senac.br/jsp/default.jsp?tab=00002&subTab=00000&newsID=a18370.htm&
testeira=453


Não sei se é bom (eu nunca fui em nenhuma palestra deles), mas a iniciativa é boa! :)

As palestras em Campinas estão disponíveis nesta página:
http://www.sp.senac.br/jsp/default.jsp?newsID=DYNAMIC,oracle.br.dataservers.ContentEventDataServer18,selectEvent&template=949.dwt&event=851&unit=CAM


Obs.: Não sei se esta URLs funcionam sempre, mas qualquer coisa, entre na página principal. :P
http://www.sp.senac.br

Momento cultural: Observatório Municipal de Campinas


Para quem não sabe, existe um Observatório Astronômico em Campinas.
Ele fica no distrito de Joaquim Egídio (Serra das Cabras, sem número) e é aberto a visitação aos domingos das 17hs ás 21hs (pelo menos, é o que esta descrito no site oficial deles...).

Para mais informações, entre no site da Prefeitura de Campinas (acho que esta mais atualizado...):
http://www.campinas.sp.gov.br/conheca-campinas/atracoes-culturais-museus.php

Ah... falando em Campinas, sabia que existe alguém famoso enterrado bem no centro de Campinas?
É o senhor Carlos Gomes!


Quem passar entre as avenidas Benjamin Constant e Thomas Alves verá a sepultura lá.
Funesto não? :P

Ah... quem dúvida que ele esta lá, de uma olhada no site da prefeitura:
http://2009.campinas.sp.gov.br/campinas/atracoes/culturais/monumentos/monumento_tumulocgomes/

Dicas de Programação: Procedimento dentro de procedimento em Pascal.

Posso criar um procedimento dentro de um outro procedimento?
Em Pascal/Delphi, isso é possível! :)

Veja um exemplo:

program teste;
uses crt;

procedure limpatela;
    procedure olamundo;
    begin
        writeln('Ola mundo!');
    end;
begin
    clrscr;
    olamundo;
end;

begin
    limpatela;
end.

Somente a título de curiosidade. (estou meio sem assunto hoje... acho que é por que é Sábado) :P

sexta-feira, 11 de março de 2011

Video Games Live - Classic game themes Orchestrated

Este é para quem jogou video-game nas décadas de 80 e 90. Músicas de jogos clássicos orquestrada:



Putz, destes que estão no vídeo, eu joguei Donkey Kong, Frog, Ghosts'n Goblins, Rastan, Outrun e Tetris.

No ano passado, o Video Games Live (é como se chama a orquestra) passou no Brasil... Quem sabe eles não voltam. :)
Pelo menos, na agenda deles deste ano, o Brasil aparece sem previsão:
http://www.videogameslive.com/index.php?s=dates

Um bom fim-de-semana!

Arquitetura de Software: Qual a diferença entre agregação, composição e herança?

Sempre me fiz esta pergunta... Então, vamos lá! :)

As diferenças são:

Agregação é a utilização de uma classe por outra através de um vínculo comum, onde a classe utilizada (agregado) faz "sentido" sem a classe que a utiliza (agregador). Um exemplo são as classes do tipo Carro e Roda (Um carro possue rodas, mas as rodas existem sem o carro).

class Carro {
private Roda[] rodas;
}

class Roda {
}

Composição é uma agregação mais "forte", onde o agregado não faz sentido sem o agregador. Um exemplo clássico, são classes do tipo Pedido e ItemPedido (Um pedido possue itens de pedido e o item de pedido não existe sem um pedido).

class Pedido {
private ItemPedido[] itens;
}

class ItemPedido {
//O código abaixo é só de exemplo, mas nem sempre em uma composição deve ser colocado assim.
private Pedido pedido;
}

Herança é quando uma classe possue todas as características de uma outra classe, a classe que possue as caracteristicas comuns é chamada de base ou de pai e a classe que "herda" estas caracteristicas é chamada de filha. Um exemplo são classes do tipo Animal e Mamifero (pois um mamífero é um animal, mas nem todo animal é mamífero):

class Animal {
}

class Mamifero extends Animal {
}

É isso ai... Pareceu até que estou escrevendo uma apostila :P

Até!

quinta-feira, 10 de março de 2011

Legend of Zelda (April Fools' Day) Movie Trailer Premiere

Muita gente acreditou neste "trailer" do filme "The Legend of Zelda", baseado no jogo de mesmo nome da Nintendo©.



Pena que isso era pegadinha de 1o. de Abril...
Obs.: Estive pensando, a IGN© deve ter gastado uma boa grana nisso... Será que site de games dá dinheiro? :P

A melhor equipe do mundo!

Trabalhei com muitas pessoas durante a minha carreira de mais ou menos 10 anos (ou seja, já trabalhei prá burro :P).
E uma vez, me perguntaram:

Qual foi a melhor equipe que você trabalhou?

E, sinceramente, não sei... Gostei de várias! :)

E para todas as equipes que trabalhei, meu muito obrigado:

Aos estagiários, para quem ensinei e aprendi muito! Valeu por me escutarem! (algumas vezes, eu exagero e falo demais...) :)

Aos meus colegas desenvolvedores, agradeço pelo esforço e pelo "coleguismo". Por me ajudarem a lidar com a tímidez e também por me ensinarem muito tecnicamente e profissionalmente. Hoje, sou o que sou por que vocês me fizeram assim! (não sei se eu correspondo as expectativas, mas espero que sim :P).

Aos meus lideres (sei que a maioria tem preconceito com a palavra "chefe"), com quem aprendi muito através dos erros e dos acertos de um projeto.

Aos analistas, pela paciência de me explicar um caso de uso. :)

Aos arquitetos, com quem aprendi que a vida de um desenvolvedor não é só programar (poderia, mas não é... :P).

Aos testers, que a gente reclama quando pegam um erro, mas que se não fosse por eles, quem ia pegar o erro era o cliente...

E aos clientes, por que, sem eles, eu estaria desempregado! :P

Para mim, todos que trabalharam comigo, de um jeito ou de outro, formam a melhor equipe do mundo! :)

Obs.: Sei lá, hoje acordei de bem com a vida! :D

Dicas de Programação: Como fazer um bom teste unitário?

Me pediram para ser um pouco menos técnico nas dicas de programação. Então decidi que vou falar de teste unitário. :)

Para quem não sabe o que é um teste unitário...
Define-se "teste unitário", em síntese, todo teste feito na menor unidade de uma aplicação (por exemplo, em funções e/ou procedimentos (código-fonte) de um programa).

Dadas as explicações, agora voltamos a pergunta: Como fazer um bom teste unitário?
Antes de fazer um teste unitário, existem algumas coisas a se pensar:

Primeiro, precisamos definir o domínio da função ou procedimento (Hã? Matemática?), ou seja, definir um conjunto de valores válidos ("entrada") para esta função.

Se definimos o domínio, agora precisamos definir o contra-domínio desta (Matemática de novo? Isso não deveria ser informática? :P ), em termos gerais, vamos definir um conjunto de valores válidos para o resultado ("saída") da função.

Para os matemáticos de plantão, isso significa que na função y = F(x), se x pertence ao domínio da função, então y pertence ao contra-domínio. Se x não pertencer ao domínio, então y não é um resultado válido.

Para facilitar as coisas (eu acho que as compliquei... :P ) vamos ao exemplo:

Vamos criar uma função que calcula a média de notas de duas provas (a primeira de peso um, a segunda de peso dois) em uma escola:

function media(primeira: integer, segunda: integer): integer
    media = (primeira + 2 * segunda) / 3;

//Teste Unitário
...
var resultado: integer;
resultado = media(5,5);
assertEquals(resultado, 5);
...

Parece que a função calcula corretamente e que o teste unitário esta passando, certo?
Errado! :P

Hã, como assim?

Vamos a alguns questionamentos que podem existir:
Existe nota negativa?
Existe nota maior que 10?
Existe nota com valor "quebrado" (5.5, por exemplo)?
Se não existe, a nota deve ser arredondada para cima ou para baixo? A partir de que valor?

Perceba que, como não foi definido um conjunto de valores válidos de entrada (domínio) e saída (contra-domínio), ficamos com um monte de dúvidas e não sabemos os valores que devemos testar...

Agora, se definirmos o domínio desta função:
As variáveis "primeira" e "segunda" pertence ao conjunto dos números inteiros, tal que, "primeira" e "segunda" são valores maiores ou iguais a 0 e menores ou iguais a 10.

E o contra-domínio desta:
O resultado da função pertence ao conjunto dos números inteiros, tal que, este é um valor maior ou igual a 0 e menor ou igual a 10, sendo resultante do seguinte calculo
(primeira + 2 * segunda) / 3, com valores arredondados para baixo, em caso de um resultado pertencente ao conjunto dos números reais.

Agora que sabemos quais os valores são válidos e não válidos para a função, podemos definir os seguintes testes:

//Valores maiores que 10 (dominio)
...
try
    resultado = media(11,21);
    fail();
except
    assertTrue(true);
...

//Valores menores que 0 (dominio)
...
try
    resultado = media(-1,-1);
    fail();
except
    assertTrue(true);
...

//Valor com um resultado quebrado (contra-dominio)
...
resultado = media(2,7);
assertEquals(resultado, 5);
...

Acho que isso torna o teste unitário mais "eficaz".

Bem, é isso...(sei lá, não sou bom de explicar essas coisas...)
Espero que isso ajude! :)

Até mais!

quarta-feira, 9 de março de 2011

Pergunta da Semana: Existe algum lugar em Campinas para assistir cinema cult?

Então, me fizeram esta pergunta hoje. :P

E descobri que o único cinema que exibia este tipo de filme aqui em Campinas, fechou a mais de um ano. :(

Era o Cine Paradiso.

Ele ficava na Rua Barão de Jaguara no Centro, na Galeria Barão Velha, pertinho do antigo Citibank da Avenida Moraes Salles.

A notícia do fim do cinema, pelo site da EPTV:
http://eptv.globo.com/lazerecultura/lazerecultura_interna.aspx?275890

Agora, o que "sobrou" em Campinas para assistir este tipo de filme são os centros culturais:


Do SESC de Campinas que fica na Rua Dom José I no bairro Bonfim perto da Rodoviária.


O CPFL Cultura que fica na Rua Jorge Figueiredo Corrêa perto do Taquaral.


O Museu da Imagem e do Som (antigo Palácio dos Azulejos) na Rua Regente Feijó no Centro que fica perto dos Bombeiros.


E a Casa do Lago na Unicamp.

Pelo menos, são estes que eu conheço. :P

Obs.: Ser nerd também é cultura. :)

Futebol e Informática: Tudo a ver!

Depois de um longo feriado, de volta ao trabalho!

Quarta-feira... Hoje deve ter jogo de futebol no campeonato Paulista. (Eu espero que o meu Palmeiras vença o Noroeste de Bauru! Poxa verdão, não dá vexame não...)

Hã? Um blog com posts só falando de informática agora vai virar um blog de futebol?

Não, nada disso! :)

Mas vamos comparar uma coisa que ambos os profissionais destas áreas devem (ou deveriam...) saber: como trabalhar em equipe.

Como assim???

Calma...

Então, vamos ver por onde começo...

No futebol, se todos os jogadores de um time fossem atacantes, o que será que aconteceria? Ou se todos fossem defesa? Será que um time assim poderia ganhar um jogo? Ou será que eles teriam dificuldades?

A resposta, para alguns, é bem óbvia...

O mesmo deve (ou deveria) acontecer com uma equipe de informática. Pense, se todos os indivíduos desta fossem desenvolvedores ou se todos fossem testers, será que o projeto "andaria" bem?

A resposta, talvez, seja a mesma. :P

Um outro caso:
Quando um jogador de destaque é entrevistado, a maioria (ou aqueles que possuem mais "cabeça", como meu pai diz :P) geralmente responde as perguntas em primeira pessoa no PLURAL (não sei se vocês perceberam...), do tipo:
"Nós fizemos uma boa partida".
"Agradeço ao time pela nossa vitória".
"O erro foi nosso e o professor vai rever nossa atuação nesta partida".

Hum... Em informática, quando as coisas vão ou não vão bem em um projeto, não deveríamos fazer a mesma coisa?

Deixo esta para vocês pensarem.

E torçam para o Verdão vencer!

É nóis! :)

O Passado e o Presente

Depois de meu último "post" falando de como eu queria saber fazer um jogo (o que, até agora, não sei muito bem), deu uma vontade de relembrar o passado...

Me lembrei de meu primeiro video-game (eu já era meio velho, tinha meus 12 ou 13 anos...), o Master System.
Sei que meus pais se sacrificaram para comprar, mas era um presente de Natal para mim e meu irmão (e foi uma das minhas maiores alegrias, na época).

Claro que além do sacrifício do dinheiro, eu e meu irmão tivemos que tirar boas notas também. :)

Hoje, tenho um Wii que comprei com o meu dinheiro. (que, pelo menos, é uma dez vezes mais potente que o Master...)

Mas não tive a mesma sensação de "felicidade" que foi o Master System...

Naquela mesma época, eu e meus colegas de ginásio tinhamos que fazer um monte de trabalhos escritos e iamos na biblioteca (existe uma biblioteca municipal em Campinas, mas acho que a maioria de vocês nem sabe aonde fica :P), sofriamos fazendo resumos e, no final, iamos para minha casa jogar video-game. (eu morava no centro da cidade)

Ou seja, não tinhamos computador. (e, naquele tempo, a internet no Brasil era coisa só de universidade e computador era coisa de rico...)

Hoje, temos internet, computadores e lan houses...

Mas tenho a sensação que as pessoas aprendem menos hoje que antigamente...

No começo da minha carreira, eu programava em Java e tinha que fazer muitas coisas na mão, não tinhamos Ant, Hibernate e Maven, era somente classes, Servlets e JSP.

Hoje, temos muitas ferramentas para programação nesta linguagem, tudo configurável para facilitar o programador.

Mas, algumas vezes, tudo parece mais complicado e difícil de configurar que naquela época, e a aplicação gerada com algumas destas novas ferramentas dá uns erros estranhos...

Hum... Será que as coisas estão ficando mais difíceis e chatas ou eu que estou realmente ficando velho? :P

Obs.: Acho que alguns programadores mais experientes (para não dizer "velhos") vão concordar comigo. :)

Até mais!

sexta-feira, 4 de março de 2011

Carnaval!

Pessoal, vou ficar um tempinho sem postar nada por causa do Carnaval (sou, também, filho de Deus :) )
Portanto, neste feriado prolongado, vou descansar bastante. (e espero que vocês também façam o mesmo)
Um bom fim-de-semana e um bom carnaval a todos! :)
Se alguém não sabe o que fazer neste feriado, sugiro ver o site Omelete:
http://www.omelete.com.br/

Dicas de Programação: Por que é recomendável colocar os scripts em Javascript no final da página?

Então... eu acho que é por causa de erros como "Objeto esperado". :P
Não entendeu?
Vou explicar! :)

Veja o seguinte código:

<script>document.getElementById('elemento3').innerHTML = "Ola mundo";</script>
<div id="elemento1"></div>
<div id="elemento2"></div>
<div id="elemento3"></div>

Parece que esta certo, mas ele, algumas vezes (pelo menos, a primeira vez que carrega...), poderá dar um erro e não executar...
Mas, por que isso ocorre?

Porque o elemento esperado no javascript (elemento3) não foi renderizado, ou seja, como a instrução esta antes do elemento que ela tem que obter (veja o trecho da função getElementById), ela não sabe que existe o elemento e dá erro.

Como resolver isso? Fácil! É só colocar o script depois do elemento!

<div id="elemento1"></div>
<div id="elemento2"></div>
<div id="elemento3"></div>
<script>document.getElementById('elemento3').innerHTML = "Ola mundo";</script>

Assim, sempre funciona! :)

Agora dá para entender porque colocar os scripts no final do HTML (fikdik) ;)

Dicas de Programação: Reescrevendo operadores em Python

O que eu acho mais legal em C++ é que ele permite reescrever operadores. Então, eu vi que dá para fazer o mesmo em Python!

Para um exemplo prático, vamos criar uma classe Fracao. Esta possui duas propriedades (numerador e denominador), um construtor com dois parâmetros inteiros, um método add (que faz a soma dos objetos da classe Fracao) e um método para transformar em string:

#Exemplo de como reescrever operadores
#Fracao é uma classe que define números fracionados
class Fracao:
    #Construtor da classe
    def __init__(self, numerador, denominador):
        #Cria e seta a propriedade numerador
        self.numerador = numerador
        #Cria e seta a propriedade denominador
        self.denominador = denominador

    #Reescreve o operador "+" (faz a soma de duas frações e retorna um resultado que também é uma fração)
    def __add__(self, f):
        resultado = Fracao(self.numerador * f.denominador + f.numerador * self.denominador, self.denominador * f.denominador)
        return resultado

    #Reescreve a função str para transformar os valores em string
    def __str__(self):
        return str(self.numerador) + "/" + str(self.denominador)

Agora, vamos executar as seguintes instruções:

a = Fracao(5,2)
b = Fracao(1,3)
c = a + b
print c

E veja o que aparece. (legal, não? :))

quinta-feira, 3 de março de 2011

Dicas de Programação: Qual a diferença entre NaN, null e undefined no Javascript?

Dica de um amigo! :)

O NaN é um resultado de uma operação ou de uma função que não conseguiu retornar um número real válido. Exemplo:

var a = parseInt("aaaa");
var b = 0/0;

Null é quando o valor de uma variável esta setada como vazia:

var c = null;

O undefined é quando uma variável não tem um valor definido ou uma variável não esta definida:

var d;
alert(typeof(e));

Utilizando o operador de comparação:

a = parseInt("aaaa") ou b = 0/0
a == Number.NaN -> false (????)
a === Number.NaN -> false (????)
a == a -> false (????)
a === a -> false (????)
isNaN(a) -> true
As demais comparações serão false, pois a variável "a" possui um valor.

c = null
c == null -> true
c === null -> true
c == undefined -> true
c === undefined -> false

d = undefined
d == null -> true
d === null -> false
d == undefined -> true
d === undefined -> true

Variável "e" não definido
typeof(e) == "undefined" -> true
typeof(e) === "undefined" -> true
As demais comparações serão false, pois o typeof retorna string.

Os testes foram feitos no Firefox 3.6 (portanto, não sei se os valores retornados em outros navegadores serão os mesmos).

Dicas de Programação: Como redimensionar uma imagem em Java?

Dicas e mais dicas... Agora é a vez de Java. (outra vez) :)

Para redimensionar uma imagem utilizando a API default do Java, podemos usar as classes File, BufferedImage e a ImageIO dos pacotes java.io, java.awt.image e javax.imageio.
Vamos ao passo a passo:

1) Primeiro, vamos ler a imagem original:

BufferedImage originalImage = ImageIO.read(new File("teste.jpg"));

2) Depois, vamos criar a imagem redimensionada que terá 100px de altura e 100px de largura:

//Largura
int width = 100;
//Altura
int height = 100;
BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

3) Agora, pegamos a imagem original e redesenhamos na imagem redimensionada:

resizedImage.getGraphics().drawImage(originalImage, 0, 0, width, height, null);

4) E finalmente, salvamos a imagem em um arquivo:

ImageIO.write(resizedImage, "jpg", new File("teste_redimensionado.jpg"));

Pronto, isso deve redimensionar a imagem para o tamanho 100x100! :)
Abaixo o código-fonte completo:

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class ImageUtil {

public static void main(String[] args) throws Exception {
BufferedImage originalImage = ImageIO.read(new File("teste.jpg"));
int width = 100;
int height = 100;
BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
resizedImage.getGraphics().drawImage(originalImage, 0, 0, width, height, null);
ImageIO.write(resizedImage, "jpg", new File("teste_redimensionado.jpg"));
}

}

quarta-feira, 2 de março de 2011

Dicas de Programação: Qual a diferença entre == e === em Javascript?

Então, existe uma diferença (a dica vale para PHP também).
Vamos ver o seguinte código:

<script>
if ('0' == 0) {
   alert('É igual!');
} else {
   alert('É diferente');
}
</script>

Então, se executarmos o código acima, veremos que ele diz que os valores são iguais mesmo que os tipos (um string, outro um inteiro) sejam diferentes.

Meio estranho, não?

Agora faremos com o operador "===" :

<script>
if ('0' === 0) {
   alert('É igual!');
} else {
   alert('É diferente');
}
</script>

Incrivel, agora ele fala que é diferente... Mas se eu colocar com o mesmo tipo (inteiro e inteiro):

<script>
if (0 === 0) {
   alert('É igual!');
} else {
   alert('É diferente');
}
</script>

Ele fala que é igual! :)

Para quem não adivinhou, o operador "==" compara os valores sem verificação do tipo e o operador "===" compara os valores e os tipos de cada variável (ou constante).

Legal, não? ;)

Até a próxima dica!

Dicas de Programação: Como colocar um botão em uma posição fixa no Java (AWT/Swing)?

Essa é uma questão muito antiga, que todo mundo fala (ou se queixa, dependendo do caso...). :P
Por que diabos, quando eu faço uma tela em AWT/Swing, o Java não deixa eu colocar o botão onde eu quero?
Pois é... Ele deixa com uma dica secreta! :P
Para colocar um componente visual em qualquer parte da tela, você deve setar null no layout do componente "pai" utilizando o método setLayout, e usar o método setBound do componente "filho" para posicionar em um lugar determinado com um tamanho definido. Para entender melhor, vamos ao exemplo:

import javax.swing.JButton;
import javax.swing.JFrame;

//Classe que representa uma janela de minha aplicação
public class Exemplo1 extends JFrame {

private JButton btn = null;

//Chamado quando se dá new no objeto
public Exemplo1() {
//Tamanho da janela
this.setSize(300,300);
//Título da janela
this.setTitle("Exemplo1");
//Botão "Ok"
btn = new JButton("Ok");
//Coloca o botão na posição x=10px e y=10px da janela, com largura de 50px e altura de 30px
btn.setBounds(10, 10, 50, 30);
//Sem layout
this.getContentPane().setLayout(null);
//Adiciona o botão na janela
this.getContentPane().add(btn);
//Por default, ao clicar no X da janela, ele termina a aplicação
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}

//Método principal (onde começa a execução)
public static void main(String[] args) {
Exemplo1 exemplo1 = new Exemplo1();
exemplo1.setVisible(true);
}

}

Os dois comandos em vermelho são o que define a posição e o tamanho livre na tela.

Espero que isso facilite a vida de muita gente! :)

Até mais!

terça-feira, 1 de março de 2011

Ferramentas de Desenvolvimento: JWebUnit

Para quem gosta de Java e de Testes Unitários. :)

O JWebUnit junta o JUnit (que faz testes unitários em serviços feitos em Java) com o Selenium IDE ou HTMLUnit (ferramentas que testam as funcionalidades de um site).

Vendo o primeiro exemplo que ele dá:

public class ExampleWebTestCase extends WebTestCase {
    public void setUp() {
        super.setUp();
        setBaseUrl("http://localhost:8080/test");
    }

    public void test1() {
        beginAt("/home");
        clickLink("login");
        assertTitleEquals("Login");
        setTextField("username", "test");
        setTextField("password", "test123");
        submit();
        assertTitleEquals("Welcome, test!");
    }
}

Parece ser bem prático e simples! (se é que realmente funciona... :))

Mais informações no site:
http://jwebunit.sourceforge.net/

Dicas de Programação: Como imprimir uma classe em modo texto no C++?

Para imprimir uma classe em C++ como texto, você deve usar um método friend que reescreve o operador << onde este utiliza o objeto standard de saida (o std:ostream).

Complicado, não? Mas é bem simples.

Primeiro a gente declara a interface do método friend na classe:

#include <iostream>
class MinhaClasse {
private:
char* texto;
public:
MinhaClasse(char* texto);
friend std::ostream& operator<<(std::ostream& out, MinhaClasse* f);
};

Explicações:

Método friend é declarado dentro da classe podendo acessar as variáveis privadas desta, porém este método não pertence ao objeto (ou seja, não é chamado através do objeto).
A classe std::ostream é a classe do objeto std::cout.
Operadores podem ser reescrito através da palavra especial "operator" mais o simbolo que ele é representado, por exemplo, eu quero reescrever o operador de soma em uma determinada classe:
...
Retorno Classe::operator+(Parametro& param);
...


Ops... Voltando a implementação, a gente implementa este método declarado na interface:

...
std::ostream& operator<<(std::ostream& out, MinhaClasse* f) {
out << f->texto;
return out;
}
...

Agora, a gente pode simplesmente fazer assim para imprimir a classe:

...
MinhaClasse* a = new MinhaClasse("texto");
std::cout << a << std::endl;
...

Tomara que isso ajude alguém... :)