viernes, 15 de julio de 2011

Demo Final

En esta entrada les voy a mostrar algo de lo que fue la demostracion final de mi programa


Interfaz:






Codigo:


import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.Graphics;
import java.awt.event.KeyEvent;


//INTERFAZ
public class Tecla extends Frame
{
  //atributos
private int estado = 0;
private int ubicacion = 0;
private int sonido;


//constructor
public Tecla () { };


//metodos
public void paint(Graphics g) {
g.setColor(Color.white);
g.drawRect(43, 80, 20, 80);
g.fillRect(43, 80, 20, 80);
g.drawRect(66, 80, 20, 80);//posicion horizontal, vertical tamano ancho largo
g.fillRect(66, 80, 20, 80);
g.drawRect(89, 80, 20, 80);
g.fillRect(89, 80, 20, 80);
g.drawRect(112, 80, 20, 80);
g.fillRect(112, 80, 20, 80);
g.drawRect(135, 80, 20, 80);
g.fillRect(135, 80, 20, 80);
g.drawRect(158, 80, 20, 80);
g.fillRect(158, 80, 20, 80);
g.drawRect(181, 80, 20, 80);
g.fillRect(181, 80, 20, 80);
g.drawRect(204, 80, 20, 80); 
g.fillRect(204, 80, 20, 80);
g.drawRect(227, 80, 20, 80); 
g.fillRect(227, 80, 20, 80);
g.drawRect(250, 80, 20, 80); 
g.fillRect(250, 80, 20, 80);
g.setColor(Color.black);
g.drawRect(60, 80, 12, 40);
g.fillRect(60, 80, 12, 40);
g.drawRect(83, 80, 12, 40);
g.fillRect(83, 80, 12, 40);
g.drawRect(129, 80, 12, 40);
g.fillRect(129, 80, 12, 40);
g.drawRect(152, 80, 12, 40);
g.fillRect(152, 80, 12, 40);
g.drawRect(175, 80, 12, 40);
g.fillRect(175, 80, 12, 40);
g.drawRect(218, 80, 12, 40);
g.fillRect(218, 80, 12, 40);
g.drawRect(241, 80, 12, 40);
g.fillRect(241, 80, 12, 40);
}
public static void main(String args[]) {
Frame frame = new Tecla();
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
frame.setBackground(Color.green);
frame.setSize(315,200);
frame.setVisible(true);
frame.setTitle("Mi piano");
}
//KeyEvent


   public void keyPressed(KeyEvent e) 
{
switch(){
case KeyEvent.VK_Q:
   System.out.println("DO");
   break;
case KeyEvent.VK_W:
   System.out.println("RE");
   break;
case KeyEvent.VK_E:
   System.out.println("MI");
   break;
case KeyEvent.VK_R:
   System.out.println("FA");
   break;
case KeyEvent.VK_T:
   System.out.println("SOL");
   break;
case KeyEvent.VK_Y:
   System.out.println("LA");
   break;
case KeyEvent.VK_Q:
   System.out.println("SI");
   break;
}
}
//music
//variables
//set estado newvar estado
public void setEstado ( int newVar ) {
   estado = newVar;
}
//get estado return estado
public int getEstado ( ) {
   return estado;
}
//set ubicacion newvar ubicacion
public void setUbicacion ( int newVar ) {
   newVar = ubicacion++;
   ubicacion = newVar;
}
//get ubicacion return ubicacion
public int getUbicacion ( ) {
   return ubicacion;
}
}

Sistemas Distribuidos (Taller y Clase)

Los sistemas distribuidos son los sistemas que están conectados por medio de una red y su objetivo principal es tener un mayor numero de usuarios utilizando la red y que estos puedan acceder desde diferentes sitios.

Caracteristicas
  • Concurrencia: Permite que una gran cantidad de usuarios puedan utilizar al mismo tiempo el sistema disponible en la red sin tener problemas y con la misma velocidad.
  • Compatibilidad: El sistema tiene que ser compatible para todos los usuarios que lo manejen.
  • Fallos independientes de los componentes: Los componentes del sistema son independientes unos de otros, por lo que si uno llega a fallar, el resto de los componentes puede continuar con sus acciones determinadas para poder seguir trabajando.
  • Ejemplo de sistema distribuido
 En mi opinion, el programa con el que estuve trabajando en estos dias si podria ser un sistema distribuido ya que es una herramienta de entretenimiento que puede tener interes por medio de los usuarios.
