terça-feira, 16 de abril de 2013

Lendo dados do usuário em Java

Olá, galera!

     A grande maioria dos programas de computadores são interativos, ou seja, necessitam da participação do usuário para informar valores de entrada necessários para os devidos processamentos. A linguagem Java oferece diferentes meios para que um programa possa ler entradas do usuário.

Lendo entradas do usuário via shell de linha de comando

    Primeiramente, veremos como se dá a leitura de dados do usuário via terminal de linha de comando. Para tanto, utilizaremos a classe Scanner do pacote java.util. A classe Scanner oferece métodos para a leitura de número inteiros ou reais e também para a leitura de strings em forma de linhas. As três classes abaixo exibem o uso da classe Scanner para ler números e strings.

Classe LeitorValorInteiroTeclado

import java.util.Scanner;

public class LeitorValorInteiroTeclado {

 public static void main(String[] args) {
  Scanner leitor = new Scanner(System.in);
  // Lê um valor inteiro do teclado
  System.out.println("Digite a sua idade:");
  int idade = leitor.nextInt();
  System.out.println("Você tem " + idade + " anos de idade."); 
 }
}


Classe LeitorValorPontoFlutuanteTeclado

import java.util.Scanner;

public class LeitorValorPontoFlutuanteTeclado {

 public static void main(String[] args) {
  Scanner leitor = new Scanner(System.in);
  // Lê um valor inteiro e um valor float do teclado
  System.out.println("Digite a sua idade:");
  int idade = leitor.nextInt();
  System.out.println("Digite o seu peso em kg:"); 
  float peso = leitor.nextFloat();
  System.out.println("Você tem " + idade + " anos e pesa " + peso +                                   " kg.");
 }
}


Classe LeitorStringTeclado

import java.util.Scanner;

public class LeitorStringTeclado {

 public static void main(String[] args) {
  Scanner leitor = new Scanner(System.in);
  /**
    * O código abaixo lê uma string do teclado. 
    * Ao terminar de digitar a string, o usuário
    * deve teclar ENTER.
    */
  System.out.println("Qual a sua comida favorita?");
  String resposta = leitor.nextLine();  
                System.out.println("A sua comida favorita é " + resposta + ".");
 }
}


    Os métodos nextInt e nextFloat da classe Scanner possuem um problema. Se o valor lido do usuário não pertencer ao domínio correto a ser lido, os métodos lançam uma exceção. Por exemplo, se o seu programa usa o método nextInt para supostamente ler um valor inteiro digitado pelo usuário, porém o usuário digitar um número real ou mesmo uma string, o método lança a exceção NumberFormatException, sinalizando que o formato do valor digitado é inválido ao dominío de leitura.

Criando janelas gráficas para ler entradas do usuário  

    Uma forma simples de criar uma janela gráfica para ler entradas do usuário é utilizar a classe JOptionPane do pacote javax.swing. As três classes abaixo mostram o uso da classe JOptionPane para ler entradas do usuário.

Classe LeitorInteiroDialog

import javax.swing.JOptionPane;

public class LeitorInteiroDialog {

 public static void main(String[] args) {
  /**
    * Exibe uma janela para ler a resposta do usuário. 
    * Após, exibe outra janela para exibir a resposta 
    * digitada pelo usuário.
    */
  String resposta=JOptionPane.showInputDialog("Qual a sua idade?");  
                // Converte a string em inteiro
  int idade = Integer.parseInt(resposta);
                JOptionPane.showMessageDialog(null, "Você tem " + idade + 
                                              " anos de idade.");
 }
}

Classe LeitorFloatDialog

import javax.swing.JOptionPane;

public class LeitorFloatDialog {

 public static void main(String[] args) {
  String resposta=JOptionPane.showInputDialog("Qual a sua idade?");
  int idade = Integer.parseInt(resposta);
  // Converte a string em inteiro
  resposta = JOptionPane.showInputDialog("Qual o seu peso em kg?");
  float peso = Float.parseFloat(resposta);
  // Converte a string em float 
  JOptionPane.showMessageDialog(null, "Você tem " + idade + 
                                              " anos de idade e pesa " + 
                                              peso + " kg.");
 }
}

Classe LeitorStringDialog

import javax.swing.JOptionPane;

public class LeitorStringDialog {

