jueves, 4 de diciembre de 2014

NoSql

Nosql es el acronimo Not only Sql, las caracteristicas de la base de datos NoSQl son las siguientes:

  •  No usan SQL como el principal lenguaje de consultas.
  •  Los datos almacenados no requieren estructuras fijas
  •  No soporta Join y tampoco garantizan completamente ACID (atomicidad, consistencia, aislamiento y durabilidad).
  •  Escalan bien horizontalmente.


El teorema de CAP "es imposible para un sistema computacional distribuido ofrecer simultánamente las siguientes 3 garantías":

Consistencia : Todos los nodos ven los mismo datos al mismo tiempo.
Disponibilidad : Garantiza que cada petición recibe una respuesta acerca de si tuvo éxito o no
Tolerancia a la partición : El sistema continua funcionando a pesar de la pérdida de mensajes



Si queremos elegir una base de datos nosql, la cosa se pone un poco dificil porque actualmente hay 150 sistemas de base de datos nosql. ¿Cúal elegir? lo primero no todas las bases de datos nosql son iguales, podemos clasificar en 4 tipos diferentes:
  • Orientadas a documentos
  • Orientadas a columnas
  • Clave-valor
  • Grafos
Orientadas a documentos.

Almacena documentos en formatos XML, JSON o BSON, un ejemplo puede ser MongoDB

Orientadas a columnas.

Cada fila pude tener una configuración diferentes de columnas, un ejemplo puede ser HBase

Clave-valor

Una colección de pares clave/valor, un ejemplo pueder Redis

Grafos

Basadas en la teoría de grafos utilizan nodos y aristas para representar los datos almacenados, un ejemplo puede ser Neo4j

Como vemos tenemos un monton de tipos de bases de datos nosql para resolver cualquier tipo.
Actualemente la base de datos más usuada es mongodb debido a su modelo de datos y versatilidad


miércoles, 3 de diciembre de 2014

Cena de filósofos

Hola

Después de ver el tema de Thread safe, vamos a aplicar nuestro conocimientos para resolver un problema típico que el la cena de los filósofos.

El enunciado es el siguiente:

Cinco filósofos alrededor de una mesa pasan su vida comiendo o pensando. Cada filósofo tiene un plato de arroz y un palillo a la izquierda de su plato. Cuando un filósofo quiere comer, cogerá los dos palillos de cada lado del plato y comerá.





Si analizamos el problema podemos sacar las siguiente conclusión, solo pueden estar comiendo 2 filósofos a la vez:


  • El filósofo 0 puede comer con el filósofo 2 o con el 3.
  • El filósofo 1 puede comer con el filósofo 3 o con el 4.
  • El filósofo 2 puede comer con el filósofo 4 o con el 0.
  • El filósofo 3 puede comer con el filósofo 0 o con el 1.
  • El filósofo 4 puede comer con el filósofo 1 o con el 2.
 Con estas premisas he resulto el problema con la palabra reservada synchronized y clase Semaphore, como siempre el código esta subido a mi cuenta de github


martes, 18 de noviembre de 2014

Thread Safe

Hola

Hoy voy hablar sobre thread safe, es algo que siempre escuchamos cuando programamos, pero ¿Qué es thread safe?

Una clase Java es Thread safe cuando su compartamiento no sé ve interferidor y modificado por otros hilos de forma concurrente.

En una imagen se ve mejor esta definición (mía):

Como vemos tenemos dos hilos que accede al mismo objecto Counter. Si counter es thread safe su comportamiento no sé vee alterado sí llega primero thread 1 y despues thread 2.

Java tiene varios mecanismo de hacer thread safe una clase:
  • Uso de la palabra reservada synchronized
  • Uso de la palabra reservada volatile
  • Uso de la clase ThreadLocal
  • Uso de la clase Lock
  • Uso de la clase Semaphore
Un error que se produce con el uso de sincronización es el bloqueo mutuo (dead Lock), como siempre esto se ve mejor con un ejemplo.

lunes, 17 de noviembre de 2014

ElasitcSearch

Hola

En esta entrada vamos a usar como almacen de datos una base de datos de tipo NoSQL, El primero que vamos a usar es ElasticSearch un proyecto de Apache que el corazón de elasticSearch es Lucene.

Como la mayoría de gente ha trabajado con base de datos relacional vamos hacer una comparativa de conceptos entre los dos sistemas:

SQL ElasticSearch
Esquema Indice
Tabla Tipo
Fila Documento
Columna Propiedad

ElasticSearch esta  hecho en java completamente, esta basado en documentos en formato JSON, se puede escalar horizonatalmente, permiter crear un cluster de nodos, tambien nos ofrece una api rest para acceder a los datos:

server:port/indice/tipo/id

ElasticSearch cuando se guarda un documento, ademas de guardar las propiedades dicho documento se añade las siguientes:
  • _id : valor único de 22 caracteres en base 64
  • _version : indica el número de modificaciones ha sufrido el documento
  • _index : indica a que indice pertenece el documento
  • _type : indica a que tipo pertenece el documento
Con los conceptos claros procedemos ha crear un proyecto que nos permita hacer las operaciones CRUD, como siempre el proyecto se encuentra en github

miércoles, 8 de octubre de 2014

Anotaciones Java

Hola

Esta entrada voy a explicar como crear  nuestras propias anotaciones java y usarlo. Las anotaciones Java aparecieron en la version 1.5 de java, seguro que lo habéis usado por ejemplo:

  • @Override
  • @SuppresWarning
  • @Deprecated
Para crear nuestro anotación tenemos que crear una interface pero un poco especial como podemos ver en ejemplo tenemos que poner la @ delante de la palabra interface.


@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnotacion{
String valorInicial() default "algo";
}

