domingo, 2 de febrero de 2014

Mantenimiento de Software

Primero que nada, debemos saber que es el mantenimiento de software:

  • "El proceso de modificar un sistema de software o sus componentes, para prevenir fallos,  mejorar el desempeño u otros atributos, así como adaptarse a los cambios en su ambiente"

Por lo tanto, podemos decir que el mantenimiento de software concierne a:

  • Corregir errores descubiertos posteriormente a la entrega del software.
  • Adaptar al software a un cambio en los requerimientos,  un cambio en su ambiente.
El éxito en el mantenimiento depende en el desarrollo, por las siguientes razones:

  1. Mayor calidad = menor mantenimiento (correctivo).
  2. Anticipar cambios = menor mantenimiento (adaptativo y perfectivo).
  3. Mejor ajuste a las necesidades del usuario = menos mantenimiento (perfectivo).
  4. Menos código = menos mantenimiento.
Contamos con 4 tipos de mantenimiento:
  • Correctivo: como el nombre lo dice, corrige los errores.
  • Adaptativo: adaptarse al cambio del ambiente (tanto hardware como software).
  • Perfectivo: adaptación al cambio en las necesidades del usuario.
  • Preventivo: incrementar la mantenibilidad del sistema.


Después de todo lo dicho, podemos determinar que simplemente por haber entregado un software 100% funcional al cliente no implica que no se le debe dar seguimiento, sino todo lo contrario, se le debe mejorar, corregir e incluso perfeccionar, esto eventualmente nos dará un sistema cercano a la perfección requerida previamente por los usuarios.


Bibliografía


Amsterdan, U. (s.f.). Faculty Sciences. Obtenido de Department of Computer Sciences: https://www.google.com.mx/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.cs.vu.nl%2F~hans%2FSEslides%2Fmaint.ppt&ei=hGMBU47RGISiyAGGkoDYAw&usg=AFQjCNEu6TpvFtE_U0RANCqMtJ_GY1zi8w&sig2=LJulSW5jT1ECAMgzXQr6AQ&bvm=bv.61535280,d.aWc


viernes, 29 de noviembre de 2013

Destination Finder == Sistema Distribuido

  • El sitio web Destination Finder, diseñado por la empresa SoftCake Inc. puede ser considerado como un sistema distribuido por lo siguiente: cada "modulo" que integra la pagina web, fue distribuida en diferentes equipos y funciono de manera exitosa, haciendo uso de los protocolos TCP/IP, logramos hacer una distribución de recursos, permitiendo una comunicación estable y eficiente entre todos los equipos, permitiendo el acceso a una sola base de Datos y coordinando el orden de ejecución de las acciones de cada parte, logramos una interfaz simple, comprensible y rápida.
  • Cumpliendo con las siguientes características podemos asegurar que este proyecto si es un sistema distribuido:


    1. Transparencia: la mayoría de los usuarios que usen nuestra plataforma web, percibirán a esta como un solo objeto, y no un "rompecabezas" que esta hecho por partes.
    2. Concurrencia: el sistema esta habilitado para la realización de multiples tareas de procesamiento y fue comprobado por medio del JMeter.
    3. Escalable: fue diseñado de tal manera que pueda seguir siendo desarrollado posteriormente sin necesidad de realizar muchos ajustes para permitir la "expansión" de su funcionalidad.
    4. Fallos independientes: al ser un proyecto integrado por partes, el fallo de un modulo, no podrá afectar el desempeño de los otros.
El sitio web esta disponible en este link "Destination Finder"

domingo, 24 de noviembre de 2013

Cliente V2.0



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;
/**
 *
 * @author Eduardo Yair-
 */
