miércoles, 1 de octubre de 2025

🍐🍎 Arquitectura Hexagonal explicada con peras y manzanas

Introducción

Imagina que tienes una aplicación que cocina peras y manzanas. Tienes la receta (la lógica de negocio) y diferentes formas de cocinarla: en horno, en microondas, o incluso en una app móvil. Pero… ¿qué pasa si cambias la forma de cocinar? ¿Tendrías que cambiar toda la receta? La arquitectura hexagonal (también llamada Ports and Adapters) nació para resolver exactamente eso.

1. El problema de las capas tradicionales

En las arquitecturas tradicionales (por ejemplo, MVC clásico), la aplicación suele estar fuertemente acoplada a frameworks, bases de datos o controladores HTTP. Por ejemplo: Si cambias tu base de datos de MySQL a MongoDB, debes modificar código en varias partes. Si agregas una nueva API REST o una interfaz gráfica, debes tocar tu capa de negocio. Esto genera dependencias cruzadas y hace que cada cambio técnico afecte la lógica central.

2. La idea central de la arquitectura hexagonal

En una arquitectura hexagonal, la lógica de negocio vive en el centro (como el corazón de la aplicación). Todo lo que la rodea (base de datos, API, mensajería, interfaz) se conecta mediante puertos (ports) y adaptadores (adapters).

En palabras simples:

La lógica no sabe si los datos vienen de una base, de una API o de un archivo JSON. Solo espera que alguien le entregue los datos con el formato correcto. Así logramos que la receta (el negocio) no dependa del tipo de cocina (la infraestructura).

3. Ejemplo con peras y manzanas

Sin arquitectura hexagonal:

public class FrutaService { 
private final FrutaRepository repository; 
public FrutaService() { 
this.repository = new FrutaRepository(); 
// ❌ Acoplamiento directo 
public double calcularTotal() { 
List<Fruta> frutas = repository.obtenerFrutas(); 
return frutas.stream().mapToDouble(Fruta::getPrecio).sum(); 
}

Aquí, FrutaService depende directamente del repositorio. Si mañana cambias de base de datos, tienes que modificar el servicio.

Con arquitectura hexagonal:

public interface FrutaRepository { 
List<Fruta> obtenerFrutas(); 
}

public class FrutaService { 
private final FrutaRepository repository; 
public FrutaService(FrutaRepository repository) { 
this.repository = repository; 
public double calcularTotal() { 
return repository.obtenerFrutas() .stream() .mapToDouble(Fruta::getPrecio) .sum(); 
}

@Repository 
public class FrutaRepositoryDB implements FrutaRepository { 
// Lógica para obtener frutas desde una BD 

public class FrutaRepositoryArchivo implements FrutaRepository { 
// Lógica para obtener frutas desde un archivo JSON 
}

Resultado: tu servicio nunca cambia, aunque cambie la fuente de datos.

4. Beneficios clave

  1. 🔹 Desacoplamiento total entre negocio y tecnología.
  2. 🔹 Facilidad de pruebas unitarias: puedes usar mocks sin conectarte a BD.
  3. 🔹 Sustituibilidad: cambia un adaptador por otro sin tocar la lógica.
  4. 🔹 Escalabilidad: agrega nuevas entradas (API, CLI, eventos) sin romper nada.

5. Conclusión

En resumen, la arquitectura hexagonal es como una cocina modular: puedes usar horno, microondas o sartén… pero la receta sigue siendo la misma. El negocio no se entera del cambio, solo sabe cocinar peras y manzanas. No se trata solo de dibujar un hexágono bonito, sino de proteger tu lógica de negocio del caos tecnológico.

¿Qué opinas?

¿Ya aplicaste este patrón en tus proyectos? Déjame tu experiencia en los comentarios o sígueme en LinkedIn para más artículos de desarrollo y arquitectura.


miércoles, 12 de marzo de 2025

Modos de Encriptación con Cloudflare

El tema que abordaré acontinuación es considerando la forma y los conceptos que implementa Cloudflare.
Los modos de encriptación y los tipos de certificados SSL/TLS no son exclusivos de Cloudflare. Sin embargo, la forma en que Cloudflare implementa estos modos y los términos específicos que usa pueden ser particulares de su plataforma.


Modos de Encriptación (SSL/TLS)

La idea de diferentes modos de encriptación, como "Full" o "Full (Strict)", es un concepto general en la seguridad web. Se basa en cómo una conexión segura es establecida entre un cliente (como un navegador) y un servidor de origen. Cloudflare simplemente facilita la gestión de estos modos dentro de su plataforma.


En general, los modos SSL/TLS incluyen:

  • Flexible (propio de Cloudflare): La conexión entre el cliente y Cloudflare es segura, pero la conexión entre Cloudflare y el servidor de origen no usa SSL.



  • Full: Usa SSL entre Cloudflare y el origen, pero sin validar el certificado del origen.



  • Full (Strict): Requiere SSL entre Cloudflare y el origen, y el certificado del origen debe ser válido y confiable.





Otros proveedores de CDN y seguridad web pueden ofrecer configuraciones similares, aunque con nombres o implementaciones distintas.


Tipos de Certificados

Los certificados SSL/TLS mencionados (Universal, Avanzado, Personalizado, Keyless) son categorías que Cloudflare usa, pero la idea general detrás de estos tipos de certificados es común en la industria:


  • Certificados gratuitos (como los de Let’s Encrypt o los que Cloudflare proporciona automáticamente).
  • Certificados avanzados o gestionados (más configurables, pero aún automatizados).
  • Certificados personalizados (cuando el cliente usa su propio certificado).
  • Certificados sin clave (Keyless SSL) (para permitir la protección sin exponer claves privadas).

Otros proveedores como AWS CloudFront, Fastly o Akamai también ofrecen opciones de administración de certificados SSL/TLS con características similares.

En resumen, aunque los términos específicos pueden ser exclusivos de Cloudflare, los conceptos detrás de la encriptación SSL/TLS y los tipos de certificados son estándares de la industria.

Keyless SSL

Por motivos regulatorios, muchas organizaciones no pueden compartir sus claves privadas. Con Keyless SSL  (SSL sin llave), estas organizaciones aún pueden usar TLS y aprovechar la nube manteniendo la clave segura.

SSL sin clave se basa en el hecho de que solo hay un momento en el que se utiliza la clave privada durante el protocolo de enlace TLS, que ocurre al comienzo de una sesión de comunicación TLS. SSL sin llave funciona dividiendo los pasos del protocolo de enlace TLS. Un proveedor de nube que ofrece SSL sin clave mueve la parte de la clave privada del proceso a otro servidor, generalmente un servidor que el cliente mantiene en las instalaciones. En lugar de utilizar la clave privada directamente para generar claves de sesión, el proveedor de la nube obtiene las claves de sesión de la empresa a través de un canal seguro y utiliza esas claves para mantener el cifrado. Por tanto, se sigue utilizando una clave privada, pero no se comparte con nadie ajeno a la empresa.


Keyless SSL sólo es "sin llave" desde el punto de vista del proveedor de la nube: nunca ven la clave privada de su cliente, pero el cliente aún la tiene y la usa. Mientras tanto, la clave pública todavía se usa en el lado del cliente como de costumbre.

Session Keys

Una clave de sesión es cualquier clave de cifrado utilizada para cifrar simétricamente una sola sesión de comunicación. Una sesión se lleva a cabo a través de una red y comienza cuando dos dispositivos se reconocen mutuamente y abren una conexión virtual. Finaliza cuando los dos dispositivos han obtenido la información que necesitan entre sí y envían mensajes "terminados", finalizando la conexión.


Encritación

Recientemente estoy cursando un training asignado por la compañía. Y quiero compartir breves resumen de algunos tópicos. En esta ocasión hablaré brevemente sobre la Encriptación.

Que es la Encriptación?

Se puede definir como el cifrado o codificación de datos para que sólo las partes autorizadas puedan entender la información. El cifrado es el proceso de convertir texto sin formato legible por humanos en texto incomprensible, también conocido como texto cifrado.
El cifrado requiere el uso de una clave criptográfica: un conjunto de valores matemáticos que tanto el remitente como el destinatario acuerdan.




2 tipos de Encriptación

Los dos tipos principales de cifrado son el cifrado simétrico y el cifrado asimétrico. El cifrado asimétrico también se conoce como cifrado de clave pública.

Cifrado simétrico

En el cifrado simétrico, solo hay una clave y todas las partes que se comunican utilizan la misma clave (secreta) tanto para el cifrado como para el descifrado.


Cifrado asimétrico

En el cifrado asimétrico o de clave pública, hay dos claves: una clave se utiliza para el cifrado y una clave diferente para el descifrado. La clave de descifrado se mantiene privada, mientras que la clave de cifrado se comparte públicamente, para que cualquiera pueda usarla. El cifrado asimétrico es una tecnología fundamental para TLS.


¿Qué es una clave criptográfica?

En criptografía, una clave es una cadena de caracteres utilizada dentro de un algoritmo de cifrado para alterar datos para que parezcan aleatorios. Al igual que una clave física, bloquea (cifra) los datos para que sólo alguien con la clave correcta pueda desbloquearlos (descifrarlos). 


SSL/TLS requiere el uso de lo que se llama una clave pública y una clave privada, y en el caso de una empresa que utiliza el protocolo para proteger el tráfico hacia y desde su sitio web (consulte HTTPS), la clave privada normalmente permanece en posesión de la empresa. Pero cuando una empresa pasa a la nube y un proveedor proporciona cifrado TLS, el proveedor tiene la clave privada.

jueves, 2 de enero de 2025

¿Quién inventó los patrones de diseño?

Continuando con la saga de Patrones de diseño, hoy quiero contextualizar un poco y conversar del origen. Como había mencionado en post anterior, los patrones son soluciones a problemas habituales en el coding, y, cuando una solución se repite una y otra vez, este pasa a ser bautizado con un nombre y explicar su solución a detalle. De esta manera nace un patrón.

De acuerdo a la fuente estudiada,  en 1977 surge un libro llamado "A Pattern Language"/"El lenguaje de patrones". Su contenido es orientada a la arquitectura urbana escrito por Christopher Alexander.


Básicamente, contempla una seria de patrones para describir por ejemplo: alto y tipos de ventanas, niveles de un edicto, zonas verdes de un emplazamiento, etc.

En 1995, esta idea fue traslada a las diversas problemas y soluciones que se pueden tener a la hora de codificar un software. Los autores de esta genial idea son Eric Gamma, John Vlissides, Ralph Johnson y Richard Helm en su publicación "Patrones de diseño".



Este libro presenta 23 patrones que resuelven problemas de diseño orientado a objetos. Desde entonces, se han descubierto numeroso patrones de diseño.


martes, 31 de diciembre de 2024

Introducción a Patrones de Diseño

 Tal como hablé en otro post, tenemos 2 conceptos: Patrones Arquitectónicos y Patrones de Diseño de Software. Me enfocaré en este último en esta serie de post.

Los patrones de diseño son soluciones habituales a problemas frecuentes en el desarrollo de software. Siempre me ha encantado la analogía, el cual dice, que son como planos para construir un puente, en donde, se considera: 

  • El tráfico de personas o vehículos
  • condiciones climáticas
  • el entorno geográfico
  • etc.
Estos patrones no son porciones de código que puedan llegan a copiarse y pegar en nuestro proyecto, sino más bien, son conceptos que deben de entenderse, asimilarse y luego implementar en tu proyecto según la naturaleza de tu proyecto.



¿En qué consiste un patrón?

La gran mayoría son descritos para que puedan ser reproducidos en el contexto que a ti te envuelve. Y esta descripción contiene estas secciones:
  • Propósito: Explica el problema y la solución.
  • Motivación: Explica en detalle el problema y la solución brindada.
  • Estructura: Indica una estructura de clases y su relación.
  • Código:  Es un ejemplo  para facilitar la asimilación.

Clasificación de los patrones

Debido a que un patrón varía en su complejidad y el objetivo a resolver es que surgen 3 grupos:
  1. Patrones Creaciones: Ofrecen mecanismos para creación de objetos y facilitan la flexibilidad y reutilzación de código.
  2. Patrones Estructurales: Explican como se ensamblan los objetos y clases para mantener la flexibilidad y eficiencia
  3. Patrones de Comportamiento: Buscan una comunicación efectiva y la asignación de responsabilidades entre los objetos.

En otro post abordaré cada vez mas amplio estos conceptos. Nos vemos en el siguiente post.

PATRONES ARQUITECTÓNICOS y PATRONES DE DISEÑO. Es lo mismo?

Quiero compartir una pequeña introducción a este tema. Muchas veces se confunde patrones de diseño con patrones arquitectónicos.

Patrones de Diseño

Un patrón de diseño son soluciones habituales a problemas que ocurren con frecuencia en el diseño de piezas, módulos, etc. Estos patrones no son código que puedas llegar y copiar, más bien, es una conceptualización que tu podrás adaptar para encajar a la resolución que buscas en tu aplicación.   Acá voy a mencionar algunos que he tenido la oportunidad de usar: 

  • fachada, 
  • abstract factory,
  • singleton,
  • fábrica.
  • entre otros
Existen muchos más que te recomiendo revisar en el libro REFACTORING GURU (muy bueno). En otros post voy a ir desarrollando mas este tema, con su tipos y características.

PatronesArquitectónicos

Se enfocan en la resolución de problemas en aplicaciones completas a más alto nivel para obtener la mejor performance, asegurar que tenga escalabilidad, soporte latencia, tolerancia a fallos, etc. Aquí puedo mencionar algunos de estos patrones:
  • microservicios, 
  • EDA (Event Driven Architecture)
  • Capas, 
  • MVC, 
  • CQRS, 
  • entre otros.

Los patrones arquitectónicos pueden aplicar patrones de diseños para su implementación en sus piezas más pequeñas.
No confundir tampoco con las buenas prácticas de desarrollo como lo son SOLIC que quizás voy a compartir en otro post.



Este es un resumen muy breve, si quieres agregar más a esto: bienvenido y gracias. Espero tus comentarios 👇

lunes, 29 de diciembre de 2014

Generar Password Aleatoriamente

Si en alguna ocasión te has visto en la necesidad de generar password aleatoriamente, aquí les dejo un enlace muy bueno donde ejemplifican como realizar este método en nuestras aplicaciones.

Link: https://alskare.wordpress.com/2009/10/13/c-generador-de-passwords-aleatorios/

Espero les sirva

Gridview y RowEditing: Error ParameterCountException

Hola amigos, despues de tanto tiempo vuelvo a hacer entradas a mi blog. Bueno hoy me topé con un problemita en ASP.NET utilizando el Gridview dentro de un UpdatePanel. El grid ejecuta el evento RowEditing. Al ejecutarlo me daba el siguiente error: ParameterCountException!!!

Y googleando encontre la solución al problema: basta con declarar en el ScriptManager el atributo ScriptMode="Release"

Espero les sirva!!

Saludos.

miércoles, 9 de febrero de 2011

Acentos y Javascript Alert

Saludos amigos, un gran saludo después de tanto tiempo. El día de hoy me topé con el problema que en el proyecto que estoy desarrollando en ASP.NET, necesitaba enviar una serie de alert tras una serie de validaciones, el cual tengo un archivo *.js que contiene dichas funciones de validaciones. El caso es que dentro de los alert me topé con el problemas de los acentos y las Ñ/ñ, que no se mostraban correctamente al lado del cliente, en algunas ocaciones por el tema de codificación.


Navegando por ahi encontré la solución: Cuando requieras emplear acentos o la "Ñ/ñ" debes de reemplazarlas por unicode.

\u00e1 -> á
\u00e9 -> é
\u00ed -> í
\u00f3 -> ó
\u00fa -> ú
\u00c1 -> Á
\u00c9 -> É
\u00cd -> Í
\u00d3 -> Ó
\u00da -> Ú
\u00f1 -> ñ
\u00d1 -> Ñ



viernes, 12 de noviembre de 2010

Desarrollador 5 Estrellas - 4ta Estrella Cardspace

Hola amigo, para aquellos que están dando las pruebas de la certificación desarrollador 5 estrellas, y van por la 4ta en este momento, aqui les dejo el link de la prueba correspondiente a Cardspace, yo me base en esta y obtuve el 80%. http://ring0a.blogspot.com/2010/09/desarrollador-cinco-estrellas-4-1.html, en un proximo post les publicaré las respuestas.


Espero les sirva
Saludos.

miércoles, 10 de noviembre de 2010

Balsamiq Mockups:Creación de bosquejos sobre interfaces gráficas

Hola amigos, saben que hace unos meses atras necesitaba un software que me permitiera realizar bosquejos sobre interfaces gráficas de paginas web o de aplicaciones de escritorio que en mi trabajo me toca desarrollar.
Y por ahi encontré esta herramienta llamada Balsamiq Mockups
Bueno para poder instalar el programa (que es muy liviano) tenés que instalar el programa de Adobe Air. Está todo comprimido en el archivo Megaupload. Obviamente no es gratuito pero después de tanto buscar consegui el serial para que todos los T! lo puedan utilizar ilimitadamente...

http://www.megaupload.com/?d=142MQMNA

Organization name: leexij@gmail.com
Serial Key: eNrzzU/OLi0odswsqslJTa3IzHJIz03MzNFLzs+tMTQyNrcwsTQyAIEa5xpDAIFxDy8=


viernes, 5 de noviembre de 2010

BEGIN TRAN, COMMIT, ROLLBACK & GOTO

En muchas ocaciones tenemos que llevar un control sobre las transacciones que se realizan en la base de datos. Y TRAN nos permite poder ejecutar nuestras instrucciones SQL como una unica instrucción, donde todas fracasan o todas tienen exito y se completan.

Si alguna de las operaciones de una transacción falla hay que deshacer la transacción en su totalidad para volver al estado inicial en el que estaba la base de datos antes de empezar. Esto se consigue con la sentencia ‘ROLLBACK TRAN’.

Si todas las operaciones de una transacción se completan con éxito hay que marcar el fin de una transacción para que la base de datos vuelva a estar en un estado consistente con la sentencia ‘COMMIT TRAN’.

Otra sentencia muy útil es GOTO, el cual nos permite ejecutar un camino alternativo de existir un error o una condición no cumplida, en SQL Server 2005 existe una nueva funcion de TRY y CATCH (el cual trataremos en otro Post).

Bueno aqui les muestro un ejemplo de como utilizarla en SQL Server (en mi caso SQL Server 2000).

ALTER PROCEDURE [DBO].[SP_Biotoscana_PreAviso]
@ACCION INT = 0,
@ERRORID INT OUTPUT,
@MSGReturn INT OUTPUT,
---------------------------------------------------------
@IDLINEA CHAR(5) = '1',
@IDPROD CHAR(30) ='',
@DESTINO CHAR(10) = '',
@LOTE CHAR(25) = '',
@FECVENC SMALLDATETIME = NULL,
@NUMOC CHAR(10) = '',
@NUMIMP CHAR(10) = '',
@PAIS CHAR(3) = '',
@CANTIDAD FLOAT = 0,
@UNIDAD CHAR(10) = '',
@PRECUNIT FLOAT = 0,
@MONEDA CHAR(4) = '',
---------------------------------------------------------
@NUMREF CHAR(15) = '',
@TIPOCOMPRA VARCHAR(15) = '',
@RUTPROV VARCHAR(100) = ''
AS
BEGIN
DECLARE @CORR CHAR(10)
SET @CORR = ''

IF @ACCION = 1
BEGIN
BEGIN TRAN

SET @CORR = (SELECT Lastbatnbr7+1 from SETUPWEB)
SET @MSGReturn = CAST((SELECT Lastbatnbr7+1 from SETUPWEB) AS INT)

update SETUPWEB set Lastbatnbr7= @CORR

INSERT INTO PRE_WEBHEADER (
CodLab,Corr, Crtd_DateTime, Crtd_Prog, Crtd_User,
Lupd_DateTime,Lupd_Prog,Lupd_User,NoteId,
RefLab,Status,TranType,VendId
) VALUES (
'49', @CORR,GETDATE(),'INTZ', 'NFS',
GETDATE(),'INTZ', 'NFS', 0,
@NUMREF, 'H',@TIPOCOMPRA,@RUTPROV
)

INSERT INTO PRE_WEBLINE
(
Corr,Crtd_DateTime,Crtd_Prog, Crtd_User,
CuryId,ExpDate,InvtId, LineRef,
LotSerNbr, Lupd_DateTime, Lupd_Prog,Lupd_User,
OrdNbr,OpenLine,Pais,QtyOrig,RefNbr,SiteId,
ShipperId,Status_Muestreo,TranDate,Unid,UnitPrice, QtyRcvd
)
VALUES
(
@CORR, GETDATE(), 'INTZ', 'NFS',
@MONEDA,@FECVENC,@IDPROD,@IDLINEA,
@LOTE,GETDATE(), 'INTZ', 'NFS',
@NUMOC, 'A', @PAIS,@CANTIDAD,@NUMREF, @DESTINO,
@NUMIMP,0, GETDATE(), @UNIDAD,@PRECUNIT, 0
)

SELECT @ERRORID = @@ERROR
IF (@ERRORID <> 0) GOTO PROBLEM
COMMIT TRAN

PROBLEM:
IF (@ERRORID <> 0) BEGIN
ROLLBACK TRAN
END
END
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Espero que sea de ayuda. Saludos.