Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Gus Garsaky

#61
Java / Re:Minicurso JAVA
Mayo 06, 2015, 12:49:12 PM

#1 - ¿QUÉ ES JAVA Y PARA QUÉ SIRVE?




1. ¿QUÉ ES JAVA?


Java es un lenguaje de programación de propósito general, concurrente, orientado a objetos que fue diseñado específicamente para tener pocas dependencias de implementación como fuera posible. Su intención es permitir que los desarrolladores de aplicaciones escriban el programa de una vez y lo ejecuten en cualquier dispositivo (conocido en inglés como WORA, o "write once, run anywhere), lo que quiere decir que el código que es ejecutado en una plataforma no tiene que ser recompilado para correr en otra. Java es, a partir de 2012, uno de los lenguajes de programación más populares en uso, particularmente para aplicaciones de cliente-servidor de web, con unos 10 millones de usarios reportados.

2. HISTORIA


El 15 de enero de 1991, Bill Joy, Andy Betcholscheim, Wayne Sheridan, James Gosling y Patrick Naughton se reunen en Aspen, Colorado. Su reunión tenía como objetivo analizar las distintas tecnologías que existían en la época sacando sus pro y contras que les sirvieran como base para su gran idea: desarrollar un entorno único que pudiera ser utilizado por todos los dispositivos de electrónica de consumo.

El equipo, llamado Proyecto Stealth (más tarde llamado Green Proyect), comienzan a trabajar en el proyecto el 1 de febrero de 1991 en oficina de Sand Hill Road en Menlo Park. En un principio se considera utilizar C++, pero el equipo llegó a la conclusión que era inadecuado. James Gosling tuvo la idea de modificar C++, pero rápidamente abandonó el desarollo. Entonces el equipo decidió crear un nuevo lenguaje llamado Oak.

Oak debería ser independiente de la plataforma, diferente al resto, y se decidió hacerlo interpretado. Además, el lenguaje debería ser robusto y sencillo para minorizar el trabajo del programador, por lo tanto, se decidió evitar características que hacían el código más propenso a errores. Por ésta razón, no se decidió incluir la herencia múltiple. El resultado fue un lenguaje que tenía similitudes con C, C++ y ObjectiveC, sin estar ligado a ninguna CPU concreta.

Mas tarde, Oak pasaría a llamarse Java por cuestiones legales de propiedad intelectual. Sobre el origen de Java, hay 2 teorías, una es que eligieron el nombre tomando café en una cafetería llamada Java y la otra que es un acrónimo de las siglas de sus creadores: James Gosling, Arthur Van Holf y Andy Bechtolsheim.

2.1 STAR 7


En agosto del 91, Java ya era funcional. El equipo trabajaba dispositivo llamado Star 7, un dispositivo parecido a un PDA,  que básicamente, les permitía a los usuarios responder el teléfono desde cualquier lugar. Luego de comercializarse, Star 7 fracasó, ya que elevaba los precios de los nuevos dispositivos. Se pensó en venderlo a una tercera empresa, pero no se llegó a un acuerdo. Fue un fracaso.

2.2 NACIMIENTO DE JAVA

Era el boom de internet; los sitios de internet crecían día a día de manera abrumadora e Internet se convertía en un fenómeno.

Naughton y J. Pane, comienzan a escribir un navegador web similar a Mosaic escrito en Java, llamado "WebRunner" al que se llamaría "HotJava". El 29 de septiembre de 1994 acaba el desarrollo de HotJava. Cuando se hace la demostración a los ejecutivos de Sun, éstos se sorprenden del potencial de Java y se acepta como proyecto.

Ya por el año 1995, Netscape anuncia en una conferencia que Java iba a ser incluida en Netscape Navigator.

3. ¿PARA QUÉ SIRVE?

Java es un lenguaje de propósito general, con él podemos construir aplicaciones web, desktop, consola, controladores, etc. Java no es solo un lenguaje de programación, es también una tecnología con un inmenso abanico de herramientas. Con Java puedes hacer desde aplicaciones sencillas en consola hasta juegos y páginas/applicaciones web complejas.
#62
Java / Mini curso Java [En progreso]
Mayo 03, 2015, 10:27:43 PM

Hola, mi nombre es Gustavo y soy parte del STAFF de Underc0de. A partir de mañana, escribiré un post diario dedicado a JAVA, los cuales serán parte de un minicurso, que se irá completando con el tiempo. Asi mismo, efspero éstos tutoriales sirvan como formación a postulantes al equipo de desarrollo de Underc0de que desean ser parte del equipo Java y no cuentan con los conocimentos necesarios o que quieran profundizar conocimientos.

CitarCualquier sugerencia, por favor, háganmelo saber por MP

CitarEn caso tengan problemas con los ejercicios planteados, abrir un tema de la manera normal




ANTES DE EMPEZAR

Herramientas:


  • JDK

    • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • Netbeans

    • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • JavaFX Scene Builder

    • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • PostgreSQL

    • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
  • GlassFish

    • You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


ÍNDICE


Java básico

1. ¿Qué es java? ¿Para qué sirve? (✔)
2. Método main (✔)
3. Tipos de datos (✔)
4. Operadores (✔)
5. Variables y consantes (✔)
6. Clase System (✔)
7. Entrada, proceso y salida de datos (✔)
8. Modificadores de acceso/visibilidad (✔)
9. El concepto de static (✔)
10. Estructuras de control (if, else, else if) (✔)
11. Estructuras repetitivas (while, do while, for) (✔)
12. Switch (✔)
13. Clase Math (✔)

POO

¿Qué es POO? Introducción teórica (✔)
Clases, métodos y objetos (✔)
POJO
this
Encapsulamiento
Herencia
Polimorfismo
Abstracción
¿Por qué es importante el concepto de acoplamiento?
Interfaces
Callbacks

Java intermedio

1. Clase String
2. Wrappers
3. Generics
4. Collections
5. ¿Qué es el ClassLoader?
6. Inicialización est\u00e1tica (static block)
7. Archivos (API java.nio)
  7.1 Lectura
  7.2 Escritura
  7.3 Trabajando con objetos y ficheros
7. Threads
8. Multithreading
9. Timer y TaskTimer
9. Sockets

JDBC

1. Introducción a JDBC
2. Conexión a BBDD
3. Consultas
4. Statement vs PreparedStatement
5. Metadata
6. Consultas complejas (inner join, subconsultas, union, etc)

GUI

Introducción a las GUI
Patrón MVC
Introducción a JavaFX
JavaFX Scene Builder
Vistas y controladores
Modelos
Aplicación de ejemplo

Java Avanzado

1. Diferencias entre JavaSE  y JavaEE
2. Introducción a JavaEE
3. JSP
4. Servlets y ciclo de vida
5. Paso de par\u00e1metros entre JSP's
6. Sesiones
7. Cookies
8. AJAX

Persistencia

1. JPA - introducción
2. PersistenceUnit
3. EntityManager y EntityManagerFactory
2. Mapeo de tablas
3. Relaciones 1:1
4. Relaciones 1:N y N:1
5. Relaciones N:M
6. Ejemplo

EJB

1. ¿Qué es un EJB?
2. Tipos de EJB
3. EJB de sesión
4. Beans locales y remotos
4. EJB dirigidos por mensajes

CDI

1. ¿Qué es CDI?
2. Contextos de inyección
3. @Named y @Model

Webservices

1. Introducción
2. SOAP y RESTful
3. RESTful
4. MIME types
5. Ejemplo

JSF

¿Qué es JSF?
2. Ciclo de vida
3. Facelets
4. Controladores
5. Controles comunes
6. Estructuras de control
7. Estructuras repetitivas
8. JSF AJAX
9. Bean validation
10. Passthrought: HTML5 y JSF

WebSockets

1. ¿Qué es un websocket? ¿Cómo funciona?
2. Decoders
3. Encoders
4. Aplicación de ejemplo



Cada día se desarrollará un tema. Si algún día no publico, será porque estaré verdaderamente ocupado, en exámenes o cosas por el estilo. De todas formas trataré de no romper el flujo. Cualquier comentario, crítica o sugerencia, me la hacen saber. Si desean colaborar con algún tema, me avisan para colocar su aporte.
#63
He puesto el nuevo link. Muchas gracias Whiz, ya iba por la mitad del libro y me incomodaban mis ojos xD.
#64
Después de 1 año y 1/2, JAVA vuelve a posicionarse como top 1 en el índice de lenguajes más populares, estadísticas generadas por TIOBE. Cabe aclarar que éstas estadísticas son generadas por:


  • Habilidades de desarrolladores calificados (Lenguaje primario) a nivel mundial
  • Cursos por lenguaj
  • Frameworks/librerías

Y son usados la mayoría de buscadores (Google, Bing, Yahoo, Wikipedia, Baidu, Amazon y Youtube) para los rankings.


Veamos algunas gráficas de popularidad de algunos lenguajes a través del tiempo:

C#


PHP


JAVA


JavaScript


Alternativamente, podemos comparar el ranking TIOBE con PyPL. PyPL realiza su ranking en base a búsquedas de tutoriales de cada lenguaje en Google, obteniendo la info de Google Trends.





¿Ya decidiste qué lenguaje aprender?
#65
Felicidades UNDER, bien merecido. A disfrutar la cuenta xD

Felicidades y saludos bro.
#66
Sería bueno si tu lo lees paralelamente a lo que vayas aprendiendo sobre programación. Así construyes una muy buena y sólida base.


Un saludo, Windux.
#67
Java / Re:Patrones de diseño
Abril 27, 2015, 05:39:04 PM
@Expermicid, @Orlok, muchas gracias por sus comentarios, muchachos.
#68

CÓDIGO LIMPIO - R. C. MARTIN




DESCRIPCIÓN

Cada año, se invierten innumerables horas y se pierden numerosos recursos debido a código mal escrito, ralentizando el desarrollo, disminuyendo la productividad, generando graves fallos e incluso pudiendo acabar con la organización o empresa. El reconocido experto de software Robert C. Martin, junto con sus colegas de Object Mentor, nos presentan sus óptimas técnicas y metodologías ágiles para limpiar el código sobre la marcha y crearlo de forma correcta, de este modo mejorará como programador.

Esta obra se divide en tres partes. La primera describe los principios, patrones y prácticas para crear código limpio. La segunda incluye varios casos de estudio cuya complejidad va aumentando. Cada ejemplo es un ejercicio de limpieza y transformación de código con problemas. La tercera parte del libro contiene una lista de heurística y síntomas de código erróneo (smells) confeccionada al crear los casos prácticos. El resultado es una base de conocimientos que describe cómo pensamos cuando creamos, leemos y limpiamos código. Imprescindible para cualquier desarrollador, ingeniero de software, director de proyectos, jefe de equipo o analista de sistemas interesado en crear código de mejor calidad. ¡El libro que todo programador debe leer!

DESCARGA

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
#69
Java / Re:Patrones de diseño
Abril 27, 2015, 01:11:12 PM
Hola Habraam,

Qué bueno que te haya gustado la publicación. Tienes razón, éstos temas son muy importantes y hay que tenerlos claros. Además, como bien dices, te motiva a hacer un mejor código.
#70
Underc0de / Re:Te gustaria ser Tutor?
Abril 27, 2015, 09:51:55 AM
Muy buena iniciativa. Me apunto si necesitan algún tutor para Java, JavaScript (y HTML5) y CSS.


Salu2.
#71
Java / Re:Patrones de diseño
Abril 26, 2015, 10:37:53 PM
Editado. Ahora el namespace es org.underc0de.
#72
Java / Patrones de diseño
Abril 26, 2015, 08:31:32 PM

PATRONES DE DISEÑO



CAPÍTULO I

Introducción

Los patrones de diseño son la base para la búsqueda de soluciones a problemas comunes en el desarrollo de software y otros ámbitos referentes al diseño de interacción o interfaces.
Un patrón de diseño resulta ser una solución a un problema de diseño. Para que una solución sea considerada un patrón debe poseer ciertas características. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que significa que es aplicable a diferentes problemas de diseño en distintas circunstancias.

Los patrones de diseño pretenden:

  • Proporcionar catálogos de elementos reusables en el diseño de sistemas software.
  • Evitar la reiteración en la búsqueda de soluciones a problemas ya conocidos y solucionados anteriormente.
  • Formalizar un vocabulario común entre diseñadores.
  • Estandarizar el modo en que se realiza el diseño.
  • Facilitar el aprendizaje de las nuevas generaciones de diseñadores condensando conocimiento ya existente.

    Asimismo, no pretenden:

  • Imponer ciertas alternativas de diseño frente a otras.
  • Eliminar la creatividad inherente al proceso de diseño.

    No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo problema o similar que soluciona el patrón, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un error".


    PATRÓN ADAPTER



    El patrón adapter nos permite ampliar la funcionalidad de una clase o interfaz adaptando objetos que no coinciden con una determinada jerarquía de clases.

    Convierte la interfaz de una clase en otra interfaz que el cliente espera. Adapter permite a las clases trabajar juntas, lo que de otra manera no podría hacerlo debido a sus interfaces incompatibles.

    Cuándo usarlo:

  • Se desea usar una clase existente, y su interfaz no se iguala con la necesitada.
  • Cuando se desea crear una clase reusable que coopera con clases no relacionadas, es decir, las clases no tienen necesariamente interfaces compatibles.


    Problema: Se nos pide adaptar un auto eléctrico a un sistema de abastecimiento de combustible para autos. Siendo que el auto eléctrico, utiliza como combustible la energía eléctrica.

    Solución: Utilizar el patrón Adapter para extender la funcionalidad de la interfaz adaptando el auto eléctrico.

    Creamos una interfaz llamada Car que representará de forma genérica a un Auto:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.adapter;

    public interface Car {

    void fillTank();
    default void start() {
    System.out.println("Encendiendo auto...");
    }
    }


    NOTA: el método start() lo predefinimos porque será el mismo para todos las implementaciones.

    Ahora sus implementaciones: GasolineCar y GasCar. Representan un auto a gasolina y otro a gas.

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.adapter;

    public class GasolineCar implements Car {

    public GasolineCar() {
    super(); // llamada al constructor padre
    System.out.println("Creando un auto a gasolina...");
    }

    @Override
    public void fillTank() {
    System.out.println("Colocando gasolina...");
    }
    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.adapter;

    public class GasCar implements Car {

    public GasCar() {
    super(); // llamada al constructor padre
    System.out.println("Creando un auto a gas...");
    }

    @Override
    public void fillTank() {
    System.out.println("Colocando gas...");
    }

    }


    Ambos autos, GasolineCar y GasCar necesitan combustible para funcionar. Por eso, el método fillTank llena el combustible de ellos, dependiendo si es gasolina o gas.

    Ahora queremos añadir un auto eléctrico a nuestra jerarquía de clases.

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.adapter;

    public class ElectricCar {

    public ElectricCar() {
    super(); // llamada al constructor padre
    System.out.println("Creando un auto eléctrico...");
    }

    public void connect() {
    System.out.println("Conectando motor a generador de electricidad...");
    }
    }


    Nos damos con la sorpresa que éste auto no coincide con nuestra jerarquía. La interfaz Car dice que todos los autos que la implementen deben tener el método fillTank. Pero, ¿Como un auto eléctrico puede llenar el tanque? ¿Cómo hacemos para adaptar éste auto a nuestra jerarquía?

    Un error es común es modificar la interfaz o clase abstracta. Ésto viola el principio OCP, el cual nos dice:
    Citar
    Las entidades de software deben ser abiertas para ser extendidas y cerradas para no ser modificadas.

    Aquí toma importancia en patrón Adapter. Éste patrón nos permite ampliar la funcionalidad de una interfaz si tener que cambiar código en ella. Veamos como funciona.

    Código: java
    package org.underc0de.adapter;

    public class ElectricCarAdapter implements Car {

    ElectricCar electricCar;

    public ElectricCarAdapter() {
    electricCar = new ElectricCar();
    }

    @Override
    public void fillTank() {
    electricCar.connect();

    }

    }


    Como vemos hemos podido adaptar nuestro auto eléctrico a nuestra interfaz Car. ¡Ahora, podemos crear tanto autos a gasolina, gas o eléctricos aplicando polimorfismo!

    Veamos que salida nos arroja:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.adapter;

    public class AdapterTest {

    public static void main(String[] args) {
    Car gasolineCar = new GasolineCar();
    gasolineCar.fillTank();
    gasolineCar.start();

    System.out.println();

    Car gasCar = new GasCar();
    gasCar.fillTank();
    gasCar.start();

    System.out.println();

    Car electricCar = new ElectricCarAdapter();
    electricCar.fillTank();
    electricCar.start();
    }

    }


    Salida:

    Código: text
    Creando un auto a gasolina...
    Colocando gasolina...
    Encendiendo auto...

    Creando un auto a gas...
    Colocando gas...
    Encendiendo auto...

    Creando un auto eléctrico...
    Conectando motor a generador de electricidad...
    Encendiendo auto...


    Y así podemos extender la funcionalidad de nuestra aplicación de forma sencilla y eficiente.


    PATRÓN FACADE



    Descripción: El patrón fachada viene motivado por la necesidad de estructurar un entorno de programación y reducir su complejidad con la división en subsistemas, minimizando las comunicaciones y dependencias entre éstos.

    Cuándo usarlo:

  • Se usa para proporcionar una interfaz sencilla para un sistema complejo.
  • Se quiere desacoplar un subsistema de sus clientes u otros subsistemas, haciéndolo mas independiente y portable.
  • Se quiera dividir los sistemas en niveles: las fachadas serian el punto de entrada a cada nivel.

    Pros/contras:

  • + La principal ventaja del patrón fachada consiste en que para modificar las clases de los subsistemas, sólo hay que realizar cambios en la interfaz/fachada, y los clientes pueden permanecer ajenos a ello. Además, y como se mencionó anteriormente, los clientes no necesitan conocer las clases que hay tras dicha interfaz.
  • - Como inconveniente, si se considera el caso de que varios clientes necesiten acceder a subconjuntos diferentes de la funcionalidad que provee el sistema, podrían acabar usando sólo una pequeña parte de la fachada, por lo que sería conveniente utilizar varias fachadas más específicas en lugar de una única global.

    Problema: Crear una aplicación que haga tres operaciones bancarias: Crear una cuenta, depositar dinero y retirar dinero. Las operaciones deben hacerse dentro de una sola entidad que las maneje.

    Solución: Aplicar el patrón Facade para encapsular todos los objetos que hacen las 3 operaciones.

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class Bank {

    public Bank() {

    }

    public void createAccount(String account) {
    System.out.println("Creando cuenta N° "+account);
    }
    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class Deposit {

    public Deposit() {

    }

    public void makeDeposit(double amount, String account) {
    System.out.println("Se ha depositado $"+amount+" a la cuenta "+account);
    }

    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class Withdrawal {

    public Withdrawal() {

    }

    public void makeWidthdrawal(double amount, String account) {
    System.out.println("Se ha retirado $"+amount+" de la cuenta "+account);
    }

    }


    Ahora, creamos nuestra clase principal:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class Facade {

    public static void main(String[] args) {

    Bank bank = new Bank();
    Deposit deposit = new Deposit();
    Withdrawal withdrawal = new Withdrawal();

    bank.createAccount("9343435093");
    deposit.makeDeposit(2599.90, "9343435093");
    withdrawal.makeWidthdrawal(699.90, "9343435093");

    }

    }


    Como vemos creamos 3 objetos los cuales se encargan de efectuar las acciones. Pero, ¿es necesario crear éstos tres objetos en éste ambito? ¿Los vamos a necesitar siempre?

    Una mejor idea sería encapsular éstos objetos dentro de uno solo que se encargue de realizar todas las operaciones. Éste es el propósito del patrón Facade, actuar como intermediario entre la interfaz y las funcionalidades de un sistema. Veamos como se representa:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class OperationsFacade {


    public OperationsFacade() {
    }

    public void createAccount(String account) {
    new Bank().createAccount(account);
    }

    public void makeDeposit(double amount, String account) {
    new Deposit().makeDeposit(amount, account);
    }

    public void makeWithdrawal(double amount, String account) {
    new Withdrawal().makeWidthdrawal(amount, account);
    }

    }


    Como podemos observar, ésta clase encapsula el comportamiento de las clases Bank, Deposit y Withdrawal. Ya no tenemos que declarar los objetos porque éstos se crean en los métodos de OperationsFacade y se destruyen al finalizar el mismo. ¡Además ahorramos memoria!

    Ahora, veamos como queda la clase principal:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.facade;

    public class FacadeTest {

    public static void main(String[] args) {
    OperationsFacade facade = new OperationsFacade();
    facade.createAccount("9343435093");
    facade.makeDeposit(2599.90, "9343435093");
    facade.makeWithdrawal(699.90, "9343435093");
    }

    }


    Como podemos ver, solo necesitamos de un objeto OperationsFacade para realizar todas las operaciones. Así aplicamos también el principio KISS (Keep it simple stupid!).

    Salida:

    Código: text
    Creando cuenta N° 9343435093
    Se ha depositado $2599.9 a la cuenta 9343435093
    Se ha retirado $699.9 de la cuenta 9343435093



    PATRÓN ABSTRACT FACTORY



    Descripción: El patrón Abstract Factory nos permite crear, mediante una interfaz, conjuntos o familias de objetos (denominados productos) que dependen mutuamuente y todo esto sin especificar cual es el objeto concreto.

    Cuándo usarlo:

  • Un sistema debe ser independiente de como sus objetos son creados.
  • Un sistema debe ser 'configurado' con una cierta familia de productos.
  • Se necesita reforzar la noción de dependencia mutua entre ciertos objetos.


    Pros/contras:

  • + Brinda flexibilidad al aislar a las clases concretas.
  • + Facilita cambiar las familias de productos.
  • - Para agregar nuevos productos se deben modificar tanto las fabricas abstractas como las concretas.

    Problema: Se nos pide crear animales de X tipo sin especificar cuál es el objeto en concreto.

    Solución: Utilizar el patrón Abstract Factory para crear los objetos solicitados.

    Primero, creamos una clase abstracta llamada Animal que representará de forma genérica a un Animal:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: =java
    package org.underc0de.factory;

    public abstract class Animal {

    protected String type;
    protected String family;
    protected String habitat;

    public Animal(String type, String family, String habitat) {
    this.type = type;
    this.family = family;
    this.habitat = habitat;
    }

    public String getType() {
    return type;
    }

    public void setType(String type) {
    this.type = type;
    }

    public String getFamily() {
    return family;
    }

    public void setFamily(String family) {
    this.family = family;
    }

    public String getHabitat() {
    return habitat;
    }

    public void setHabitat(String habitat) {
    this.habitat = habitat;
    }

    @Override
    public String toString() {
    return "Tipo de animal: "+getType()+"\nFamilia: "+getFamily()+
    "\nHábitat: "+getHabitat();
    }
    }


    Y tres animales que extienden de Animal:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class Dog extends Animal {

    public Dog(String type, String family, String habitat) {
    super(type, family, habitat);
    }

    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class Shark extends Animal {

    public Shark(String type, String family, String habitat) {
    super(type, family, habitat);
    }


    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class Lion extends Animal {

    public Lion(String type, String family, String habitat) {
    super(type, family, habitat);
    }


    }


    Bien, ya tenemos nuestros 3 tipos de animales que heredan de Animal: Dog, Shark y Lion. Como la tarea es construir objetos sin especificar de qué tipo son, creamos una fábrica abstracta que especifica la creación de un Animal genérico sin especificar de qué tipo:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public interface AbstractAnimalFactory {

    Animal createAnimal();
    }


    Ahora, el siguiente paso es hacer las implementaciones de ésta fábrica abstracta, es decir las fábricas concretas que crearán los objetos concretos:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class DogFactory implements AbstractAnimalFactory {

    protected String type;
    protected String family;
    protected String habitat;

    public DogFactory(String type, String family, String habitat) {
    this.type = type;
    this.family = family;
    this.habitat = habitat;
    }

    @Override
    public Animal createAnimal() {
    return new Dog(type, family, habitat);
    }

    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class SharkFactory implements AbstractAnimalFactory {

    protected String type;
    protected String family;
    protected String habitat;

    public SharkFactory(String type, String family, String habitat) {
    this.type = type;
    this.family = family;
    this.habitat = habitat;
    }

    @Override
    public Animal createAnimal() {
    return new Shark(type, family, habitat);
    }

    }


    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class LionFactory implements AbstractAnimalFactory {

    protected String type;
    protected String family;
    protected String habitat;

    public LionFactory(String type, String family, String habitat) {
    this.type = type;
    this.family = family;
    this.habitat = habitat;
    }

    @Override
    public Animal createAnimal() {
    return new Lion(type, family, habitat);
    }

    }


    Analicemos un poco el código. Cada una de las implementaciones de AbstractAnimalFactory especifican la implementación que tendrá para crear un tipo de animal.

    Cada factoría concreta, tiene las 3 propiedades que necesita cada objeto para poder crearse. Así mismo, dichos datos se pasan como parámetros a su constructor para establecer los valores en las propiedades que se utilizarán para crear una instancia del objeto.

    Establece las propiedades:

    Código: java
    public LionFactory(String type, String family, String habitat)


    Y usa esas mismas propiedades para crear el objeto:

    Código: java
    @Override
    public Animal createAnimal() {
    return new Lion(type, family, habitat);
    }


    Finlamente, se sobre-escribe el método de la factoría abstracta createAnimal() para retornar un nuevo objeto de acuerdo al tipo de factoría. Así, la factoría de Perros, creará objetos tipo Perro, la factoría de Tiburones creará objetos tipo Tiburón y la factoría de Leones, crearán objetos tipo León.

    Por último, especificamos una Fábrica global que utilizará las 3 fábricas para crear los objetos (Aquí se aplica también el patrón Facade):

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public abstract class AnimalFactory {

    public static Animal create(AbstractAnimalFactory factory) {
    return factory.createAnimal();
    }
    }


    Ésta clase recibe un objeto que implemente la interfaz AbstractAnimalFactory, por lo tanto podrá recibir objetos tipo: DogFactory, SharkFactory y LionFactory. Luego simplemente usa la factoría especificada para crear un animal mediante polimorfismo.

    Ahora construyamos nuestra clase principal para probar el funcionamiento del patrón:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.factory;

    public class FactoryTest {

    public static void main(String[] args) {
    Animal dog = AnimalFactory.create(new DogFactory("Perro","Caninos","Doméstico"));
    Animal shark = AnimalFactory.create(new SharkFactory("Tiburón", "Lámnidos", "Mar"));
    Animal lion = AnimalFactory.create(new LionFactory("León", "Felinos", "Selva"));

    System.out.println(dog.toString());
    System.out.println();
    System.out.println(shark.toString());
    System.out.println();
    System.out.println(lion.toString());
    }
    }


    Utilizamos el método estático create() de AnimalFactory que recibe una implementación de la interfaz AbstractAnimalFactory, en éste caso un objeto DogFactory al que se le asignan los valores "Perro", "Caninos" y "Doméstico" y finalmente AnimalFactory llama al método createAnimal() de DogFactory para crear un animal tipo Dog y devolverlo hacia AnimalFactory que lo devuelve y lo guarda en el objeto 'dog'. El mismo procedimiento es para todas las factorías.

    Salida:

    Código: text
    Tipo de animal: Perro
    Familia: Caninos
    Hábitat: Doméstico

    Tipo de animal: Tiburón
    Familia: Lámnidos
    Hábitat: Mar

    Tipo de animal: León
    Familia: Felinos
    Hábitat: Selva


    Y de ésta manera sencilla, podemos usar tantas fábricas como queramos para poder crear objetos si generar dependencias ;)


    PATRÓN SINGLETON



    Cuándo usarlo:

  • Cuando la aplicación requiere que solo exista una instancia de un determinado objeto.

    Problema: Encapsular la configuración de una aplicación en un objeto y compartirlo con los demás objetos de la aplicación que lo requiera.

    Solución: Utilizar el patrón Singleton para encapsular la configuración de la aplicación.

    Para utilizar éste patrón se deben seguir dos reglas:

  • El primer paso es hacer el constructor privado para que no se pueda llamar y por lo tanto, no se puedan crear instancias.
  • El segundo paso es crear una instancia de la clase y devolverla mediante un método estático.

    Teniendo en cuenta éstas reglas, creamos una clase que representa a la configuración de la aplicación:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.singleton;

    import java.util.HashMap;
    import java.util.Map;

    public class Configuration {

    private Map<String,Object> appOptions = null;
    private static Configuration config;

    private Configuration() {

    }

    public static Configuration getConfiguration() {
    if(config == null) {
    config = new Configuration();
    }
    return config;
    }

    public Map<String,Object> getAppOptions() {
    if(appOptions == null) {
    appOptions = new HashMap<>();
    appOptions.put("theme", "dark");
    appOptions.put("show_hidde_files", true);
    }
    return appOptions;
    }

    public void setAppOptions(Map<String,Object> appOptions) {
    this.appOptions = appOptions;
    }

    }


    Y simplemente, cuando la necesitemos, obtenemos su única instancia:

    You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
    Código: java
    package org.underc0de.singleton;

    import java.util.Map;

    public class SingletonTest {

    public static void main(String[] args) {
    Configuration cfg = Configuration.getConfiguration();

                    // recorre el hashmap para leer las claves y valores
    for(Map.Entry<String, Object> entry: cfg.getAppOptions().entrySet()) {
    System.out.println(entry.getKey()+": "+entry.getValue());
    }

    }

    }


    Salida:

    Código: text
    show_hidde_files: true
    theme: dark



    NOTA IMPORTANTE:

    Generalmente, cuando se usa éste patrón, se garantiza que solamente existirá una instancia de dicha clase. Pero, si se trata de una aplicación web y se va a integrar una aplicación web con otra, es probable que ya no exista una sola instancia.

    Ésto se debe a los ClassLoaders. Cada contenedor de cada aplicación web (WAR) tiene su propio ClassLoader, por lo que en el supuesto caso de una integración de WARs, las instancias serán dos y no una como se había previsto.

    Una mejor forma de de implementar el patrón Singleton es mediante un enum, como recomienda Joshua Bloch. Al ser un enum, todas sus propiedades serán constantes únicas, no se pueden crear nuevas, solo utilizar las ya descritas.

    Código: java
    public enum Configuration {
    INSTANCE;

    private Map<String, Object> options;

    public Map<String, Object> getOptions() {
    if(options == null)
    fillOptions();
    return options;
    }

    private void fillOptions() {
    options = new HashMap<>();
    options.put("theme", "Dark");
    options.put("show_hidden_files", true);
    }

    }



    En el capítulo II, veremos más patrones de diseño. Nos vemos.




    By Gus.
#73
Java / Re:Ejercicio Java
Abril 25, 2015, 03:09:15 PM
Muy bueno, rollth. Te recomendaría que apliques otra capa de abstracción y separes el objeto Dinero del proceso y apliques el encapsulamiento (es muy importante).

Por cuestiones de seguridad e integridad de datos, nunca se debe acceder a las variables de un objeto directamente. Ésto puede tener problemas si accidentalmente se cambia (ya que es visible desde cualquier contexto), el resultado final puede variar mucho.

Se me ocurre también crear un método play(), que inicie y controle el juego y que además, sea recursivo para controlar posibles excepciones como NumberFormatException. Además, lanzaríamos un IllegalAccessException si se escoje un número fuera del rango 1 - 6 para poder reiniciar el juego.

Modificando algo tu code, quedaría así:

Código: java
public class Generator {
public static Integer generate() {
Random random = new Random(System.nanoTime());
return 1 + random.nextInt(6);
}
}


Código: java
public class Cash {
private Double quantity;

public Cash() {

}
public Cash(Double quantity) {
this.quantity = quantity;
}
public Double getQuantity() {
return quantity;
}
public void setQuantity(Double quantity) {
this.quantity = quantity;
}
}


Código: java

public class CashManager {
public static void increase(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() + quantity);
}
public static void decrease(Cash cash, Double quantity) {
dinero.setQuantity(dinero.getQuantity() - quantity);
}
}


Código: java

public class Machine {
private Cash cash;

        public setCash(Double amount) {
            cash = new Cash(amount);
public Double checkCash() {
return cash.getQuantity();
}
public void bet(Double betSize , int choosedNumber){
if(choosedNumber < 1) {
System.out.println("Elija un número válido");
return;
}
if(betSize < checkCash()) {
System.out.println("Solo dispone de: "checkCash());
return;
}
        int generatedNumber = Generator.generate();
        System.out.println("Su numero es: " + choosedNumber);
        System.out.println("El numero que ha salido en el dado es: " + generatedNumber);
        (generatedNumber == choosedNumber) ? win(betSize) : lose(betSize);
    }
    public void play() {
    try {
    System.out.println("*** EMPIEZA EL JUEGO... ***\n\n"):
    while(checkCash() > 0) {
System.out.print("\nElija su número (1 al 6): ");
Integer number = reader.nextInt();
if(number < 0 || number > 6) {
throw new IllegalAccessException("Elija un número entre 1 y 6!");
}
System.out.print("\nIngrese el monto de apuesta: ");
Double betSize = reader.nextDouble();
bet(betSize, number);
}
} catch(NumberFormatException e) {
System.out.println("\nDebe ingresar un número");
play(); // volvemos a pedir número, (método recursivo)
} catch(IllegalAccessException e2) {
System.out.println(e.getMessage());
play();
}
    }
    private void win(Double betSize) {
    System.out.println("!HA GANADO¡");
        DineroManager.increase(cash, betSize * 6);
    }
    private void lose(Double betSize) {
    System.out.println("Ha perdido...");
        DineroManager.decrease(cash, betSize);
    }
}


Código: java

public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.print("Ingrese el monto inicial: ");
Double amount = reader.nextDouble();
Machine machine = new Machine();
machine.setCash(amount);
machine.play();
}
}


Un saludo.
#74
Back-end / [JEE] Servicios REST - primer contacto
Abril 25, 2015, 11:20:18 AM
Un servicio web nos provee mucha utilidad y flexibilidad. Al estar basado en la arquitectura Cliente Servidor, nos permite mucha escalabilidad horizontal. Para empezar, crearemos una POJO:

Código: java

public class Song implements Serializable {
private Integer id;
private String name;
private Long duration;

public Song() {

}
public Song(Integer id, String name, Long duration) {
this.id = id;
this.name = name;
this.duration = duration;
}
// getters y setters
}


Ésta clase es un Java Bean, no un POJO. Un POJO debe cumplir los siguientes requisitos:

  • Variables privadas
  • Un constructor vacío
  • Getters y setters
  • No implementar nada del exterior

    Un POJO no debe implementar ni heredar nada. Por otro lado, un JavaBean, tiene como requisito implementar la interface Serializable. La interface Serializable hace que el objeto sea descompuesto/recompuesto en una secuencia de Bytes, permitiendo así que éste objeto pueda ser transportado en diferentes ámbitos como pueden ser: ficheros, sockets, peticiones HTTP, etc.

    Un JavaBean debe de implementar Serializable porque éste va a ser transportado o persistido, por lo que, si no implementara la interface Serializable, no podría ser posible su transporte.

    Ahora, hagamos una clase que sirva como servicio o comúnmente llamado DAO:

    Código: java

    public class SongService {
    private static final Map<Integer, Song> songs;
    static {
    songs = new HashMap<>();
    songs.put(1, new Song(1, "Enter Sandman", 3500L));
    songs.put(2, new Song(2, "The day that never comes", 5000L));
    songs.put(3, new Song(3, "Whiskey in the jar", 4000L));
    }
    public static Song find(Integer id) {
    return songs.get(id);
    }
    // otros metodos que simulan el crud (create, findAll, update, remove)
    }


    Ésta clase simula un servicio o DAO. Dispone de un método find, que recibe un entero que representa a un ID. Éste ID es buscado es el Map y es retornado hacia el contexto en que se llamó.

    Ahora, resta crear nuestro REST:

    Código: java

    @Path("/music")
    @Stateless
    public class MusicServiceREST {
    @Path("/find/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Song findMetallica(@PathParam("id") Integer id) {
    return SongService.find(id);
    }
    // otros servicios (findAll, update, remove, etc)
    }


    Aquí es necesario explicar algunas cosillas:


    • @Path indica una ruta y ésta ruta será mapeada; es decir, todas las peticiones que se hagan a dicha ruta las interceptará el REST.

    • @Stateless indica que dicha clase es un EJB (Enterprise Java Bean). Un Enterprise Java Bean es una especificación de Java EE, el cual trae una serie de novedades como: JMS, control de concurrencia, transacciones (flujos), servicios de nombre y directorios. Éste concepto lo dejaremos para después. Al estar la clase anotada con @Stateless estamos diciendo que esa clase es un EJB y que soporta las características antes mencionadas. Por ejemplo, al soportar transacciones, aquí se puede inyectar un EntityManager y que el EJB sea el encargado de manejar las transacciones (cuando se abren y cierran). En éste caso, al no haber entidades no es necesario.

    • @Produces indica qué MIME retornará la petición a dicha ruta (@Path). Aquí podemos especificar que se devolverá el MIME que se crea necesario: text/plain, text/html, application/json, application/xml, etc. En nuestro caso hemos dicho que se devolverá un objeto JSON, que es la representación de nuestro objeto Song.

    • @PathParam indica el parámetro que se va a formatear en el tipo de dato deseado. En nuestro caso, el parámetro enviado lo especificamos entre llaves, y se llamará id ({id}), así que, formateamos éste parámetro a entero para poder buscar al objeto Song con dicho ID.

    Es necesario registrar nuestro REST. Para ello, solo basta hacer:

    Código: java

    @ApplicationPath("api")
    public class RestApplication extends Application {
        @Override
        public Set<Class<?>> getClasses() {
        Set<Class<?>> rests = new HashSet<>();
        rests.add(MusicServiceREST.class);
        return rests;
        }
    }


    Solo debemos de agregar el class de los REST que tengamos creados para registrarlos. Una vez hecho lo anterior, ya tenemos todo hecho. Ahora, para probarlo, solo tipea la url:

    Código: html5
    http://localhost:8080/tu_proyecto/api/music/find/3


    La URL anterior, buscará la canción con el ID 3 y lo retornará como JSON:

    Código: javascript
    {
        "id": 3,
        "name": "Whiskey in the jar",
        "duration": 4000L
    }


    En caso se quiera consumir algo, por ejemplo, un XML, debemos de utilizar la anotación @Consumes:

    Código: java
    @Path("/upload")
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.TEXT_HTML)
    public String upload(final InputStream IS) {
        /* proceso */
    }


    El caso anterior es sin utilizar JAXB. Si utilizáramos JAXB no necesitaríamos el InputStream. Como la petición puede venir desde todo tipo de clientes, es necesario capturarla con un InputStream para poder procesarla.

    Ésta es la forma básica en que se crea un servicio REST en Java. Generalmente, se usa un REST como capa intermedia entre el acceso a datos y el cliente.



    Librerías necesarias:

  • jersey-server
  • jersey-json
#75
ANTRAX, en lugar de Lord Gus pon Gus Garsaky please xD
#76
Front-end / Re:[HTML5] Pizarra virtual
Abril 22, 2015, 05:39:21 PM
Muchas gracias por sus comentarios muchachos. Espero que a alguien le sean de provecho los fuentes que publico.


Un saludo.
#77
Front-end / Re:[HTML5] Pizarra virtual
Abril 21, 2015, 08:38:02 AM
Muchas gracias Whiz. He creado una github page para que puedan probar la demo You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login.


Saludos.
#78
Front-end / [HTML5] Pizarra virtual
Abril 19, 2015, 05:24:23 PM
Descripción: Simple pizarra virtual con soporte para toda la paleta de colores, grosor el pincel y borrador.

Características:

  • Diversidad de colores.
  • Grosor del pincel entre 1 y 30.
  • Borrador.
  • Limpiador de lienzo (full clean).
  • Responsivo.





    C{0}digo fuente



    El source lo pueden encontrar en mi github: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

    Espero que le sirva a alguien. Nos vemos.




    By Gus.
#79
Sí,  tienes razón ~ Yoya ~, no venía al caso, pero igual es bueno que se lo haya comentado para que se vaya familiarizando con MVC (que seguro tocará más adelante Spring, JSF, Trapestry, entre otros).

Saludos.

PD: No sabía que estabas también por acá xD.
#80
Jasper tiene soporte para parámetros, queries y demás cosas; de hecho, Jasper usa internamente iTetx. Checka su documentación.


Saludos.