lunes, 27 de marzo de 2017

Uso de la librearia Thread en C++11

Este post contiene el enlace hacia el repositorio de GitHub que contiene un código de ejemplo para maneo de Thread por medio de los medios que proporciona C++11.

Las características de este ejemplo son:

  • Implementación de los Threads de C++11 sobre una clase de C++.
  • Crear dos thread que este utilizando diferentes métodos de la misma instancia.
  • Uso de la librería use of unique_lock  en conjunto con la librería condition_variable.
  • Uso de Mutex para la sincronización de la zonas compartidas.
  • Uso de la librería condition_variable para suspender y  reactivar cada uno de los threads creados en el ejemplo, de manera manual.
  • Uso de la librería condition_variable para suspender el thread y reactivarlo después de un tiempo predefinido.

El enlace al repositorio y su documentación, en ingles, es:


Librería JSON para C++

Este post contiene el link hacia una librería para interpretar documentos estructurados bajo el formato JSON (Standar ECMAC-404). Las características de esta librería son:


  1. Trabaja con formato de cadena UTF-8.
  2. No requiere librerías adicionales.
  3. Modificar el documento JSON
  4. Permite crear documentos JSON.


El link hacia el repositorio GitHub es, la documentación esta en ingles:

https://github.com/jorgemedra/JSONLib

Diagramas de UML y BPMN.

A los colegas que estudiaron Ingeniería o Licenciatura en Sistemas, recordarán la materia de Fundamento de Ingeniería de Software, materia que tome en mi caso (Ingeniero). Sobre esta materia se plantea de temas como ciclos de vida del software, métricas de medición, técnicas de modelado, herramientas case y un largo etcétera.  Entre toda la información que recibimos en dicha materia recordarán los diagramas de flujo para modelar un algoritmo (Conjunto ordenado de instrucciones sistemáticas que hallar la solución de un tipo de problemas), de los cuales son muy utilizados hasta la fecha, pero desde mi perspectiva son insuficientes, tema del cual quiero compartir mi opinión.
Durante los 14 años que he estado trabajando diseñando y creando software para resolver temas de integración en diferentes productos, he llegado a utilizar estos diagramas (Diagramas de Flujo) y siempre me había quedado con la sensación de que requería algo más para detallar excepciones, eventos asíncronos, interrupciones, y todo esa clase de situaciones que los desarrolladores de hoy en día nos encontramos. Fue entonces cuando me acerque al estándar UML (Unified Modeling Language ), un estándar diseñado por la Object Managment Group (OMG).
UML no solo adapto a sus estándar la metodología de modelar un algoritmo de los Diagramas de Flujo que nos enseñaron en los años 80’s y 90’s, sino que también extendió su capacidad de modelado a un entorno de Objetos, llegando a obtener diversos tipo de diagrama de propósito especifico, agrupados en dos principales grupo: Estáticos y Dinámicos.
Es con los diagramas Estáticos que UML nos llevo a adentrarnos en las necesidades del cliente con la  implementación de los diagramas de Casos de Uso, que no son más que un esfuerzo por hacerle ver al desarrollador que parte del negocio  se requiere atender con la implementación con el sistema de información que se esta diseñando. Mientras que los diagramas de clases nos permiten ubicar las diferentes entidades que interactuarán en el nuevo sistema de información que se esta modelando.
Por otro lado, los diagramas Dinámicos nos permiten apreciar la interacción con las diversas entidades que se encuentran en el sistema de información, interacción que se lleva a cabo a través del tiempo, es por eso que se conocen como diagramas Dinámicos. Este tipo de característica nos permite ver si nuestro diseño presenta el comportamiento deseado, tomando como referencia el problema que queremos solucionar.
Pero a medida que aumentaba mi interacción con el cliente y su usuario final, empecé a tener las mismas dudas que me surgieron con los Diagramas de Flujo, específicamente al entender el entorno de negocio en el cual se quiere implementar el sistema informático.

