Utilización de bases de datos ¿En qué casos podríamos utilizar NoSQL? II

Reto: obtener la temperatura media en un país, o del mundo entero, en un intervalo de tiempo.

En el post anterior lo planteábamos, y en este le daremos una segunda vuelta…

¿Qué problemas tendrían estas tareas?:
  1. Nos podemos olvidar de una respuesta inmediata: aunque para hallar la media solamente haga falta recorrer una vez el listado de datos filtrados, estamos hablando de cientos de miles de millones de registros, así que (y mucho menos si hay muchas peticiones por minuto). 
  2. ¿Podría escalar?: suponiendo que consiguiésemos una máquina tan potente que pudiera hacer ese cálculo en un tiempo razonable, 
  3. ¿Cuál sería el precio de tener una máquina tan potente que fuera capaz de satisfacer nuestras necesidades de esta forma? 
  4. Seguramente se te ocurren más inconvenientes…

¿Cómo podríamos reestructurar nuestros datos de forma que no fuese tan costoso responder a esta consulta?

Un ejercicio tan simple como pre-calcular ciertos datos una vez al día en una tarea batch (y ya que estamos en la nube, ¿por qué no utilizar para ello, por ejemplo, la potencia de Hadoop?) y crear tablas nuevas con información ya “cocinada” y útil, sería suficiente.

Para reducir la complejidad de estas queries (pongamos el ejemplo de la media) drásticamente (recorrer cientos de miles de millones de registros vs decenas o como mucho cientos de registros), bastaría con tener guardadas la suma de todas las temperaturas y el número de mediciones en una tabla en un cómputo mensual y en otro diario para calcular la media de forma inmediata.

Esta información precalculada no tendría por qué guardarse obligatoriamente en una base de datos NoSQL, podríamos elegir entre diferentes tipos de bases de datos según fuesen nuestras necesidades. Sin embargo una vez simplificado el problema como proponemos, reestructurando nuestras tablas, y teniendo en cuenta el gran beneficio que nos aporta la escalabilidad de la nube (la tabla principal con los datos en bruto podría llegar a ser enorme), o la utilización de Hadoop en nuestros procesos batch, no sería tan doloroso renunciar a la integridad referencial, por ejemplo.

Moraleja: Las ventajas que nos ofrecen las bases de datos relacionales convencionales son valiosísimas, pero no debemos caer en el error de utilizarlas a toda costa, ya que a veces, el mero hecho de replantearnos el problema desde lo más básico, puede hacernos la vida mucho más fácil.

WordPressTwitterBlogger PostShare

¿Todo es Big Data?

Para encontrar huecos donde competir de forma diferencial y ofrecer valor a nuestros clientes debemos acotar y definir Big Data.

“Big Data se oye por todas partes desde hace varios meses y queremos contaros cuál es nuestra visión acerca de esta gran tendencia tecnológica, tal y como ha ocurrido con otras grandes tendencias macro como Cloud Computing.

Estamos convencidos de que será una de las mayores fuentes de ventaja competitiva para las organizaciones en los próximos años. Big Data está evolucionando y acelerando su impacto a una escala y nivel que ninguna industria o negocio puede ignorar.

El impacto afectará a la cadena de valor de las empresas desde diferentes perspectivas:

  •        predicciones de ventas
  •        estudios de mercado
  •        conocimiento adicional de todos nuestros stakeholders
  •        segmentación extrema
  •        personalización total  
  •        comercialización de datos de valor añadido

Ahora bien, ningún sector industrial será inmune.

¿Qué es Big Data? ¿Cómo enfocamos desde BBVA GlobalNet el BigData?

Big Data para nosotros consiste en ofrecer a nuestros clientes velocidad e inmediatez en el consumo de grandes volúmenes de información estructurada y no estructurada.

El valor diferencial se encuentra en la inmediatez y el volumen. Para ello, tenemos que apostar por tecnologías de Big Data elásticas, integrándolas en grandes sistemas de información completamente orientados a servicios.