public class Cliente extends JLabel implements Juego{
    JFrame frm=new JFrame("Speed Racer GT");
    Socket sokete;
    ArrayList<Enemigo> racerx=new ArrayList<Enemigo>();
    ArrayList<Auto> speedr=new ArrayList<Auto>();
    Timer t;
    ObjectInputStream entradaOBJ;
    ObjectOutputStream objSaliente;
    Image track=new ImageIcon(getClass().getResource("media/fondo.png")).getImage();
    Image autoi=new ImageIcon(getClass().getResource("media/carpot.png")).getImage();
    Image enemyi=new ImageIcon(getClass().getResource("media/enemy.png")).getImage();
    Image enemyj=new ImageIcon(getClass().getResource("media/enemy1.png")).getImage();
    Image enemyk=new ImageIcon(getClass().getResource("media/enemy2.png")).getImage();
    Image enemyl=new ImageIcon(getClass().getResource("media/ship.png")).getImage();

    int pos=0;
    public static void main(String args[]) throws Exception{
        new Cliente();
    }
    public void bkgrndmsk()throws Exception {
        URL url = new URL(  "https://dl.dropboxusercontent.com/u/96424843/hocus.wav");      
        //String strFilename = "media/hocus.wav";
        //File sound=new File(strFilename);
        //InputStream in = ClassLoader.getSystemResourceAsStream("media/hocus.wav");
        //URL urlToClip = this.getClass().getResource("media/hocus.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.getAudioInputStream(url);
        clip.open(ais);
        clip.loop(Clip.LOOP_CONTINUOUSLY);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(null, "La música se terminara cuando acabe el juego");
            }
        });
    }
    public Cliente() throws Exception{
        super();
        bkgrndmsk();
        conectar();
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension pantalla=Toolkit.getDefaultToolkit().getScreenSize();
        frm.setSize(pantalla);
        frm.setUndecorated(true);
        frm.add(this);
        frm.setVisible(true);
        this.setFocusable(true);
        this.addKeyListener(error85);
        setBackground(Color.BLACK);
        t=new Timer(5,updater);
       
        t.start();
    }
    public void dibujarAuto(Auto c,Graphics2D g2d){
        if(!c.perder){
            g2d.drawImage(autoi,c.posx,c.posy,c.ancho,c.alto , null);
        }
    }
     public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.white);
        g2d.drawImage(track, 0, pos,frm.getWidth() ,frm.getHeight() , null);
        g2d.drawImage(track, 0, 0-frm.getHeight()+pos,frm.getWidth() , frm.getHeight() , null);
        for(Auto a:speedr){
            dibujarAuto(a,g2d);
        }
        dibujarEnemigos(racerx,g2d);
    }
    public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d){
        for(int i=0;i<enem.size();i++){
            int r=i%3;
            if(r==0){
                g2d.drawImage(enemyi,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(r==1){
                g2d.drawImage(enemyj,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2<=4){
                g2d.drawImage(enemyk,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2>=4){
                g2d.drawImage(enemyl,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);}
        }
    }
    public void recibirEnemigos(){
        try{
            //s.setSoTimeout(5);
            Mensaje mensaje=(Mensaje)entradaOBJ.readObject();
           
            racerx=mensaje.enemigos;
            speedr=mensaje.autos;
            pos=mensaje.fondo;
            //imprimirEnemigos();
        }catch(IOException e ){
            //e.printStackTrace();
            //System.exit(0);
        }
        catch(Exception e ){
            //e.printStackTrace();
        }
    }
    @Override
    public void conectar() {
        try{
            //System.out.println("Estableciendo Conexión");
            InetAddress ad=InetAddress.getByName(JOptionPane.showInputDialog("IP (Server): "));
            sokete=new Socket(ad,Integer.parseInt(JOptionPane.showInputDialog("Puerto: ")));
            entradaOBJ=new ObjectInputStream(sokete.getInputStream());
            objSaliente=new ObjectOutputStream(sokete.getOutputStream());
        }catch(Exception e){
            //e.printStackTrace();
        }
    }
    public void mover(Movimiento m) {
        try{
            objSaliente.writeObject(m);
            //ois.readInt();
            //Thread.sleep(200);
            objSaliente.flush();
            //sokete.getOutputStream().flush();
            //ooo.reset();
           
        }catch(Exception e){
            //e.printStackTrace();
        }
    }

    @Override
    public void actualizar() {
            recibirEnemigos();
            repaint();
    }

    @Override
    public void ganar() {
    }

    @Override
    public void perder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    ActionListener updater=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            actualizar();
        }
       
    };
    KeyListener error85=new KeyListener(){
        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
                System.exit(0);
            }
            Movimiento m=new Movimiento(ke,true);
            mover(m);
        }
        public void keyReleased(KeyEvent ke) {
            Movimiento m=new Movimiento(ke,false);
            mover(m);
        }
    };
}

