Skip to content

Month: January 2008

Gerando permutações

Muitas vezes para resolver uma única instância de um problema é mais rápido ataca-lo com força bruta do que encontrar um algoritmo geral com uma boa ordem de complexidade. Permutações são de grande utilidade nesse tipo de abordagem.

Permutações em Prolog:

Esse é um código em Prolog que o Wladimir Araujo passou na cadeira de IA.

select(X, [X|Xs], Xs).
select(X, [Y|Ys], [Y|Zs]) :- select(X, Ys, Zs).

permutar([], []).
permutar(Xs, [Z|Zs]) :-
    select(Z, Xs, Ys),
    permutar(Ys, Zs).

Permutações em Python:
Esse é um código de um certo Michael Davies que eu tirei daqui. Ele gera uma lista com todas as permutações de uma lista. Muito bonitinho. 🙂

def all_perms(str):
    if len(str) <=1:
        yield str
    else:
        for perm in all_perms(str[1:]):
            for i in range(len(perm)+1):
                yield perm[:i] + str[0:1] + perm[i:]

Um exemplo de uso:

>>> for p in all_perms(['a','b','c']):
	print p
['a', 'b', 'c']
['b', 'a', 'c']
['b', 'c', 'a']
['a', 'c', 'b']
['c', 'a', 'b']
['c', 'b', 'a']

Outras implementações:
Em outras linguagens o código para gerar permutações geralmente é muito grande, então eu preferi deixar alguns links.

Monitor de Memória do Netbeans

Você já viu em algum screencast um monitor de memória na barra de ferramentas do Netbeans?

Monitor de memória

Bem lega, né? Essa ferramenta mostra um gráfico animado do consumo de memória do Netbeans. Ele também permite que você chame a Coleta de Lixo clicando nele

Para ativar essa ferramenta no Netbeans 6 (download), vá em View → Toolbars → Memory.

View → Toolbas → Memory

Binha Dormindo

Binha dormindo
Binha, a poodle da Juliana (aka Cheetos).

Reparem que ela usou a coleira para tapar os olhos. Engraçado, não é a primeira vez que eu vejo um cachorro usar essa técnica. Eu também não consigo dormir sem um lençol para cobrir o rosto.

Desenhando com Java e Netbeans

Criar um componente flexível, derivado do Swing, para fazer desenhos não é difícil. Você pode criar um componente gráfico para plotar funções, mostrar gráficos, jogos, etc.

Para ilustrar esse tutorial eu vou usar o Netbeans 6.0 (download), uma IDE livre, multiplataforma e multilinguagem. Provavelmente você poderá seguir todos esses passos em versões anteriores do Netbeans ou, com um pouco mais de dificuldade, sem usar o Netbeans.

Netbeans aberto e vazio
Figura 1. Netbeans aberto e sem nenhum projeto.Passo 1 – Criando um novo projeto: Inicialize o seu Netbean e vá em File → New Project.

Janela de New Project
Figura 2. Janela New Project

Em Categories escolha Java, em Projects escolha Java Desktop Application. Em seguida clique no botão Next.

Janela New Desktop Application
Figura 3. Janela New Desktop ApplicationFique a vontade para escolher o campo Project Name, eu chamei de Desenho. Os outros campos deixe como já estão por padrão. Clique em Finish.

Passo 2 – Criando a classe JDesenho:

Ambiente Netbeans com o projeto já inicializado
Figura 4. Ambiente Netbeans com um projeto de Aplicação Desktop Java já inicializado.Agora já temos o esqueleto do projeto pronto, inclusive já compilável e executável.

New Java Class
Figura 5. New → Java Class.Com o botão direito do mouse vá na aba de projetos, na esquerda, e clique no pacote (um pacotinho amarelo dentro de Source Packages) e vá em New → Java Class.

Tela New Java Class
Figura 6. Janela de Criação de classe Java

Em Class Name coloque JDesenho e o resto deixa com o padrão (Project Desenho e em Package desenho). Clique no botão Finish.