 public static void main(String[] args) {
  /**
    * Exibe uma janela para ler a resposta do usuário. 
    * Após, exibe outra janela para exibir a resposta 
    * digitada pelo usuário.
    */
  String resposta = JOptionPane.showInputDialog("Qual a sua comida favorita?");  
  JOptionPane.showMessageDialog(null, "A sua comida favorita é " + resposta);
 }
}

     Em uma aula futura, veremos como ler dados do usuário de forma mais precisa e segura. Abraço!

segunda-feira, 15 de abril de 2013

Compilando e executando programas em Java

    Um programa Java precisa ser compilado para bytecodes antes que a máquina virtual Java possa executá-lo. Para tanto, a plataforma Java oferece um compilador Java, presente no script javac.

    Antes que você possa utilizar o script javac, talvez você deseje adicioná-lo às suas variáveis de ambiente, para que você possa executá-lo em qualquer pasta. No Windows, primeiramente você deve informar ao sistema operacional onde os arquivos da máquina virtual Java estão localizados, criando a variável de ambiente JAVA_HOME:

Nome da variável: JAVA_HOME
Valor da variável: PASTA_ONDE_O_JAVA_FOI_INSTALADO

    Por exemplo, se você instalou a última versão do Java (data de 08/04/2013) em uma instalação padrão, sem definir um outro diretório, provavelmente você fará a seguinte configuração:

Nome da variável: JAVA_HOME
Valor da variável: C:\Program Files\Java\jdk1.7.0_17

    Após criar a variável de ambiente JAVA_HOME, você precisa informar ao Windows onde estão localizados os programas da máquina virtual Java. Para tanto, basta você adicionar o caminho dos programas na variável de ambiente PATH (ATENÇÃO: Esta variável provavelmente já existe na sua instalação do Windows. Assim, coloque o caminho dos executáveis Java no final da string do valor da variável PATH. NÃO APAGUE o conteúdo já existente da variável! ).

     Caso você tenha instalado a última versão do Java em uma instalação padrão como citado anteriormente, você deve colocar o valor abaixo no final da string do valor da variável de ambiente PATH (lembrando que quando uma variável de ambiente possui vários valores, cada valor deve ser separado pelo caractere ';' ):

C:\Program Files\Java\jdk1.7.0_17\bin

    Uma vez que você tenha realizado todas estas configurações (caso tenha sido necessário realizá-las), o seu computador está pronto para compilar e executar os seus programas Java. Para compilar um programa Java, entre no PROMPT do DOS, use o comando cd para entrar na pasta onde o seu arquivo .java está localizado e utilize o comando javac para compilar o seu programa.

    Por exemplo, considere que você tenha escrito um programa Java no método main da classe Exemplo, a qual está dentro do arquivo Exemplo.java. Assim, para compilar o seu programa você precisa digitar o comando abaixo:

javac Exemplo.java

    Ao fazer isto, caso o seu programa não contenha nenhum erro, o compilador Java cria um arquivo chamado Exemplo.class na mesma pasta onde o seu programa está situado. Este arquivo contém os bytecodes do seu programa para que a máquina virtual Java possa executá-lo. Assim, para executar o seu programa, você precisa digitar o comando abaixo:

java Exemplo

E pronto! Agora é só testar o seu programa!


Estruturas de Dados Básicas

Olá, galera!

Nesta aula eu apresento os tipos básicos da linguagem Java e como criar matrizes de diferentes dimensões com a linguagem. Abraço!


Estrutura de Programas

Olá, galera!

Nesta aula eu apresento brevemente o que é programação estruturada, explicando os conceitos de sequência, seleção e iteração. Abaixo, os slides de aula e as classes Java utilizadas nos exemplos.



Classe Sequencia


/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de sequência.
 * @author Prof.º Sidney
 */
public class Sequencia {

    /**
     * O método <b>main</b> de uma classe Java contém o código a ser
     * executado primeiramente no programa.
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        /**
         * As linhas abaixo contém a sequência de tarefas as quais o nosso 
         * programa executa.
         */
        int numero1 = 1;
        int numero2 = 2;
        int resultado = numero1 + numero2;
        System.out.println(numero1 + " + " + numero2  + " = " + resultado);
        double divisor = 7.43;
        double resultadoPontoFlutuante = resultado / divisor;
        System.out.println(resultado + " / " + divisor + " = " + 
                           resultadoPontoFlutuante);
    }
}


Classe SelecaoIf

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de seleção <b>if</b>.
 * @author Prof.º Sidney
 */
public class SelecaoIf {
    