Vamos a analizar el codigo, lo primero el @Target es donde determinamos donde podemos usar nuestra anotación a nivel de clase, metodo, campos, etc. Los valores posibles son los siguientes:
  • ANNOTATION_TYPE
  • CONSTRUCTOR
  • FIELD  
  • LOCAL_VARIABLE 
  • METHOD  
  • PACKAGE 
  • PARAMETER  
  • TYPE
Como se puede ver el mismo nombre nos indica donde podemos usar nuestras anotaciones, tambien podemos usar combinaciones por ejemplo

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD})

La siguiente linea analizar es @Retention determina cuanto tiempo deben estar disponibles los datos de la anotación, los valores posible son los siguientes:
  • SOURCE : Solo visible en source ignorada por el compilador y JVM
  • CLASS : El compilador lo puede ver y actuar pero es ignorada JVM
  • RUNTIME : La JVM puede ver la anotacion y utilizar en tiempo de ejecucion por reflection
Con esto ya tenemos nuestra anotación como podeis ver se puede asignar valores por defecto usando la palabra reservada default.

Como simpre esto se ve mejor con un ejemplo, tengo un ejemplo subido a github.com 

martes, 7 de octubre de 2014

Oauth 2.0 (seguridad nuestra Api Rest)

Hola

En esta entrega vamos a hablar Oauth (Open Authorization) es un protocolo abierto,
que permite autorización segura de una API de modo estándar y simple para aplicaciones de escritorio, móviles y web.

En como siempre vamos a explicar lo que es oauth version 2.0 y posteriormente un ejemplo. A continuación se muetra una imagen mostrando el baile de Oauth 2.0



El acceso de los clientes a su aplicación (1) y hace que la solicitud para acceder a un recurso protegido (2).
 El servidor de autenticación devuelve un token de acceso basado en las credenciales de usuario publicado (3).  Después, el usuario realiza una solicitud para acceder a los recursos con el token obtenido anteriormente (4).  Una vez que el token se valida, el servidor de recursos devuelve el recurso protegido a la aplicación cliente (5).

Asi se tiene una idea global del funcionamiento de Oauth 2.0, ahora vamos a ver un diagramas que muestra mas claro el funcionamiento








Este ejemplo muestra como sería usando grant_type "password y refresh_token", hay más opciones que no vamos a ver aquí pero si quereís más información.

Como véis la primera petición se envía la información de usuario, contraseña, client_id y password, la respuesta es el access_token y token_refesh. El access_token es el token que vamos a usar para poder acceder a los recursos, como podemos ver en la segunda petición.

Los tokens tiene un tiempo de duración, cuando accedemos a los recursos y obtenemos el mensaje “invalid_token” debemos solicitar un nuevo token usando el token_refresh que obtenimos anteriormente.





Como veis la petición de refresco del token es muy parecida a la de obtención de token (no enviamos el usuario y contraseña)

Como se puede ver es muy intuitivo el protocolo oauth 2.0 como siempre hay varias implementaciones de oauth 2.0:


  • Spring Oauth
  • Apache Oltu
  • Picketlink
El ejemplo que tenemos hemos usado Spring Oauth 2.0, como siempre esta subido a github.com

viernes, 8 de agosto de 2014

Full Stack Developer

Hola

Hoy voy hablar sobre un perfil que se esta demandado mucho en los últimos años, que es Full Stack Developer.¿Qué es un Full Stack Developer?

En pocas palabras "el puto amo", es decir una persona que sabe de todo y tiene un conocimiento medio ó alto de tecnologías, heramientas, paradigmas, metodologias, servidores, redes, etc y gran facilidad de aprender. ¡Casi nada!

En el mundo del desarrollo web (donde estoy actualemente trabajanado) son muchas las tecnologías y las herramientas que hay para el desarrollo web, dependiendo del tamaño del softtware se puede utilizar un conjunto de tecnologías y herremientas para su desarrollo.

Para un desarrollo pequeño o mediano este sería el stack tecnologico

y para un desarrollo grande


Como veis son un monton de tecnologías, falta las herremientas, metodologías, servidores, etc. como veis hay que saber de muchas cosas para poder ser un Full Stack Developer.¿Se puede ser un Full Stack Developer?

Sí, pero no se hace de noche de la mañana, se tarda varios años y siempre se tiene que estar actulizando, probando y evaluando. Como he dicho al principio para ser FSD (Full Stack Developer) tienes que ser el puto amo.

martes, 5 de agosto de 2014

Seguridad web (Métodos)

Hola

Una vez visto la teoría en que consistente la seguridad web, vamos a ver que métodos que tenemos para poder implementar nuestra seguridad en nuestras aplicaciones web JEE:

  • HTTP-BASIC
  • HTTP-DIGEST
  • FORM-LOGIN
  • CLIENT-CERTIFICATE-AUTENTICATION
  • CUSTOMER AUTENTICATION

Esta son los métodos que tenemos para implementar seguridad en nuestras aplicaciones la mas usuada de FORM-LOGIN (Formulario de logeo). Todos estos métodos no sirve para poner seguriad tambien para nuestra Api Rest excepto FORM-LOGIN y ademas podemos añadir una mas que esta cogiendo mucha fuerza en el mundo de Api Rest que es Oauth, el listado de seguridad sería para las Api Rest las siguientes:

  • HTTP-BASIC
  • HTTP-DIGEST
  • OAUTH
  • CLIENT-CERTIFICATE-AUTENTICATION
  • CUSTOMER AUTENTICATION

Como vemos hay muchos métodos para elegir e incluso podemos hacer el nuestro propio. Como siempre hay frameworks que nos facilita la vida para poder usar estos métodos de seguridad en nuestras aplicaciones, estos son algunos:

En las proxima entradas pondre ejemplos de algunos de los metodos de seguridad para nuestra aplicaciones y un resumen de la seguridad web.


