Pages

Segunda Oportunidad

Entradas Nuevas

Todo los archivos y carpetas de mi proyecto estan la parte de downloads aqui

Adicionalmente en la parte de descargas se encuentra el video de mi proyecto terminado al 100%.
Lo intente subir a diferentes streamers de video online, pero tengo problemas con el formato; y para peor al tratar de convertirlo se deformaba drasticamente.

Clase:
     Eventos, excepciones y errores aqui
     Interfaz grafica aqui
     Retroalimentacion aqui
     Diagrama de clases aqui
     Importancia de la documentacion tecnica aqui
     Herencia aqui
     Patrones de diseño aqui
    Sistemas Distribuidos aqui
    Diagramas de Secuencia aqui



Taller:
    Eventos, excepciones y errores aqui
    Interfaz grafica -- la misma entrada que la clase -- aqui
    Autogeneracion de codigo aqui
    Documentacion Tecnica aqui
    Herencia y polimorfismo aqui
    Esqueleto de las clases aqui
    Patrones de Diseño aqui
   Sistemas Distribuidos aqui 


Una leve introduccion a los hilos de ejecuccion aqui

Diagramas de Secuencia

Estos son algunos de los diagramas que hice en la pagina websequence, muy util y recomendable debo decir.

Al estar usando umbrello en mi ArchLinux me da problemas ya que es propio de KDE y Arch utiliza Gnome por eso opte por el websequence.
Bueno, esto ya es otra historia.

Los siguientes diagramas estan describiendo situaciones completas y "dias felices". Y la verdad es que algunos si estan un poco extensos, pero partirlos a secuencias mas reducidas no ayuda a comprender mejor la situacion, asi que lo deje con un contexto mas extenso.


Diagrama de una secuencia de inicio de sesion



Registrar un nuevo usuario



Ver Articulos del Carrito de compras



Ver Datos del usuario

Sistemas Distribuidos

Mi proyecto es apto para el su uso al estilo de computacion distribuida.

Lo primero que se me ocurre es que usar un sistema de Clustering puede beneficiar en gran medida a mi sistema para poder aumentar por mucho su funcionamiento.

Imaginando que el sistema crece, tendremos que las bases de datos de los clientes y los articulos seran mas extensas, por lo cual nos costara mas tiempo realizar todas las acciones de busqueda, inserccion y alteracion de datos.

Si mi sistema funcionara con clustering podria tener varios procesos esparcidos entre las computadoras del cluster, esto implicaria una gran ventaja en su uso ya que seria mucho mas potente y rapido, pero implica un riesgo mucho muy grande ya que si un Nodo del cluster falla el sistema puede quedar inestable y dejar de funcionar.

Cluster de 6 computadores.


Este problema se podria arreglar con un nodo provisional al que recurran si algo falla, pero todo queda en manos de las pruebas al momento de la implemetacion de un sistema distribuido.

Patrones de Diseño

En este caso decidi implementar el patron singleton para optimizar un poco los recursos ya que algunas de las clases no se usan concurrentemente asi que sera aplicable el tener solo una instancia y estarla modificando.

-..

public class CarroWeb {

 private static CarroWeb instancia;
 
 private List<articulo> listadoLibros;
 private List<articulogadget> listadoGadgets;
 private Float total, nuevaCantidad;
 private String respuesta;
 private RemovedorDatos rm;
 private String usuario;

 /**
  * Constructor privado para uso del singleton
  */
 private CarroWeb(){
  listadoLibros = new ArrayList<articulo>();
  listadoGadgets = new ArrayList<articulogadget>();
 }
 
 /**
  * metodo para el singleton
  * @return instancia del carroweb
  */
 public static CarroWeb getInstance(){
  if(instancia == null){
   instancia = new CarroWeb();
  }
  return instancia;
 }


Mi clase de manejador tambien aplica para singleton y asi solo tener una conexion en vez de muchas.
public class Manejador {

  private static Manejador instancia;
 
 private String bdDriver, dataSource;
 private String bdName, user, pass;
 private Connection conn;
 private String encryp;

 /**
  * Constructor de la clase
  */
 private Manejador(){
  dataSource="//localhost/web"; 
  bdName="jdbc:mysql:" + dataSource;
  bdDriver="com.mysql.jdbc.Driver";
  user="root";
  pass="root"; 
  encryp = "encryp";
 }
 