Si bien, UML contiene la sección de Casos de Uso, que es un diagrama que describe como interactuarán los diferentes actores con el nuevo sistema de información, es una vista estática y que describe una caso bajo una narrativa, y es ahí donde radica su punto débil. El ser humano es una persona que puede entender de mejor manera una situación o un mensaje si este se representa de manera gráfica, es por eso que los modelos son de gran ayuda. Es por esta razón  que me dedique a la tarea de buscar como modelar un caso de uso bajo un modelo dinámico y gráfico, características que permitirían al desarrollador entender más a fondo y de manera más rápida el entorno del negocio y su problemática a solucionar. El resultado de mi búsqueda termino en los diagramas BPMN ( Business Process Model & Notation), estándar que también ha sido establecido por la OMG.

BPMN fue creado para modelar procesos de negocio, en los cuales se encuentras diversas interacciones. Su principal característica es la de representar un proceso de negocio  de manera gráfica evitando crear documentos de narrativas largas y complejas, como se viene realizando en los Casos de Uso (UML) o en los diagramas de Cross Funtional. También es una realidad que ha estado creciendo el número de empresas que han adoptado este estándar para modelar sus procesos internos.
Este tipo de modelado (BPMN) permite a las personas el conocer el negocio y su funcionamiento sin tener que leer un documento, pues solo deben conocer las reglas básicas del BPMN para la interpretación del modelo. Cabe mencionar que aprender a leer un diagrama BPMN es una actividad que no llevaría más de una hora y de la cual no se requiere se experto en BPMN, basta con tener a la mano una hoja de referencia de los símbolos utilizados en BPMN.
Así pues concluyo que, con la ayuda de BPMN es posible tomar en cuenta la etapa que varios desarrolladores no se interesan por considerar, el Análisis del Negocio. Con un análisis del negocio claro y representado en un modelo de fácil lectura, se puede integrar a los desarrolladores en una dinámica en donde todos los involucrados de un proyecto hable el mismo idioma, pues se tiene claro el entorno de negocio y su problemática a solucionar. Mientras que los modelos de UML es la metodología ideal para llevar a cabo el diseño del sistema de información (La solución).

Conversión de un número decimal a base 64

En esta post les comparto como convertir un número decimal a un número en base 64.

Este caso es muy útil para crear llaves únicas  a partir de un número long, como puede ser el Timestamp, obteniendo un identificador con una cantidad de caracteres menores a los que pude ser representado por el Timestamp.

Este código tiene las siguientes características


  • El algoritmo utiliza un sistema numérico base 64, lo cual significa que tiene 64 símbolos para representar un número decimal.
  • La función toBase64 es la función principal la cual esta encargada de convertir un número de tipo entero (long) a su representación numérica de base 64, representada en un string.
  • La función secundaría toSingleBase estará encargada de convertir un numero menor a 64 a su representación en el sistema numérico base 64.
  • Los caracteres utilizados son los número del 0 al 9, las letras mayúscula y minúsculas, sin caracteres especiales, y dos símbolos adicionales: + y *.



long value = DateTime.Now.Ticks;
string strVal = toBase64(value);

private static string toBase64(int n)
{
    string ret = "";
    int cosiente = 0;
    int residuo = 0;

    if (n < 64)
        return toSingleBase64(n);


    residuo = n / 64;
    cosiente = n % 64;

    ret = toBase64(residuo) + toBase64(cosiente);
    
    return ret;
}

private static string toSingleBase64(int n)
{
    string ret = null;

    if(n < 0)
        ret = "0";
    if (n < 10)
        ret = "" + n;
    else
    {
        if (n >= 10 && n < 36)
        {
            n = n - 10;
            n = 65 + n; //65 inicia el caracte 'A' (Mayusculas)
            ret = "" + (char)n; 
        }
        else if (n >= 36 && n < 62)
        {
            n = n - 36;
            n = 97 + n; //97 inicia el caracte 'a' (minusculas)
            ret = "" + (char)n; 
        }
        else if (n >= 62 && n <= 63)
        {
            n = n - 62;
            n = 42 + n; //42 inicia el caracter '+', seguido por el caracter '*'.
            ret = "" + (char)n;
        }
        else
            ret = "0";
    }
    return ret;
}