miércoles, 30 de julio de 2014

Seguridad mundo web (Teoría)

Hola

En esta entrada voy hablar sobre la seguridad, durante este tiempo hemos visto como relizar aplicaciones web, un punto muy importante en el desarrollo del mundo web es el tema de la seguridad. ¿Que consiste? 

Cuando hablamos de seguridad en el mundo web es restringuir o controlar el acceso a mi aplicación.
Como siempre un ejemplo se ve mejor, a continuación vamos a ver como funciona la seguridad de la página web 'Cosas':
Acabamos de entrar en la web de 'Cosas' página que se dedica al a venta de cosas, cuando accedemos a la web, la primera página nos ofrece la opción de buscar articulos y añadir a un carrito de compras.
Yas hemos elegido los productos que deseamos comprar y pulsamos el boton comprar y la aplicación nos pregunta ¿Qué si ya tenemos una cuenta?. Al ser la primera no tenemos y decimos que no y  nos ofrece la posibilidad de crear una cuenta y procedemos a crear una cuenta rellenado el formulario con nuestros datos personales, direccion, etc.

Una creada la cuenta, pagina web cambia, es decir, tiene el mismo aspecto pero sale más opciones que antes no había, un avatar, nuestro nombre de usuario, opción de ver configuración, opción de ver pedidos, boton de cerrar sesión, etc y por último terminamos nuestra comprar.

El adminitrador de la página web 'Cosas' entra cada día para ver si hay pedidos para relizar los paquetes enviarlos a sus compradores, el administrador entra a 'Cosas' pulsa el boton acceso que le aparece una página que le piden sus credenciales. Una vez que el administrador introduce sus credenciales obtiene una pagína web parecida al usuario que ha realizado la compra pero con más opciones.

El administrador entra el opción de ver pedidos, puede ver y gestionar los pedidos realizados por los usuarios, el administrador busca los pedidos con estado nuevo, una vez que ha realizado el pedido y enviado a la empresa de mensajería. El administrador cambia el estado del pedido a enviado y cierra su sesión.

El usuario que ha relizado la compra entra a la página 'Cosas' para ver el estado de su pedido. el usuario entra a 'Cosas' y pulsa el boton acceso que le aparece una página que le piden sus credenciales y poesteriormente elige la opción 'ver pedidos', donde tiene un historico de sus pedidos y el estado de cada pedido, en su caso encuentra que su pedido se encuentra en estado 'enviado'.

Como véis es un caso muy general que en mundo web este ejemplo. De este ejemplo vamos analizador para obtener la caracteristicas de la seguridad que tiene implementada. Lo primero que podemos abstraer son los distintos tipos de usuarios:
  •  Anónimo
  •  Usuario
  •  Administrador
Otra cosa que podemos abstraer es que hay usuario que estan autenticados (logeados) y no autenticados:
  • No autenticados: Anónimo.
  • Autenticados :  Usuario y Administrador.
Si seguimos analizando nuestro ejemplo, sí estan autenticados el usuario y dependiendo de quien sea puede ver más o menos opciones en la página web.
  • Permisos para tipos Usuario
  • Permisos para tipos Administrador
Con esto ya tenemos analizado el sistema de seguridad de la página web 'Cosas', como se puede ver la seguridad el mundo web esta formado por:
  • Tipos de Usuarios
  • Permisos de Usuarios
La seguridad web consiste:

 1º Autenticación (Obtener el tipo de usuario)
 2º Autorización para ver tal cosas (Ver los permisos de pendiento del tipo de usuario)



Una vez visto la teoría de la seguridad web vamos a explicar los distintos técnicas que tenemos de de implantar seguridad en nuestras aplicaciones web y api rest.

miércoles, 23 de julio de 2014

Ejemplo de Backbone

Despues de ver la distintas clase de Backbone y sus caracteristicas, procedemos para hacer un pequeño ejemplo completo con todos los componentes de Backbone. A ver el ejemplo se ha realizado con la herramientas y tecnologias:
  • BackEnd  RestGenerator para generar Api Rest (JAX-RS, Spring, Mybatis, H2)
  • FrontEnd Html5, CSS3, Backbone, Jquery, Underscore
Como siempre el ejemplo esta publicado en github y con la explicación de como usarlo. Aqui tenéis un resumen de lo que hemos visto de Backbone.


Backbone (Router)

Router

Las routers son las encargadas de enrutar las URLs de nuestras aplicaciones


 Base = Backbone.Router.extend({
 routes : {
  "" : "root",
  "usuario/:id" : "usuarioSingle"
 },
 root : function () {
  console.log('Estoy en root');
 },
 usuarioSingle : function (id) {
  console.log('Estoy en un usuario '+id);
 }
});

 Backbone.history.start({
  silent : false //Para que salte el evento
 });

Vamos a explicar un poco esta clase para compreder su funcionamiento.

Routes

Para ello se define un objeto hash routes que contendrá todas las rutas que se atenderán, debiendo contener al menos una.

Con esto tenemos la base para crear rutas en backbone, os envito a ver todos los métodos que tiene la clase Route de Backbone.

Backbone (View)

View

Las vista son las encargadas de representar la datos de nuestro modelo al usuario y también se encargan de capturar eventos y reaccionar de forma adecuada.


UsuarioView = Backbone.View.extend({
   tagName : "li",
   className : "item",
   events : {
    "click .delete" : "deleteUsuario"
   },
   initialize : function () {
    console.log('creado una view de usuario');
    this.template = _.template( $('#usuario-template').html());
   },
   deleteUsuario : function(e){
    this.$el.unbind();
    this.$el.remove();
   },
   render : function () {
    var data = this.model.toJSON();
    var html = this.template(data);
    this.$el.html(html);
   }
});

var usarioView = new UsuarioView({model : usuario});