Para hacer mi programa formar parte de un sistema distribuido podria subir la aplicacion a internet para que los usuarios puedan utilizar el piano en linea y producir diferentes canciones. Despues podria implementarse la opcion de grabar las canciones y almacenarlas para que sea mas atractivo y economico para el usuario hacer musica.

 Referencias:
Imagen
Sistemas distribuidos
Computacion distribuida

Retroalimentación

Para poder aprender un poco mas sobre un tema es necesario compartir conocimiento con las demas personas. De esta manera se puede escuchar diferentes puntos de vista o perspectivas sobre un tema, ideas, aprender nuevas cosas o entender conceptos que antes no habian sido comprendidos.

Por este motivo hable un poco con mis compañeros sobre temas importantes de la clase y sobre cosas que ellos entendieron mejor, compartimos ideas y ayudamos a solucionar las dudas que teníamos. Hablamos sobre las clases, atributos y métodos, sobre todos los diagramas, el uso y la importancia que tiene cada uno de ellos, entre otras cosas.

Despues de haber tenido una conversacion sobre los temas vistos en la clase decidi publicar comentarios sobre sus entradas para darles sugerencias. Mis compañeros también comentaron en mis entradas.
A continuacion les mostraré los comentarios que compartimos

  • Pedro: (Esqueleto de Software, Taller)
"Oye gaby nomas un comentario porque no utilizas el SintaxHighlighter para mostrar el código de una forma mas bonita.

Aquí esta un link que explica como hacerlo:

http://soloinformaticayalgomas.blogspot.com/2011/01/colocar-codigo-en-blogger-con.html"

  • En una entrada de Vanessa donde hablaba sobre patrones de diseño comente:

"Tambien existe el patron Memento, que funciona como el undo (deshacer). Permite regresarte a estados anteriores del sistema.
Saludos:)"

  • En otra entrada de Vanessa donde hablaba de autogeneracion de codigo escribi:

"Lo que me gusto del autogenerador es que te define la estructura y ya de ahi vas mejorando el codigo, aunque lo mejor es escribirlo todo para saber exactamente que funcion realiza cada una de las lineas del codigo
Saludos(:"





jueves, 14 de julio de 2011

Pruebas Unitarias

Los casos de prueba son las formas en las que podemos probar nuestro programa para verificar que todo funcione de la manera mas correcta y efectiva posible.
 
A continuacion describire algunos de los casos de prueba utilizados en mi programa
 
Caso 1: Reproducir Sonido

Objetivo: Que el  programa sea capaz  de producir un sonido al momento de presionar una tecla del teclado

Requisitos: Tener el programa, sonido y contar con Java para poder ejecutarlo correctamente.

Datos de prueba (Variables):
Teclasociada
Estado de la tecla
Ubicacion de la tecla
Funcion Key Listener
Funcion Reproducir Sonido


Pasos: 
  1. Ejecutar el programa
  2. Presionar una tecla de la computadora y verificar que se escuche un sonido
  3. Presionar otra tecla para comprpbar si se escucha bien el sonido en todas las teclas
Resultado Esperado:
Escuchar el sonido producido por el programa según la tecla indicada

Resultado Obtenido
No se pudo obtener bien el sonido ya que faltan algunos detalles por terminar






Documentacion Tecnica (Taller y Clase)

La Documentación Técnica es muy útil para saber manejar de una manera adecuada cualquier programa que se nos proporcione, optimizar los resultados y disminuir el tiempo de aprendizaje del programa.
Ademas, sirve para conocer completamente todas las funciones del programa y sacar máximo provecho de este. 
La documentación explica también las características técnicas de un programa, así como los requerimientos y las necesidades para poder utilizar el programa de la manera mas adecuada y que su utilización sea la mejor posible.

Para la persona que creo el programa es muy fácil crear la documentación ya que conoce perfectamente el programa, sus características, requerimientos, entre otras cosas.

Para crear la documentacion tecnica de mi programa utilice un programa llamado Doxygen. 
Despues de haber proporcionado al programa los datos principales dentro de mi codigo se genero el html de documentacion.
 
A continuacion les mostrare algunas capturas de pantalla del html generado por Doxygen




  




Autogeneracion de codigo

Existen programas que generan el codigo del software automaticamente, sin la necesidad de escribirlo nosotros mismos. A este tipo de programas los llamamos programas autogeneradores de código.
Un ejemplo de programa que realiza esto es el Umbrello (Programa de Diagramas para Ubuntu). Este programa genera el codigo despues de realizar el diagrama de clase.


A continuacion les muestro el codigo autogenerado de una de las clases principales llamada Tecla:



import java.util.*;

//clase Tecla
public class Tecla 
  //atributos
 private int sonido;
  //constructor
  public Tecla () { };
  //metodo
  set sonido newvar sonido
  private void setSonido ( int newVar ) {
  sonido = newVar;
  }
  get sonido return sonido
  private int getSonido ( ) {
  return sonido;
  }
    //otros metodos
  public void reproducir(  )
  {
  }
}


