Skip to content

Tag: Java

Estudando para a SCJA

SCJA

A SCJA (Sun Certified Java Associate) é a certificação Java de nível de entrada. Como ela não é pre-requisito para nenhuma outra certificação poucas pessoas tiram a SCJA. Apesar disso eu a acho uma certificação interessante porque ela é bem abrangente, embora que superficial. Eu estou estudando para SCJA como uma porta de entrada para as outras certificações.

Este post é uma coletânea de links e dicas úteis para aqueles que possuirem estes mesmo objetivos.

  • Página oficial da SCJA – nesta página estão as principais informações sobre a certificação, algumas referencias de material para estudo e os objetivos do exame, que é a primeira coisa que você deve ler. Se possível imprima os objetivos do exame e vá marcando os objetivos que você já estudou.
  • UML for the Java Associate – Esse é um PDF gratuito que cobre alguns conceitos básicos de UML em uma linguagem fácil de divertida. Eu gostaria de ter tido isso em mãos alguns semestres atrás. O autor é o Dave Wood (que também elabora provas da SCJA) e é da mesma editora da série Head First. Esse livrinho é um ótimo ponto de partida para começar a estudar.
  • JavaRanch SCJA FAQ – Um tira dúvidas das dúvidas comuns sobre o SCJA e também uma excelente coletânea de materiais de estudo.
  • J2EE Specification – Um dos objetivos da é “Java Platforms and Integration Technologies“. Vá nesse PDF J2EE Specification, na seção 2.6 há um ótimo guia de termos de J2EE.
  • Trail: Learning the Java Language – Trilha de aprendizado da página oficial de tutoriais do Java. Muito bom e completo.

Objetivos da Certificação SCJA