Vamos a explicar un poco esta clase para compreder su funcionamiento.

La propiedad el

Cada instancia de una vista contendrá una propiedad llamada el, que será el objeto DOM que tendrá todo el contenido de la vista. Este elemento se crea automáticamente como un elemento div vacío, salvo que se indique lo contrario con las propiedades tagName y className, en nuestro caso va ser un elemto li con la clase item.
Por comodidad yo uso la propiedad $el que es el objecto DOM pero convertido en un objecto de jquery.

El método render

Este método se debe sobre escribir siempre porque es un método vacío, este método es el encargado de renderizar la plantilla de la vista con los datos del modelo y actulizar la propiedad $el

Eventos

Toda vista puede definir eventos y sus escuchadores, para ello se define un objeto hash llamado events con el siguiente formato en cada propiedad: {“event selector”: “callback”}. De esta forma indicaremos que para cada evento que ocurra bajo los elementos indicados por el selector se ejecutará la función callback.

Con esto tenemos la base para crear vistas de backbone, os envito a ver todos los métodos que tiene la clase View de Backbone.


Backbone (Collection)

Collection

Las colecciones son un conjunto de modelos. Una regla es que cada colección tiene que ser de un tipo de modelo,
aunque realmente no hay restricción alguna y pero por convección se hace así. Vamos a ver como crear una colección

Usuarios = Backbone.Collection.extend({
  url : '/rest/usuario/all',
  model : Usuario,
  initialize: function(){
   console.info('Creado una collecion de usuarios');
  }
});



Aqui hemos creados la clase collection de Usuarios, Como podemos ver el atributo model le indicamos el tipo de nuestra coleccion,
vamos a ver algunas metodos de la clase Collection

  • add
  • get
  • at
  • fetch
   
El método add añadido un modelo a nuestra coleccion

var usuarios = new Usuarios();

usuarios.add([{nombre:'Pepe', apellidos:'Perez Alonso'}, 
              {nombre:'Jose', apellidos:'Garcia Serrano'}]);



El método get obtiene el modelo con el id que le pasamos por argumento

usuarios.get("id-de-usuario");


El método at obtiene el modelo en la posción que se pase por argumento

usuarios.at(1)


El último método fetch es el encargado de hacer un petición al servidor y obtener un conjunto de datos  y crear un modelo por cada uno de los datos obtenidos en la petición y añadirlo a la colección

usuarios.fetch();


Con esto tenemos la base para crear colecciones de backbone, os envito a ver todos los métodos que tiene la clase Collection de Backbone.

Backbone (Model)

En esta entrada voy hablar de backbone una libreria MVC para JavaScript, desde la gran separacíon entre el FrontEnd y Backend, estan surguiendo una monton de librerias de para FrontEnd (Backbone, AngularJs, Ember, ...). En esta ocasión voy hablar de Backbone.

Backbone es una librería que nos permite construir apliaciones web en javascript siguiendo el patron MVC. Como bien dice el nombre de la librería nos proporciona la columna vertebral de nuestra aplicación web. De tal modo que la libreria esta formada por 4 clases:


  • Model
  • Collection
  • View
  • Route

Model


Los modelos son los encargados de almacenar los datos de tu aplicación. como simepre vamos a ver un ejemplo que es la mejor manera de verlo.


Usuario = Backbone.Model.extend({
 initialize: function(){
       console.info('Creado un usuario');
 }
});


Con esto ya tenemos una clase del modelo de backbone y ademas se ha hecho una extensión del metodo initialize que escribera por la consola "Creado una usuario",cuando hagamos una instacia de la clase Usuario saldra por consola el mensage del metodo initialize.


var usuario = new Usuario({nombre : 'Pepe', apellidos : 'Perez Lopez'});


Con esto ya tenemos un objecto usuario con unos datos a vamos a ver algunos metodos de la clase Model de backbone:

  • get
  • set
  • change
  • save
  • destroy
   
Los dos primero (get, set) métodos nos permite obtener o modificar el valor de un atributo.


console.log(usuario.get('nombre'));

usuario.set({edad : 19});

console.log(usuario.get('edad'));


El metodo change no permite escuchar cuando se produce un cambio en el modelo


usuario.bind('change:nombre', function(target, valor, options){
   //Podemos acceder a la variable interna
   var old = this.previousAttributes().nombre;
   console.log('Modificado nombre a ' + valor + '. Antiguo valor:' + old);
});

usuario.set({nombre : 'Jose'});


Los últimos métodos (save, destroy) son los encargados de sincronizar el modelo con el servidor, para sincronicar con el servidor hay que rellenar el atributo urlRoot del modelo para saber la direccion donde tiene que hacer la petición backbone.

Una cosa que tenemos que tener muy en cuenta es que backbone nos dice que cada modelo tiene que ser único es decir que tiene que tener una campo identificador 'id', en caso que nuestro modelo no tiene una campo id, podemos indicar a la clase Model de backbone cual es el campo identificador, para eso tenemosq que modificar el valor idAttribute del modelo.

Todo esto es para cuando un modelo tiene el campo identificador (id o idAttribute ) a null, el método save va hacer una llama POST al servidor, en caso de esta relleno se hace un PUT, cuando llamamos al metodo destroy se hace DELETE

Con esto tenemos la base para crear modelos de backbone, os envito a ver todos los métodos que tiene la clase Model de Backbone.

martes, 17 de junio de 2014

RestGenerator (Generador de servicios rest)

Hola

En esta entrada voy hablar sobre el generador que he creado para crear servicios rest desde una tabla de base de datos. RestGenerator es una herramienta de RAD (rapid application development). La idea principal de RestGenerator es la siguiente:







Lo que hace rest generador es leer la tablas de la base de datos y crear un proyecto de servicio rest con las operacion CRUD de cada una de la tablas.