Como es un programa generado a partir de un diagrama de clase, los metodos no tienen mucho codigo.
Los comentarios agregados (//) yo los escribi.







Especificacion Tecnica

Una especificación técnica es la descripcion detallada de un programa y su funcionamiento para que el usuario pueda utilizarlo de la mejor manera. En esta tambien se especifican los requerimientos necesarios, asi como las tareas que se ejecutan. 
  • Descripcion del programa:
El programa que estoy realizando consiste en un pequeño teclado virtual que emite sonidos a traves del teclado de la computadora. Segun la tecla que se presione sera el sonido obtenido.
  • Objetivo:
El objetivo de mi programa es que el usuario pueda escuchar sonidos a traves de las teclas del teclado. El usuario puede ayudarse de las partituras incluidas en el programa, las cuales le indican como reproducir canciones populares de una manera más facil. 
  • Requerimientos:
El programa se puede ejecutar en cualquier sistema operativo y es necesario que la computadora cuente con Java para poderlo correr.
Detalles por terminar
Al programa le falta una serie de detalles para que quede completamente funcional y pueda utilizarse bien. Dichas funcionalidades las expresare a continuacion:
  • Función KeyListener: Esta funcion permite escuchar la tecla que es presionada
  • Funcion Reproducir Sonido: Esta funcion permitira reproducir el sonido al momento de presionar la tecla
Para llevar a cabo las funcionalidades que faltan es necesario primeramente realizar la funcion KeyListener y después de esta accion reproducir el sonido de la tecla que fue presionada.

Una vez que fue codificada la primera tecla ya sera mas facil hacer lo que falta del programa porque el resto de las teclas serán codificadas de la misma manera. Por este motivo tambien me falta tener la interfaz grafica completa.

REFERENCIAS



miércoles, 13 de julio de 2011

Demostracion Avance Parcial (Taller)

Antes de terminar el proyecto me gustaria darles una pequeña demostración de lo que hace mi programa hasta ahorita y mostrarles mis avances en la materia.

Primeramente les mostraré la pantalla principal de la interfaz 

En esta pantalla podemos observar la primera tecla de mi programa. Es importante que quede la primera tecla porque el resto seran codificadas de la misma manera. 
A esa tecla le impĺementare un key listener para que pueda reconocer la tecla de la computadora que le corresponde y que despues emita un sonido.  
Ahora les mostrare algo del codigo que llevo de la tecla:

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.applet.Applet;

//Rectangulo
public class Tecla extends Frame {
    Stroke drawingStroke = new BasicStroke(2); 
    Rectangle2D rect = new Rectangle2D.Double(30, 35, 10, 40);

    public void paint(Graphics g) {
        Graphics2D g1 = (Graphics2D)g;
        g1.setStroke(drawingStroke);
        g1.draw(rect);
        g1.setPaint(Color.white);
        g1.fill(rect);
        }
    public static void main(String args[]) {
        Frame frame = new Rectangulo();
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });
        frame.setSize(300,200);
        frame.setVisible(true);
        frame.setBackground(Color.black);
    }
    //key listener

    public class Keylistener extends Applet{

    public void keyPressed(KeyEvent e)
    {
    }
    public void actionPerformed(ActionEvent e)
    {
    }
}
}
Tambien les mostrare un avance del codigo que tengo para las otras clases