miércoles, 20 de noviembre de 2013

Juego Distribuido ("Speed Racer 2049")

Juego.java


/**
 *
 * @author Eduardo Yair-
 */
import java.awt.Graphics2D;
import java.util.ArrayList;
import javax.swing.JPanel;

public interface Juego{
public void conectar();
public void mover(Movimiento m);
public void actualizar();
public void ganar();
public void perder();
public void recibirEnemigos();
public void dibujarAuto(Auto a,Graphics2D g2d);
public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d);
}


Cliente.java



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
/**
 *
 * @author Eduardo Yair-
 */
public class Cliente extends JLabel implements Juego{
    JFrame ventana=new JFrame("Speed Racer 2049");
    Socket s;
    ArrayList<Enemigo> enemigos=new ArrayList<Enemigo>();
    ArrayList<Auto> autos=new ArrayList<Auto>();
    Timer t;
    ObjectInputStream ois;
    Image fondo=new ImageIcon(getClass().getResource("img/fondo.png")).getImage();
    Image autoi=new ImageIcon(getClass().getResource("img/carpot.png")).getImage();
    Image enemyi=new ImageIcon(getClass().getResource("img/enemy.png")).getImage();
    Image enemyj=new ImageIcon(getClass().getResource("img/enemy1.png")).getImage();
    Image enemyk=new ImageIcon(getClass().getResource("img/enemy2.png")).getImage();
    Image enemyl=new ImageIcon(getClass().getResource("img/ship.png")).getImage();
    
    ObjectOutputStream ooo;
    int pos=0;
    public static void main(String args[]){
        new Cliente();
    }
    public Cliente(){
        super();
        conectar();
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension pantalla=Toolkit.getDefaultToolkit().getScreenSize();
        ventana.setSize(pantalla);
        ventana.setUndecorated(true);
        ventana.add(this);
        ventana.setVisible(true);
        this.setFocusable(true);
        this.addKeyListener(teclado);
        setBackground(Color.BLACK);
        t=new Timer(5,escuchador);
        
        t.start();
    }
    public void recibirEnemigos(){
        try{
            //s.setSoTimeout(5);
            Mensaje mensaje=(Mensaje)ois.readObject();
            enemigos=mensaje.enemigos;
            autos=mensaje.autos;
            pos=mensaje.fondo;
            //imprimirEnemigos();
        }catch(IOException e ){
            //e.printStackTrace();
            //System.exit(0);
        }
        catch(Exception e ){
            //e.printStackTrace();
        }
    }
    public void dibujarAuto(Auto c,Graphics2D g2d){
        if(!c.perder){
            g2d.drawImage(autoi,c.posx,c.posy,c.ancho,c.alto , null);
        }
    }
    ActionListener escuchador=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            actualizar();
        }
        
    };
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.white);
        g2d.drawImage(fondo, 0, pos,ventana.getWidth() ,ventana.getHeight() , null);
        g2d.drawImage(fondo, 0, 0-ventana.getHeight()+pos,ventana.getWidth() , ventana.getHeight() , null);
        for(Auto a:autos){
            dibujarAuto(a,g2d);
        }
        dibujarEnemigos(enemigos,g2d);
    }
    public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d){
        for(int i=0;i<enem.size();i++){
            int r=i%3;
            if(r==0){
                g2d.drawImage(enemyi,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(r==1){
                g2d.drawImage(enemyj,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2<=4){
                g2d.drawImage(enemyk,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2>=4){
                g2d.drawImage(enemyl,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);}
        }
    }
     KeyListener teclado=new KeyListener(){
        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
                System.exit(0);
            }  
            Movimiento m=new Movimiento(ke,true);
            mover(m);
        }
        public void keyReleased(KeyEvent ke) {
            Movimiento m=new Movimiento(ke,false);
            mover(m);
        }
    };
    @Override
    public void conectar() {
        try{
            System.out.println("Estableciendo Conexión");
            InetAddress ad=InetAddress.getByName(JOptionPane.showInputDialog("Inserte IP del servidor: "));
            s=new Socket(ad,Integer.parseInt(JOptionPane.showInputDialog("Inserte Puerto: ")));
            ois=new ObjectInputStream(s.getInputStream());
            ooo=new ObjectOutputStream(s.getOutputStream());
        }catch(Exception e){
            //e.printStackTrace();
        }
    }
    public void mover(Movimiento m) {
        try{
            ooo.writeObject(m);
            Thread.sleep(200);
            
            //ooo.flush();
            //s.getOutputStream().flush();
            ooo.reset();
            
        }catch(Exception e){
            //e.printStackTrace();
        }
    }

    @Override
    public void actualizar() {
            recibirEnemigos();
            repaint();
    }

    @Override
    public void ganar() {
    }

    @Override
    public void perder() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

Acceso.java


import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JOptionPane;
/**
 *
 * @author Eduardo Yair-
 */

class Acceso {
    JFrame ven=new JFrame("Speed Racer 2049");
    
    public Acceso() {
        ven.setSize(200, 200);
        ven.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ven.setLocationRelativeTo(null);
        Container c=ven.getContentPane();
        c.setLayout(null);
        JButton b2=new JButton("Unirse a partida");
        b2.addActionListener(clien);
        
        b2.setBounds(25, 50, 150, 25);
        c.add(b2);
        ven.setVisible(true);
    }
    ActionListener clien=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            new Cliente();
            ven.dispose();
        }
    };
}


