Skip to content

Tag: Java

Gato em JavaFX

Meu primeiro desenho com JavaFX.

Gato em JavaFX

Código-fonte:

import javafx.ui.canvas.*;
import javafx.ui.*;

Canvas {
    content: [
    // cat head
    Ellipse { cx:200, cy:100, radiusX:100, radiusY:50, fill:black },
    // right ear
    Arc { x:200, y:10, height:150, width:100,
        startAngle:-20, length:90, closure:PIE, fill:black},
    // left ear
    Arc { x:100, y:10, height:150, width:100,
        startAngle:110, length:90, closure:PIE, fill:black},
    // left eye
    Ellipse { cx:160, cy:100, radiusX:30, radiusY:15, fill:white},
    Ellipse { cx:160, cy:100, radiusX:5, radiusY:15, fill:black},
    // right eye
    Ellipse { cx:240, cy:100, radiusX:30, radiusY:15, fill:white},
    Ellipse { cx:240, cy:100, radiusX:5, radiusY:15, fill:black},
    // nose
    Arc { x:185, y:110, height:20, width:30,
        startAngle:45, length:90, closure:PIE, fill:white},
    ]
}

Sim, foi uma tentativa de reproduzir este outro gato. 🙂

Cursos Java de Graça para Estudantes

Sun University

Página: http://www.sunstudentcourses.com/

  • A Sun está com um projeto novo com cursos sobre a plataforma Moodle (meu velho conhecido). O nome do curso é Real World Technologies: NetBeans GUI Builder, JRuby, JavaFX, and JavaME. É uma introdução rápida e bem prática sobre cada um desses temas. O curso é dividido em seções e no final de cada seção há um dever de casa para você submeter. Sim, é bem no estilo do Java Passion e não é à toa, o Sang Shin também está por trás disso.

Esses slides são a apresentação inicial do curso:

Algumas vantagens de se fazer esse curso:

  • O Preço. É de graça 😀
  • É Livre. São tecnologias de Software Livre como o Netbeans, o Java, JavaFX e JRuby. Além disso o próprio curso está disponível sob uma licença livre (Berkley).
  • São Novidades. são tecnologias novas como o JavaFX e JRuby, é bom se manter atualizado.
  • É Fácil. São tutoriais pela web que você pode fazer sozinho no seu computador e no final de cada seção você faz um dever de casa.
  • É Rápido. A duração estimada no curso é de 5 horas.
  • Tem Certificado. No final do curso, entregando todos os deveres de casa, você recebe um certificado que participou do curso.
  • Inglês. O curso é todo em inglês e é bom que você treina. 😉

Eu já estou fazendo.

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.

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.

SHA-1 em Java

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class sha1it {
    public static void main(String[] args) throws NoSuchAlgorithmException {
        if (args.length==0) return;
        
        MessageDigest md = MessageDigest.getInstance("SHA1");
        md.update(args[0].getBytes());
        byte[] newHash = md.digest();
        StringBuffer newHashStringBuffer = new StringBuffer();
        for ( int i = 0; i < newHash.length; i++ )
            newHashStringBuffer.append(Integer.toHexString(newHash[i]&0xff));
        System.out.println(newHashStringBuffer.toString());
    }
}

Vai calcular o SHA-1 do primeiro argumento da linha de comando:

$ java sha1it silveira
665fc8e2ed1b8aa1571a5c9d3e14d89bad4f0

Note que não é uma implementação pura do SHA-1. Simplesmente pedimos por essa implementação, que pode não estar disponível.

Café com Tapioca de Dezembro

O evento do Café com Tapioca desse mês foi realizado dentro da UFC, no auditório da geografia. A palestra principal foi Teste unitário com JUnit com o Fabrício Lemos.



Na foto um segurança da Planop, vários estiveram transitando por perto para garantir a segurança do evento. Alguns dias antes eu havia entregue um ofício solicitando um esquema de segurança.

Quase virei a noite terminando os preparativos e acordei e cheguei bem cedo no campus. Uma chuva pesada caiu logo no inicio do dia mas felizmente logo parou.