import java.util.*;
import java.awt.*;

//clase Piano
    public class Piano {

    //atributos
    private char teclasociada;
    private int estado = 0;
    private int ubicacion = 0;
   
    //constructor
    public Piano () { };
 
    //metodo
   
    //set teclasoc newVar teclasociada
   
    public void setTeclasociada ( char newVar ) {
        newVar = 'q';
        teclasociada = newVar;
    }
   
    //get teclasociada return teclasociada
    public char getTeclasociada ( ) {
        return teclasociada;
    }
   
    //set estado newvar estado
    public void setEstado ( int newVar ) {
        estado = newVar;
    }
   
    //get estado return estado
    public int getEstado ( ) {
        return estado;
    }

    //set ubicacion newvar ubicacion
    public void setUbicacion ( int newVar ) {
        newVar = ubicacion++;
        ubicacion = newVar;
    }

    //get ubicacion return ubicacion
    public int getUbicacion ( ) {
        return ubicacion;
   
    }

    }

import java.util.*;


//Clase partitura
public class Partitura {

  //
  // Fields
  //

  private char nombre;
  private char titulo;
  private char dificultad;
 
  //
  // Constructor
  //
  public Partitura () { };

  // Metodos
 
  //Set nombre newvalue nombre
  private void setNombre ( char newVar ) {
    nombre = newVar;
  }
  //Get nombre return nombre
  private char getNombre ( ) {
    return nombre;
  }

  //Set titulo newvalue titulo
  private void setTitulo ( char newVar ) {
    titulo = newVar;
  }
  //Get titulo return titulo
  private char getTitulo ( ) {
    return titulo;
  }
  //Set dificultad new value
  private void setDificultad ( char newVar ) {
    dificultad = newVar;
  }
  //Get dificultad return dificultad
 
  private char getDificultad ( ) {
    return dificultad;
  }
//Otros metodos
  public void imprimir(  )
  {
  }
  public void mostrarimagen(  )
  {
  }
  public void back(  )
  {
  }

}

Todo el codigo que aqui les muestro ya compila y corre en la terminal.

Eventos Excepciones y Errores

Un evento es un suceso que forma parte importante del programa y que lo define como tal. A continuacion les mostrare la tabla con los eventos de mi programa


En la tabla se muestran los diferentes graficos del programa con las acciones que realizan y una descripcion del tipo de evento

En la siguiente tabla mostrare las excepciones o errores que puede tener el programa en caso de que no se ejecuten sus funciones de manera correcta.


Para codificar seria muy sencillo no realizar ninguna accion al momento de presionar una tecla que no esta incluida en el teclado. Podemos decir que al momento de presionar una tecla existente emita el sonido, pero que al momento que no exista la tecla en el teclado simplemente terminar con la funcion ( cerrarlo }) y que no realize ninguna accion, para que de esta manera el usuario vea cuales son las que si emiten sonido y cuales no.


Otra forma de lidiar con este error sería utilizar una pantalla de error al momento de presionar una tecla.
El codigo quedaría se podria aplicar dentro del switch despues de cada caso de las teclas que si se utilizan.


default:
system.err.println("Error: Tecla no reconocida. Intente Nuevamente");
break;



Interfaz Grafica

Aqui les mostrare un poco de la interfaz grafica que tengo planeada para mi proyecto.
Esta muy basica ya que el diseño fue realizado en paint, un programa que no tiene muchas herramientas de diseño. Mi idea es mejorarlo al momento de hacerlo en la interfaz verdadera de mi programa.

Asi se veria la interfaz principal del programa