El proyecto que generar utiliza la siguiente tecnologías:
  1. Jersey
  2. Spring
  3. Mybatis
RestGenerator es un proyecto que esta basado en Maven, las únicas restinciónespara poder usar el generador son la siguientes:
  1. Java (1.6 o superior)
  2. Maven 3
El proyecto esta formado por un plugin y un arquetipo de maven y la mejor forma de entender Restgenerator es hacer un prueba, como simpre el proyecto lo tengo github enlace además en Readme.md tiene la explicación de la instalación y uso.

Cualquier duda sobre el generador preguntarme.




jueves, 5 de junio de 2014

Jersey 2 con Jboss 6.1

Hola

En esta entrada voy hablar como configurar Jboss 6.1 para funcionar con Jersey 2, Jboss tiene como implementación de JAX-RS RestEasy que pertenece a Jboss (lógico que use esta implementación), lo que hay que hacer es desactivar el módulo de JAX-RS para eso tenemos que ir al fichero module.xml:

${JBOSS_HOME}/modules/system/layers/base/javax/ws/rs/api/main

Y comentar la siguientes lineas:

 <resources>
        <!-- Disable the next line Para coger la version JSX-RS 2.0-->
        <!-- <resource-root path="jboss-jaxrs-api_1.1_spec-1.0.1.Final-redhat-2.jar"/> -->
        <!-- Insert resources here -->
    </resources>


Ahora vamos a comentar standalone.xml
${JBOSS_HOME}/standalone/configuration

Y comentar la siguientes lineas:

 
<!--<extension module="org.jboss.as.jaxrs"//>-->
<!--<subsystem xmlns="urn:jboss:domain:jaxrs:1.0"/>-->

Lo único malo de esto es que estamos desactivado JAX-RS para todos los proyectos web.


miércoles, 4 de junio de 2014

Spring MVC (Servicios Rest)

Hola

En esta entrada voy hablar como hacer servicios rest con Spring MVC, como bien sabéis anteriormente había publicado como hacer servicios rest con Jersey y RestEasy. Spring para poder adaptarse a elegido a Spring MVC dar mas funcionalidad en vez de crear una nuevo modulo para los servicios rest. Si habeis programdor aplicaciones web con Spring MVC el aprendizaje va ser casi instantaneo y si veneis de Jersey o RestEasy su aprendizaje tambie va ser rápido.

Las Capas de Servicios y Dao son iguales que en los ejemplos que tenemos en Jersey y RestEasy por eso voy a explicar el controlador y la configuración.

Controlador

Es la clase que se encarga de recibir la peticion, procesar y dar una respuesta. el codigo es el siguiente:

@Controller
@RequestMapping(value = "/cursos")
public class CursoWS {

        @Autowired
 private CursoService service;

        @RequestMapping(value = "/all", method = RequestMethod.GET, produces = "application/json")
 @ResponseBody
 @ResponseStatus(value = HttpStatus.OK)
 public List getCursos() {  
  CursoExample example = new CursoExample();
  example.createCriteria().andActivoEqualTo(true);
  return service.getAll(example);
 }
}

Como veis es parecido a Jersey y RestEasy, lo que cambia es el Path por RequestMapping para indicar la url de nuestro servicio rest. Por lo demas es casi igual que Jersey y RestEasy.
Con esto ya tenemos el servicio rest lo único falta es la configuración para que funcione es activar la configuración de mvc en nuestro applicationContext


Con esto ya tenemos activada la configuración spring mvc y por último creamos un fichero en WEB-INF con el nombre spring-dispatcher-servlet.xml con la siguiente códgio
 

