jueves, 13 de abril de 2023

Sincronicidad forzada.

 El otro día leí esta entrada de un blog, que estaba en Hacker News, sobre como habían desechado RabbitMQ y se habían quedado usando una tabla de Postgres simulando una cola FIFO con la ayuda de los bloqueos y aislamiento que provee el motor de datos relacionales.

 No la voy a explicar aquí así que, si quieres contexto para el resto de la entrada, te animo a que la leas primero antes de continuar.

miércoles, 12 de abril de 2023

Programar con ChatGPT y un sacacorchos

Pues la IA sabe las respuestas pero hay que sacarlas con sacacorchos. Es una pena porque lo bonito de esto sería que cuando te diese una respuesta "pro", si hay algo que no entiendes o una característica que no conocías, le pudieses preguntar y así aprendes.

Voy a poner una conversación muy sencilla que he tenido con esta IA en la que se ve que le tengo que ir pidiendo las cosas poco a poco; eso significa que el usuario tiene que conocer las características, por lo que si el usuario no sabe, ChatGPT tampoco...

martes, 29 de noviembre de 2022

Cuando y como aplicar programación asíncrona.

Pues aquí estamos de nuevo. Hacía una pandemia que no escribía en este blog; debido a un buen montón de líos e imprevistos.

En esta entrada quería enumerar las situaciones más comunes, con las que es posible encontrarse, que pueden aprovechar las bondades de la programación asíncrona.

jueves, 12 de marzo de 2020

Cuando tienes un martillo (TypeScript) ...

todo parecen clavos (tipos). 

Estaba buscando como se hacen uniones discriminadas y pattern matching con typescript y me he encontrado con artículo en un blog con una solución para "reducir la cantidad de código que tenemos que escribir en una funcion reduce de Redux sin comprometer la seguridad de tipos".

Traducido al castellano significa que así pulsamos menos teclas para construir la función reduce porque al estar fuertemente tipado salen las letritas y los cartelitos de autocompletado del intellisense del VS Code.

martes, 10 de marzo de 2020

Composición de software - Inyeccion de dependencias funcional en la canalización de funciones.

La cosa viene de la I  y II parte. Pégale un vistazo si no lo has hecho todavía.

En esta entrada voy a demostrar lo fácilmente que se puede modificar y/o extender el comportamiento del workflow de la aplicación y además como se puede hacer inyectando las dependencias para conseguir una arquitectura con bajo acoplamiento.

lunes, 9 de marzo de 2020

Composición de software - Canalización de funciones con aridad heterogénea en JavaScript usando mónadas.

La cosa viene de la I parte. Pégale un vistazo si no lo has hecho todavía.

En esta entrada voy a usar una unión disyuntiva en las funciones orquestables del ejemplo anterior y modificamos la función pipe para que opere con ella.

jueves, 5 de marzo de 2020

Composición de software - Canalización de funciones con aridad heterogénea en JavaScript

La canalización de funciones es una de las partes más importantes para el desarrollo de software usando el paradigma de programación funcional.

Si revisas las entradas del gran Eric Elliott en Medium verás una línea de código extremadamente sagaz:

const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);

jueves, 6 de febrero de 2020

NodeJs en AppVeyor

Lo que parecía simple y directo al final es una odisea. Seguro que te suena...

Para poner en marcha un entorno de CI de NodeJs en AppVeyor hay que tener estas cosas en cuenta:

viernes, 24 de enero de 2020

Mi nuevo pet project.

Un completo engine en node.js y su bot de telegram acompañándolo, que permite jugar al juego de mesa MOON(1110011). Habla con el bot para jugar en single player; añade el bot a un grupo y podrás jugar en cooperativo con tus amigos! allá donde estés, sin fronteras!


Si alguien se siente generoso podría hacer un bot en otras plataformas; slack, messenger, etc utilizando el mismo engine por lo que en un principio lo tiene facilito ;)

lunes, 2 de diciembre de 2019

Jerarquía de contenedores de Inyección de dependencias en ASP.NET MVC