Como pueden observar, en la esquina inferior derecha hay un boton que da la opcion de ver partituras para tocar algunas melodias comunes.
Al momento de presionar ese boton se abriria una ventana con las partituras. Las partituras van a mostrar las teclas asociadas con el teclado del telefono que se tienen que presionar para escuchar el sonido. En pocas palabras, son las teclas que tiene que presionar el usuario en su telefono


El diseño de las interfaces ira mejorando poco a poco


A continuacion les mostrare un poco de codigo de lo que llevo hasta ahorita de la interfaz grafica:


import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.applet.Applet;

//Rectangulo
public class Rectangulo extends Frame {
    Stroke drawingStroke = new BasicStroke(2); 
    Rectangle2D rect = new Rectangle2D.Double(30, 35, 10, 40);

    public void paint(Graphics g) {
        Graphics2D g1 = (Graphics2D)g;
        g1.setStroke(drawingStroke);
        g1.draw(rect);
        g1.setPaint(Color.white);
        g1.fill(rect);
        }
    public static void main(String args[]) {
        Frame frame = new Rectangulo();
        frame.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent we){
                System.exit(0);
            }
        });
        frame.setSize(300,200);
        frame.setVisible(true);
        frame.setBackground(Color.black);
    }
    //key listener

    public class Keylistener extends Applet{

    public void keyPressed(KeyEvent e)
    {
    }
    public void actionPerformed(ActionEvent e)
    {
    }
}
}



Diagrama de Secuencia

Un diagrama de secuencia es el diagrama que muestra las interacciones entre las clases u objetos definidos en un programa. 
A continuacion les mostrare un ejemplo de diagramas de secuencia de mi proyecto.

Para la siguiente demostracion utilizare la funcion que sirve para reproducir un sonido al momento de presionar una tecla


Primeramente al momento de presionar una tecla el Piano la ubica. Despues le pide que se reproduzca y dicha tecla reproduce el sonido deseado.


En mi segundo diagrama se puede ver la funcion que sirve para mostrar la partitura que el usuario desee tocar en el piano.
Primeramente el piano debe pedirle a la partitura que se muestre y despues de que la partitura recibio esa orden se va a mostrar en el piano.


Para este diagrama se muestra como la tecla se va a sombrear de un color al momento de estar presionada. Primeramente el piano debe ubicar cual es la tecla que esta presionada y pedirle que se sombree. Al momento de recibir la orden de sombrearse la tecla se sombreara en el piano.

REFERENCIAS

lunes, 11 de julio de 2011

Herencia y Polimorfismo


Herencia
Una herencia es el mecanismo que nos permite compartir características(metodos y atributos) similares entre las clases. Es donde una clase padre hereda características a la clase hija (pueden ser todas o algunas).
Existen dos tipos de herencias: La herencia simple y la herencia multiple.
  • La herencia simple puede tener solo una clase padre
  • La herencia multiple puede tener varias clases padres
Aqui les muestro un ejemplo de codigo de herencia que obtuve de internet
class Persona
 {
    private:
      char * nif;
      int  edad;
      char * nombre, *apellidos;
   public:
      Persona(char * , int = 0,  char *, char * );
      Persona & operator=( Persona &);
      ~Persona();               // Destructor
      void medad(int);
      void mnombre(char *);
      char * mnombre() ;
void mostrar() ;
char * nombreCompleto() ;
void felizCumple();            // El día del cumpleaños
void leer();      // Lectura de los datos de la persona
};

Class  Alumno : public Persona
    {
    private:
      int  curso;
   public:
      Alumno(char * , int = 0,  char *, char * , int );
      Alumno& operator=( Alumno &);
      ~Alumno ();                                // Destructor
      int mcurso ();
void mcurso (int );
};

Para mi programa no utilizare herencia ya que la clase principal no heredara ningun atributo o método con las otras clases. Las clases son completamente diferentes y no se podrían definir como clases hijas. 
Tecla NO es un tipo de Piano
Partitura NO es un tipo de Piano
Por lo que en este programa no se puede utilizar herencia