Auto.java


import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;

public class Auto implements Serializable{
    int dx,dy,posx,posy,alto,ancho;
    int[]teclas=new int[4];
    Control control=new Control();
    boolean perder=false;
    public Auto(int px,int py,int lx,int ly,int nteclas[]){
        
        teclas=nteclas;
        posx=px;
        posy=py;
        alto=ly;
        ancho=lx;
    }
    
    public void mover(Dimension max){
        posx+=dx;
        posy+=dy;
        if(posx<=0){
            posx=0;
        }
        if(posx+ancho+15>max.width){
            posx=max.width-ancho-15;
        }
        if(posy<0){
            posy=0;
        }
        if(posy+alto+35>max.height){
            posy=max.height-alto-35;
        }
    }
    
    public class Control implements Serializable,KeyListener{

        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            int tecla=ke.getKeyCode();
            if(tecla==teclas[2]){
                dy=-5;
            }
            if(tecla==teclas[3]){
                dy=5;
            }
            if(tecla==teclas[0]){
                dx=-5;
            }
            if(tecla==teclas[1]){
                dx=5;
            }
            
        }
        public void keyReleased(KeyEvent ke) {
            int tecla=ke.getKeyCode();
            if(tecla==teclas[2]||tecla==teclas[3]){
                dy=0;
            }
            if(tecla==teclas[0]||tecla==teclas[1]){
                dx=0;
            }
        }
        
    }
}


Movimiento.java

import java.awt.event.KeyEvent;
import java.io.Serializable;
public class Movimiento implements Serializable{
    public Movimiento(KeyEvent k,boolean b){
        ke=k;
        presion=b;
    };
    KeyEvent ke;
    boolean presion;
}


Mensaje.java

import java.io.Serializable;
import java.util.ArrayList;

/**
 *
 * @author eduardoyair-
 */
public class Mensaje implements Serializable{
    ArrayList<Enemigo> enemigos=new ArrayList<Enemigo>();
    ArrayList<Auto> autos=new ArrayList<Auto>();
    int fondo;
    int perder=0;
}

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author eduardoyair
 */
public class main {
    public static void main(String args[]){
        new Acceso();
    }
}


Enemigo.java


import java.io.Serializable;

class Enemigo  implements Serializable{
    int vel,posx,posy=-200,ancho=100,alto=200;
    public Enemigo(int w,int v){
        posx=(int)(Math.random()*w);
        vel=(int)(Math.random()*v)+1;
    }
    public void mover(){
        posy+=vel;
    }
}