    public static void main(String[] args) {
        long numeroAleatorio = System.currentTimeMillis();
        System.out.println(numeroAleatorio);
        if(numeroAleatorio % 2 == 0) { // Se o número aleatório for um número par, então:
            System.out.println("O numero aleatorio e um numero par!");
        } else { // Senão, o número aleatório só pode ser um número ímpar!
            System.out.println("Na verdade, o numero aleatorio e um numero ímpar!");
        }
    }
}


Classe SelecaoMultipla

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de seleção múltipla.
 * @author Prof.º Sidney
 */
public class SelecaoMultipla {
    
    public static void main(String[] args) {
        //Escolhe aleatoriamente um número entre [0..9]
        long numeroAleatorio = System.currentTimeMillis() % 10;
        
        // Se o número aleatório for divisível por 2, então:
        if(numeroAleatorio % 2 == 0) { 
            System.out.println("O numero aleatorio e divisivel por 2!");
        } else if(numeroAleatorio % 3 == 0) { // Se o número aleatório for divisível por 3, então: 
            System.out.println("O numero aleatorio e divisivel apenas por 3!");
        } else if(numeroAleatorio % 5 == 0) { // Se o número aleatório for divisível por 5, então:
            System.out.println("O numero aleatorio e divisivel apenas por 5!");
        } else if(numeroAleatorio % 7 == 0) { // Caso contrário, o número só pode ser divisível por 7:
            System.out.println("O numero aleatorio e divisivel apenas por 7!");
        } else {
            System.out.println("So pode ser o numero 1!");
        }
    }
}


Classe SelecaoSwitch1

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de seleção com <b>switch</b>.
 * @author Prof.º Sidney
 */
public class SelecaoSwitch1 {
    
    public static void main(String[] args) {
        //Escolhe aleatoriamente um número entre [0..9]
        int numeroAleatorio = Math.abs((int)System.currentTimeMillis() % 10);
        switch(numeroAleatorio) {
            case 0:
                System.out.println("Sorteou o numero 0");
                break;
            case 1:
                System.out.println("Sorteou o numero 1");
                break;
            case 2:
                System.out.println("Sorteou o numero 2");
                break;
            case 3:
                System.out.println("Sorteou o numero 3");
                break;
            case 4:
                System.out.println("Sorteou o numero 4");
                break;
            case 5:
                System.out.println("Sorteou o numero 5");
                break;
            default:
                System.out.println("Sorteou um numero entre [6..9]");
        }
    }
}


Classe SelecaoSwitch2

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de seleção com <b>switch</b>.
 * @author Prof.º Sidney
 */
public class SelecaoSwitch2 {
    
    public static void main(String[] args) {
        //Escolhe aleatoriamente um número entre [0..9]
        int numeroAleatorio = Math.abs((int)System.currentTimeMillis() % 10);
        System.out.println(numeroAleatorio);
        switch(numeroAleatorio) {
            case 1:
                System.out.println("O numero sorteado e divisivel apenas por 1");
                break;
            case 2:
            case 4:
            case 6:
            case 8:
                System.out.println("O numero sorteado e divisivel por 2");
                break;
            case 3:
            case 9:
                System.out.println("O numero sorteado e divisivel apenas por 3");
                break;
            case 5:
                System.out.println("O numero sorteado e divisivel apenas por 5");
                break;
            case 7:
                System.out.println("O numero sorteado e divisivel apenas por 7");
                break;
        }
    }
}


Classe IteracaoWhile.java


/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de iteração com <b>while</b>.
 * @author Prof.º Sidney
 */
public class IteracaoWhile {
    
    public static void main(String[] args) {
        int x = 1;
        while(x <= 10) {
            if(x % 3 == 0) {
                System.out.println(x + " e divisivel por 3!");
            } else {
                System.out.println(x + " nao e divisivel por 3!");
            }
            x = x + 1;
        }
    }
}


Classe IteracaoDoWhile

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de iteração com <b>do-while</b>.
 * @author Prof.º Sidney
 */
public class IteracaoDoWhile {
    
    public static void main(String[] args) {
        int x = 11;
        do {
            if(x % 3 == 0) {
                System.out.println(x + " e divisivel por 3!");
            } else {
                System.out.println(x + " nao e divisivel por 3!");
            }
            x = x + 1;
        }while(x <= 10);
    }

}


Classe IteracaoFor