Polimorfismo
Polimorfismo es la capacidad que tienen las clases para que una serie de clases derivadas utilicen el mismo método para realizar una función especifica
Existen dos tipos de polimorfismo:
  • Polimorfismo Dinámico: En esta forma de polimorfismo no es especifica el tipo de datos con el que se trabaja
  • Polimorfismo Estático: Es en el que tienen que ser declarados especificamente los tipos de datos que se van a utilizar.
Aqui les muestro un ejemplo de codigo de polimorfismo que encontre en internet


public abstract class figura {
protected String nombre; 
protected int color; 
protected int grosorBorde; 

public String getNombre(){ 
return this.nombre; 
public void setNombre(String n){ 
this.nombre=n; 
public int getColor(){ 
return this.color; 
public void setColor(int c){ 
this.color=c; 
public int getGrosorBorde(){ 
return this.grosorBorde; 
public void setGrosorBorde(int g){ 
this.grosorBorde=g; 
public abstract void dibujar(); 
}


Para la ejecucion de mi programa tampoco utilizare polimorfismo ya que ninguna de las clases comparten metodos similares.

Referencias

Esqueleto del software (Taller)

Un esqueleto de software es la parte principal que define la esctructura de un programa.
Es imprescindible realizar el esqueleto de las clases para acomodar bien la estructura y dividir las partes del programa correctamente. Despues de realizar el esqueleto podemos codificar los atributos y metodos mas especificamente.
Aqui les muestro el esqueleto de las 3 clases mas importantes de mi programa

Esqueleto 1: Clase Piano
Esta clase es la que define, relaciona y unifica las demás clases. Es la clase principal y la que va a controlar todo.

import java.util.*;
import java.awt.*;

//clase Piano
    public class Piano {
      //atributos
private char teclasociada;
private int estado = 0;
private int ubicacion = 0;
//constructor
public Piano () { };
//metodo
//set teclasoc newVar teclasociada
public void setTeclasociada ( char newVar ) { 
   newVar = 'q';
   teclasociada = newVar;     
}
//get teclasociada return teclasociada
public char getTeclasociada ( ) {
   return teclasociada;
}
//set estado newvar estado
public void setEstado ( int newVar ) {
   estado = newVar;
}
//get estado return estado
public int getEstado ( ) {
   return estado;
}
//set ubicacion newvar ubicacion
public void setUbicacion ( int newVar ) {
   newVar = ubicacion++;
   ubicacion = newVar;
}
//get ubicacion return ubicacion
public int getUbicacion ( ) {
   return ubicacion;
}
    }

Esqueleto 2: Tecla
Esta clase va a definir y reproducir el sonido de cada tecla. Realizare una clase por tecla. En total serian 8 clases.

import java.util.*;

//clase Tecla
public class Tecla 
  //atributos
 private int sonido;
  //constructor
  public Tecla () { };
  //metodo
  set sonido newvar sonido
  private void setSonido ( int newVar ) {
  sonido = newVar;
  }
  get sonido return sonido
  private int getSonido ( ) {
  return sonido;
  }
    //otros metodos
  public void reproducir(  )
  {
  }
}

Esqueleto 3: Partitura
Esta clase va a permitir que el usuario sea capaz de ver partituras que pueda utilizar durante el programa para reproducir diferentes melodias

import java.util.*;

//Clase partitura
public class Partitura {

  //
  // Fields
  //

  private char nombre;
  private char titulo;
  private char dificultad;
  
  //
  // Constructor
  //
  public Partitura () { };

  // Metodos
  
  //Set nombre newvalue nombre
  private void setNombre ( char newVar ) {
    nombre = newVar;
  }
  //Get nombre return nombre
  private char getNombre ( ) {
    return nombre;
  }

  //Set titulo newvalue titulo
  private void setTitulo ( char newVar ) {
    titulo = newVar;
  }
  //Get titulo return titulo
  private char getTitulo ( ) {
    return titulo;
  }
  //Set dificultad new value
  private void setDificultad ( char newVar ) {
    dificultad = newVar;
  }
  //Get dificultad return dificultad
  
  private char getDificultad ( ) {
    return dificultad;
  }
//Otros metodos
  public void imprimir(  )
  {
  }
  public void mostrarimagen(  )
  {
  }
  public void back(  )
  {
  }
}