Muito cedo da manhã o auditório já estava funcionando e o coffee break já estava encaminhado. O pessoal do departamento da Geografia foi muito gentil e me ajudou muito nos detalhes da organização.

O PET Computação possibilitou o nosso coffee break, a eles o meu muito obrigado.



Delícia…

Foram tapiocas, salgadinhos, café, café com leite, bolos, torradas e refrigerantes. Um belo e farto coffee break.

As 8 horas da manhã algumas pessoas já começavam a chegar. Por volta de 9 horas servimos o coffee break.


Suando a camisa?

Em seguida começamos a palestra do Fabrício Lemos.

Depois da palestra do Fabrício foi o meu primeiro Tech Demo como embaixador da Sun.

Silveira Neto
Olha eu ali no fundo. Foto gentilmente cedida pelo Handerson Frota

Infelizmente as coisas não saíram como planejadas, me restou muito pouco tempo para a palestra e o notebook não funcionou corretamente durante minha apresentação. O mouse não funcionava nem nos slides nem no Netbeans, o que comprometeu completamente a apresentação.

Tudo bem, são coisas que acontecem 🙂 Na próxima oportunidade eu já devo estar com o meu próprio notebook e ter uma variável a mais sobre meu controle.

Houve o sorteio de vários brindes, os brindes da Sun que eu já havia comentado e também vários brindes que o cejug trouxe, assinaturas da Java Magazine, um boné da Sun, etc. Acho que todo mundo conseguiu sair com algum brinde.

Outra coisa, pela lista de presença, a contagem foi de 52 participantes.


Alimentos arrecadados que serão encaminhados pelo CEJUG para uma instituição carente.


Pelo feedback que tivemos, o evento foi um sucesso e eu estou muito feliz que tenha dado tudo certo. Eu espero que em 2008 o evento se fortaleça ainda mais e possa voltar a UFC.

Eu pretendo refazer o tech demo em janeiro dentro da UFC. Provavelmente janeiro vai ser bem agitado porque eu vou fazer os techdemos de Netbeans, Sun Academic Initiative e algum outro tema, talvez JavaFX. Também há o convite para que eu refaça o demo no próximo café com tapioca, que já está marcado.

Até lá.

Observações:

  1. Os slides que eu usei estão aqui.
  2. Eu estou fazendo alguns screencasts com o conteúdo que eu iria apresentar. O primeiro já está no ar aqui.
  3. O restante das fotos que eu tirei estão aqui.

Matemática para a web

Figura - Quadro azul

Eu estive pesquisando algumas ferramentas de matemática para a web a pedido do professor Romildo, professor do departamento de matemática, que está desenvolvendo um sistema web.

É mais ou menos assim:

  • Um conjunto de professores vai criar testes e questões para outros professores espalhados por todo o estado.
  • Para criar e ler as questões os professores vão usar o próprio sistema.
  • Tem que ser fácil de usar, compatível e leve.
  • As questões são de matemática do ensino fundamental e médio.
  • Tecnologias livres.

Algumas ferramentas que eu experimentei, há links para as páginas de exemplo de todos os editores:

exemplo do mathdonalds
Exemplo de editor de fórmulas mathdonalds.

mathdonalds.com: você edita as fórmulas com um editor javascript, ou seja, que roda no próprio browser e depois as fórmulas são exportadas para arquivos de imagem PNG. O editor de fórmulas funcionou bem apesar de não ser muito intuitivo. Eu não consegui fazer algumas fórmulas um pouco mais complexas como raiz quadrada. No site há exemplos de como integrar com outros editores ricos como o TinyMCE ou o FCKeditor. Porém, o editor de fórmulas só funciona no navegador Mozila Firefox e só funciona no Internet Explorer usando um plugin. Não ficou claro pra mim se ele é um software livre ou qual é sua licença. Uma vantagem é que as fórmulas depois de prontas ficam em formato PNG e portanto podem ser vistas em qualquer navegador.

Exemplo do editor do xinha
Exemplo do editor de fórmulas do Xinha.