Com isso temos uma classe JDesenho vazia. Vamos faze-la ser uma subclasse da classe JPanel do Swing.

public class JDesenho extends JPanel{
}

Dica de importação
Figura 7. Recurso da IDE para adicionar importação

Quando você escrever isso você verá um pequeno ícone de lâmpada com uma plaquinha vermelha no lado esquerdo da linha de código. Isso quer dizer que esse seu código não compila mas há uma dica de como resolver o problema. Selecione a opção Add import for javax.swing.JPanel.
O problema aí era que o nome JPanel não estava no espaço de nomes. Isso foi resolvido importando o pacote JPanel.

Passo 3 – Sobrescrevendo o método PaintComponent: coloque o cursor de edição dentro da classe JDesenho e aperte as teclas control e espaço.

Control+Espaço é o atalho para completação de código. Comece a escrever PaintComponent, nas primeiras letras você vai achar o método e o editor vai mostrar a documentação. Pressione enter para escolher sobrescrever o método PaintComponent.

Editor com dica de código
Figura 8. Completação de código.

Nessa altura do campeonato o código-fonte da JDesenho estará mais ou menos assim:

package desenho;

import java.awt.Graphics;
import javax.swing.JPanel;

public class JDesenho extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
}

O Graphics é a classe abstrata base para qualquer classe que permita desenhos. É através dela que vamos fazer nossos desenhos.

Só para fazer um teste vamos escrever um código que pinta o Graphics de preto (na verdade pinta um retângulo preto no Graphics). O seu método paintComponent vai ficar assim:

    protected void paintComponent(Graphics g) {
        g.setColor(Color.black);
        g.fillRect(0, 0, 500, 500);
    }

(lembre-se de adicionar os imports usando as dicas de código)

Passo 4 – Trocando um JPanel por um JDesenho: agora vamos testar nossa classe JDesenho.

Customize code
Figura 9. Escolha Customize Code.

Vá na aba DesenhoView.java e clique no meio da janela. Um menu vai aparecer e você escolhe Customize Code.

Janela Code Customizer
Figura 10. Janela Code Customizer

Na primeira linha, mude a caixa do lado direito de default code para custom creation. Na caixa de texto troque o JPanel pelo nosso JDesenho:

mainPanel = new JDesenho();

Note que a variável mainPanel é do tipo JPanel. Como JDesenho herda JPanel então estamos usando polimorfismo.

Agora é só testar, apertando F6 ou clicando no ícone run.

Janela Preta
Figura 11. Tá preto? Então funcionou.

Passo 5 – Desenhando: Para fazer mais desenho é só colocar código dentro do método paintComponent da classe JDesenho.

Por exemplo, com a classe JDesenho dessa forma:

package desenho;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;

public class JDesenho extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, 500, 500);
        g.setColor(Color.darkGray);
        g.fillOval(150, 200, 200, 40);
        g.setColor(Color.red);
        g.fillOval(100, 80, 150, 150);
        g.setColor(Color.pink);
        g.fillOval(120, 105, 30, 30);
        g.setColor(Color.blue);
        g.setFont(new Font("Arial Bold", Font.PLAIN, 36));
        g.drawString("http://silveiraneto.net", 30, 50);
    }
}

Você obtém esse desenho:

Desenhando uma string e algumas figuras ovais
Figura 12. Desenho de 3 figuras ovais, um retângulo e uma String.

Você também pode carregar imagens de vários formatos e há muitas formas de se fazer isso. Nesse exemplo eu vou abrir um arquivo chamado silveira.jpg que está na pasta “/tmp”, em seguida vou desenhar ele no Graphics e fazer alguns outros desenhos por cima dele.