/**
 * Para fins de organização, é uma convenção que os códigos de um projeto
 * Java sejam organizados em pacotes.
 */
package br.edu.ifms.lp1.aula02;

/**
 * Exemplo de iteração com <b>for</b>.
 * @author Prof.º Sidney
 */
public class IteracaoFor {
    
    public static void main(String[] args) {
        for(int x = 1; x <= 10; x = x + 2) {
            if(x % 3 == 0) {
                System.out.println(x + " e divisivel por 3!");
            } else {
                System.out.println(x + " nao e divisivel por 3!");
            }
        }
    }

}

O que é interação humano-computador?

Olá, galera!

Nesta aula discutimos sobre o estudo de interfaces humano-computador, mostrando a evolução destas interfaces desde os anos 70 até os dias atuais. Discutimos também o que é o estudo da interação humano-computador e seus desafios e objetivos. Por fim, vemos quais são os princípios básicos de design de interfaces mais usáveis e acessíveis. Abraço!


Temas de TCC 2013

Olá, galera!

Chega o final do curso e muitos alunos ficam indecisos quanto ao tema/assunto que gostariam de trabalhar em seu projeto de conclusão de curso. Assim, vou descrever abaixo alguns dos temas que veio na minha mente e os quais eu gostaria de trabalhar.


1. Indexação automática e busca semântica multiplataforma de documentos textuais heterogêneos

Resumo: Este trabalho propõe uma solução para o armazenamento, indexação e busca de documentos textuais heterogêneos, i.e., documentos de diversos formatos/extensões. O mecanismo de busca a ser implementado neste sistema considerará os aspectos semânticos dos documentos de texto armazenados e não apenas simples casamentos de termos ou palavras-chave. Isto implica em um processo prévio de indexação que consiga extrair os significados semânticos de cada documento armazenado. Por exemplo, um documento cujo texto ou parte deste aborde a respeito do plantio de mandioca não deve ser recuperável apenas em buscas pelo assunto “mandioca”, mas também pelos assuntos “macaxeira”,
“aipim”, entre outros. Por fim, a busca por documentos deve ser implementada de tal forma a ser oferecida por interfaces em diferentes plataformas, como páginas Web ou aplicativos desktop ou mobile.

Possíveis tecnologias envolvidas: Ontologias, thesaurus, bancos de dados relacionais, bancos de dados NoSQL e linguagens de programação para Web.

Palavras-chave: Indexação textual, recuperação textual, documentos textuais digitais,
semântica de dados.

2. Estudo e avaliação de frameworks contemporâneos para desenvolvimento Web

Resumo: Este projeto propõe um estudo dirigido a frameworks contemporâneos para o desenvolvimento de aplicações na plataforma Web que utilizem diferentes linguagens de programação. Tal estudo visa comparar os frameworks quanto às suas complexidades de instalação, configuração e implementação, além da curva de aprendizado de seu funcionamento. Para tanto, serão realizados estudos de caso práticos a fim de se avaliar os aspectos acima citados.

Possíveis tecnologias envolvidas: Ruby on Rails, Django, JSF, Grails e Zend.

Palavras-chave: framework Web, desenvolvimento Web.

3. Estudo e avaliação de SGBDs NoSQL para armazenamento e consulta de documentos heterogêneos

Resumo: Os SGBDs NoSQL (Not Only SQL, ou seja, Não Apenas SQL) oferecem a gestão de dados de forma não relacional, como é feito em SGBDs relacionais populares como o MySQL, PostgreSQL ou Oracle. Assim, cada SGBD NoSQL existente hoje em dia no mercado utiliza estratégias de armazenamento e indexação, estruturas de dados e linguagens de consulta distintas. Desta forma, o objetivo principal deste trabalho é realizar um estudo comparativo e avaliação das principais soluções NoSQL gratuitas encontradas no mercado, visando especificamente SGBDs NoSQL orientados a documentos.

Possíveis tecnologias envolvidas: Apache Cassandra, MongoDB, BaseX, eXist, ArangoDB.

Palavras-chave: Sistemas Gerenciadores de Bancos de Dados, NoSQL, documentos digitais.

4. Desenvolvimento de uma ontologia OWL para o mapeamento documental do IFMS