Nuestra apuesta tecnológica es doble, por un lado tenemos Hadoop y por otro BigQuery; cada uno de ellos con sus particularidades.

Las soluciones en Hadoop las complementamos  con Pig, Hive y HBase, todo ello sobre Elastic MapReduce de Amazon Web Services, con un objetivo claro: elasticidad.  Ofrecemos valor a través de un procesamiento paralelo, donde incluso podemos llegar al tiempo real.

La segunda gran apuesta estratégica es BigQuery, el sistema ofrecido por Google para realizar consultas masivas en prácticamente tiempo real, con esta tecnología apostamos por la inmediatez, aportando valor añadido a aquellos clientes que necesiten analizar y obtener resultados en tiempo real en gigantescos volúmenes de información.

¿Pensáis como nosotros que BigData será una de las mayores fuentes de ventaja competitiva de las organizaciones?

 

WordPressTwitterBlogger PostShare

El ecosistema NFC: ¿Quién se integra y quién falta?

NFC es una tecnología de comunicación inalámbrica segura basada en señal de radio. Se fundamenta en la misma tecnología que nos permite acercar la tarjeta de acceso de la oficina a un sensor y que se nos abra la puerta.

Los fabricantes de móviles están empezando a ofrecer terminales con esta funcionalidad, pero poca gente sabe que partido se le puede sacar.

Una de las primeras aplicaciones que se han identificado es el pago. Es decir, usar los dispositivos móviles como contenedores de los datos de tarjeta o como terminales de punto de venta. Esto tiene su atractivo en el mercado de los medios de pago, cuyo modelo tradicional se enfrenta a reducciones continuas de los márgenes de beneficio.

Sin embargo al establecer como dispositivo central el teléfono móvil, entran en el juego actores que, o bien antes no tenían interés por los medios de pago, o bien desempeñaban roles más pasivos.

Los nuevos actores son:

  • las operadoras móviles: que quieren controlar el canal y llevarse la correspondiente tarifa de intermediación,
  • los proveedores de servicios de pago: como Google, Apple o Monetoque han generado ya un ecosistema basado en un wallet virtual y pueden ampliar su alcance mediante el uso de dispositivos móviles.
  • Los fabricantes de móviles: que perciben la creciente demanda de terminales NFC, pero son cautos ya que se enfrentan a una estandarización tecnológica aún pendiente de realizar.

Los actores clásicos de los medios de pago también juegan su papel:

  • Las marcas: tratan de crear el estándar NFC de medios de pago que potencie su posición comercial
  • Los fabricantes de hardware de medios de pago:, siguen a las marcas adaptándose a los diferentes estándares que definen.
  • Los bancos adquirentes: se preguntan quién pagará la factura de renovación de su red de terminales cuando acaban de adaptar su red al estándar EMV. Sobre todo cuando, a diferencia de EMV, esto no es una regulación de obligado cumplimiento.
  • Los bancos emisores: se frotan las manos pensando en los ahorros de costes de estampación y emisión, pero miran con desconfianza su posible desintermediación.

Finalmente, ajeno a todos estos intereses comerciales, están el usuario de tarjetas y el comercio, que realmente no han tenido la oportunidad de probar aplicaciones interesantes de esta tecnología. Esta situación lleva a preguntarse: ¿Cuál es la demanda real de este servicio? ¿Aporta tanto el uso de NFC a la experiencia de pago? ¿Quién va a asumir el coste del despliegue de la nueva tecnología?

 La demanda no va a venir sola, hay que crearla innovando y desarrollando servicios que resuelvan los problemas de los usuarios finales.

 La tecnología ya está aquí y es cuestión de aplicarla de forma que sea sencilla (cuantos menos actores involucrados, mejor) y útil.

 

WordPressTwitterBlogger PostShare

Creación de certificados de cliente a partir de una CA propia

