Guia de uso

Hay Dios Libre es un blog para programadores autodidactas con poco tiempo.

Esta orientado a los desarolladores que estan acostumbrados a googlear, y que ya han leido miles de veces los conceptos sobre lo que buscan, pero no han encontrado la respuesta a lo que necesitan.

Este blog pretende ser una solucion final a todas aquellas inquietudes. Cuando se hable de un tema, asumo que mis lectoras ya han buscado por gran parte de la web, y que ya conocen los conceptos que no se cansan de repetir en los tutoriales (cuantas veces has tenido que leer sobre Patron MVC en tutoriales de Spring MVC?).

Hay dios libre! es una guia, es una respuesta rapida a las dudas que cualquier desarrollador puede tener.

Nota: La mayoria de los ejemplos se han realizado con la version completa de Netbeans 6.9, en su configuracion mas basica, a menos que se especifique lo contrario en el post.

miércoles, 10 de agosto de 2011

Lo que no te cuentan de Google App Engine (GAE)

Si te tira un:

com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found..

cuando subis la aplicación a App Engine, y te funcionaba perfecto en modo local... dale tiempo (media hora). Google tiene que crear indices, y si bien lo hace de manera instantanea cuando estás desarrollando... en producción tarda un rato.

viernes, 22 de julio de 2011

Mocking de Web Services con SOAP-UI.

Para realizar el mock a partir de un WebService que existe:

1 - Generamos el cliente de forma comun (file -> New SoapUI Project ->....).

2 - Creamos el mock (Boton derecho en el binding ( xxxxxSoap11Binding o xxxxSoap12Binding, Generate MockService ).

3 - Se generará una response por defecto.

- La dirección del endpoint va a ser: localhost:8088/mockXXXXSoap11Binding
- La dirección del WSDL va a ser: http://localhost:8088/mockXXXXXSoap11Binding?WSDL

4 - Consumimos el WS desde algun lado que querramos (por ej: con wsdl2java -uri http://....?wsdl

-= Generar respuestas =-

SoapUI te genera una response por cada metodo. Se le puede agregar a un metodo, varias respuestas, y un dispatcher se encargara de decidir a quien enviarlo la respuesta.

El dispatcher tiene 4 modos:
A ) Secuencial. Si el metodo tiene 4 responses distintas, primero responde el primero, despues el segundo, y asi... de manera circular.
B ) Random: Elige una response al azar.
C ) Script: Ejecuta un script que se encarga de la logica... se programa en groovy, todavia no lo chusmie mucho. La idea es crear completamente el response.
D ) Query_Match:
Tiene dos partes. Una es el XPath:

Ejemplo de query:
http://chopapp.com/#841uxexz

Ejemplo de XPath que te retorna el valor "Cordoba":
http://chopapp.com/#et2q0our

En ExpectedValue ponemos con que valor queremos machearlo ("Cordoba" por ejemplo), y en DispatchTo, ponemos la respuesta que deberá enviar.

E ) XPath: Ni idea, pero en la propia pagina de SoapUI dice que es poco poderoso.
http://www.soapui.org/Service-Mocking/simulating-complex-behaviour.html

sábado, 25 de diciembre de 2010

org.apache.commons.lang review

Cosas copadas de esta biblioteca (al menos para que les pique el bicho de la curiosidad):

http://commons.apache.org/lang/download_lang.cgi

1 ) Equals que funciona con null.
2 ) Singleton de un Null (Tenes un Null Object!).
3 ) Valida si una colección contiene un valor "Null"
4 ) Valida si todos los elementos de una colección son de un tipo en especial.
5 ) Trae un manejo de arrays[] mas objetoso (ArrayUtils.add(vector[],elemento), por ejemplo)
6 ) Escapa cadenas dependiendo el formato.
7 ) Distancia de Levenstein entre cadenas
8 ) Clonado profundo!!! (Clona el objeto, y todos sus atributos, recursivamente...)

9 ) Miles de cosas de reflection!



Algunos pocos ejemplos que tenemos:

A ) Manejo de Nulls.

ObjectUtils trae bastantes herramientas copadas, que si bien no es nada que puede no ocurrirsenos hacer, Commons-Lang ya nos las trae hechas y probadas:

1 ) Equals que funciona con null.
2 ) Singleton de un Null (Tenes un Null Object!).