Essa tradução fui em quem fiz, não é oficial. Se encontrar algum erro me notifique nos comentários do post.

  • Seção 1 – Conceitos Fundamentais de Orientação a Objetos.
    • Descrever, comparar e contrastar primitivas (inteiro, ponto flutuante, booleano, e caractere), tipos enumerados e objetos.
    • Descrever, comparar e contrastar classes concretas, classes abstratas, e interfaces, e como a herança se aplica a elas.
    • Descrever, comparar e contrastar composição de classes, e associações (inclusive de multiplicidade um-para-um, um-para-muitos e muitos-para-muitos) e associações de navegação.
    • Descrever ocultamento de informação (usando atributos privados e métodos), encampsulamento e exposição de funcionalidades de objetos usando métodos públicos; e descrever as convenções de JavaBeans para métodos setter e getter.
    • Descrever polimorfismo aplicado a classes e interfaces, e descrever e aplicar o princípio de “programar para uma interface”.
  • Seção 2 – Representação UML de Conceitos de Orientação a Objetos.
    • Reconhecer as representações UML de classes, (incluindo atributos e operações, classes abstratas, e interfaces), as representações UML de herança (ambas implementações e interface), e a representação UML de modificadores de visibilidades de membros de classe (- para privado e + para público).
    • Reconhecer a presetação UML de associação de classe, composição, indicadores de multiplicidade da associação, e indicadores de navegação da associação.
  • Seção 3 – Implementação Java de Conceitos de Orientação a Objetos.
    • Nota: exemplos de código podem usar o operador “new“.
    • Desenvolver código que use tipos primitivos, tipos enumerados, e referencias a objetos, e reconhecer os literais desses tipos.
    • Desenvolver código que declare classes concretas, classes abstratas, e interfaces, código que suporte implementação e interfaces de herança, código que declare atributos de instância e métodos, e código que use os modificadores de acesso: private e public.
    • Desenvolver código que implemente associação de classes simples, código que implemente multiplicidade usando vetores, e reconhecer código que implemente composição em detrimento de simples associações, e código que implementa associações de navegação corretamente.
    • Desenvolver código que use polimorfismo tanto para classes quanto para interfaces, e reconhecer código que usa o princípio de “programar para uma interface”
  • Seção 4 – Projeto e Implementação de Algoritmos.
    • Descrever, comparar e contrastar estes três tipos fundamentais de sentenças: atribuição, condicional, e iteração, e dado uma descrição de um algoritmo, selecionar os tipos apropriados de sentenças para projetar o algoritmo.
    • Dado um algoritmo em pseudo-código, terminar o escopo correto para a variável usada no algoritmo, e desenvolver código que declara variáveis em qualquer um dos seguintes escopos: variável de instância, parâmetro de método, e variável local.
    • Dado um algoritmo em pseudo-código, desenvolver um código de método que implementa o algoritmo usando sentenças condicionais (if e switch), sentenças de iteração (for, for-each, while, e do-while), sentenças de atribuição, e sentenças break e continue para controlar o fluxo no switch e nas sentenças de iteração.
    • Dado um algoritmo e múltiplas entradas e saídas, desenvolver o código do método que implementa o algoritmo usando os parâmetros de métodos, um tipo de retorno, e uma sentença de retorno, e reconhecer os efeitos quando referencias a objetos e primitivas são passadas para métodos que os modificam.
    • Dado um algoritmo em pseudo-código, desenvolver código que aplica corretamente e apropriadamente os operadore incluíndo os operadores de atribuição (limitados a: =, +=, -=), operadores aritméticos (limitados a: +, -, *, /, %, ++, –), operadores relacionais (limitados a: <, <=, >, >=, ==, !=), operadores lógicos (limitados a: !, &&, ||) para produzir o resultado desejado. Também escrever código que determina a igualdade de dois objetos ou duas primitivas.
    • Desenvolver código que usa o operador de concatenação (+), e os seguintes métodos da classe String: charAt, indexOf, trim, substring, replace, length, startsWith, e endsWith.
  • Seção 5 – Fundamentos de Desenvolvimento Java.
    • Descrever os propósitos de pacotes (packages) na linguagem Java, e reconhecer o uso correto de sentenças de import e package.
    • Demonstrar o uso correto do comando “javac” (inclusive as opções de linha de comando: -d e -classpath), e demonstrar o uso correto do comando “java” (inclusive as opções de linha de comando: -classpath, -D e -version).
    • Descrever os propósitos e tipos de classes dos seguintes pacotes Java: java.awt, javax.swing, java.io, java.net, java.util.
  • Seção 6 – Tecnologias Java de Plataforma e Integração.
    • Distinguir as características básicas das três plataformas Java: J2SE, J2ME, e J2EE, e dado objetivos arquitetônicos de alto nível, selecionar a(s) plataforma(s) apropriada(s).
    • Descrever em um alto nível os benefícios e as características básicas do RMI.
    • Descrever em um alto nível os benefícios e as características básicas das tecnologias JDBC, SQL e RDBMS.
    • Descrever em um alto nível os benefícios e as características básicas das tecnologias JNDI, mensagem, e JMS.
  • Seção 7 – Tecnologias Cliente.
    • Descrever em um alto nível as características básicas, benefícios e inconvenientes de criar thin-clients usando HTML e JavaScript e os problemas e soluções relacionadas à distribuição.
    • Descrever em um alto nível as características básicas, benefícios, inconvenientes e os problemas de distribuição relacionados a criação de clientes usando J2ME.
    • Descrever em um alto nível as características básicas, benefícios, inconvenientes e os problemas de distribuição relacionados a criação de fat-clients usando Applets.
    • Descrever em um alto nível as características básicas, benefícios, inconvenientes e os problemas de distribuição relacionados a criação de fat-clients usando Swing.
  • Seção 8 – Tecnologias Servidor.
    • Descrever em um alto nível as características básica de: EJB, servlets, JSP, JMS, JNDI, SMTP, JAX-RPC, Web Services (incluindo SOAP, UDDI, WSDL, e XML), e JavaMail.
    • Descrever em um alto nível as características básicas de servlet e o suporte JSP para thin-clients HTML.
    • Descrever em um alto nível o uso e as características básicas de uma seção EJB, beans de entidade e beans orientados a mensagem (message-driven).
    • Descrever em uum alto nível os benefícios fundamentais e inconvenientes de usar tecnologias do lado do servidor J2EE e descrever e comparar as características básicas da camada web, camada de negócios e a camada EIS.

