Sistema de Ficheros en C++17

Contenedores Docker multi-dominio

Caso de Uso

Tenemos varias aplicaciones servidoras a la vez en un mismo entorno de desarrollo, cada una encapsulada en un contenedor, llamémosles de ahora en adelante "Contenedor A" y "Contenedor B".

Utilizando docker estas aplicaciones tienen la misma dirección IP en nuestra máquina, una forma de distinguirlas es cambiando el puerto que exponen.

/galleries/docker-multidomain/ip.thumbnail.png

Aplicaciones exponiendo la misma dirección IP utilizando diferentes puertos para diferenciar las aplicaciones

Pero esto es un poco confuso, ¿8080 sigfica que accedemos a las "aplicación A" y 8081 significa "aplicación B"?

Sería mucho más sencillo de recordar algo así:

/galleries/docker-multidomain/domain.thumbnail.png

Diferenciando aplicaciones por nombre de dominio

Obtener este valor semántico extra es más sencillo de lo que parece.

Leer más…

Comparación frameworks REST para RUST

Estoy empezando a hacer mis primeros pinitos con Rust, es un lenguage de programación que promete ser tan rápido como C/C++, pero más seguro en cuanto a la gestión de memoria ser refiere. Básicamente, no permite al programador hacer "cosas malas" con la memoria como: olvidarse de liberar la memoria que no se va a utilizar o liberar memoria que no es tuya. En estos casos, Rust simplemente no compilará.

Para aprender he pensado en hacer algún pequeño proyecto, tengo algunas ideas, pero todas pasan por ofrecer una API REST, así que me he puesto a buscar frameworks que me faciliten esta tarea y me he llevado una grata sorpresa al encontrar una muy buena comparativa con el estado de los frameworks REST para Rust, a continuación os dejo el enlace:

https://github.com/flosse/rust-web-framework-comparison

Convertir archivos en formato Windows a formato Unix

Si alguna vez has programado desde un entorno Windows para entornos Unix, seguramente habrás tenido este problema: Los archivos que instalas en tu entorno Unix tienen formato Windows.

Hay un forma bastante sencilla de convertir todos los archivos que tienes en un directorio de formato Windows a Unix.

find . -type f -print0 | xargs -0 dos2unix

Lo he sacado, como no, de http://stackoverflow.com/questions/11929461/how-can-i-run-dos2unix-on-an-entire-directory

Creando REST URLs

Las primeras veces que me puse a diseñar una API REST cometí unos cuantos errores, por supuesto. A continuación os voy a contar algunos de los errores que cometí y lo que he entendido hasta hoy sobre la construcción de URLs REST con ejemplos.

Leer más…

Gestión de dependencias C++: Biicode

Hace tiempo que estoy interesado la construcción, gestión de dependencias, empaquetado y despliegue de proyectos software. Para Java, Scala, Python, etc. Es bastante sencillo ya que hay herramientas como Maven, Gradle, pip, Sbt, etc. Pero para C++_, lo más parecido que he encontrado es Maven con el plugin Nar o Gradle con su plugin cpp (que está en desarrollo).

Hace tiempo que conozco Biicode, pero no había sacado nunca tiempo para probarlo, hasta hoy.

El funcionamiento general es muy sencillo.

Necesitamos instalar biicode en nuestra máquina.

Yo he creado un pequeño ejemplo utilizando el sistema de log de la librería Poco.

He ejecutado este comando para crear mi proyecto, al que he llamado bii_log. Eso sí, lo tengo que crear debajo de mi nombre de usuario en Biicode, por si posteriormente lo quiero publicar.

bii new carlovin/bii_log --hello=cpp

Se ha creado una estructura de directorios y ficheros con nuestro proyecto. Aunque los únicos ficheros que vamos a tocar son:

blocks/carlosvin/bii_log/main.cpp
blocks/carlosvin/bii_log/biicode.conf

En el fichero biicode.conf vamos a configurar nuestras dependencias, en nuestro caso la librería Poco.

# Biicode configuration file

[requirements]
    fenix/poco(develop): 0

[parent]
        carlosvin/bii_log: 0