¿Has tenido alguna vez un sistema de información; cuya interfaz para la parte interactiva es ASP.NET MVC; que necesita mantener varias versiones de comportamiento en la capa de aplicación y/o negocio a la vez y la decisión de qué versión utilizar tenía que establecerse en tiempo de ejecución según el input del usuario? Si es así, quizás esto te interese.

jueves, 17 de octubre de 2019

Retryer funcional

Hasta ahora estaba utilizando PostSharp para mi infraestructura de reintentos y muy contento oye. Utilizar AOP para estas cosas de crosscutting concerns está muy guapo y solo con eso ya está a milenios luz de la mayoría de los proyectos laborales que te puedes encontrar.

Pero tenía un problema y es que no puedes modificar en tiempo de ejecución nada. No puedes decidir si una función se reintenta o no y no puedes cambiar los parámetros del reintento. Todo está decidido en tiempo de diseño y no hay manera de cambiarlo en tiempo de ejecución. Tampoco se puede tener la misma función decorada con 2 retryers diferentes que sean usadas por distintas partes del sistema.

lunes, 19 de agosto de 2019

Pillándole el rollo a Command Query Responsibility Segregation (CQRS) de una vez por todas.

Hay que ver lo que se complica la gente con conceptos tan sencillotes (aunque increiblemente útiles). La ultima vez que hablé sobre CQRS con alguien; este alguien tenía un pifostio montado en la cabeza sobre event sourcing, read/write models, consistencia eventual y un buen montón de paranoias que creía que era en lo que consistía CQRS.

miércoles, 5 de junio de 2019

Que las promesas no te controlen a ti.

Pues sí; aquí estamos tirando código Javascript que tenga que funcionar en navegadores relativamente antiguos y sin que me dejen usar Babel debido al gañanismo atávico de Españistan.

Aquí estamos usando la implementación de las promesas provistas por JQuery que deja mucho que desear. Pero a lo tonto he interiorizado varias cosas interesantes que quiero compartir.


viernes, 17 de mayo de 2019

Precomputa sin miedo que no muerde.

Parece ser que, en el mundo de la gente que intenta aplicar DDD, hay mucha reticencia a la hora de hacer cálculos en diferido fuera de la operación principal (agregado raíz) que necesita los resultados de ese cálculo. Eso es un error que te empantana hasta las tetillas y te hace liarla muy parda.


lunes, 29 de abril de 2019

Que no Neo; que no hay cuchara.



En DDD las entidades no existen. ¡BUM! Toma locura gorda; contradiciendo todos los textos existentes sobre el tema... o no ;-)

miércoles, 13 de febrero de 2019

Las montañas de la locura.

Si quieres hacer un juego donde las localizaciones son teseractos de esos que tienen geometrías no euclidianas como en el relato de Lovecraft o quieres hacer uno en el que te drogas mucho, tienes que usar este engine tan guapo:



Y aquí el código fuente que supongo que también seguirá estructuras de control no algebraicas para que ya pierdas la poca cordura que te queda:

jueves, 20 de diciembre de 2018

Consideraciones para multihilo

Un buen post para adentrarse en el mundo del multihilo sin liarla parda:


Bueno... asumámoslo, la vas a liar parda de todas maneras pero al menos tienes un buen comienzo para averiguar la que has liado y cómo arreglarlo. ;-)

miércoles, 12 de diciembre de 2018

The big idea is messaging

Esta es la continuación de la entrada enterior.

Pues sí, mensajes; el concepto más importante de la P.O.O. y el más ignorado y olvidado tanto por desarrolladores como por los diseñadores de lenguajes de programación O.O. Y eso es una pena porque los mensajes aportan un cosa imprescindible: Contexto. Y ese contexto es lo que nos permite diseñar agregados que no tengan que ser elementos persistibles y que no filtren detalles de su implementación.

viernes, 7 de diciembre de 2018

Los agregados no son elementos persistibles.

Si habéis leído ciertas entradas en este blog; alguna vez me habréis visto comentar que hacer que un agregado sea un elemento que se guarda en persistencia a bloque (y por ende se lee de persistencia a bloque) es un detalle de implementación que no es obligatorio y no debe afectar al diseño del agregado ni que este dependa del esquema de persistencia.