martes, 17 de noviembre de 2015

Hello World: Docker, Kubernetes, and Microservices.

Getting Started with Docker
  • Download Docker Toolbox 1.9.0 for  Windows.
  • Install Docker Machine 0.5.0

jueves, 19 de diciembre de 2013

Cross-Origin Resource Sharing con Mule ESB y jQuery (REST)

Integración de cliente jQuery ó Java Script con un servicio Rest publicado usando Mule ESB como server.

En esta integración todos se encontraran con problemas de CORS (Cross-Origin Resource Sharing), basicamente se dan cuando se llama desde Java script a recursos rest en dominios y contextos distintos. Es decir, la aplicación cliente tiene la siguiente url:www.domainclient.com/appclient y el servidor publica servicios en www.domainserver.com/appserver. 

Error generado:


Solucion


App Cliente: 



Mule App Server: 

Agregar como header en el response: Access-Control-Allow-Origin, Access-Control-Allow-Headers


Resultado 

sábado, 1 de junio de 2013

Google Play Game Services - Google Day Peru


Entorno de desarrollo:


Descargar el ADT o Android Studio





Tener Instalado lo siguiente en el SDK Manager:




Descargar los ejemplos:


https://github.com/playgameservices/android-samples


Importar google-play-services_lib como proyecto Android:


Ruta: adt-bundle-windows-xx\sdk\extras\google\google_play_services\libproject\google-play-services_lib


Importar los ejemplos descargados como proyecto Android:

 Estos proyectos debe tener la siguiente configuracion:


Configuracion de Google Play Games Service en la consola Google Play: https://play.google.com/apps/publish



Referencias:











https://developers.google.com/games/services/

Algunos Juegos que ya estan usando Google Play Games Services:
https://play.google.com/store/apps/details?id=com.vectorunit.yellow
Beach Buggy Blitz



lunes, 4 de marzo de 2013

Code Lab Uno - [Android] Google Cloud Messaging


[Google Cloud Messaging - Android | AppEngine] Pasos para implementar Google Cloud Messaging en Android. Como de costumbre no detallare ninguna teoria, sera totalmente practico.

Requisitos:
- Entorno de desarrollo Eclipse
- Android SDK
- AppEngine SDK
- Google Plugin for Eclipse

Paso a Paso:
1.-Crear un proyecto Android.




Next> Next>























2.- Clic derecho en el  proyecto >  Google > Generate App Engine BackEnd..













3.- Observa, se genero un Proyecto App Engine.



Tambien se genero 3 Clases en el proyecto  Android.


4.- Configurar Google Cloud Messaging en API Console https://code.google.com/apis/console

Crear un proyecto:


Ingresar a la opción Services y activar el servicio Google Cloud Messaging for Android:

Apuntar el valor de Project Number, este sera usado  en la clase GCMIntentService.java


Entrar a la opción API Access, apuntar el valor de Api Key que se usará en la clase MessageEndpoint.java del proyecto App Engine





5.- Deployar el proyecto AppEngine en la Nube

Clic derecho en el  proyecto  App Engine > Google > Deploy to AppEngine.


Una vez deployado en la nube tendras la url del Backend en este caso es http://codelabunogcm.appspot.com, esta url se usara en la clase CloudEndpointUtils.java del proyecto Android.


6.- Configurar Project Number en la clase GCMIntentService.java en el proyecto Android.

protected static final String PROJECT_NUMBER = "1080067658096";

7.- Configurar el Api Key en la clase MessageEndpoint.java del proyecto AppEngine y volver a deployar en la nube.

private static final String API_KEY = "AIzaSyCVCOuMfOUxL5zHucEiJbbHzY97RtNJT9Q";

8.- Correr la aplicacion Android en el Emulador, ingresar y dar clic en registrar. En esta acción la aplicación enviará el RegistryID del generado para el emulador y lo enviaráa al  BackEnd via Rest.

9.- Ingresar la consola de Servicios Rest del backend http://codelabunogcm.appspot.com/_ah/api/explorer

10.- Entrar al servicio Rest Services > messageEndpoint API v1 > messageEndpoint.sendMessage, luego  enviar el mensaje.