[includes]
    Poco/*.h: fenix/poco/Foundation/include

En la sección [includes], estamos redefiniendo la ruta a nuestros ficheros de cabeceras, porque si no lo hiciéramos tendríamos que hacer algo así:

#include "fenix/poco/Foundation/include/Logger.h"

Gracias a esta línea, en nuestro código tendremos includes más claros como:

#include "Poco/Logger.h"

Así de fácil, ya podemos utilizar la librería Poco en nuestro proyecto, por ejemplo:

#include "Poco/FileChannel.h"
#include "Poco/FormattingChannel.h"
#include "Poco/PatternFormatter.h"
#include "Poco/Logger.h"
#include "Poco/AutoPtr.h"

using Poco::FileChannel;
using Poco::FormattingChannel;
using Poco::PatternFormatter;
using Poco::Logger;
using Poco::AutoPtr;

int main(int argc, char** argv) {
        AutoPtr<FileChannel> pChannel(new FileChannel);
        pChannel->setProperty("path", "log/sample.log");
        pChannel->setProperty("rotation", "100 K");
        pChannel->setProperty("archive", "timestamp");

        //AutoPtr<ConsoleChannel> pCons(new ConsoleChannel);
        AutoPtr<PatternFormatter> pPF(new PatternFormatter);
        pPF->setProperty("pattern", "%Y-%m-%d %H:%M:%S %s: %t");
        AutoPtr<FormattingChannel> pFC(new FormattingChannel(pPF, pChannel));
        Logger::root().setChannel(pFC);

        Logger & logger = Logger::get("TestChannel");
        for(int i=0; i<10000; i++){
                poco_information(logger, "This is a info");
                poco_warning(logger, "This is a warning");
        }
        return 0;
}

Para compilar el proyecto simplemente hay que ejecutar:

bii cpp:build

Y para publicarlo y que cualquiera pueda utilizarlo, como nosotros hemos utilizado Poco:

bii publish

Además de lo sencillo que ha resultado todo, me ha gustado mucho que después de ejecutar "bii cpp:build", mi Eclipse con CDT indexaba perfectamente el código, así como el autocompletado y la navegación entre clases y métodos.

También he leído un artículo sobre lo bien que se integra con CLion: When CLion met biicode.

Mantenimiento de Software

Hace unos días en el trabajo tuve que rellenar un documento en el que debía indicar el tipo de mantenimiento que debía hacer y sólo tenía dos opciones: correctivo y adaptativo. Esto me extrañó, porque el cambio que yo quería hacer no terminaba de encajar en ninguno de los dos tipos.

Haciendo memoria sobre lo que había dado en mi primera asignatura de Ingeniería del Software, conseguí recordar tres tipos, pero me parecía que me faltaba un tipo.

Hoy por casualidad he encontrado mis apuntes de Ingeniería del Software y estos son los tipos de mantenimiento ordenados de más a menos porcentaje de tiempo dedicado.

Perfectivo: Actividades para mejorar o añadir nuevas funcionalidades requeridas por el usuario.
Adaptativo: Actividades para adaptar el sistema a los cambios en su entorno tecnológico (Hardware o software).
Correctivo: Corregir defectos en el hardware o software detectados por el usuario durante la explotación del sistema.
Preventivo: Actividades para facilitar el mantenimiento del futuro sistema.

Construir un proyecto C++ con Gradle

Introducción

La construcción, gestión de dependencias y distribución de mis proyectos es algo que cada vez me preocupa más, me gustaría encontrar una herramienta que unificara este proceso y fuese independiente del lenguaje, lo más parecido con lo que he trabajado ha sido SCons, Autotools, Ant, Maven y últimamente Gradle.

Llevo un tiempo haciendo algunas cosas con Gradle, pero siempre centrado en proyectos Java utilizándolo como reemplazo a Maven, porque que es más sencillo de usar y más rápido. También lo he utilizado en projectos Android y he sufrido la pareja Android Studio + Gradle en sus primeros matrimonios (porque yo he querido), actualmente está todo mucho más documentado y funciona muy bien.

Antes de nada hay que decir que la construcción de proyectos C/C++ y Objective-C con Gradle se encuentra en fase de incubación, aunque ya permite hacer algunas tareas avanzadas como:

  • Generación de múltiples artefactos dentro del mismo proyecto, esto es varias librerías o ejecutables.
  • Gestionar las dependencias entre estos artefactos (sin versiones).
  • Generar distintos “sabores” de aplicaciones, por ejemplo: podremos generar una aplicación “Community” y otra con más características habilitadas llamada “Enterprise”.
  • Permite generar binarios para distintas plataformas, esto depende de las cadenas de herramientas ( Toolchains ) que tengamos instaladas en la máquina de compilación.

Como decía todavía tiene limitaciones, aunque están trabajando en ello y si consiguen lo que tienen planeado dejaré Autotools (me arrepentiré de haber dicho esto).

Leer más…