package desenho;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class JDesenho extends JPanel{
    @Override
    protected void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0, 0, 500, 500);

        Image img = Toolkit.getDefaultToolkit().getImage("/tmp/silveira.jpg");
        g.drawImage(img, 50, 55, this);

        g.setColor(Color.black);
        g.drawLine(75, 100, 75, 150);
        g.drawLine(75, 100, 25, 70);
        g.drawLine(75, 100, 125, 70);
        g.drawLine(75, 150, 100, 200);
        g.drawLine(75, 150, 50, 200);
        g.drawLine(75, 150, 100, 200);

        g.setColor(Color.yellow);
        g.fillArc(200, 50, 150, 150, 140, -270);
    }
}

E vai ficar assim:

oh não! pac man
Figura 13. Corre, corre, corre!

Eu recomendo que você olhe a documentação do Graphics e do Graphics2D. Veja também pode fazer animações fazendo sua classe JDesenho implementar a interface Runnable.

Família Simpsons em Prolog

Os Simpsons no sofá

% Fatos.
homer.
marge.
bart.
lisa.
maggie.
mona.
jacqueline.
patty.
abraham.
clancy.
hugo.
louise.
herb.

mulher(marge).
mulher(maggie).
mulher(lisa).
mulher(mona).
mulher(jacqueline).
mulher(selma).
mulher(patty).
mulher(louise).

homem(homer).
homem(bart).
homem(abraham).
homem(clancy).
homem(hugo).
homem(herb).
homem(clancy).

progenitor(homer,bart).
progenitor(homer,lisa).
progenitor(homer,maggie).
progenitor(marge,bart).
progenitor(marge,lisa).
progenitor(marge,maggie).

progenitor(abraham, homer).
progenitor(mona, homer).

progenitor(clancy, marge).
progenitor(clancy, patty).
progenitor(clancy, selma).
progenitor(jacqueline, marge).
progenitor(jacqueline, patty).
progenitor(jacqueline, selma).

progenitor(abraham, herb).

progenitor(herb, hugo).
progenitor(louise, hugo).

% Regras
pai(A,B) :- homem(A), progenitor(A,B).
mãe(A,B) :- mulher(A), progenitor(A,B).

é_pai(A) :- pai(A,_).
é_mãe(A) :- mãe(A,_).

filho(A,B):- homem(A), progenitor(B,A).
filha(A,B):- mulher(A), progenitor(B,A).

irmaos(X,Y) :-
	progenitor(Z,X),
	progenitor(Z,Y),
	X\=Y.

irmao_completos(A,B) :-
	pai(P,A), pai(P,B),
	mãe(M,A), mãe(M,B),
	A\=B.

tio(T,A) :-
	homem(T),
	irmaos(T,X), progenitor(X,A).

tia(T,A) :-
	mulher(T),
	irmaos(T,X), progenitor(X,A).

primo(A,B) :-
	homem(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).

prima(A,B) :-
	mulher(A),
	progenitor(X,A),
	progenitor(Y,B),
	irmaos(X,Y).

avô(A,B) :- pai(A,X), pai(X,B).
avó(A,B) :- pai(A,X), pai(X,B).

Referências:

Extrair arquivos .rar incompletos

ícone pacote de David Vignoni

É bem comum eu assisti episódios ou filmes em formatos rmvb que estão divididos em diversos arquivos rar hospedados em vários servidores grátis diferentes. Mas uma das coisas boas do rmvb é a possibilidade de assistir o vídeo antes mesmo de ter finalizado o do download. Como os arquivos estão compactados em vários arquivos rar seria necessário esperar acabar o download de todas as partes e só então descompactar e assisti ao vídeo.

Você pode contornar isso descompactando o arquivo mesmo sem ele ter terminado. Na linha de comando você deve usar o parâmetro -kb:

unrar e -kb arquivo.rar

O unrar vai descompactar o arquivo rar e os arquivos da sequência até onde ele conseguir, e quando ele sentir falta de algum arquivo ele vai falhar mas não vai apagar o que ele já conseguiu extrair.

Bachelorette

Adoro esse clipe. Não é só porque é da Björk mas porque essa recursividade me lembra muito os sonhos em que as vezes eu fico preso.