 /**
  * metodo para el singleton
  * @return instancia del manejador
  */
 public static Manejador getInstance(){
  if(instancia == null){
   instancia = new Manejador();
  }
  return instancia;
 }

Sistemas Distribuidos

Antes de pensar en los sistemas distribuidos, ya habia pensado en algo como el clustering.

Resulta que mientras mas datos se le agregan a la base de datos de los articulos o los usuarios, mas lento se vuelve el sistema. Esto es natural ya que el rendimiento no mejor al aumentar el estres y carga de las acciones.

La forma en la que aplicaria hacerlo distribuido seria mediante varios hosts que alojen las bases de datos, en cada host diferente una base de datos, de esta manera se pueden hacer las cargas de items mas rapidamente, pero conlleva a un problema de seguridad en cuanto a las transacciones, ya que seria un sistema concurrente que aceptaria peticiones de -compra-venta- lo que obliga a el sistema a verificar la cantidad de productos por cada ejecuccion y asi evitar que dos peticiones tomen el mismo archivo.

La idea esta asi:


Utilizar mi servidor como Nodo Maestro y principal y con ayuda de otros computadores conectados en LAN en mi casa lograr hacer un cluster estilo Beowulf.


Podria tener algo asi:

1- Un nodo para la base de datos de los clientes.
2- Un nodo para los articulos.
3- Un nodo puede tener todo el contenido web.
4- Un ultimo nodo tendria todo el contenido que opera las peticiones.

Suponiendo que un usuario desea iniciar sesion, el orden logico para esa tarea seria que al inicio el nodo maestro llamara el nodo 3 para desplegar los Jsp que son nuestra interfaz grafica, despues el cliente ingresaria sus datos y al darle al boton de ok! para ingresar, este evento llamaria el nodo 4 que contiene los Servlets para manipulacion de datos, en este caso se ejecutaria una accion de verificacion de datos en la base de datos de clientes, que se encuentra en el nodo 1, despues se llamaria al nodo 3 para escoger la pagina respuesta adecuada segun la operacion del servlet y se mandaria la informacion atravez del nodo maestro.


Actualemente tengo un servidor casero, espero proximamente terminar los ultimos detalles de mi sistema y ponerlo en la web para poder recolectar mas informacion sobre como hacerlo un sistema distribuido mas eficiente.

Patrones de Diseño

Al parecer un patron de diseño es el que mas destaca en mi proyecto, el MVC.

Comunmente se usa el MVC en casi cualquier proyecto para aumentar la reutilizacion de codigo, hacer mas facilmente mejoras y poder tener una amplia perspectiva del entorno del proyecto.

Resulta que en mi proyecto tengo inmiscuidos JSP, Servlets y Clases ¨comunes¨ de java.

Todo indica que mis JSP son mi vista, mis controladores son mis Servlets y las clases son mi modelo, por lo menos de esta manera lo visualizo.

Tambien tenia en mente la fachada como patron.
Asi tendria solo un servlet que controlara a los demas, aprovechando que los servlets se cargan solo 1 vez al ser llamados podria ahorrarme recursos y optimizar un poco el codigo si las bases de datos se llegasen a ampiliar mucho.

Eventos, Excepciones y errores

Para el taller.

Aqui explico como manejo los Eventos de mi proyecto : Enlace

Para los Errores, los mas comunes son en los servlets, ademas de implementar en algunas secciones el uso de NumberFormatException y SQLException, decidi crear una clase que mediante un metodo static manejara un error

En mi clase de validacion de usuarios tengo este metodo

public Boolean validaDatos(HttpServletResponse resp) throws IOException{

  try{
   
   pst = conn.prepareStatement("SELECT user,AES_DECRYPT(password,?) FROM cuentas WHERE user=? AND password=AES_ENCRYPT(?,?)");
      pst.setString(1, bd.getEncryp());
   pst.setString(2, usuario);
   pst.setString(3, password);
      pst.setString(4, bd.getEncryp());

      rs = pst.executeQuery();
      
   valida = (!rs.next()) ? true : false;
     
  }catch(SQLException exe){
   web.Error.despliegaError(resp,exe.getMessage());
  }
  return valida;
 }
Si llegase a succeder una exepcion del tipo SQLException se manda a llamar el siguiente metodo.

public static HttpServletResponse despliegaError(HttpServletResponse resp,String ex) throws IOException{
 
 buffer = new StringBuffer();
   buffer.append("\n");
   buffer.append("\n");
   buffer.append("Página de Error\n");
   buffer.append("\n");
   buffer.append("\n");
   buffer.append("

Lo sentimos aparecio una error inesperado

"); buffer.append(ex); buffer.append(" "); buffer.append(""); buffer.append("\n"); buffer.append(""); resp.setContentType("text/html"); resp.setContentLength(buffer.length()); salida = new PrintWriter(resp.getOutputStream()); salida.println(buffer.toString()); salida.close(); return resp;