Xinha: o xinha é um editor rico para web, como o TinyMCE ou o FCKeditor. E também é livre. A diferença é que ele já vem com um grande número de plugins, um deles é um editor de fórmulas. Ao contrario do mathdonalds, você não edita as fórmulas direto na fórmula. Você edita as fórmulas num input em texto plano numa certa sintaxe e vê um preview da fórmula na sua direita. É fácil de usar porque há uma grande tabela com as fórmulas para você clicar e usar. No final ele gera um código em MathML. MathML é uma notação XML para fórmulas. Ela é suportada por praticamente dos softwares de suíte de escritório e em quase todos os navegadores, mas não no Internet Explorer onde é necessário um plugin.

Exemplo do dragmath
Exemplo do DragMath

DragMath: é um editor de fórmulas em Java, no formato de applet. A proposta dele é de criar fórmulas simplesmente arrastando e soltando. Ele é um software livre e certamente é fácil de personalizar. Mas ele não funcionou bem comigo, eu tive dificuldade para criar as fórmulas. Uma vantagem dele é que ele exporta as fórmulas para LATEX, MathML e vários outros formatos.

ascii math

asciimathml.js: Ele transforma de uma notação própria para mathML. Funciona mais ou menos como o editor do xinha, você tem um preview do que está acontencedo. Ele é útil para escrever fórmulas usando uma notação fácil, dentro de um texto e depois abri-lo no browser, mas a página tem que ter um certo javascript integrada.

Das opções que eu olhei a que me agradou mais foi a do mathdonalds.

O Duke é Livre

Duke comendo café com tapioca
Duke comendo um típico café com tapioca. Código-fonte.

Nem todo mundo sabe disso. Quando a Sun fez o anuncio da liberação do Java sobre a GPL eles aproveitaram e também lançaram o Duke em uma licença BSD. As imagens que ilustram esse post foram feitas por mim e incluem seu código-fonte em SVG.

Muitos mascotes de projetos livres não foram lançados sobre a mesma licença do projeto. O antigo demônio do BSD pertence a Marshall K. McKusick. Até mundialmente famoso Tux do Linux parecem pertencer ao seu criador, Larry Ewing. É claro que esses mascotes são usados praticamente livremente embora não tenham sido explicitamente lançados sobre um licença livre.

Duke Estudando e tomando café
Um Duke Acadêmico tomando um café e estudando. Código-fonte.

O Duke além de livre tem um site, (dke.dev.java.net) para reunir desenhos, animações e modelos 3D que qualquer um pode baixar, utilizar e modificar. Há muito material lá.

Duke cangaceiro, tomando um café com tapioca
Duke cangaceiro, comendo tapioca com café. Mais Ceará impossível 🙂 Código-fonte.

Atualizado em 14 de Novembro de 2008:

Um ano da postagem original, olha só o que acharam na praça do Ferreira, centro de Fortaleza:

Relato e fotos da Caravana

Ontem passou aqui por Fortaleza a Caravana da Tecnologia 2007 trazendo muita gente boa e fazendo um grande evento.

Logo cedo da manhã tivemos a primeira palestra com o Tim Jacobson sobre computação de alto desempenho com o Sun Studio.


Pthreads, OpenMP e MPI

Ele mostrou um pouco de história e as diversas ferramentas para se trabalhar com computação de alto desempenho.


A tradução simultânea em ação sendo transmitida via FM para quem trouxe seu radio.

Tim também falou da importância de se aprender a programar para processadores de múltiplos núcleos e também falou um pouco sobre linguagens, programação e mercado de trabalho.


Tim falando sobre processadores multi-core em seu notebook.

Houveram vários benchmarks sobre otimização e também sobre os compiladores da Sun. Uma ótima palestra para quem, como eu, brinca com clusters e supercomputadores.

A segunda palestra foi a do Edward Pilatowicz sobre o sistema operacional livre, o OpenSolaris. Ele é um desenvolvedor do kernel do OpenSolaris e conhece a fundo o sistema.


Ed respondendo às dúvidas da plateia.

De longe o que eu gostei mais foi o DTrace. É algo tão incrível que é difícil de explicar.

