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!