Por último el web.xml

  SpringMVCRest
  org.springframework.web.servlet.DispatcherServlet
  
            contextConfigLocation
            /WEB-INF/spring-dispatcher-servlet.xml
        
        1
 
 
 
  SpringMVCRest
  /rest/*
 
Con esto ya tenemos todo, como simepre el ejemplo completo en github

jueves, 22 de mayo de 2014

Eclipse aumentando su rendimiento (Performance)

Hola

En esta entrada voy a hablar sobre eclipse el IDE más usado por la gente (eso creo) , en esta ocasion voy a explicar como aumentar el rendimiento de nuestro ide favorito para programar en Java. Como mucho de vosotros ya sabeis que eclipse esta hecho con Java con la libreria SWT. Al ser una aplicación java pues logicamente esta funciona sobre una JVM, como ya habréis imaginado para aumentar la velocidad de eclipse tenemos que poner o tocar parametros de configuración de la JVM.

Lo ideal seria tener memoria RAM infinita entonces podriamos a nuestro eclipse uan burrada de memoria, pero por desgracia eso no es asi la memoria RAM es finita. Actualmente todo los PC o Portatiles tiene 4 o más de GB de RAM(en caso contrario intenta aumentar tu memoria ram). Yo voy a poner una configuración para un ordenador con 4 GB de RAM. Para tocar los paramentros de ejecución de eclipse para JVM tenemos que abrir el fichero eclipse.ini que se encuentra en la carpeta donde tengamos eclipse instalado.

${HOME_ECLIPSE}/eclipse.ini

-vmargs
-server
-Xmn128m
-Xms1024m
-Xmx2048m
-Xss2m
-XX:PermSize=512m
-XX:MaxPermSize=512m
-XX:+UseParallelGC
-Xverify:none

Algunos parametros estaran y otros no, como veis lo que hago es reservar la mitad de la memoria ram para eclipse este valor podemos bajarlo a un 1,5GB para dejar 2,5GB al sistema operativo y otros programas. (Yo con esto funciono bien). Con esto ya tenemos configurado el eclipse para que no de problemas con la falta de memoria.

Ahora vamos a tocar configuraciones propias del eclipse, seguramente cuando arrancamos el eclipse trada bastante en arranca, eso es debido a la gran cantidad de plugin que tenemos instalado en nuestro IDE. ¿Cómo podemos hacer que el arranque sea más rápido?

Solo tenemos que ir a la ventada:

windows-->Preferences

Una vez pinchamos en:

General-->Startup and Shutdown

Como podemos ver en esta caso yo tengo desactivados todos, pero cada uno puede elegir la configuración  que mas le interese.


Otra cosa que nos molesta es que cuando tenemos mucho proyectos abiertos esta todo el rato validando o compilando(si son proyectos pequeños no se nota, pero si son grande si se nota y mucho).
En la misma pantalla de Preferences, en arbol buscamos Validation, hay activamos o desactivamos las opciones que nos interese.


Esta es la configuración general pero luego para cada proyecto podemos sobreescribir la configuraciones:

Botón derecho sobre raiz del proyecto y Validation.

Puesta a punto

Por ultimo esta tarea hay que hacer cada cierto tiempo, es una puesta punto al eclipse. Cuando estamos trabajando con nuestro eclipse solemos utilizar atajos sobre todo:

CRTL+SHIFT+R, CRTL+SHIFT+T, CRTL+SHIFT+O

Para buscar un fichero en nuestros proyectos, esto lo que hace es que eclipse escriba en el carpeta de .metadata de nuestro workspace:

${WORKSPACE}/.metadata/.plugins/org.eclipse.jdt.core

Hay mucho ficheros los eliminamos y ya esta. Otra cosa que hay que eliminar el historia local que tiene eclipse con los ficheros que trabajamos (no es cvs, svn y git), es que eclipse te guardar las modificaiones que has hecho en un fichero durante un cierto tiempo, para borrar esos fichero tenemos que ir a:

${WORKSPACE}/.metadata/.plugins/org.eclipse.core.resources/.history

Hay eliminamos todos los ficheros y carpetas.

Con esto ya tenemos mas que tuneado nuestro eclipse para trabajar máximo rendimiento.

Saludos

martes, 13 de mayo de 2014

Paginacion Mysql, Oracle y SQLServer

Hola

En esta entrada voy ha explicar como hacer paginación en la tres bases de datos más usadas en el mundo, es decir las que he usado yo hasta hoy, lo primero es decir que es paginación.

Paginación



La paginación consistente en traerse una cantidad de registros y de ser necesarios más saltar a una página posterior.

Cuando usamos ORM, Hibernate, Mybatis, etc..., Lo mejor es hacer sql nativas que van a ir muy rápidas. Lo malo es que cada base de datos tiene un forma distintas de hacerlo, no hay una query común que sirva para todas las bases de datos.

Mysql

Mysql tiene la clasula limit y offset, limit le indica el número máximo de registro y offset indica la posición del registro que se va empezar.

   
select columna_1, columna_2 
from tabla 
where columna_3 = 'algo' 
order by columna_1 
limit 10  
offset 0


Oracle

Oracle tiene la clasula rownum, rownum es una seudo columna que devuelme para cada registro del resultado de la consulta una poscion numerica.

SELECT * FROM ( 
SELECT a.*, rownum minimun FROM ( 
select columna_1, columna_2 from tabla
 where columna_3 = 'algo'
 order by columna_1
 ) a
 WHERE rownum <= 10
)WHERE minimun > 0

SQLServer

SQLServer tiene la clasula top, top se emplea para obtener sólo  una cantidad limitada de registros, los primeros n registros de una consulta.

select TOP 10 b.*
 FROM
 (
 SELECT ROW_NUMBER() OVER 
 (
 order by columna_1
 ) as row_number, *
 FROM
 (
 select columna_1, columna_2
 from tabla
 ) AS a
 where columna_3 = 'algo'
) AS b
 where b.row_number > 0

Autenticación http-basic spring y weblogic

Hola

En esta entrada voy hablar sobre como usar spring security con http-basic y weblogic.

Cuando usamos spring-security como método de autenticación http-basic y desplegamos en weblogic, sucede algo rar, que es que nos pregunta dos veces el usuario y password. ¿Porque sucede esto?

Lo que pasa es que cuando se lanza una petticion a nuestro servidor, salta primero el filtro de  spring pidendo el usario y password. Cuando aceptamos weblogic detecta que en la cabecera de la petición va una petición con autenticación http-basic entonces como no se encuentra ese usuario en su sistema de usarios. nos saca otra vez la peticion de usuario y password.¿Como solucionar este problema?

Fácil desactivando a weblogicla validación forzosa de http-basic. Lo que hay que hacer es tocar un fichero de weblogic. que se encuentra el la siguiente ruta:

MW_HOME/user_projects/domain/DOMAIN_NAME/config/config.xml

Buscar la linea y poner el valor false.

<enforce-valid-basic-auth-credentials>false</enforce-valid-basic-auth-credentials>



lunes, 31 de marzo de 2014

JAX-RS (Jersey y RestEasy)

Java API for RESTful Web Services es una la Api de Java que proporciona soporte para la creación de servicios web de acuerdo con la defición de Api Rest.

A partir de la versión 1.1 en adelante, JAX-RS forma parte de Java EE 6. Unas de las características de JAX-RS es la utilización de anotaciones para el
rápido desarrollo de los recursos del servicio web. A continuación un listado las anotaciones.

Lista de anotaciones de creación del recurso:
  •     @Path especifica la ruta de acceso relativa para una clase recurso o método.
  •     @GET, @PUT, @POST, @DELETE y @HEAD especifican el tipo de petición HTTP de un recurso.
  •     @Produces especifica los tipos de medios MIME de respuesta.
  •     @Consumes especifica los tipos de medios de petición aceptados.
   
Lista de anotaciones de obtención de  información de la solicitud:
  •     @PathParam enlaza el parámetro a un segmento de ruta.
  •     @QueryParam enlaza el parámetro al valor de un parámetro de consulta HTTP.
  •     @MatrixParam enlaza el parámetro al valor de un parámetro de matriz de HTTP.
  •     @HeaderParam enlaza el parámetro a un valor de cabecera HTTP.
  •     @CookieParam enlaza el parámetro a un valor de cookie.
  •     @FormParam enlaza el parámetro a un valor de formulario.
  •     @DefaultValue especifica un valor por defecto para los enlaces anteriores cuando la clave no es encontrada.
  •     @Context devuelve todo el contexto del objeto. (Por ejemplo: @Context HttpServletRequest request)   
Una vez vista las características JAX-RS como bien dice es una api de java ahora vamos a ver un listado de implementaciones de esta api:
  •     Jersey (Oracle) Implementación de Referencia
  •     RestEasy (Jboss)
  •     ApacheCXF (Codigo Abierto)
Como siempre esto se ve mejor en un ejemplo actualemente tengo 2 ejemplos, usando Jersey y RestEasy, en ambos ejemplos hay un cliente para consumir los servicios rest, esto ejemplos estan probado en JBOSS 6.1 EAP, además estos ejemplos estan
 configurado para usar con Spring.

Api Rest

En esta entra voy a explicar los que es un api Rest

¿Qué es REST?
REpresentational State Transfer, es una arquitectura de tipo SOA que esta basado en HTTP.

REST nos permite crear servicios que pueden ser comsumidos por cualquier dispositivo, cliente o otro servicio REST que conozca el protocolo HTTP,
como consecuencia esto los servios rest son mas simples que otras alternativas que se han usado en los últimos años como SOAP y XML-RPC.

REST se definió en el 2000 por Roy Fielding, coautor principal también de la especificación HTTP.

Existen tres niveles de calidad a la hora de aplicar REST en el desarrollo de una API
Estos niveles son:
  •     Uso correcto de URIs
  •     Uso correcto de HTTP.
  •     Implementar Hypermedia.
   
Una de las caracteriscas de Rest es un servicio sin estado es decir toda la información que se necesaria para mostrar la
información que se solicita debe estar en la consulta por parte del cliente.


Nivel 1: Uso correcto de URIs

Denominamos recurso el acceso a la información del servicio rest.

Las URL, Uniform Resource Locator , son un tipo de URI, Uniform Resource Identifier, que nos permite de identificar de forma única el recurso,
nos permite localizarlo para poder acceder a él o compartir su ubicación.

Estructura de una URL:

{protocolo}://{dominio o hostname}[:puerto (opcional)]/{ruta del recurso}?{consulta}

Como siempre hay unas reglas para el nombrado de los recursos de nuestras Apis Rest:
  •     Los nombres de URI no deben implicar una acción, por lo tanto debe evitarse usar verbos en ellos.
  •     Deben ser únicas, no debemos tener más de una URI para identificar un mismo recurso.
  •     Deben ser independiente de formato.
  •     Deben mantener una jerarquía lógica.
  •     Los filtrados de información de un recurso no se hacen en la URI.

Nivel 2: HTTP

Para desarrollar APIs REST se debe dominar y conocer los siguientes aspectos:
  •     Métodos HTTP
  •     Códigos de estado
  •     Aceptación de tipos de contenido  
Métodos.

Como hemos nombrado anteriormente, en la url's no debemos poner la accion porque HTTP nos proporciona los siguientes métodos con los cuales debemos operar:
  •     GET:  consultar recursos
  •     POST:  crear recursos
  •     PUT:  editar recursos
  •     DELETE:  eliminar recursos.
  •     PATCH: editar partes concretas de un recurso.   
Códigos de estado.

Uno de los errores más frecuentes a la hora de construir una API suele ser el desarrollo
de APIs con códigos de error propios.

Ejemplo

Petición
========
PUT /coches/123

Respuesta
=========
Status Code 200
Content:
{
  success: false,
  code:    734,
  error:   "datos insuficientes"
}

Como podemos ver en el ejemplo se devuelve un código de estado 200, que significa que la petición se ha realizado correctamente,
pero, estamos devolviendo en el cuerpo de la respuesta un error y no el recurso solicitado en la URL.

HTTP tiene un gran abanico muy amplio que cubre todas las posibles indicaciones que vamos a tener que añadir en nuestras respuestas cuando las operaciones han ido bien o mal.

Petición
========
PUT /caches/123

Respuesta
=========
Status Code 400
Content:
{
  message: "se debe especificar un id de coche"
}

Tipos y formatos de contenido.

Cuando hablamos sobre URLs, vimos también que no era correcto indicar el tipo de formato de un recurso al cual queremos acceder o manipular.

HTTP nos permite especificar en qué formato queremos recibir el recurso, pudiendo indicar varios en orden de preferencia, para ello utilizamos el header Accept.

Nuestra API devolverá el recurso en el primer formato disponible y, de no poder mostrar el recurso en ninguno de los formatos indicados por el cliente mediante el header Accept, devolverá el código de estado HTTP 406.

Nivel 3: Hypermedia.


Con Hypermedia básicamente añadimos información extra al recurso sobre su conexión a otros recursos relacionados con él.

Aquí tenemos un ejemplo:    
<pedido>
     <id>666</id>
     <estado>Procesado</estado>
     <links>
       <link rel="factura">
        http://example.com/api/pedido/666/factura 
           </link> 
    </links>   
 </pedido>

En este ejemplo vemos cómo indicar en un xml que representa un pedido, el enlace al recurso de la factura relacionada con el mismo.

Sin embargo, necesitamos que el cliente que accede a nuestra API entienda que esa información no es propia del recurso, sino que es información añadida que puede utilizar para enlazar el pedido con la factura.

Para ello conseguir esto, debemos utilizar las cabeceras Accept y Content-Type, para que tanto el cliente como la API, sepan que están hablando hypermedia.

Por ejemplo:

Petición
========
GET /pedido/666
Accept: application/nuestra_api+xml, text/xml

Respuesta
=========
Status Code: 200
Content-Type: application/nuestra_api+xml
Content:

<pedido>
 <id>666</id>
 <estado>Procesado</estado>
 <links>
   <link rel="factura">

http://example.com/api/pedido/666/factura

   </link>
 </links>
</pedido>

Como vemos, el cliente solicita el formato application/nuestra_api+xml de forma preferente al formato text/xml.
De esta forma, le indica al servicio web, que entiende su formato hypermedia y puede aprovecharlo.

El servicio web por lo tanto, como implementa hypermedia, le devuelve la información de recurso y la información de
hypermedia que puede utilizar el cliente.


Una vez ya ententido la teoría de Api Rest lo siguiente es implementar una Api Rest en Java.

lunes, 24 de marzo de 2014

JNDI

Hola

En esta entrada voy a hablar sobre JNDI, Jndi son las siglas de Java Naming and Directory Interface, es una interfaz de programación (API) que proporciona funcionalidades de nombrado y directorio a las aplicaciones escritas usando Java.

¿Para que sirve?

Sirve para configurar recursos compartidos para aplicaciones java organizándolos por directorio con nombres únicos.

Es un servicio de nombres que permite:
  • Relacionar nombres con objetos.
  • Permitir la búsqueda de un objeto por su nombre.
Por ejemplo:
  • LDAP (Lightweight Directory Access Protocol)
  • NDS (Novell Directory Service)
  • NIS (Network Information Service) 
Cada servicio tiene una forma de acceso diferente, lo que implica que si se cambia de fabricante hay que reescribir los clientes. Es por eso que se usa JNDI como capa por encima pues ofrece un acceso común a los recursos configurados.


Ahora vamos habla de como es la arquitectura de JNDI:

La API JNDI  permite escribir código Java que realice operaciones sobre directorios. Es una API uniforme a todos los tipos de servicios de directorios. Es similar a JDBC.

Service Provider Interface (SPI) permite acceder al servicio de directorio específico de cada fabricante.
Mapea código JNDI en operaciones específicas de directorios. Es un driver JNDI.
 
Algunos conceptos de JNDI:

Vamos a ver un listado de conceptos básicos de JNDI
  • Nombres Atómicos: es el componente indivisible de un nombre.
  • Nombres Compuestos: es un conjunto de cero o más nombres atómicos
  • Un binding es una asociación de un nombre con un objeto.
  • Un contexto (context) es un objeto que contiene cero o más bindings. Cada binding tiene un nombre atómico.
  • Un sistema de nombres es un conjunto de contextos.
  • Un espacio de nombres (namespace) son todos los nombres contenidos en un sistema de nombres.
  • Initial Context es el punto de entrada para comenzar a explorar un espacio de nombres. Es el primer contexto que se usa, es el punto de entrada para realizar las operaciones de nombres y de directorio.
  • Para obtener el InitialContext se usa el InitialContextFactory y el providerURL.
  • InitialContextFactory es el driver JNDI, es una clase Java. Conoce la semántica específica de una estructura de directorios particular.
  • El providerURL es la URL que se usa como punto de entrada para empezar a navegar.


import javax.naming.Context;
import javax.naming.InitialContext;
public class InitCtx {

public static void main(String args[]) throws Exception {
// Definir el contexto inicial
Properties props = new Properties();
FileInputStream in = new FileInputStream(“archivo.properties”);
props.load(in);
Context ctx = new InitialContext(props);
System.err.println("Success!");
}
}
 
El contenido de archivo.properties es el siguiente:
 
Context.INITIAL_CONTEXT_FACTORY=com.sun.jndi.ldat.LdapCtxFactory 
Context.PROVIDER_URL=ldap://louvre:389 

Nombre de la clase del driver JNDI
Ubicación del arbol de JNDI

En el desarrolo de JEE, JNDI nos provee diferentes funciones, por ejemplo:
  •  Obtener una referencia al API de transacciones (JTA)
  •  Conectarse a fabricas de recursos (JDBC, JMS)
  •  Localizar EJB







martes, 18 de marzo de 2014

EJB

Hola

En esta nueva entraga voy a explicar como conectarnos remotamente a un EJB desplegado en Jboss 6.1 EAP, lo primero voy a explicar lo que es un EJB y JNDI.



Los EJB (Enterprise JavaBeans) es un componente que pertenece la JEE, los EJB se tiene que ejecutar en contenedor de EJB ´s,  por ejemplo JBOSS 6.1 EAP que implementa JEE 6.  que nos ofrece las siguientes caracteristicas:

  • Comunicación remota
  • Transacciones
  • Control de concurrencia
  • Seguridad
  • etc.

Los EJB no se puede acceder directamente siempre tenemos que acceder a traves de un proxy,  Los EJB tiene dos tipos de proxy:

  • LOCAL Nos permite el acceso al ejb desde la misma JVM.
  • REMOTE Nos permite el acceso al ejb desde una JVM remota. 
Los proxy son los encargados de darnos todas las características que nos ofrece los EJB.  Cuando implementemos nuestro EJB tenemos que eligir entre 2 tipos:


  • stateful: En un bean de sesión con estado, las variables de instancia del bean almacenan datos específicos obtenidos durante la conexión con el cliente.
  • stateless: Los beans de sesión sin estado son objetos distribuidos que carecen de estado asociado permitiendo por tanto que se los acceda concurrentemente

Con esto es todo de los EJB, en la proxmia entrega os explicare JNDI. De todas formas os dejo el código para que le echeis un vistazo y lo analizes.

Código Fuente