¿Como es el punto 1? ¿No estás cansado de, cuando queres hacer un Equals, tener que primero fijarte que el objeto no sea Null, y despues tener preguntar si el elemento es igual a otro?

Osea, no estas cansado de tener que hacer esto?:

if ( miAuto != null && miAuto.equals(elAutoQueChoco) )
//... codigo ...

Yo realmente si estoy cansado. Si no tengo auto, es logico que mi auto va a ser distinto al que choco...

Apache Commons - Lang te trae la solución:

if ( ObjectUtils.equals(miAuto, elAutoQueTieneMultas) );
// ... codigo ...

que es algo mucho más declarativo que lo otro!

2 ) ¿Y para qué me sirve tener un objeto Null? ¿No te jode el manejo que tiene Null con un hashmap?

Osea, supongamos que tenemos lo siguiente:

miHashMap.put("Cero", "Julian");
miHashMap.put("Dos", "Pepe");
miHashMap.put("Cuatro", null);

if(miHashMap.get("Cuatro") == miHashMap.get("Noventa dos veinte"))
// La condicion de arriba siempre va a ser "true", ya que el HashMap te retorna Null, si el valor del diccionario es null, o si la clave no existe.

En cambio, con esto podemos hacer:

miHashMap.put("Cero", "Julian");
miHashMap.put("Dos", "Pepe");
miHashMap.put("Cuatro", ObjectUtils.NULL);

if(miHashMap.get("Cuatro") == miHashMap.get("Noventa dos veinte"))
// La condicion de arriba siempre va a ser "true", ya que el HashMap te retorna Null, si el valor del diccionario es null, o si la clave no existe.

B ) Otros:

6 ) Escapa cadenas:

Dependiendo de las necesidades, escapa las cadenas para que funcionen en donde lo necesitemos. Hay para Java, Xml, Csv, Html, y hasta uno para Sql (aunque no funciona correctamente con sentencias Like) Ejemplo:

Imaginemos que el usuario, en un textbox escribió: Y el marciano dijo, "Hola mundo & planetas cercanos!!!"

StringEscapeUtils.escapeJava(a); // Y el marciano dijo, \"Hola mundo & planetas cercanos\"

StringEscapeUtils.escapeCsv(a); // "Y el marciano dijo, ""Hola mundo & planetas cercanos!!!"""

StringEscapeUtils.escapeHtml(a); // Y el marciano dijo, "Hola Mundo & planetas cercanos!!! ""


Tiene tanto para Escapar, como para Des-Escapar :P


7 ) Distancia de Levenstein:

La distancia de levenstein es la cantidad de caracteres en los que difieren dos palabras. Ejemplo:

"pablo" "palo" -> 1 ("pablo" tiene una letra mas).

"aaab" "bbbb" -> 3 (Hay tres letras que son diferentes, y una en comun).

StringUtils.LevensteinDistance("pablo","palo")

domingo, 11 de julio de 2010

Parte 2: Validadores en Spring.