O Dtrace é um ferramenta livre do OpenSolaris para fazer inspeção num programa rodando. Eu nunca tinha visto nada parecido. Com o DTrace você consegue inspecionar o código para saber em que função o programa entrou mais, quanto tempo levou, quais os parâmetros e praticamente qualquer coisa.


Ed tirando coelhos da cartola =D

Você pode inclusive ver as chamadas entre diferentes processos, kernel ou libc. É como se você estivesse vendo o mundo com os olhos do sistema operacional.

Ed também fez uma apresentação do ZFS, um robusto sistema de arquivos que eu estou ansioso para usar. É surpreendentemente diferente dos sistemas de arquivos que eu estou familiar.


DTrace em ação.

Ed falou também sobre o Projeto Indiana, que a partir de agora deve ganhar uma certa popularidade. O projeto Indiana é uma distribuição do Opensolaris mais bonita e fácil de usar, como o Ubuntu é para o Linux.

Ao final da palestra todo mundo que estava lá ganhou um kit com CD e DVD do OpenSolaris e também um livreto de introdução ao opensolaris com práticas de ZFS e DTrace.


Livretos Introdução a Sistemas Operacionais – Uma abordagem prática usando o projeto OpenSolaris.


Eu ganhando o meu DVD =D

Se você ficou sem esse material, não se preocupe. Esse livro está disponível para download aqui. Já os CDs e DVDs você pode baixar no site do OpenSolaris. Você também pode pedir um OpenSolaris Stater Kit para ser entregue em sua casa.


Uma pausa para o almoço =P


Tropa de elite tocando num iphone.


Um kit do SunSPOT, no momento só disponível para venda nos EUA.

A tarde houve uma apresentação sobre o SunSPOT (Sun Small Programmable Object Technology).


Ligando os brinquedos.


Botão de ligar/desligar e saída USB do SunSPOT


Um SunSPOT ligado.

Dentro do SunSPOT há uma Máquina Virtual Java (a Squawk) e diversos brinquedinhos como sensores de luz, movimento, aceleração, temperatura, transmissor de rádio etc.


SunSpot na minha mão.

Foi uma palestra que deu muito o que falar até porque é sempre um assunto que desperta muita curiosidade. Se você quiser saber mais sobre o SunSPOT, vá aqui.

A palestra seguinte foi a do Tim Boudreau sobre Java e Netbeans.

O Tim mostrou um release do Netbeans 6. Foi muito normal escutar ooooh vindo da platéia enquanto ele mostrava as novas funcionalidades.

Eu falei um pouco (e de improviso) sobre o Sun Academic Initiative (SAI) e sobre o programa de Embaixadores de Campus da Sun. Em breve eu faço um post explicando tudo sobre o SAI.

Por fim o Bruno Souza (aka Javaman) deu uma palestra sobre Software Livre e nós tivemos uma maratona de perguntas e respostas sobre os mais diversos temas, sobretudo Java.


Maurício Leal respondendo perguntas.

Foi muito bom também porque eu pude finalmente conhecer o Eduardo Lima pessoalmente. Agora ele não é mais só uma voz misteriosa no telefone. =D


Quase todo mundo junto e mais alguns professores de algumas faculdades daqui.

O pessoal tinha que voar para Salvador a meia-noite então nós fomos jantar no Coco Bambu para a caravana experimentar algumas comidas típicas daqui.


Com certeza foi um dia muito divertido.

Eu queria agradecer a todo mundo que esteve por trás do evento, a caravana, ao Felipe Gaúcho que mesmo lá em Zurique conseguiu estar do nosso lado fazendo tudo, ao CEJUG que esteve suando a camisa para que tudo desse certo, a FANOR pela infra-estrutura e pelo apoio e a todos que compareceram ao evento.

Foi realmente um sucesso e esperamos repetir a dose qualquer dia desses.

  • bônus 1: o restante das fotos que eu tirei estão aqui.
  • bônus 2: O Rafael Carneiro também fez um post sobre o evento, aqui.
  • bônus 3:  O Edward também colocou algumas fotos aqui.