miércoles, 4 de septiembre de 2013

Modelo OSI

Modelo OSI 

 


El Modelo OSI (Open Systems Interconnection) fue desarrollado en 1977 por la ISO (International Standars Organization) y es fundamentalmente el proceso por etapas que deben recorrer los datos a través de cada una de sus 7 capas, de dispositivo a dispositivo, usando una red.

7 capas

Las primeras 4 capas usan hardware:

Capa Física:
  • Se encarga de realizar la transmisión de un flujo de bits a través del medio.
  • Se usan voltajes e impulso eléctricos.
  • Depende de cables, conectores y otros componentes para la conexión con el medio de transmisión.
Capa Enlace de Datos:
  • Le de forma al flujo de bits, usando un formato predeterminado llamado "TRAMA".
  • Para formar una "trama" este nivel agrega una secuencia especial de bits al principio y al final del flujo principal.
  • Usa la MAC (Media Access Control) y la LLC (Logic Link Control).
Capa de Red (Nivel de paquetes):
  • Divide el mensaje en "paquetes".
  • Cada paquete lo encapsula en una "trama".
  • Usa la IP (Internet Protocol).

Capa de Transporte:
  • Establece las conexiones punto con punto, para evitar errores en el envío de los mensajes.
  • Provee el "broadcast" a múltiples destinos.
  • Usa los protocolos TCP (Transmission Control Protocol) y UDP (User Datagram Protocol).
*Las siguientes capas se basan en el software:

Capa de Sesión:
  • Permite a usuarios en diferentes maquinas a crear una sesión.
  • Controla los "diálogos" (quien habla, cuando, cuanto tiempo, half duplex o full duplex).
  • Mantiene la sincronía.
Capa de Presentación:
  • Establece un formato adecuado para la información que sera transmitida.
  • Define la estructura para los datos (Ej. definir campos de un registro).
  • Define una codificación a usar para la representación de la cadena de caracteres (ASCII, etc).
  • Comprime los datos.

Capa de Aplicación:
  • Transferencia de archivos, Login Remoto, Correo Electrónico, Acceso a BD.

Convertir a bits para la transmisión:
  •  En una aplicación se introduce el dato, este lo pasa a través de la interfaz a la presentación, la cual determina el formato usado añadiendolo en los "encabezados" del paquete que se envía a la siguiente capa, llamada sesión, en esta etapa podemos incluir la seguridad (cifrado de los datos, aunque no es la uncia, la seguridad se puede aplicar en cualquiera de estas etapas), posteriormente llegamos a la parte del hardware, el transporte en esta etapa se hacen "pedacitos" los bloques y se determina un protocolo (TCP / UDP). En la eapa de red se decide que ruta se usa para el envio de los datos (IP); al llegar a la parte del enlace se determina la LLC y la MAC (dirección única para el hardware a nivel mundial), por último, estos datos se envían junto con el paquete original usando la tarjeta de red o similares a el receptor que realizara el proceso inverso.
Ejemplo básico del modelo OSI: LogMeInHamachi

Representación gráfica Modelo OSI

Señales analogas-digitales

Ejemplo entre Analogica y Digital usando el Muestreo (rep. gráfica)




El OSI llego a facilitar la comprension del manejo de los datos al momento de que un usuario, por medio de un equipo computacional, emitiera un mensaje destinado a otro usuario. ISO creo el modelo de las 7 capas para describir la forma en que la información se transfiere de una red a otra, al mismo tiempo, lo creo para establecer una guía para la creación posterior de redes y estándares de comunicación. Por lo mismo, el "OSI Manual Assistance" se separo en 7 capas.

Bibliografía

Enterprise, M. (27 de 02 de 2002). The OSI Model's Seven Layers Defined and Functions Explained. Recuperado el 04 de 09 de 2013, de Microsoft Support: http://support.microsoft.com/kb/103884/en
Tyson, J. (No Disponible de No Disponible de 2000). How OSI Works. Recuperado el 04 de 09 de 2013, de How Stuff Works: http://computer.howstuffworks.com/osi1.htm