Simulados SCJA gratuitos

  • scja.de – na lateral esquerda, tem uns botões azuis. Cada um deles é uma bateria de questões.
  • ejavaguru.com – 10 questões de SCJA.
  • cafe4java.com – 5 questões sobre SCJA.
  • WGS-PREX-J019C – Esse é o melhor teste que eu já vi. É o teste oficial da Sun, com 150 questões e é um teste pago e o valor varia de país para país. O que certamente você não sabe é que esse teste está disponível gratuitamente, só que neste site bem escondido. Você vai lá, se cadastra e recebe um link, login e senha. O ambiente não é tão bom quanto o Sun Learning Connection mas as questões são as mesmas. Inclusive nesse mesmo pacote tem testes para várias outras certificações, tudo de graça e dentro da lei. 🙂

Eu estou incrementando e organizando esse post aos poucos.

Walker Sphere

For a while I’m thinking about this hardware project idea and now I’m opening here to get some opinions. After that maybe I’ll submit it for the Sun SPOT Open Grant Program.

What is Walker Sphere? Walker Sphere is a project to made an robot capable with a diferent aproach, without heels, mats, propellers or wings. The main idea is to move only changing its center of gravity.

How change its center of gravity?

It’s a sphere

Sphere Walker Anatomy

with some compartments

Sphere Walker Anatomy

and a Sun Spot.

Sphere Walker Anatomy

One compartment is filled with a liquid. The liquid is pumped to another compartment and so the compartment got heavier and the sphere moves towards its direction.

How the sphere walks

Why a sphere? We can distribute the mass uniformly in a sphere and it’s shapes make it easier to roll. A sphere can encapsulates all components and protect them from the outside world and at the same time all sensors can work, especially using some transparent material for the bark.

Why Sun Spot? The Sun Spot have some advantages that fits perfectly in this project:

  • A broad set of sensors including accelerometers that made possible to know the current state of the sphere.
  • Radio communication that can make possible two or more spheres collaborate to achieve a common task.

Spheres robots talking

  • Programmable using Java.
  • Open and Free Source JVM, Squawk.

It will be free? Yes. I’d like to know more about open and free licenses for hardware projects.

How to pump the liquid into the compartments? I don’t know. Have you some good idea?

Some random ideas:

  • A pressure device.
  • Something like an injection.
  • An Archimedes’ screw.
  • Not using a liquid, use something else.

I’m open for ideas, critics and suggestions. 😉

Sun SPOT Open Grant Program

Dado o sucesso e a procura, o projeto Sun SPOT reabriu as portas para submissões de propostas de trabalhos com o Sun Spot para professores, alunos e hobistas. Você submete uma proposta de trabalho livre usando o Sun Spot e o projeto entra lhe doando os kits de Sun SPOT necessários. A idéia é criar projetos livres que possam ser reutilizados em futuros projetos livres.

Sun Spot Kit por dentro

As vantagens:

  • Acesso a um equipamento de tecnologia de ponta equipado com vários sensores e comunicação por wifi.
  • Trabalhar com um ramo novo da cultura livre: o hardware livre e aberto.
  • Criar um projeto inovador e quem sabe até inédito.
  • Ter apoio da comunidade do Sun Spot através dos vários fóruns e listas.

Gif animado do Sun SPOT

Você pode obter mais informações sobre o Sun SPOT Open Grant Program aqui ou aqui.

Eu estou pensando em algo para submeter, e você?

Draggable and Growable Ball in JavaFX

Two simple JavaFX code handling onMouseDragged event.

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

Canvas {
    content: Circle {
        var x = 50
        var y = 50
        transform: bind translate(x, y)
        radius: 30
        fill: red
        onMouseDragged: operation(e) {
                x += e.localDragTranslation.x;
                y += e.localDragTranslation.y;

        }
    }
}

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

Canvas {
    content: Circle {
        var x = 50
        var y = 50
        var radius = 30
        transform: bind translate(x, y)
        radius: bind radius
        fill: red
        onMouseDragged: operation(e) {
            if (e.button == 1){
                x += e.localDragTranslation.x;
                y += e.localDragTranslation.y;
            }
            if (e.button == 3) {
                radius += e.localDragTranslation.x;
            }
        }
    }
}

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