Resumo: Uma ontologia é composta por um conjunto de classes, instâncias e relacionamentos que descrevem formalmente conceitos do mundo real. Ontologias são amplamente utilizadas para a indexação e consulta semântica de conteúdo na Web. A proposta deste trabalho é construir uma ontologia para descrever as áreas e assuntos comumente encontrados nos documentos administrativos e letivos do Instituto Federal de Mato Grosso do Sul, utilizando a linguagem de definição de ontologias OWL. Com esta ontologia, será possível construir futuramente sistemas e mecanismos inteligentes para a recuperação semântica do conteúdo documental digital do instituto.

Possíveis tecnologias envolvidas: OWL, Protégé, RDF.

Palavras-chave: Ontologia, semântica de dados.

5. Desenvolvimento de um sistema de CBIR (Content-Based Image Retrieval) utilizando a API JAI

Resumo: A área de recuperação de imagens baseada em conteúdo (Content-Based Image Retrieval ou CBIR) visa oferecer a busca de imagens de acordo com o conteúdo encontrado em sua combinação de pixels, como formas ou cores. Esta estratégia de recuperação visa oferecer uma busca mais detalhada do que a simples busca por imagens de acordo com a sua descrição textual ou mesmo de acordo com o texto encontrado próximo à imagem dentro do documento. Assim, este trabalho propõe a implementação de um sistema de CBIR, utilizando a API Java JAI (Java Advanced Imaging) para as operações de manipulação de imagens.

Possíveis tecnologias envolvidas: JAI API, linguagem Java.

Palavras-chave: CBIR, processamento de imagens.

6. Mineração de dados em documentos textuais de estrutura heterogênea 

Resumo: O processo de mineração de dados visa encontrar padrões em um conjunto de dados. Cada padrão encontrado em um processo de mineração é avaliado por um analista, o qual separa os padrões úteis dos inúteis. Um padrão é considerado útil se ele traz à tona um novo fato relevante a respeito do conjunto de dados que não era antes conhecido. A proposta deste trabalho é implementar um mecanismo de mineração de dados em documentos textuais, i.e., um mecanismo de mineração textual. A ideia é que este mecanismo consiga operar sobre documentos textuais heterogêneos, ou seja, documentos de tipos/formatos variados.

Possíveis tecnologias envolvidas: alguma linguagem de programação e algum componente que implemente algum algoritmo de identificação de padrões.

Palavras-chave: mineração de dados, documentos digitais textuais.

7. Estudo comparativo (survey) de abordagens de teste de Web Services SOAP

Resumo: Um Web Service é um componente de software disponibilizado via Web que oferece um conjunto de operações/funcionalidades úteis que podem ser consumidas por diversos tipos de software, hospedados em diversas plataformas. Por incentivar esta portabilidade, o uso de Web Services é extremamente difundido mundo a fora. Porém, realizar testes em Web Services envolve questões e preocupações que não ocorrem no teste de outros tipos de componentes de software. Assim, este trabalho propõe um estudo acerca de abordagens para teste de Web Services, focando em Web Services que utilizem o protocolo SOAP para a troca de mensagens.

Possíveis tecnologias envolvidas: JAX-WS, Suds, Soaplib.

Palavras-chave: web services, SOAP, teste de software.

8. Estudo comparativo de abordagens de teste em contêineres EJB

Resumo: O EJB (Enterprise Java Beans) é um dos principais componentes de software da plataforma JEE (Java Enterprise Edition), sendo utilizado por diversas empresas para o desenvolvimento rápido e simplificado de aplicações Java baseadas em componentes distribuídos, transacionais, seguros e portáveis. Um contêiner EJB é um servidor de aplicações capaz de executar e depurar aplicativos que utilizem a tecnologias EJB. Para que uma aplicação EJB possa ser executada, é necessário que tal aplicação seja implantada num contêiner EJB primeiramente. Este processo dificulta os testes unitários nós códigos de negócio na aplicação EJB, uma vez que as ferramentas comuns de teste (como o Junit) não conseguem executar o trecho de código a ser testado sem a interferência do contêiner. Assim, este trabalho propõe um estudo comparativo sobre as tecnologias e abordagens para testes de aplicações que executadas em contêineres EJB, visando levantar as diferentes características de cada abordagem, além da forma como cada uma é aplicada na prática.

Possíveis tecnologias envolvidas: Arquillian, Mockito, Cactus, Needle.

Palavras-chave: EJB, teste de software, JEE.

Representação e Manipulação de Informações

Olá, galera!

Nesta aula, estudamos tópicos básicos em estruturas de dados referentes à representação e manipulação de informações. Nela, conheça o utópico Yottabyte! ;)