11.- Verificar en la pantalla del Emulador la llegada del  mensaje.

Referencias:


Si hay algo que se me paso  no documentarlo, comentar abajo.  Espero les sirva en algo.

lunes, 25 de febrero de 2013

Primer CodeLab de Web Services con Mule ESB, JAX WS, SOAP, WSDL, Spring

Primer CodeLab de Web Services usando [Mule ESB, JAX WS, SOAP, WSDL, Spring]. en este post no hablaré nada teórico sobre Mule, ya que ello lo pueden encontrar Googleando, será un lab totalmente práctico.

Requisitos:
- JDK  1.6
- MuleStudio
- soapUI

Paso a Paso para crear Web Services con Mule:



1. Crear proyecto Mule (MuleStudio): 




Next > Next > Next > Finish







2.- Crear el Objeto Producto.java
package com.dmotta.mule.labuno.mulelabuno.bo;
import java.io.Serializable;
public class Producto implements Serializable {
private String id;
private String nombre;
private String marca;
private String descripcion;

public Producto() {
}

public Producto(String id, String nombre, String marca, String descripcion) {
this.id=id;
this.nombre=nombre;
this.marca=marca;
this.descripcion=descripcion;
}
//getters/setters
}


3.- Crear la Interface que publicará los métodos listarProductos() y getDetalleProducto() y añadir las anotaciones @WebService, @WebResult para indicar que sera un servicio web.

package com.dmotta.mule.labuno.mulelabuno;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

import com.dmotta.mule.labuno.mulelabuno.bo.Producto;

@WebService
public interface ICatalogoService {

@WebResult(name="lista")
public List listarProductos() throws Exception;

@WebResult(name="detalle")
public Producto getDetalleProducto(@WebParam(name="productoId") String productoId) throws Exception;

}


4.- Crear la clase CatalogoServiceImpl.java  que Implementa la Interface ICatalogoService.java

package com.dmotta.mule.labuno.mulelabuno.impl;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import com.dmotta.mule.labuno.mulelabuno.ICatalogoService;
import com.dmotta.mule.labuno.mulelabuno.bo.Producto;

@WebService(endpointInterface = "com.dmotta.mule.labuno.mulelabuno.ICatalogoService", serviceName = "productoCatalogService")
public class CatalogoServiceImpl implements ICatalogoService {

 private List listaProducto;

 public CatalogoServiceImpl() {
   listaProducto = new ArrayList();
   listaProducto.add(new Producto("100", "Nexus 4", "LG", " Tablet Google Nexus 4"));
   listaProducto.add(new Producto("101", "Nexus 7", "ASUS", " Tablet Google Nexus 7"));
   listaProducto.add(new Producto("102", "Nexus 10", "SAMSUNG", " Tablet Google Nexus 10"));
 }

 @Override
 public List listarProductos() throws Exception {
   return listaProducto;
 }

 @Override
 public Producto getDetalleProducto(String productoId) throws Exception {
   Producto prod = new Producto();
   for (Producto producto : listaProducto) {
     if (productoId.equals(producto.getId())) {
       prod = producto;
     }
   }
   return prod;
 }

}


5.-  Editar el archivo de configuración de Mule, en este lab se llamará LabUno.xml (por default es mule-config.xml)



6.- Asimismo, Mule genera de manera automatica el archivo mule-deploy.properties

#Mon Feb 25 12:11:42 COT 2013
redeployment.enabled=true
encoding=UTF-8
domain=default
config.resources=LabUno.xml



7.- Finalmente LabUno.mflow, quedaria de la siguiente manera:



8.- Clic derecho : Run As > Mule Application
.
.
INFO  2013-02-25 16:33:37,939 [[labuno].config.change.1.thread.1] org.mule.module.management.agent.JmxAgent: Registered Endpoint Service with name: Mule.labuno:type=Endpoint,service="WebServiceFlow",connector=connector.http.mule.default,name="endpoint.http.localhost.8080.services.ICatalogoService"
INFO  2013-02-25 16:33:37,940 [[labuno].config.change.1.thread.1] org.mule.module.management.agent.JmxAgent: Registered Connector Service with name Mule.labuno:type=Connector,name="connector.http.mule.default.1"
INFO  2013-02-25 16:33:37,941 [[labuno].config.change.1.thread.1] org.mule.DefaultMuleContext:
**********************************************************************
* Application: labuno                                                *
* OS encoding: Cp1252, Mule encoding: UTF-8                          *
*                                                                    *
* Agents Running:                                                    *
*   Clustering Agent                                                 *
*   JMX Agent                                                        *
**********************************************************************
INFO  2013-02-25 16:33:37,942 [[labuno].config.change.1.thread.1] org.mule.module.launcher.DeploymentService:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'labuno'                                     +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

9.- Consumir el  servicio usando soapUI:



  • Primer Request: getDetalleProducto


  • Segundo Request: listarProductos

Referencias:


Si hay algo que se me paso  no documentarlo, comentar abajo. Espero que sirva de ayuda a los que se estan iniciando  con Mule ESB



viernes, 15 de febrero de 2013

Manual de Instalación de fabrica: Android 4.2.2 para Nexus 4/ Nexus 7 / Nexus 10


[Flashing a Factory Image with fastboot] El objetivo de este manual es ofrecer instrucciones detalladas sobre como flashear una imagen de fábrica usando fastboot y adb para los dispositivos Nexus(Android 4.2.2). Esto le permitirá ver lo que está sucediendo en cada paso del proceso, y también es una buena oportunidad para aprender.
ver el manual  completo en www.Android-Peru.com
para solucionar el siguiente error:
assert failed: apply_patch_check("EMMC:/dev/b­lock/platform/sdhci-tegra.3/by­-name/LNX:5013504:c48f8e86c73f­b2c2ba1794f5ec98e27c9e206ed5:5­060608:319331fae14fec8a8806375­1475fce26bae328e0")

miércoles, 13 de febrero de 2013

Salio la nueva version de App Engine 1.7.5

La version version 1.7.5 de AppEngine, tiene las siguientes caracteristicas:

  • High-Memory Instances: Se incremento el doble la cantidad de memoria disponible (ahora se podra utilizar las instancias F4 o B4 con 1 GB de memoria).
  • Mail Bounce Notifications: Notificaciones de correos que no fueron entregados a su destino. Ahora sabras si llego a su destino o no.
  • Soporte Experimental de Java 7
  • Soporte de Google Cloud Endpoints, hace la vida facil para publicar servicios REST y RPC y que puedan ser fácilmente consumidos por una web o una app movil.
 
Lo mas novedoso sin duda es la posibilidad de publicar servicios RESTfull de una manera muy sencilla. 

viernes, 25 de enero de 2013

[GWT] XMLHttpRequest cannot load. Origin is not allowed by Access-Control-Allow-Origin

I am developing an app front end  with GWT and this connect to other app that publish AppEngine Endpoints services. 
(Estoy desarrollando una aplicación  front end con GWT que se conecta a otra app que publica servicios rest en AppEngine usando Google Cloud EndPoints).

But, I is generating some problems (is not allowed by Access-Control-Allow-Origin.): 
(Pero, esto  me esta generando  algunos problemas).