Canvas {
    content: [
    Rect {x: 50, y: 50, width: 50, height: 50, fill: orange },
    Circle {
        var x = 50
        var y = 50
        var radius = 30
        var color = red:Color
        transform: bind translate(x, y)
        radius: bind radius
        fill: bind color
        onMouseDragged: operation(e) {
            if (e.button == 1){
                x += e.localDragTranslation.x;
                y += e.localDragTranslation.y;
            }
            if (e.button == 3) {
                radius += e.localDragTranslation.x;
            }
        }
        onMousePressed: operation(e){
            color = Color {blue: 0.0, green: 0.0, red: 1.0, opacity: 0.5};
        }
        onMouseReleased: operation(e){
            color = red:Color;
        }
    }]
}

You can test this examples with thhe JavaFX Pad or using Netbeans with the JavaFX Plugin.

Gato em JavaFX, versão 2

Lembra daquele nosso gato em Java FX? Agora ele move os olhos com cliques em botões.



Código fonte:

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

class Cat extends CompositeNode{
    attribute look: Number; // -1.0 to 1.0
    operation lookLeft();
    operation lookCenter();
    operation lookRight();
}

attribute Cat.look = 0; // 0 = middle

operation Cat.lookLeft(){
    look = [look, look - 0.1 .. -1.0] dur 1000;
}

operation Cat.lookCenter(){
    var step = if look < 0 then 0.1 else -0.1;
    look = [look, look+step .. 0.0] dur 1000;
}

operation Cat.lookRight(){
    look = [look, look + 0.1 .. 1.0] dur 1000;
}

function Cat.composeNode(){
    var head =  Ellipse {cx:100, cy:100, radiusX:100, radiusY:50, fill:black };
    var rightEar =  Arc {x:100, y:10, height:150, width:100,
                       startAngle:-20, length:90, closure:PIE, fill:black};
    var leftEar = Arc {x:000, y:10, height:150, width:100,
                     startAngle:110, length:90, closure:PIE, fill:black};
    var leftEye = Ellipse { cx:60, cy:100, radiusX:30, radiusY:15, fill:white};
    var rightEye = Ellipse { cx:140, cy:100, radiusX:30, radiusY:15, fill:white};
    var nose = Arc { x:85, y:110, height:20, width:30,
                     startAngle:45, length:90, closure:PIE, fill:white};
    
    var rightIris = Ellipse { cx: bind 140+look*20, cy:100,
                     radiusX:5, radiusY:15, fill:black};
    var leftIris = Ellipse { cx: bind 60+look*20, cy:100,
                     radiusX:5, radiusY:15, fill:black};    
    
    return Group{content: [head, rightEar, leftEar, leftEye,
                     leftIris, rightEye, rightIris, nose]};
}

var myCat = Cat{};

var myCatControl = View {
            transform: [translate(0, 150)]
            content: GroupPanel {
                cursor: DEFAULT
                var row = Row {alignment: BASELINE}
                var column1 = Column { }
                var column2 = Column { }
                var column3 = Column { }
                var column4 = Column { }
                var column5 = Column { }
                rows: [row]
                columns: [column1, column2, column3, column4]
                content:
                [SimpleLabel {
                    row: row
                    column: column1
                    text: "Look:"
                },
                Button {
                    row: row
                    column: column2
                    mnemonic: L
                    text: "Left"
                    action: operation() {
                        myCat.lookLeft();
                    }
                },
                Button {
                    row: row
                    column: column3
                    mnemonic: C
                    text: "Center"
                    action: operation() {
                        myCat.lookCenter();
                    }
                },
                Button {
                    row: row
                    column: column4
                    mnemonic: R
                    text: "Right"
                    action: operation() {
                        myCat.lookRight();
                    }
                }]
                }
            };

Canvas {
    content: [myCatControl, myCat]
}

Downloads:

JavaFX, Exemplos Básicos

Alguns exemplo básicos de JavaFX usando a construção de interfaces de forma declarativa.
Para testa-los eu recomendo o JavaFX Pad ou o plugin JavaFX para Netbeans.

