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
Segunda Oportunidad
0 comentarios lunes, 12 de diciembre de 2011
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.
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.
0 comentarios domingo, 11 de diciembre de 2011
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; }
0 comentarios viernes, 9 de diciembre de 2011
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;
Eventos, excepciones y errores
Bien, los eventos de mi proyecto son basicamente acciones de que hacen forms o click de hipervinculos, esto se debe que mi proyecto esta basado en programacion del lado del servidor que no esta al pendiente de lo que sucede en el lado del cliente.
La principal forma de crear eventos es mediante el uso de hipervinculos en los distintos menus
En este caso al dar click en Log In, el Jsp que contiene el Log In es llamado.
Si estas por loggearte y utilizas el boton reiniciar, los parametros se borran y puedes volver a introducir datos, acepto que no es muy util, pero en la zona de registro donde reiniciar los datos con un click si es conveniente por la cantidad de inputs que son. En el caso de este Log In, manda llamar un Servlet que verifica los parametros que se le envian y determina si el usuario y password son correctos, despues redirecciona a la pagina principal.
Las Excepciones en su mayoria son del tipo ServletException, y SQLException donde las exepciones del Servlet pueden succeder en cualquier momento de la ejecuccion de un servlet y las exepciones de sql ocurren con las consultas.
En los servlets si llegase a ocurrir una exepcion de alguno de esos tipos se desplegara una pagina que informa esa exepcion en concreto, sin embargo si es alguna otra la exepciones se arrojan hasta el contenedor y tomcat las maneja desplegando su menu de exepciones.
Algo parecido a esto.
Interfaz Grafica
Esto cumple con el diseño y la implementacion de la interfaz.
utilize html5 y Css3.
Se puede accesar a los datos del usuario
Si el usuario es administrador puede entrar al menu de agregar usuario.
La verdad es que prefiero un formulario en secuencia para poder ir haciendo tab y estar seguro que ingresare el dato que esta abajo inmediatamente y no que saltare a otra parte de la pagina.
Se puede accesar a la seccion de libros o gadgets para poder ver los articulos que estan en venta y agregarlos a carro.
Podemos pasar a ver lo que contiene nuestro carro y eliminarlo
Retroalimentacion
Bueno en cuanto a la retroalimentacion fue con mi compañero Juan esteban.
Discutimos en concreto un punto.
Al momento de distribuir mi software ( debo decir que tengo la idea de subirlo a mi servidor y dejar que lo mis amigos lo utilizen para hacer pruebas reales ) mediante mi servidor casero me comento sobre lo que sucederia si solo quedaba un solo articulo y dos personas daban click sobre en al mismo tiempo.
Esto representa un problema para mi proyecto ya que debe manejar concurrencias entre muchas peticiones al servidor, buscando un poco me di cuenta que las jsp pueden activar o no activar la concurrencia cuando estan en uso. Por desgracia aun no llego a una solucion definitiva, optima e infalible para manejar ese tipo de situaciones por mi bajo dominio de la programacion en Server Side.
La unica idea que me quedo en mente es la de usar timestamps en las peticiones de los usuarios para ver quien "gano" el articulo, pero falta investigar aun mas.
Autogeneracion de codigo
Usando umbrello autogenere codigo apartir de mi diagrama uml.
Debo aceptar que no me parecia pertinente, pero al ver los resultados y considerando el tamaño de mi diagrama me di cuenta que es muy recomendable utilizar las herramientas CASE.
independientemente de que el codigo generado sea lo suficientemente util, en mi caso representa una gran ayuda al momento de codificar, ya que algunas clases era un poco extensas con muchos metodos get y set, umbrello autogenero todos estos metodos.
Todo el codigo generado por umbrello esta en este rar
Digrama de Clases
Bueno usando umbrello genere el diagrama de clases.
Actualmente es un poco confuso porque no domino el uso de umbrello, asi que dejare el .xmi por si no es muy claro.
La imagen es esta:
Documentacion Tecnica
La forma en la que mantendre un control de la documentacion tecnica es con Javadoc.
Cada uno de mis clases contendra comentarios especiales requeridos por el javadoc para la generacion de la documentacion, la cual se creara en formato de paginas html para su mejor visualizacion.
Aqui esta la documentacion creada. Descarga
Herencia y Poliformismo
He aqui la herencia de mi proyecto.
No incluyo la relacion de herencia de los Servlets, porque aclaro que ya esta definida la Clase HttpServlet y no es codificacion propia.
La clase Articulo la deje con propiedades para poder heredarla y obtener una clase derivada mas reducida y que sea de contenido parecido, como el autor no lo requiero en mis clases hijas lo deje private.
public class Articulo { protected String nombre; private String autor; protected float precio; protected String estado; public String getNombre() { if(nombre == null){ nombre = "Sin nombre especificado"; return nombre; }else{ return nombre; } } public void setNombre(String nombre) { this.nombre = nombre; } public String getAutor() { if(autor == null){ autor = "Sin autor especificado"; return autor; }else{ return autor; } } public void setAutor(String autor) { this.autor = autor; } public String getEstado() { if(estado == null ){ estado = "regular"; return estado; }else{ return estado; } } public void setEstado(String estado) { if(estado == "bueno"){ this.estado = estado; }else if(estado == "malo"){ this.estado = estado; }else if(estado == "regular"){ this.estado = estado; } } public float getPrecio() { return precio; } public void setPrecio(float precio) { this.precio = precio; } public Articulo llenaDatos(Object obj) { if(obj instanceof Articulo){ Articulo UserObject = (Articulo)obj; setNombre(UserObject.getNombre()); setAutor(UserObject.getAutor()); setPrecio(UserObject.getPrecio()); setEstado(UserObject.getEstado()); return UserObject; }else{ return this; } } }
Clase que hereda de Articulo
public class ArticuloGadget extends Articulo { private String comentario; public String getComentario() { if(comentario == null){ this.comentario = "sin comentarios"; return this.comentario; }else { return comentario; } } public void setComentario(String comentario) { this.comentario = comentario; } }
El polimorfismo aplica en mi clase CarroWeb.
ya que puede aplicar que remueva o agrege determinado tipo de Articulo.
Este es la parte de la clase que lo implementa.
public class CarroWeb { private ListlistadoLibros; private List listadoGadgets; private Float total, nuevaCantidad; private String respuesta; private RemovedorDatos rm; private String usuario; public void Agrega(Articulo libro){ listadoLibros.add(libro); } public void Agrega(ArticuloGadget gadget){ listadoGadgets.add(gadget); } public void Remueve(Articulo libro){ if(listadoLibros.contains(libro)){ for(Articulo item : listadoLibros){ if(item.getNombre() == libro.getNombre()){ listadoLibros.remove(item); } } } } public void Remueve(ArticuloGadget gadget){ if(listadoGadgets.contains(gadget)){ for(ArticuloGadget item : listadoGadgets){ if(item.getNombre() == gadget.getNombre()){ listadoGadgets.remove(item); } } } } }
Esqueleto de las clases
Servlets
Verificador
public class Verificador extends HttpServlet private Connection conn; private ResultSet rs; private String usuario; private String password; private Boolean valida; private Manejador bd; private PreparedStatement pst; private HttpSession session; private Datos datos; private Usuario dummy; private CarroWeb carro; *public void init(ServletConfig config){} public Boolean validaDatos(HttpServletResponse resp){} public HttpSession creaNuevaSesion(HttpServletRequest req){} *public void doGet(HttpServletRequest request, HttpServletResponse response){} *public void doPost(HttpServletRequest request, HttpServletResponse response){} * Son metodos predefinidos de los servlets e init hace la funcion del constructor.
Registro
public class Registro extends HttpServlet private Usuario dummy; private Connection conn; private PreparedStatement pst,pst2; private Manejador bd; private HttpSession session; *public void init(ServletConfig config){} public void agregarUsuario(HttpServletResponse resp){} *public void doGet(HttpServletRequest request, HttpServletResponse response){} *public void doPost(HttpServletRequest request, HttpServletResponse response){} * Son metodos predefinidos de los servlets e init hace la funcion del constructor.
CarroWebServlet
public class CarroWebServlet extends HttpServlet private CarroWeb carroActual; private HttpSession session; private Articulo libro; private ArticuloGadget gadget; private String tipoGadget,tipoLibro,remover; *public void init(ServletConfig config){} public void removerItem(HttpServletRequest request,HttpServletResponse response){} public void agregarItem(HttpServletRequest request,HttpServletResponse response){} public ArticuloGadget Gadget(HttpServletRequest request){} public Articulo Libro(HttpServletRequest request){} *public void doGet(HttpServletRequest request, HttpServletResponse response){} *public void doPost(HttpServletRequest request, HttpServletResponse response){} * Son metodos predefinidos de los servlets e init hace la funcion del constructor.
Error
public class Error public static StringBuffer buffer; public static PrintWriter salida; public static HttpServletResponse despliegaError(HttpServletResponse resp,String ex){}
Clases
Usuario
public class Usuario private String user; private String password; private String nombre; private String apellidoMaterno; private String apellidoPaterno; private int edad; private String correo; private String telefono; private String calle; private String colonia; private String cp; private String numero; private float credito; private Boolean admin; public Usuario(Object obj){} // Construye a partir de un objeto dado. public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo.
Articulo
public class Articulo protected String nombre; private String autor; protected float precio; protected String estado; public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo. public Articulo(Object obj){} // Construye a partir de un objeto dado.
ArticuloGadget
public class ArticuloGadget extends Articulo private String comentario; public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo. public ArticuloGadget(){} // constructor que solo usa super();
CarroWeb
public class CarroWeb private ListlistadoLibros; private List listadoGadgets; private Float total, nuevaCantidad; private String respuesta; private RemovedorDatos rm; private String usuario; public CarroWeb(){} public set(type t){} // Para ahorrar espacio se resumen los metodos set de cada atributo public type get(){} // Para ahorrar espacio se resumen los metodos get de cada atributo. public void Remueve(Articulo libro){} public void Remueve(ArticuloGadget gadget){} public void RemueveTodo(){} public float Total(){} public String CompletaCompra(float credito){}
RemovedorDatos
public class RemovedorDatos private Connection conn; private PreparedStatement pst; private Manejador bd; public RemovedorDatos(){} public void RemueveGadget(ArticuloGadget gadget){} public void RemueveLibro(Articulo libro){} public void RestaCredito(float cantidad, String usuario){}
Manejador
public class Manejador { private String bdDriver, dataSource; private String bdName, user, pass; private Connection conn; private String encryp; public Manejador(){} public Connection abreBD() {} public String getEncryp(){} public void Cierra(Connection conn){}
Datos
public class Datos private Connection conn; private ResultSet rs2; private Manejador bd; private Usuario dummy; private PreparedStatement pst2; private Articulo item; private ArticuloGadget gadget; public Datos(){} public Usuario consigueDatosUsuario(String usuario) {} public Articulo consigueDatosArticulo(String nombre) {} public ArticuloGadget consigueDatosGadget(String nombre) {} public ListconsigueArticulos() {} public List consigueGadgets(){}
Documentacion Tecnica
public class insert { String p; String l; String x; EscuchaEventos m = new EscuchaEventos("as"1,true); p = m.insen(); l = m.insea(); x = m.insee(); basedatos bd = new basedatos(); bd.upd(p,l,x); }Al ver esto cualquiera se asustaria. Las variables no tienen mucho sentido, no hay forma de saber cuales son los elementos importantes, no tiene metodos implementados. No se sabe si esta clase es necesaria, y al parecer solo el encargado principal, aquel que escribio el codigo es capaz de interpretarlo.
Quiza aun exista manera de arreglarlo, pero ahora imaginen que se quedan con el empleo.
Traten de visualizar todo el codigo igual de codificado, seria una pesadilla, no?
Es por ello que la documentacion tecnica es tan importante, a nivel de proyecto es indispensable mantener una documentacion limpia y clara para poder darle mantenimiento a nuestros propios sistemas o a sistemas ajenos.
Veamos este ejemplo de codigo.
public class Elevator { public boolean doorOpen = false; // variable que indica si la puerta esta abierta public int currentFloor = 1; // entro que indica el piso actual public final int TOP_FLOOR = 4; // Constante donde se indica el maximo de pisos public final int MIN_FLOOR = 0; // Constante donde se indica el minimo de pisos // Metodo openDoor para abrir las puertas modificando la variable openDoor public void openDoor() { System.out.println("Abriendo puerta...."); doorOpen = true; System.out.println("La puerta esta abierta."); } // Metodo closeDoor para cerrar las puertas modificando la variable openDoor public void closeDoor() { System.out.println("Cerrando puerta ...."); doorOpen = false; System.out.println("La puerta esta cerrada."); } // Metodo goUp para aumentar el currentFloor y desplegar en pantalla el piso actual public void goUp() { System.out.println("Subiendo un piso."); currentFloor++; System.out.println("Estamos en el piso: " + currentFloor); } // Metodo goDown para decrementar el currentFloor y desplegar en pantalla el piso acutal public void goDown() { System.out.println("Bajando un piso."); currentFloor--; System.out.println("Estamos en el piso: " + currentFloor); } }Al ver un codigo asi es mas facil comprender y modificar su estructura, es un hecho. Como un consejo extra, la documentacion tecnica esta bien acompañada de un estandar de codigo esto hace una lectura y comprension tan sencilla que es facil aplicarles mantenimiento a los sistemas ademas de aplicarles optimizaciones.
0 comentarios sábado, 5 de noviembre de 2011
Herencia
En mi proyecto Determine que la herencia puede aparecer en la clase Articulo y en los Servlets.
La clase Articulo puede derivar a ArticuloGadget.
Ademas la herencia de los servlets esta implicita, ya que la clase Verificador y la clase Registro heredan de HttpServlet.
0 comentarios miércoles, 2 de noviembre de 2011
Hilos de ejecución
Un hilo es una secuencia de instrucciones que está controlada por un scheduler que se comporta como un flujo de control secuencial.
Hablar de hilos es hablar sobre programación concurrente, lo cual da lugar a nuevas necesidades como son la sincronizacion entre hilos y acceso de forma segura a variables u objetos compartidos por un mismo sistema o hilo.
Los Threads tienen un ciclo de vida caracteristico, en el siguiente diagrama de estados se puede apreciar el ciclo.
- new(Recien creado) - Justo cuando es creado el nuevo hilo, esto sucede al utilizar la palabra reservada new, la cual hace una llamada al constructor de la clase Thread y lo deja listo para su uso.
- Runnable(Listo para ejecutar) - El hilo estará en estado new hasta el momento en el cual el metodo start() de dicho hilo sea llamado, una vez que este metodo es llamado el hilo pasa a estar en runnable y se puede ejecutar en forma concurrente si la computadora cuenta con varios procesadores ,o bien puede compartir el procesador con los procesos.
- waiting(esperando) - A veces los hilos tienen que esperar a que otros hilos terminen de ejecutarse para poder continuar ( dígase una Entrada/Salida de datos ) entonces si la computadora no dispone de mutiples procesadores solo 1 hilo puede estar en ejecución y para ello, manda a waiting a otro de los hilos que este ocupando el procesador. Ademas el hilo puede quedar en estado waiting si esta en espera de un lock ( usado para sincronizacion entre hilos ), y para volver a su estador de Runnable, puede liberar el candado, o con los metodos de notify/notifyall , aunque esto por lo general lo hacen las algunas librerías de clases ya incluidas en la API.
- Time waiting( tiempo en espera ) - Este estado es muy parecido al anterior, pero con la diferencia que el mismo hilo se puede liberar, ya que solo queda en espera durante el tiempo que se le asigne. Para mejor referencia puede ver el metodo sleep() en la documentación de java, este metodo hace esperar el flujo de ejecución del hilo actual.
- Terminated(Terminado) - El ultimo estado en el cual el hilo entra cuando ha terminado su tarea o cuando es cancelado.
En Java los Hilos de ejecución ya están implementados en java.lang.Thread por lo cual no es necesario importar el paquete para poder utilizarlo.
Existen dos formas de iniciar un Thread
- implementado la interface runnable
- heredando desde la misma clase Thread
Si se inicia un Thread implementando una interface runnable solo se necesita redefinir el metodo run() dentro de una clase.
vale la pena destacar que el metodo run() contiene todo lo que el hilo hará, dígase llamadas a otros métodos, creación de objetos, declaración de variables; es lo mismo que un método main.
La pequeña implementacion quedaria algo asi:
public class HiloRunnable implements Runnable{ public void run(){ System.out.println("Hilo creado desde la interfaz runnable"); } }
Ahora que ya hemos creado la parte runnable del nuestro hilo podemos crear un thread y pasarle como parámetro nuestro runnable
Este es el constructor de la clase Thread
Thread(Runnable threadOb, String threadName);
donde threadOb es una instancia de la clase que implementa Runnable y threadName es el nombre que le podemos dar para identificar el hilo.
Ahora veamos el siguiente código.
Y no puede faltar el método de prueba con main.
Aqui esta el codigo
Aqui esta el codigo
y esto obtendremos.
Algunos métodos extras de la clase Threads son:
Join() - el cual sirve para esperar a que el hilo actual termine, hace referencia a conectar uno tras otro los hilos.
sleep() - puedes pausar o terminar el código a ejecutar en el run del thread
yield() - para ser cortes y preguntar que hilo esta libre para ejecutarse, antes de volver a ejecutar el hilo yield.
Referencias:
http://www.reloco.com.ar/prog/java/threads.html
http://sunsite.dcc.uchile.cl/java/docs/JavaTut/Cap7/comunica.html
http://www.ctr.unican.es/asignaturas/procodis_3_II/Doc/Procodis_3_01.pdfhttp://perseo.cs.buap.mx/~danguer/projects/curso_java/manual/node5.html
http://trevinca.ei.uvigo.es/~formella/doc/cd04/node37.html
Imagenes propias.
1 comentarios martes, 20 de septiembre de 2011
Modelado de Clases del Proyecto
Para el proyecto del carro web de compras las clases que se consideran importantes a implementar son las siguientes.
-Desgraciadamente aun no tengo claro si el uso de bases de datos me oblige a utilizar nuevos atributos, asi que hasta no investigarlos los agregare.
Clase:
public Accesos
importancia:
esta clase es sumamente importante porque sin ella el sistema no se puede accesar,
posiblemente se utilize como interface, ya que puede usarse para el
Log In, Log Out y la Autentificacion de Usuario.
Atributos
- protected-Usuario(clase) usuario
verificacion de usuario y despues se hace una consulta
a la base de datos, y se le asignan valores a la clase Usuario.
Clase:
con esta clase se manejaran los datos del usuario,
importantes ya que para ellos fue creado el sistema.
- private-String nombres
- private-String apellidoMaterno
- private-String apellidoPaterno
- private-String password
- private-double efectivoDisponible
- private-int idUsuario
- private-boolean administrador
Usuario(String nombres, String apellidoMaterno, String ApellidoPaterno,
String password, double efectivoDisponible,
int idUsuario, boolean administrador )
El usuario es creado recibiendo como parametros los atributos
VerificarDatos(void)
- protected-Conecction
1 comentarios jueves, 8 de septiembre de 2011
Primer Programa Orientado a Objetos
En esta entrada del blog se registrara el primer programa orientado a objetos para la clase del taller.
Se especifico que el programa deberia contener:
Por lo menos la creacion de dos objetos.
La clase debera contener por los menos dos atributos.
Utilizar el paradigma de OO.
Por lo menos un metodo.
Bien pasemos a la pequeña descripcion.
Decidi crear como ejemplo una clase Monitor
y tambien la clase PruebaMonitor para realizar las pruebas.
Los atributos que contiene son:
- Estado del monitor, un boolean por ende puede ser True o False
- Contraste, un int de rango 0 a 100
- Id, un String para diferenciar un monitor de otro.
- Encender Monitor, no recibe parametros
- Apagar Monitor, no recibe parametros
- Subir Contraste, recibe la cantidad entera de contraste a subir.
- Bajar Contraste, recibe la cantidad entera de contraste a bajar
- Get Id, no recibe parametros.
Este es el codigo para probar los objetos de la clase monitor.
1 comentarios miércoles, 7 de septiembre de 2011
Casos De Uso Para El Proyecto
En esta entrada presentare la tabla que escribi con el formato que la Doctora Sara nos sugirió.
Lo que mas destaca es el hecho de que si el usuario o el administrador no hace Log In practicamente no se puede hacer nada.
Ambos actores usuario y administrador, comparten muchas caracteristicas a excepcion del administrador que como es obio tiene mayor cantidad de permisos en cuanto a modificacion y uso del sistema.
1 comentarios jueves, 25 de agosto de 2011
Definicion del Proyecto
Despues de mucho meditarlo, decidi implementar un software de un carro de compras web.
Porque?
Bueno existen dos buenas razones, la primera es que deseo implementar sobre la web, en segunda despues de una platica con un empresario me comento sobre la falta de profesionalismo departe de los programadores en cuanto a carros de compra web, lo cual me impulsa a comprobar el porque es tan dificil hacer uno.
Descripcion detallada.
El usuario podra acceder a una pagina de incio en la cual necesitara registrarse o acceder a su cuenta, despues pasara a el menu de usuario donde podra validar sus datos, nombre, edad, apellido, trabajo, cantidad de efectivo disponible e historial de transacciones. Si todos los datos son correctos y el cliente esta conforme, tendra la opcion de pasar a realizar sus compras en determinada tienda o sucursal.
Estando en la sucursal o tienda de su preferencia, podra buscar los articulos que necesita o simplemente inspeccionar que articulo tiene disponible la tienda, si el cliente encuentra algun articulo de su agrado puede agregarlo su carro web de compras. El usuario podra verificar en cualquier momento el estado de su carro de compras, la cantidad de articulos que tiene y sus precios, al verificar el estado de su carro se le proporcionara el usuario el coste total de los articulos actualmente seleccionados para que tome en cuenta el efectivo que dispone. Tambien desde la opcion de verificacion podra remover articulos de su carro de compras.
Tambien estara el usuario especial, un administrador el cual podra modificar a placer la base de datos para agregar articulos, modificarlos, borrarlos, y agregar efectivo a los usuarios.
Porque el administrador podra agregar efectivo a los usuarios?
la respuesta a ello, es porque no se manejan tarjetas de credito, ni depositos, la forma de abonar dinero es directamente con el administrador(digase empresa) para que al momento de su "deposito" el administrador personalmente le agrege dicha cantidad a la cuenta del usuario.
En cuanto a los articulos a vender, la idea es que sean libros principalmente pero se pueden agregar mas articulos dependiendo las necesidades.
- Funciones -
Acceder como usuario.
Log in/out
Verificar datos de la cuenta.
Comprobacion de datos
Modificar datos de la cuenta.
Modificacion de datos
Añadir objetos al carro.
Añadir compra
Quitar objetos del carro.
Remover compra
Verificar los objetos del carro.
Checar articulos a comprar
Sobre la implementacion.
Pienso usar como lenguaje de programacion Java.
Concretamente pienso utilizar Servlets y Java Server Pages para la implementacion final, tambien usare el Rdbms Mysql para el uso de bases de datos.
Referencia:
Imagen carro de compras web
http://www.jevaplastic.com.mx/persona-con-carrito-de-compras-245x300.gif
referencia de Mysql
http://www.mysql.com/
referencia de los JSP
http://www.desarrolloweb.com/articulos/831.php
referencia de los Servlets de java
http://www.oracle.com/technetwork/java/javaee/servlet/index.html
0 comentarios lunes, 22 de agosto de 2011
Instalacion de Herramientas de Trabajo
Sistema Operativo a usar: GNU/Linux en su distribución Arch.
Las herramientas que instalare son:
Emacs
Para el desarrollo de mi sistema he preferido usar un editor de textos practico, ya que los IDE's suelen auto generar mucho código y mas aun si se utilizan servlets o paginas web.
Bien, para instalar emacs no se necesita mucho simplemente
instalaremos desde los repositorios.
Openjdk
Es el kit en su versión libre para desarrollo de java. Personalmente apoyo al software libre así que usaremos el open. También funciona si se instala el Sunjdk que es mantenido por la empresa Sun Microsystems.
Con este jdk podremos ejecutar y compilar los programas en java, en esta caso los Servlets.
Para este caso instalaremos la version 6, porque la 7 no esta totalmente actualizada y es mejor experimentar con ella después.
Para instalar el entorno de desarrollo de java simplemente usamos el gestor de paquetes para descargar lo necesario.
Yo cuento con el jdk por eso me dice que si lo quiero reinstalar, pero si no se cuenta con el, les dará la opción para descargarlo e instalarlo automáticamente.
Para comprobar que si esta instalado el sdk podemos verificar si están instalados en el sistema buscando su dirección con el comando which.
- manager-gui para acceso a la interfaz grafica en HTML y el estado del servidor
- manager-script acceso a la interfaz de texto y el estado del servidor
- admin-gui para tener permisos en la interfaz grafica del Host manager
- admin-script para tener permisos en la interfaz de texto del Host manager.
- username especificar el nombre del usuario
- password especificar la contraseña del usuario
- roles especificar los roles a desempeñar por el usuario
Referenciasde informacion e imagenes:
Referencias de emacs
http://www.gnu.org/software/emacs/
https://wiki.archlinux.org/index.php/Emacs
https://ccrma.stanford.edu/guides/package/emacs/emacs.html
imagen http://picandocodigo.net/wp-content/uploads/2010/01/emacs-23.png
Referencias de Tomcat
http://tomcat.apache.org/
http://faqhosting.com.ar/?p=123
http://www.osmosislatina.com/tomcat/instalacion.htm
imagen http://nullpointerexception.tk/wp-content/uploads/images/tomcat.png
Referencias jdk
http://openjdk.java.net/
imagen http://openjdk.java.net/images/duke-thinking.png
Referencias Archlinux
https://wiki.archlinux.org/index.php/Main_Page
imagen http://www.muylinux.com/wp-content/uploads/2011/03/Arch-Linux.png