En el universo web existen diversas formas de establecer un mecanismo de conexión segura (https), mediante el cifrado de las comunicaciones entre los clientes (usuarios) y el servidor (servicios web). En este post explicaremos cómo crear certificados de cliente con un certificado de servidor asociado, a partir de una entidad certificadora (CA) también creada por nosotros para poder firmar los certificados que generemos. En primer lugar, se deberá crear una entidad certificadora propia, para lo cual podemos ejecutar el siguiente comando:

$ openssl req -nodes -x509 -newkey rsa:2048 -days 3650 -keyout <nom_CA>.key -out <nom_CA>.crt
Generating a 2048 bit RSA private key
...........................................................................+++
.....................+++
writing new private key to 'CA-API_Mgmt.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA GlobalNet
Organizational Unit Name (eg, section) []:Sistemas
Common Name (eg, your name or your server's hostname) []:ca.bbvaglobalnet.com
Email Address []:

De toda la información que se solicita durante el proceso de creación de la CA, el campo más relevante es el "Common Name" (CN), ya que define el nombre que va a poseer la entidad certificadora que estamos originando. En el ejemplo expuesto se ha especificado el nombre ca.bbvaglobalnet.com. Una vez creada la entidad certificadora, podemos proceder a crear el certificado SSL que deberá utilizarse en el lado del servidor. Para ello, ejecutar el siguiente procedimiento:

  • Creación de un par de claves para el certificado (clave privada / clave pública) y generación de la solicitud de firma del certificado (CSR):
$ openssl genrsa -out <nom_cert_servidor>.key 2048
Generating RSA private key, 2048 bit long modulus
..........................................................+++
.......................................................................................................+++
e is 65537 (0x10001)

$ openssl req -new -key <nom_cert_servidor>.key -out <nom_cert_servidor>.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA GlobalNet
Organizational Unit Name (eg, section) []:Sistemas
Common Name (eg, your name or your server's hostname) []:api-management.bbvaglobalnet.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Durante el proceso de generación de la solicitud de firma del certificado se deberá introducir la información que irá asociada al mismo. Entre los campos solicitados se encuentra el "Common Name" (CN), en el cual debe especificarse el nombre de dominio asociado a la aplicación para la cual se está generando el certificado. Es importante que el CN asignado a la entidad certificadora sea distinto que el CN del certificado, ya que en caso contrario las peticiones que se hagan al servidor devolverán un error de tipo sec_error_bad_signature.

  • Generación de un fichero de configuración con los parámetros necesarios para la creación del certificado de servidor:
$ cat >servidor.conf <<_EOF
basicConstraints = critical,CA:FALSE
extendedKeyUsage = serverAuth
_EOF

 

  • Creación del certificado SSL de servidor firmado por nuestra entidad certificadora, a partir de la solicitud de firma del certificado que se ha generado anteriormente:
$ openssl x509 -CA <nom_CA>.crt -CAkey <nom_CA>.key -req -extfile servidor.conf -in <nom_cert_servidor>.csr -days 3650 -CAcreateserial -sha1 -out <nom_cert_servidor>.crt
Signature ok
subject=/C=ES/ST=Madrid/L=Madrid/O=BBVA GlobalNet/OU=Sistemas/CN=api-management.bbvaglobalnet.com
Getting CA Private Key

 

Con la realización de estos pasos ya tendremos creado el certificado del servidor. El siguiente paso será incluirlo junto con la entidad certificadora que lo ha firmado (la que hemos creado) en la configuración SSL del servidor Apache (por ejemplo…). Una vez configurado el certificado en el lado del servidor, procedemos a crear el certificado de cliente siguiendo el procedimiento que se describe a continuación:

  • Creación de un par de claves para el certificado (clave privada / clave pública) y generación de la solicitud de firma del certificado (CSR):
$ openssl genrsa -out <nom_cert_cliente>.key 2048
Generating RSA private key, 2048 bit long modulus
...................+++
.......+++
e is 65537 (0x10001)

$ openssl req -new -key <nom_cert_cliente>.key -out <nom_cert_cliente>.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:ES
State or Province Name (full name) [Berkshire]:Madrid
Locality Name (eg, city) [Newbury]:Madrid
Organization Name (eg, company) [My Company Ltd]:BBVA
Organizational Unit Name (eg, section) []:Plataformas financieras digitales
Common Name (eg, your name or your server's hostname) []:www.bbva.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

 

  • Generación de un fichero de configuración con los parámetros necesarios para la creación del certificado de cliente:
cat >cliente.conf <<_EOF
basicConstraints = critical,CA:FALSE
extendedKeyUsage = clientAuth
_EOF

 

  • Creación del certificado SSL de cliente firmado por nuestra entidad certificadora, a partir de la solicitud de firma del certificado que se ha generado anteriormente:
$ openssl x509 -CA <nom_CA>.crt -CAkey <nom_CA>.key -req -extfile cliente.conf -in <nom_cert_cliente>.csr -days 3650 -CAcreateserial -sha1 -out <nom_cert_cliente>.crt
Signature ok
subject=/C=ES/ST=Madrid/L=Madrid/O=BBVA/OU=Plataformas financieras digitales/CN=www.bbva.com
Getting CA Private Key

 

  • Conversión del certificado a formato pkcs12 para poder importarlo en el navegador del cliente:
$ openssl pkcs12 -export -in <nom_cert_cliente>.crt -inkey <nom_cert_cliente>.key -certfile <nom_CA>.crt -out <nom_cert_cliente>.p12
Enter Export Password:Acceso_Cliente01
Verifying - Enter Export Password:Acceso_Cliente01

La contraseña de exportación que se especifique será solicitada al usuario al importar el certificado pkcs12 que se ha generado en el navegador del cliente.

WordPressTwitterBlogger PostShare

Scrum orgánico

Durante los días 17 y 18 de octubre, 7 miembros del departamento de Desarrollo de BBVA GlobalNet asistimos a un curso de certificación en Scrum Master impartido por los Scrum Trainers Alan Cyment y Ariel Ber.

Todos los miembros asistentes, con conocimiento previo de Scrum, queremos comenzar a implantar estas técnicas de trabajo de forma orgánica en BBVA GlobalNet. Para ello, y tras solicitar consejo a Alan y Ariel, vamos a ir incorporando diversas técnicas a todas las áreas de trabajo de la corporación de forma progresiva, con la intención de que sean los diferentes grupos humanos los que finalmente decidan si las acogen o no. Como primer paso para nuestro objetivo, nuestra intención es informar a todo el equipo, cuales son los cimientos sobre los que se basa Scrum.

 

¿Qué es Scrum?

Scrum es un marco o framework de trabajo, esto es, un conjunto de técnicas y herramientas que nos va a permitir ayudar al cliente en su visión de negocio.

Como todo marco de trabajo, el objetivo es utilizarlo para llevar a cabo un resultado, por tanto, es un medio y no un fin. Tampoco nos va a decir qué es lo que debemos hacer o qué debemos utilizar, sino que nos va a dar las pautas y seremos responsables de ver qué es lo que necesitamos en cada momento para llegar al resultado, para aportar valor al cliente.

Scrum no es tener tarjetas, usar Jira o Excel; Scrum no es tener XP o TDD; Scrum no es tener integración contínua. Scrum es utilizar lo necesario para conseguir la satisfacción del cliente a través de entregas tempranas y contínuas de software valioso.

 

Scrum se basa en el manifiesto ágil cuyos valores son: 

  • Valorar más a los individuos y su interacción que a los procesos y las herramientas.
  • Valorar más el software que funciona que la documentación exhaustiva.
  • Valorar más la colaboración con el cliente que la negociación contractual.
  • Valorar más la respuesta al cambio que el seguimiento de un plan.

 

¿Qué roles existen en Scrum? 

Un proyecto desarrollado bajo el marco de trabajo Scrum va a tener una o varias personas interesadas (stakeholders) en que la empresa llegue a su fin. Estas personas hacen llegar sus necesidades de forma más o menos frecuente a un encargado del producto (product owner), quien conoce de primera mano cuales son los requisitos del proyecto en cada momento.

Mediante reuniones periódicas, el propietario del producto se reune con el equipo de trabajo para conocer el estado de los requisitos funcionales del proyecto, y aceptarlos o no, y dar prioridad a los requisitos que quedan por desarrollar.

 Por su parte, el Scrum Master acompaña en sus diferentes reuniones (diaria, de retrospectiva y de planificación de sprint) al equipo, para tratar de guiar al equipo en el uso de las técnicas de Scrum y servir de apoyo constante.

 

¿Qué aporta Scrum? 

Scrum ayuda mediante el cambio de paradigma a que el rendimiento sea más efectivo, trabando en conjunto y permitiendo exponer de forma clara cualquier problema que se ponga en su camino para que el equipo se pueda inspeccionar y adaptar en consecuencia.

El funcionamiento de Scrum es sencillo: tras cada salto (ciclo de desarrollo), el equipo realiza un ejercicio de inspección interna para adaptarse antes de volver a saltar.

El uso de Scrum es un medio que proporciona a BBVA GlobalNet beneficios en cuanto a calidad y competitividad:

  • Productos potencialmente entregables en un corto período de tiempo, y de forma continuada en el tiempo. Esto conlleva ciertas ventajas, como gestión de las expectativas del cliente, adaptabilidad a cambios del cliente o mercado, gestión del retorno de inversión (ROI) y mitigación de los riesgos gracias a la identificación sistemáticas de inconvenientes del proceso (filosofía LEAN).
  • Productividad y calidad del software entregado al poner el foco en el desarrollo continuo de la aplicación.
  • Alineamiento entre el cliente y  el equipo de desarrollo, lo cual provoca confianza.
  • Moral y responsabilida del equipo, gracias a la motivación, colaboración y cooperación.

¿Cómo vamos a implantar? 

En primer lugar, los responsables tienen claro que queremos comenzar con la implantación, con determinación y compromiso para la constante mejora, pues el comienzo puede ser doloroso.

Como primera medida, es muy importante introducir Scrum, sus fundamentos y valores, a todos los miembros de la compañía. Para ello, a través del blog y cursos de formación, todos podremos conocer los roles, artefactos, cómo se crea y estima un backlog, cómo se transforma en un sprintlog, cómo se gestiona un gráfico de burndown y se calcula la velocidad del equipo, etc. En definitiva, los equipos de trabajo deben conocer herramientas y forma de trabajo.

Para realizar Scrum de forma orgánica, queremos realizarlo poco a poco, mejorando día a día. Una buena forma de comenzar es por las reuniones retrospectivas. A partir de aquí, se irá realizando un proceso de mejorar, mejorar y mejorar, compartiendo experiencias, aprendiendo unos de otros y teniendo en cuenta que nunca existirá una lista de "las mejores prácticas en Scrum", ya que el contexto en importante.

WordPressTwitterBlogger PostShare

Formación: Web2py, Mercurial y GAE

Compartir y extender el conocimiento debe ser una de las actividades más importantes de cualquier empresa. De esta forma no sólo se mejora la comunicación interna sino que nos ayuda a tener en cuenta soluciones que se han llevado a cabo en proyectos de éxito en los que no hemos estado involucrados, con el único fin de tener mas capacidad de desarrollo y una visión más amplia para afrontar nuevos retos.

Es por este motivo, que en BBVA GlobalNet, hemos iniciado unas jornadas de formación interna en la que distintos departamentos dan formación al resto sobre temas que para unos es “el pan de cada día” y para el resto un mundo sin explorar. El pasado 20 de enero comenzó el departamento financiero con un curso sobre “Indicadores de gestión”. El próximo curso, correrá a cargo del departamento de sistemas, que nos hablará sobre el desarrollo y el diseño de arquitecturas con:

1- Web2py
2- Mercurial
3- GAE

Y que han sido aplicadas en proyectos tan importantes como el Ministerio de Cultura (Museo del Prado), Ministerio de Industria (Red.es).

Ya os contaremos más… de momento podéis ver un pequeño tráiler… VER VÍDEO

Música del trailer: The Place That Won’t Take Me Back by I Am Not Lefthanded
Licencia: http://creativecommons.org/licenses/by-sa/3.0/

WordPressTwitterBlogger PostShare

Problemas de encoding

A veces para afrontar un problema no tenemos mas remedio que cambiar el punto de vista. Como muestra, un caso real:

Queremos generar un fichero de salida tipo csv, en texto plano, mediante un proceso batch que utiliza una clase java. El encoding de dicho fichero debe ser ISO 8859-15, similar al ISO-8859-1 (también conocido como LATIN1) pero incluyendo, entre otros, el símbolo del euro.

En la fase de pruebas comprobamos que el fichero se genera incorrectamente. Al abrirlo en Windows con Notepad este muestra texto chino, codificado en UTF-8. Lo mismo ocurre al abrirlo con gedit en GNU/Linux.

Inicialmente las pesquisas para encontrar el origen del problema se centran en el encoding del texto: se comprueba la codificación pasada al PrintWriter encargado de escribir el fichero, la codificación de la base de datos de la que se obtienen los datos a escribir. En definitiva se chequea todo el código relacionado sin encontrar ningún error que pueda explicar la codificación incorrecta. Por ello decidimos pasar de examinar el código fuente a examinar el resultado de su ejecución, esto es, el propio csv. Utilizando un editor hexadecimal revisamos los bytes que lo componen en busca de secuencias erróneas, comprobando en particular la validez de la codificación los caracteres no ASCII. No encontramos nada raro.

El siguiente paso es comprobar posibles caracteres de control, y aquí si obtenemos resultados: ocurrencias de bytes a 0, que se corresponden con el carácter NULL y que no deberían aparecer en nuestro fichero. En efecto, sustituyendo cada byte 0 por otro byte correspondiente a un carácter ASCII (p.e. 20h, espacio) conseguimos que el csv se abra correctamente.

Ahora sabemos lo que causa el problema, pero no donde se origina en el código fuente. Nuestro principal sospechoso es algún String inicializado a null, sin embargo la documentación del API del PrintWriter dice que el método print(String s)

“Prints a string. If the argument is null then the string “null” is printed”

Por lo cual tenemos que descartar las cadenas como origen del problema. Nuestro siguiente candidato es un char sin inicializar, y efectivamente es el caso.

Si intentamos escribir un char sin inicializar declarado localmente al método que realiza la escritura recibimos un error en tiempo de compilación: variable carácter might not have been initialized. Pero en nuestro caso el char en cuestión está definido en otra clase y es accedido mediante un getter, por lo que el compilador no puede realizar la comprobación de inicialización y el .class se genera sin problemas.

La solución es sencilla una vez identificado el culpable y el texto se genera correctamente en ISO 8859-15.

Por curiosidad seguimos analizando un poco mas el tema y vemos que, al realizar distintas pruebas que generan ficheros con distintos contenidos se producen dos casos:

  1. El caso detectado inicialmente (y el mas frecuente): el editor Notepad de Windows lo interpreta como chino, al igual que el editor Gedit en Ubuntu. Mi teoría es que realmente se genera un fichero UTF-8 bien formado, pero el editor no puede identificar unívocamente el charset y utiliza un charset del chino como fallback.
  2. Notepad muestra correctamente el fichero, pintando el byte a 0 como un espacio en blanco (lo interpreta como carácter NULL, \u0000 ). Sin embargo Gedit no reconoce ningún encoding y no abre el fichero, considerándolo binario.

En situaciones como esta posiblemente es mas rápido analizar a bajo nivel el objeto generado que revisar el código que lo genera, que puede ser (como en este caso) bastante complejo.

WordPressTwitterBlogger PostShare