import javafx.ui.*; 

Frame {
    title: "Label JavaFX"
    width:  300
    height: 50
    content: Label {
            text: "Olá Mundo!"
    }
    visible: true   
}

JavaFX label

import javafx.ui.*;
import java.lang.System;

Frame {
    title: "Botão JavaFX"
    width:  300
    height: 100
    content: Button {
           text: "Clique-me"
           action: operation(){
              System.out.println("Botão pressionado");
           }
    }
    visible: true   
}

Botão em JavaFX

import javafx.ui.*;
import java.lang.System;

Frame {
  title: "Menu JavaFX"
  width:  300
  height: 100
  menubar: MenuBar {
    menus: Menu {
      text: "Menu"
      items:  foreach (name in ["Menu1", "Menu2", "Menu3"])  
              MenuItem {
                text: name
                action: operation() {
                  System.out.println("MenuItem: {name}");
                }
             }
     }
  }
    visible: true
}

JavaFX Menu

import javafx.ui.*;
import java.lang.System;

var N = 4;

Frame {
    title: "Tabela JavaFX"
    width:  300
    height: 150
    onClose: operation(){ System.exit(0); }
    content: Table {
        columns: [
        TableColumn {
            text: "numero"
        },
        TableColumn {
            text: "quadrado"
        },
        TableColumn {
            text: "cubo"
        }]
        
        cells: bind foreach(n in [1..N])[
        TableCell {
            text: "{n}"
        },
        TableCell {
            text: bind "{n * n}"
        },
        TableCell {
            text: bind "{n * n * n}"
        },
        ]
    }
    visible: true
}

JavaFX Tabela

import javafx.ui.*;

var selectedTab = 0;

Frame{
    title: "Tab Example"
    width: 300
    height: 120
    content: BorderPanel{
        top: Label { text: bind "Selected tab: {selectedTab + 1}" }
        center: TabbedPane{
            selectedIndex: bind selectedTab
            tabs: foreach(i in [1..5])
            Tab {
                title: "Tab{i}"
                content: Label{ text: "Label{i} "}
            }            
        }
    }
    visible: true
}

JavaFX abas

import javafx.ui.*;

Frame {
    title: "FlowPanel JavaFX"
    width:  300
    height: 100
    content: FlowPanel{
        content: [
        Label{ text: "Label1" },
        Label{ text: "Label2" },
        Label{ text: "Label3" },
        ]
    }
    visible: true
}

JavaFX FlowPanel

import javafx.ui.*;

Frame {
    title: "BorderPanel JavaFX"
    width:  400
    height: 200
    content: BorderPanel{
        top   :  Button{ text: "Topo" }
        center:  Button{ text: "Centro" }
        bottom:  Button{ text: "Fundo" }
        left  :  Button{ text: "Esquerda" }
        right :  Button{ text: "Direita" }
    }
    visible: true
}

JavaFX BorderPanel

Esses exemplos eu retirei da página de exemplos do Wiki do JavaFX (russo). Se você quiser saber mais sobre componentes de interface gráfica em JavaFX veja o tutorial
Learning More About the JavaFX Script Language (for Swing Programmers).

Java: métodos com número variável de parâmetros

A partir do Java 5 podemos escrever métodos com um número variável de parâmetros, é o chamado varargs. Com isso podemos criar métodos bem flexíveis e elegantes, principalmente se aplicando isso juntamente com outros recursos como o loop melhorado e polimorfismo.

Esse exemplo cria uma classe Estatistica com o método media que pode receber um número variável de argumentos do tipo int.

public class Estatistica {
    public float media(int... numeros){
        float soma = 0;
        for(int num: numeros)
            soma += num;
        return soma/numeros.length;
    }
    public static void main(String[] args) {
        Estatistica est = new Estatistica();
        System.out.println( est.media(1,2,3) );
        System.out.println( est.media(0,1,2,3,4,5,6,7,8,9,10) );
        System.out.println( est.media(10,20,30) );
    }
}

$ javac Estatistica.java
$ java Estatistica
2.0
5.0
20.0

Legal, né? Isso sim é sobrecarga de método. 😉