La lista de clases que hemos analizado sobre Spring MVC, son:
Beans de comunicacion Vista-Control.
Controladores
Servicios.
Validadores (despues de leer el tutorial.


Conocimientos previos:
Haber hecho la Parte 1 del tutorial :P.


¿Que es un validador?
Un validador valida (valga la redundancia) los datos que ingresó el usuario.
En el ejemplo del largo Paso 1, hicimos un Login...
... Y la validacion sobre si un usuario es logueado o no, la realizabamos en el servicio LoguearUsuario, recordemos un poco:

package Servicios;

import BeanVistaControl.Usuario;

public class loguearUsuario {
public String login(Usuario usr)
{
if (usr.getUsr().equals("pablo"))
return "usuario valido! :D";
return "cualquiera mandaste";
}
}

Supongamos que el usuario se olvida de ingresar uno de los dos campos... ¿No estaria bueno delegar esta responsabilidad a otra clase? Recordemos que, sea un usuario valido o no, actualmente estamos reenviandolo a una pagina.

Ahora haremos una clase, llamada ValidarUsuarioNulo, que se encargue de fijarse si el usuario escribio algo en los campos "usuario" y "contraseña".


public class ValidarUsuario implements Validator{

public boolean supports(Class type) {
if(type.equals(Usuario.class))
return true;
return false;
}

public void validate(Object o, Errors errors) {
Usuario usr = (Usuario) o;
if(usr.getUsr() == "")
errors.rejectValue("usr", "errorMessage", null, "Escriba un usuario!");
}
}


El metodo "supports" establece si el Bean "Usuario" acepta la clase "type" que le envien desde el controlador.

El metodo validate, justamente valida si el valor que se ingresó es o no correcto. En este caso, verificamos nomas si el usuario se ingreso o no.

En el constructor del Controlador ponemos:

setValidator(new ValidarUsuario());


Despues, del lado de la vista:

Al inicio de todo, colocamos:

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>


Y luego del ' input type="text" name="${status.expression}" value="${status.value}"> ', colocamos:





Y listo, ejecutamos y veremos como el login valida y coloca el mensaje "Escriba un usuario!" al lado del text.

viernes, 9 de julio de 2010

DDD: Groovy mediante casos reales. (parte 1)

(DDD significa Departamento de Delirios)

Groovy es una "expansion" del lenguaje Java (como lo es C++ a C).

Conceptos que estaria copado que sepas (y que groovy implementa):
- Debilmente tipado/Tipado dinamico si se quiere (podes hacer todo Fuertemente tipado/Tipado estatico):
http://tinyurl.com/2937ppl

- Soporte nativo de Expresiones Regulares:
http://tinyurl.com/66ec58
http://tinyurl.com/394owu (Si entendes este link, es porque entendiste las Exp. Reg.)

- Beans (Generacion automatica de Setters & Getters)
http://tinyurl.com/2bmjcpy

- Soporte nativo para Lenguajes de marcado:
http://tinyurl.com/24wllrh

Conceptos que se explicaran:
- Soporte nativo de colecciones (Tipo Smalltalk)
- "Navegacion segura"
- Iteracion polimorfica
- Expresiones dentro de Strings (Tipo PHP)
- Clausuras/Bloques de codigo.


NOTA INICIAL: En Groovy, una linea termina con un "salto de linea" (enter). El "punto y coma" no hace falta!

-------------------------------------------------------------------------------------
1 - Tipado dinamico:

Supongamos una base de datos con "Equipos", y un campo "Tipo_Equipo" que contiene un integer.

Supongamos una Clase abstracta "Equipos", de la cual heredan las clases "Router" "PC" "Mac"

envez de hacer:


A - BigDecimal miNumero = MiFactory.DameUnNumero(3);
B - public static BigDecimal DameUnNumero(int num) {return new BigDecimal(num);}


podemos hacer:


A - def miNumero = MiFactory.DameUnNumero(3);
B - static def DameUnNumero(num) {return new BigDecimal(num)}


miNumero, en tiempo de ejecucion, será del tipo de datos que devuelva el método MiFactory.DameUnNumero.
De esta forma, si ya no nos gusta BigDecimal, y queremos que retorne un Integer, el codigo será:


B - static def DameUnNumero(num) {return new Integer(num)}


Y la linea A no se modificará (haciendo tu codigo mas "mantenible").

-------------------------------------------------------------------------------------

2 - Soporte nativo de expresiones regulares

Ejemplos:

// ==~ Machea TODA la cadena
"2009" ==~ /\d+/ // retorna TRUE
"holla" ==~ /\d+/ // retorna FALSE
"cheesecheese" ==~ "cheese" // retorna FALSE

// =~ Machea AL MENOS en una parte de la cadena
"cheesecheese" =~ "cheese" // retorna TRUE
"cheesecheese" =~ "queso" // retorna FALSE

// Sobreescribir cadenas:
def replaced1 = "abc".replaceAll(/(a)(b)(c)/, '$1$3') //retorna "ab"
def replaced2 = "abc".replaceAll(/(a)(b)(c)/, "Pepe $1') //retorna "Pepe a"


En java, es un quilombo, hay que crear la expresion regular, compilarla, y ejecutar un metodo... aca el soporte es nativo, y facil para los que alguna vez programamos en Perl.

Puede ver mas ejemplos en: http://groovy.codehaus.org/Regular+Expressions

-------------------------------------------------------------------------------------

3 - Beans (Generacion automatica de Getters & Setters)

Supongamos el bean Maquina:


class Maquina { //Groovy asume que la clase es Public
def nombre
def placa3D
def bichos
}

// Desde otro lado

new Maquina(nombre:"La compu", placa·D: new GeForce("GTX 260 192 SP") );



Envez de tener que escribir Getters & Setters uno a uno.


jueves, 8 de julio de 2010

Primer paso completo con Spring MVC 3.0 y Netbeans

Spring MVC es un framework MVC utilizado mayormente en sitios web y bla bla bla.
Asumo que ya sabes lo que es MVC, y esa clase de cosas.

Con NetBeans 6.9, te viene instalada la version 3.0 de Spting MVC.

Pre-condiciones para entender esto:

Saber que es MVC: http://es.wikipedia.org/wiki/Modelo_Vista_Controlador
Tener instalado Netbeans 6.9,yo use la version full full desde linux.
Haberlo instalado con un Tomcat (ya que Glassfish me tiraba error con domain.xml).
Saber programar en java.
Tener nociones basicas sobre HTML.
Que es un bean, con este video de un profe de mi facu basta: http://www.youtube.com/watch?v=vFlTYRleZpU

Glosario:
POJO: Una clase java de toda la vida, son clases comunes y corrientes creadas por uno, que no depende de ningun framework en particular.
Logica de negocio: Lo que REALMENTE hace el programa, sin importar la base de datos que use, ni tampoco la forma de visualizar los datos.
Nombre string: Hablando mal, digamos que Spring tiene un hashmap, donde el primer String es un nombre cualquiera, y el segundo string es una ruta a una clase ("control.clasesMias.MiControlHermoso"). A veces usaremos clases, otras veces el Nombre String, porque asi lo dice el tutorial que lei :P

Sigamos:
1 - Creamos un proyecto web nuevo.
Esto es:
File->New proyect->Java web->Web application.
Next.... hasta que aparezca Server: Apache tomcat 6.0.20
Next... habilitar Spring web MVC. Hibernate para futuros "tutoriales".

2 - Creamos las clases:

Concepto:

Las clases se dividen (por ahora) en tres grupos:

Los beans para la comunicacion vista-control
Los controladores.
Los servicios.

El controlador maneja las vistas, los modelos y los servicios.
El bean es un POJO que contiene la información a mostrar en la Vista. Solo tiene getters&setters (generalmente).
Los servicios, supuestamente contienen la "logica de negocio". Suele

¿Como es el flujo que nos interesa?

Un usuario accede a nuestra web. En algun lugar que veremos luego, le decimos "si quiere acceder a "pantallaLogin.htm", debe llamar al controlador "LoginController".
LoginController le dice al framework "bueno, muestro la vista X".
Cuando haces un Submit desde la web (con algun form html), el controlador (LoginController) RECIBE la respuesta de la pagina web. ¿Se acuerdan del POJO? Bueno, el controlador recibe ESE BEAN, realiza acciones con el servicio asignado, y retorna una nueva web...

Probablemente no hayas entendido nada, asique mejor vamos a-los-palos.

/fin concepto.

Practica:

2.1 - Crear el Bean POJO.

Antes de hacer cualquier cosa, tenemos que tener en claro QUE datos el usuario debe ingresar al sistema: Que datos nos interesa obtener (como desarolladores) desde la pagina web.

Esto es un Login, asique nos interesan Nombre de usuario y Password.
Entonces, creamos una clase java. En este ejemplo, la crearemos en el package BeanVistaControl (porque me gusta asi :P). La clase, la llamaremos Usuario.


package BeanVistaControl;

/**
*
* @author segfault
*/
public class Usuario {
private String usr;
private String pwd;

public String getPwd() {
return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

public String getUsr() {
return usr;
}

public void setUsr(String usr) {
this.usr = usr;
}

}


2.2 - Crear un servicio:

¿Que hace que nuestra aplicacion sirva?
Realmente no importa si usamos una pagina web, un formulario Swing, o un sistema de voz. Esos son detalles. Nuestra aplicacion sirve, por su logica de negocios.

Ahora, dijimos que nuestra aplicacion iba a ser un login, asique creamos una clase java, a la que llamaremos "loguearUsuario" (*), en un package "Servicios".

A mi por lo menos, me gusta que los Servicios obtengan directamente el Bean POJO del punto anterior (asi el Controlador solo se encarga de unir componentes y no tener lógica), pero no es obligatorio, ni tampoco se si es una buena practica.


package Servicios;

import BeanVistaControl.Usuario;

public class loguearUsuario {
public String login(Usuario usr)
{
if (usr.getUsr().equals("pablo"))
return "usuario valido! :D";
return "cualquiera mandaste";
}
}


2.3 - Creamos el Controlador.

NOTA: Despues de esto, empiezan los xmls feos...

Creamos un Simple Controller, esto es:
File -> New file -> Spring framework -> Simple Form Controller.
Nombre de clase: LoginController (porque quiero, esto no es Ruby on rails!).
Package: controladores

Adentro, meter en el constructor esto:

public LoginController() {
//Initialize controller properties here or
//in the Web Application Context



// CommandClass es el bean POJO vista-controlador!
setCommandClass(Usuario.class);

// Aca al BEAN le ponemos un nombre STRING que querramos
// (si, puede llamarse "aslñknsdfkaj", pero despues vas a tener que recordarlo
setCommandName("beanUsuario");

// setFormView establece la VISTA COMUN cuando se invoque a este
// controlador. En nuestro caso, es una pantalla de login.
//
// NOTA: Las vistas tienen un nombre de archivo (ponele, pepe.jsp),
// pero a Spring le interesa el Nombre String (ver el glosario arriba).
// Luego en algun xml, le diremos que "pantallaLogin" es TAL archivo jsp.
setFormView("pantallaLogin");

// Aca decidimos cual va a ser la "vista siguiente", luego de que se toque el botón Submit.
// Lo elegimos, mediante el Nombre String de la vista (que todavia no creamos)

setSuccessView("pantallaPrincipal");

}


Ahora, creamos el SERVICIO (logica de negocio) de la siguiente forma:


public loguearUsuario loguearUsuario;

public loguearUsuario getLoguearUsuario() {
return loguearUsuario;
}

// Creo que este no es necesario :P
public void setLoguearUsuario(loguearUsuario miLoguearUsuario) {
this.loguearUsuario = miLoguearUsuario;
}


Después, establecemos la "logica del controlador".

ESTO SUCEDE una vez que se haya tocado el boton "Submit"!!!!
LUEGO de ejecutarse ModelAndView, el framework MUESTA el jsp de "sucessView" que pusimos previamente (en el constructor de esta clase).


@Override
protected ModelAndView onSubmit(Object command) throws Exception {

// Recordar que, cuando se toca el boton onSubmit,
// el framework llena el bean POJO, con los datos que el usuario
// INGRESO a la pagina web. Aca es cuando lo casteamos :P
Usuario name = (Usuario)command;

// Aca obtengo la vista de Sucess :P
ModelAndView mv = new ModelAndView(getSuccessView());
// Aca le digo a la vista de Sucess "Che, te envio este objeto para que lo muestres" Recordar esto como el punto (*1)
// RECORDAR que loguearUsuario retornaba un String, el cual decia si habia sido un login exitoso o no. ESE STRING en la vista lo llamaremos como "mensajeLogin".
mv.addObject("mensajeLogin", loguearUsuario.login(name));

//aca ya termino todo :P.
return mv;
}


Y ya nos olvidamos de clases JAVA por el dia de hoy :P

3.0 - Creacion de Vistas.

En este caso, tenemos dos:
- La pantalla de Login, con dos campos text para usuario & password, mas un boton de "login".
- La pantalla de "entraste!" o "la pifiaste".

Empecemos por el mas facil: Entraste o La pifiaste.


<%@page contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

   "http://www.w3.org/TR/html4/loose.dtd">

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>



<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Hello</title>

    </head>

    <body>

        <h1>${mensajeLogin}</h1>
    </body>
</html>


FIJARSE que esto no tiene ninguna lógica de negocio:
SOLO mostramos lo que recibimos en el punto (*1) dicho anteriormente,
mediante su "Nombre String", que era 'mensajeLogin' !!!!!!!!!!!!!!


Ahora, vamos con la PantallaLogin, que es un toque mas complicada :P


<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

   "http://www.w3.org/TR/html4/loose.dtd">



<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>JSP Page</title>

    </head>

    <body>

        <spring:nestedPath path="beanUsuario">

            <form action="" method="post">

                Name:

                <spring:bind path="usr">

                    <input type="text" name="${status.expression}" value="${status.value}">

                </spring:bind>



                <spring:bind path="pwd">

                    <input type="text" name="${status.expression}" value="${status.value}">

                </spring:bind>



                <input type="submit" value="OK">

            </form>

        </spring:nestedPath>

    </body>

</html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        <title>Hello</title>

    </head>

    <body>

        <h1>${mensajeLogin}</h1>

    </body>

</html>



Ahora preguntaran: QUE GOMA ES spring:nestedPath path="beanUsuario" ???

Bueno, digamos que luego al BEAN POJO Vista-Control, le vamos a poner un "Nombre String", al que llamaremos "beanUsuario". Todo esto es vía configuración XML... ¿Ya no lo empiezan a odiar un poco?

Bueno, en "path" ponemos el nombre string del Bean.
Y luego, le decimos "che, asocia este input text, con este otro campo del Bean".

spring:bind path="usr" se asocia con el primer Input text
spring:bind path="pwd" se asocia con el segundo Input text.

usr y pwd es accedido vía getters y setters, así que si NO los creaste, NO va a funcionar (igual, si copypasteaste mi ejemplo, todo funcionará OK).

Y ahora.... EMPIEZAN LOS XMLs FEOS!!!

4.0 - Episodio 4: El ataque de las configuraciones.

La configuracion esta dada por dos archivos (por ahora):

application-context.xml
Asocia los servicios con un nombre string. En realidad, también se usa para todo lo que sea Modelado de datos (Hibernate...), pero como no accedemos a una BD por ahora, usamos esto :P.
Antes de que cierre el tag "/beans", escribimos:


<bean name="loguearUsuario" class="Servicios.loguearUsuario" />


Aca asociamos la clase Servicios.loguearUsuario , con el nombre string
"loguearUsuario" (si, no tuve mucha imaginación :P).

dispatcher-servlet.xml
Aca colocamos los Controles.
Lo importante de un control de este tipo es:
- Saber su "Nombre String" (en este caso, lo llamare loginController, osea, con minuscula).
- Saber que servicio utiliza (why? I don't know).
- Decirle por que web entra (url). En este caso, pondremos "miLogin.htm".

¿Como haremos esto?

Busquen una linea en la que diga: property names="mappings" y dentro de "props", escriban:

<prop key="miLogin.htm">loginController</prop>


Aca asociamos la URL a el loginController.

Ahora, asociemos la clase LoginController, con el nombre string loginController (letra L en minuscula :P)

Antes de que cierre el ultimo tag beans (osea, la ultima linea), coloquen:


<bean name = "loginController" class="controladores.LoginController" p:loguearUsuario-ref="loguearUsuario"/>


Aca asociamos el nombre string, y el servicio con el control.

Y ahora DENLE RUN! E intenten meterse a la web cuya url termine en "miLogin.htm"
en mi caso, es "http://localhost:8084/WebFront/miLogin.htm" :P


Si no funciona, avisen :P

miércoles, 16 de junio de 2010

Mi primer verano, hibernando, con la caja de herramientas de Google (GWT + Spring 3 RC + Hibernate)

O mas bien, como intentar zafar en un laburo, y de paso, aprender algo nuevo de la forma mas complicada posible.

Hace un tiempo, en la Factory tenemos un cliente nuevo, el cual quiere hacer EL mega-sistema que se comunica con el cliente, combina datos con empresas estatales, realiza procesos internos, y ofrece una interfaz de customización para la empresa.

Y como soy el "tecnico experto" en este desarrollo, he decidido complicarme la vida, a costa de aprender algo nuevo.

GWT + Spring Framework 3 RC + Hibernate, en NetBeans.

Mi nivel de conocimientos es: casi-nulo.
Lo único que conozco Web, es: PHP 4.0 y crear WebServices SOAP en Java.
Nunca toqué Enterprise Edition, ni tampoco ningun framework MVC, excepto CakePHP (dos dias), y uno creado internamente por mi y dos personas mas. Yo vengo del mundo de las apps desktops, con arquitecturas cliente-servidor comunicadas por sockets... si, demasiado antiguo.

Pre-requisitos:

Tener una PC.
Tener Linux, y permisos de superusuario.
Saber java :P.
Tener una base de datos levantada. Yo, en estos momentos, para no detenerme con configuraciones, uso xampp
http://www.apachefriends.org/es/xampp.html
Y creo una bd de mysql.

Los vere en la proxima!