The app GWT  call endpoint using  RequestBuilder. and the Endpoint app is other app with other domain. and both was deployed in https://appengine.google.com
(La app GWT llama a los servicios rest' endpoints' usando RequestBuilder. y la app endpoint es otra app con otro dominio. Ambas fueron deployadas en https://appengine.google.com).

Domains of the Apps:
-xappgwtx.appspot.com (GWT).
-xappendpointsx.appspot.com (Google Cloud Endpoints).

GWT Code:

public String getDevice(String id) {
String url = URL_SERVICE_BASE + "deviceendpoint/v1/device/get/" + id;
RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
logger.info("::::::::::::sendRequest:::::::");
try {
builder.sendRequest(null, new RequestCallback() {
public void onResponseReceived(Request request, Response response) {
logger.info("response=" + response.getText() + " request:" + request);
resp = response.getText();
if (response.getStatusCode() == 200) {
System.out.println("response=" + response.getText());
logger.info("response=" + response.getText());
}
}

public void onError(Request request, Throwable exception) {
logger.info("onError response=" + exception.getMessage());
resp = exception.getMessage();
exception.printStackTrace();
}
});
} catch (RequestException e) {
logger.info("exception=" + e.getMessage());
e.printStackTrace();

}
return resp;
}

Chrome Console:

After much research in lists, stackoverflow and other forum, solve the problem
(Luego  de mucha investigación en listas y stackoverflow llegue a solucionar el  problema)

Solution: to solve this issue simply assign a variable to your json string into the eval

* Before:

  public static native JavaScriptObject fromJson(String json) /*-{

    return eval("(" + json + ")");

  }-*/;
  
  public final String toJson() {
    return new JSONObject(this).toString();
  }
  
  protected BaseJso() {
  }

* After: 

public class BaseJso extends JavaScriptObject {



public static native JavaScriptObject fromJson(String json) /*-{
eval('var res = ' + json);
return res;
}-*/;

public final String toJson() {
return new JSONObject(this).toString();
}

protected BaseJso() {
}

}

References:


sábado, 11 de agosto de 2012

WS-Security en SOAP

WS-Security define la forma de conseguir integridad, confidencialidad y autenticación en los mensajes SOAP.

La autenticación se ocupa de identificar al llamador. WS-Security utiliza tokens de seguridad para mantener esta información mediante un encabezado de seguridad del mensaje SOAP.

La integridad del mensaje se consigue mediante firmas digitales XML, que permiten garantizar que no se han alterado partes del mensaje desde que lo firmó el originador. La confidencialidad del mensaje se basa en la especificación XML Encryption y garantiza que sólo el destinatario o los destinatarios a quien va destinado el mensaje podrán comprender las partes correspondientes.

La especificación permite una variedad de formatos de firma, algoritmos de encriptación y es abierto a varios modelos de seguridad, tales como:

X.509 certificates,
Kerberos tickets,
UserID/Password credentials,
SAML Assertions, and
custom-defined tokens.

Esta especificación se debe aplicar en aquellos servicios que solo pueden ser accedidos por ciertos clientes. Un ejemplo de caso de uso de WS-Security es un sistema de compras online en el cual el cliente se conecta al sistema de un comerciante para hacer un pedido pero el pago (por ejemplo, con tarjeta de crédito) debe ser confirmado por un sistema bancario antes que se procese el pedido. Si el sistema del comerciante tiene acceso a las informaciones de tarjeta de crédito en forma no cifrada, genera un tipo de riesgo a la seguridad . Con WS-Security, es posible enviar las informaciones de tarjeta de crédito en un formato cifrado que sólo puede ser descifrado por el sistema bancario que emite la confirmación de pago.

En .net se puede implementar Ws-Security con WCF.
Java y Python tambien soportan WS-Security.

¿Qué es REST, despues de haber llevado el curso SDS?

REST (Representational State Transfer) es un estilo de arquitectura de software para sistemas distribuidos tales como la Web. REST se refiere estrictamente a una colección de principios para el diseño de arquitecturas en red. Estos principios resumen como los recursos son definidos y diseccionados. 

Especificación REST:

REST nace como un alternativa a SOAP/WSDL/WS basado en una arquitectura distribuida, protocolo cliente/servidor sin estado. REST utiliza los métodos HTTP de manera explícita, hace que los desarrolladores usen los métodos HTTP explícitamente de manera que resulte consistente con la definición del protocolo. Este principio de diseño básico establece una asociación uno-a-uno entre las operaciones de crear, leer, actualizar y borrar de los métodos HTTP. De acuerdo a esta asociación:
  • se usa POST para crear un recurso en el servidor
  • se usa GET para obtener un recurso
  • se usa PUT para cambiar el estado de un recurso o actualizarlo
  • se usa DELETE para eleminar un recurso
REST no mantiene estado, los servicios sin estado son mucho más simples de diseñar, escribir y distribuir a través de múltiples servidores. Un servicio sin estado no sólo funciona mejor, sino que además mueve la responsabilidad de mantener el estado al cliente de la aplicación. En un servicio web REST, el servidor es responsable de generar las respuestas y proveer una interfaz que le permita al cliente mantener el estado de la aplicación por su cuenta.