Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
lunes, 28 de abril de 2025
Desarrollador examinando con una lupa C# frente a otros lenguajes de programación

Aquí tenemos la entrega número 607 de la recopilación semanal de contenidos interesantes 🙂

Esta semana podemos destacar un extenso artículo de Milan Milanović, donde nos explica por qué C# es el mejor lenguaje de programación: sus características, ventajas, historia, futuro, comparación con otros lenguajes, y mucho más.

También me ha llamado la atención CSS Hell, un conjunto de puzzles donde tendrás que exprimir tus conocimientos de CSS para conseguir los objetivos que te plantean 👉 https://csshell.com/

Finalmente, Juan Luis Guerrero nos muestra cómo combinar distintas tecnologías como Semantic Kernel, Phi-3 y Qdrant para construir una API RAG.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET

martes, 22 de abril de 2025
Máquina generando modelos LLM como churros

Ha sido una semana especial con tanto festivo, pero aún así he conseguido recopilar contenidos que espero que os resulten interesantes, sobre .NET, ASP.NET Core, IA, programación web y muchos otros temas.

En esta ocasión ponemos el foco en la carrera de las tecnológicas lanzando modelos de IA generativa. Aunque esta locura está haciendo que deje de sorprendernos cada lanzamiento, está bien saber que esta semana OpenAI ha presentado tres nuevos modelos: GPT 4.1, o3 y o4-mini.

Vale la pena echar también un vistazo a las mejoras de Copilot en el recientemente lanzado Visual Studio 17.14 Preview 3: autocompletado de código, chat, nuevos modelos, inferencia de próximas ediciones o pegado inteligente son algunas de las novedades.

E interesante el detallado paso a paso de Juan Luis Guerrero sobre cómo crear una extensión de Copilot para Visual Studio Code usando MCP para conectarlo con una herramienta personalizada creada con .NET.

El resto, a continuación.

Por si te lo perdiste...

.NET

lunes, 14 de abril de 2025
Ingeniero midiendo latencias de distintos dispositivos. De fondo, una TV con una entrevista a Linus Torvals

En la entrega número 605 de nuevo superamos los sesenta enlaces a contenidos interesantes recopilados durante la semana pasada, abarcando temas de .NET, ASP.NET Core, Azure, CSS, JavaScript, IA y muchos otros.

Destacar, antes de nada, que con esta entrada superamos oficialmente los quince años desde que comenzamos a recopilar y publicar enlaces interesantes, el 11 de abril de 2010. Hace poco ya celebramos la entrega 600, así que no os daré la turra con esto; simplemente, a estas alturas es curioso revisar aquél post inicial "Enlaces interesantes 1", con formato raro, imágenes rotas, personas que ya no están en primera línea, blogs que no existen, herramientas obsoletas... en fin, el paso del tiempo 😉

Cinco años más (o sea, 20) cumple Git, y Taylor Blau lo celebra con una entrevista al mismísimo Linus Torvalds, el creador de esta herramienta, hoy imprescindible en el día a día de cualquier desarrollador-

Y continuando con el número veinte: algo más de veinte días han pasado desde que se lanzó la segunda versión preliminar, y ya tenemos la Preview 3 de .NET 10, con mejoras en bibliotecas, runtime, SDK, MAUI, C#, ASP.NET Core, Blazor y Entity Framework, entre otros. ¡Vaya ritmo que llevan!

Por último, os recomiendo echar un vistazo al post de Benjamin Dicken sobre la latencia en dispositivos de  almacenamiento habituales: su historia, cómo funcionan y el rendimiento que ofrecen. Pero aparte de la información, lo que más me ha gustado es la forma de presentarla.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET

martes, 8 de abril de 2025
Persona al teléfono que no sabe quién le está llamando

En C#, existen atributos que no están diseñados para añadir metadatos consumibles en tiempo de ejecución, sino que están pensados para ser interpretados por el compilador.

Entre ellos, se encuentran los atributos englobados en la categoría "caller information", que ofrecen la posibilidad de que un método o función conozca información sobre el método que lo ha llamado, como el nombre del archivo, el número de línea, el nombre del método o la expresión de argumento.

Esto puede ser muy interesante en diversos escenarios, pero probablemente el ejemplo más claro lo encontramos en la generación de trazas y puntos de control, puesto que, en lugar de tener que escribir manualmente el nombre del método o el número de línea, podemos obtenerlos de forma automática.

Lo vemos a continuación.

lunes, 7 de abril de 2025
Artista pintando el contenido de un desplegable en un formulario, Bill Gates celebrando el 50 aniversario de Microsoft y una Llama asomando por detrás

Una semana más, vamos con una recopilación de contenidos interesantes que he ido descubriendo durante los últimos días. De nuevo, más de 60 enlaces a artículos sobre .NET, C#, Azure, ASP.NET, Blazor, Machine Learning, IA, JavaScript, HTML, CSS y mucho más. Espero que os resulten útiles.

En esta entrega hay bastantes temas reseñables, pero me voy a quedar sólo con unos cuantos 🙂

Para celebrar el 50 aniversario de Microsoft, Bill Gates nos cuenta los inicios de la compañía y comparte el código de Altair Basic, su primer producto. Aparte del contenido, es un post con una estética retro fantástica que bien merece un vistazo.

Un nuevo terremoto, con epicentro en los conocidos Automapper y MediatR, que de nuevo traen a la palestra el problema de la sostenibilidad de los proyectos open source y, obviamente, con reacciones de todo tipo al respecto.

José Manuel Alarcón nos muestra Docker Model Runner, una herramienta que permite ejecutar localmente modelos generativos de IA de forma muy sencilla, y acceder a ellos desde línea de comandos o mediante una API compatible con OpenAI. 

En el apartado de historias truculentas, descubrimos un post de Jacob Voytko publicado hace unas semanas, donde describe su lucha contra el bug más difícil al que se ha enfrentado mientras trabajaba en el equipo de Google Docs. Muy interesante-

También traemos una buena noticia para los frontenders: por fin podemos personalizar visualmente el elemento <select> con CSS. En este artículo de Adam Argyle nos cuenta cómo hacerlo y hasta dónde podemos llegar con esta nueva posibilidad-

Y por último... ¡boom! Meta presenta y pone a disposición de la comunidad varias ediciones de Llama 4, modelos abiertos multimodales con hasta 10 millones de tokens de contexto, velocidad y rendimiento de primera línea. Y próximamente habrá más, y más potentes.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET

martes, 1 de abril de 2025
Minions numerados ordenados lexicográficamente

Cuando hablamos de comparar números enteros, está claro que 1 es menor que 2, y éste menor que 10:

1 < 2 < 10

Sin embargo, si estos valores están en una cadena de texto, la comparación se hace carácter a carácter, y en ese caso "10" es menor que "2":

"1" < "10" < "2"

Este criterio de ordenación puede ser molesto en muchos escenarios, sobre todo cuando queremos ordenar o comparar valores numéricos se encuentran en el interior de cadenas de texto donde hay otros contenidos. En todos estos casos, la comparación lexicográfica tradicional no nos dará los resultados esperados:

  • Una lista de nombres de archivo como "file1.txt", "file2.txt"... así hasta "file10.txt". Al ordenarlos, "file10.txt" aparecerá antes que "file2.txt".
  • Versiones de un software, como "1.2" y "1.10". Si las comparamos, la versión "1.10" será anterior a la "1.2", cuando en realidad es al revés.
  • De la misma forma, una lista de direcciones IP, como "10.10.2.10", "10.10.10.10", si queremos mostrarlas de forma ordenada, obtendremos "10.10.10.10" y "10.10.2.10", que no es su orden numérico real.
  • O simplemente, si comparamos las horas "01:10" con "1:10", la primera será anterior a la segunda, cuando en realidad se trata de la misma hora.

Hasta la versión 10 de .NET no existía una forma sencilla de resolver estos casos, por lo que teníamos que implementar soluciones propias, bastante farragosas en algunos casos, o bien utilizar bibliotecas de terceros. Sin embargo, en .NET 10 se ha añadido una forma nativa para conseguirlo, que vemos a continuación.

lunes, 31 de marzo de 2025
Usuarios protegidos tras un token antiforgery

La recopilación de enlaces número 603 está ya disponible, con más de 60 links a contenidos sobre .NET, C#, ASP.NET, Azure, Machine Learning, Web, HTML, CSS, JavaScript y otros temas que, como siempre, espero que os resulten interesantes 🙂

Si desarrolláis páginas con muchos elementos en el DOM, os puede venir bien echar un vistazo a content-visibility, una propiedad CSS que nos puede ayudar a mejorar el rendimiento de páginas web al omitir la renderización de elementos que no son visibles en la pantalla 👉 https://cekrem.github.io/posts/content-visibility-auto-performance/

Continuando en el mundo web, pero esta vez desde la perspectiva de la seguridad, tenemos un gran repaso de Maarten Balliauw al sistema de tokens antiforgery en ASP.NET Core. En este post, veremos qué es CSRF y cómo estos tokens pueden ayudarnos a prevenirlo cuando utilizamos MVC, Razor Pages o Minimal APIs.

También me ha parecido curioso el post de Mohammad Zeya Ahmad sobre tiempos de latencia de distintas operaciones frecuentes. Está bien para tener en mente al menos las proporciones y magnitudes que manejamos en cada caso.

Y por último, echamos un vistazo al protocolo de moda: MCP. Se trata de un protocolo abierto, creado por Anthropic, que propone mecanismos de integración entre aplicaciones basadas en modelos de texto y fuentes de datos o herramientas. Muy interesante.

El resto, a continuación...

Por si te lo perdiste...

.NET

martes, 25 de marzo de 2025
Desarrolladores Javascript y C# trabajando juntos

En JavaScript es frecuente encontrar expresiones como esta para comprobar si un objeto tiene valor (o, al menos, si su valor es uno de los reconocidos como truthy):

const friend = getFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend) {
    // Hacer algo con el objeto friend
}

Debido a su sistema de tipos estricto, en C# no es posible hacer lo mismo de forma directa, tenemos que comprobar si el objeto es null, por ejemplo así:

var friend = GetFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend is not null) {
    // Hacer algo con el objeto friend
}

Sin embargo, con muy poco esfuerzo podemos hacer que C# acepte la sintaxis de JavaScript para ese tipo de chequeos de nulidad, implementando en nuestra clase un conversor implícito a bool. Lo vemos a continuación.

lunes, 24 de marzo de 2025
Una persona que no se dedica al desarrollo programando con la mente

Otra semana más, aquí tenemos los enlaces recopilados durante los últimos siete días que, como de costumbre, espero que os resulten interesantes 🙂

En esta ocasión, nos llevamos la sorpresa de la aparición de la segunda preview de .NET 10, apenas veinte días después de publicarse la primera. ¿Se han adelantado? ¿O es que se retrasaron con la primera y al final se han agolpado? 🤔 Bueno, la cuestión es que aquí la tenemos, con novedades en el SDK, C#, runtime y los frameworks asociados (ASP.NET Core, MAUI, Entity Framework, Windows Forms, etc.)

Por otro lado, ¿qué es eso del vibe coding? Sin duda es muy espectacular, pero, ¿nos va a quitar el trabajo a todos? ¿Pondrá la programación al alcance de cualquiera? El artículo de Jacob Anderson lo explica.

También podemos leer a Mark Seemann hablando sobre versionado de bases de código y estrategias para la gestión de breaking changes en proyectos de largo recorrido. Muy interesante.

El resto de enlaces, unos sesenta, los tenéis a continuación.

Por si te lo perdiste...

.NET

martes, 18 de marzo de 2025
Vista trasera de un coche de carreras a toda velocidad

En nuestras aplicaciones, es relativamente frecuente tener que buscar una serie de valores dentro de un conjunto de datos. Existen muchos escenarios, como cuando tenemos que buscar una serie de palabras dentro de un texto largo, o comprobar si todos los caracteres de un string pertenecen a un conjunto de caracteres válidos.

Por ejemplo, centrándonos en este último caso, imaginad que queremos comprobar si el contenido de una cadena de texto de tamaño arbitrario contiene únicamente una serie de caracteres válidos (por ejemplo, las vocales). La implementación que se nos ocurriría de forma natural sería muy simple: recorrer la cadena de texto de entrada, y, por cada carácter, comprobar si está en el conjunto de caracteres permitidos. ¿Fácil, no?

Sin embargo, como veremos en este post, hay formas mucho más eficientes de hacerlo.

lunes, 17 de marzo de 2025
Personas en coche cargado con muchas cosas que no van a necesitar

Ya tenemos por aquí la recopilación de enlaces de la semana, en esta ocasión con más de 50 enlaces, aunque especialmente cargadas las secciones de .NET y desarrollo web.

Destacable el artículo de Derek Comartin sobre el principio YAGNI (You Aren't Gonna Need It, "No vas a necesitarlo") en el desarrollo de software, y cómo la tentación de añadir abstracciones o código genérico puede llevarnos a un exceso de complejidad que no aporta valor al proyecto.

También, Ricardo Peres continúa su interesante exploración sobre los puntos de extensibilidad de ASP.NET Core, centrándose en esta ocasión en el framework MVC.

El último dramita en la comunidad .NET lo protagoniza el compilador de TypeScript, que ha sido portado a Go y ha multiplicado por diez su rendimiento. Anders Hejlsberg nos lo cuenta de primera mano en este artículo, y podéis seguir el culebrón en este hilo de GitHub.

Y para finalizar con comentario rápido, sabed que HybridCache ya ha salido de preview. Claudia Regio nos resume las novedades de esta herramienta.

El resto de enlaces, a continuación 🙂

Por si te lo perdiste...

.NET

martes, 11 de marzo de 2025
Aseo público con información sobre los urinarios

Quizás sea el único del mundo que desconocía la existencia de "Tech on the toilet", la iniciativa de Google que lleva casi veinte años llevando información de calidad a los aseos de sus oficinas para que los desarrolladores, mientras hacen sus necesidades, puedan mejorar sus habilidades de desarrollo de software.

Pero como seguro que habrá algún despistado más, me ha parecido interesante compartirlo por aquí, así que vamos allá 🙂

lunes, 10 de marzo de 2025
Enlaces interesantes

Esta semana llegamos a la entrega número 600 de los enlaces interesantes, ¡quién lo iba a decir cuando publiqué la primera recopilación, allá por abril de 2010! Desde entonces, exceptuando los periodos vacacionales y alguna semana que por motivos personales o profesionales no haya podido ser, cada día dedico un buen rato a revisar mis fuentes y seleccionar los contenidos que me parecen más interesantes para compartirlos con vosotros. Luego, normalmente los domingos, me siento a escribir la entrada, añadiendo una pequeña introducción y organizando los enlaces por categorías para facilitar su consulta.

Por cuantificarlo de alguna forma, cada recopilación suele tener entre 60 y 70 links, así que he compartido como mínimo 36.000 enlaces a contenidos que he considerado valiosos, y, haciendo cuentas rápidas, he debido dedicar más de 3.000 horas (unos 375 días a jornada completa) a revisarlos y seleccionarlos. Si tenéis curiosidad por cómo lo hago, los criterios de selección de contenidos, cómo los ordeno, cuáles son mis fuentes, qué herramientas uso, etc., lo podéis leer en este post de hace unos años 👉 https://www.variablenotfound.com/2020/04/diez-anos-de-enlaces-interesantes-lo.html

Pero bueno, creo que el esfuerzo está justificado. En primer lugar, porque me gusta estar al día, y creo que en nuestra profesión es totalmente necesario. Y luego, porque ya que de todas formas estoy dedicando tiempo a ello, ¿por qué no compartirlo con vosotros? Y si a alguien le resulta útil, o le ahorra tiempo, o le descubre algo nuevo, pues ya me doy por satisfecho 🙂 

¡Muchas gracias a todos por estar ahí!

Y dicho esto, vamos con la recopilación semanal, de nuevo más de sesenta enlaces, en esta ocasión con mucha presencia de contenidos sobre inteligencia artificial, novedades en herramientas, .NET, MAUI, Azure y Web.

En esta cosecha, muy interesante, y de agradecer, el esfuerzo de José Manuel Alarcón por traducir a un idioma que podamos entender los mortales lo que es Majorana 1 y cómo promete revolucionar el mundo en los próximos años.

También me ha alegrado volver a leer a Marc Rubiño, comentando esta vez el papel de los CTO en las startups, los desafíos a los que se enfrentan y buenas prácticas para lograr el éxito en ese rol.

Juan Irigoyen da un buen repaso a los niveles de aislamiento de transacciones en SQL Server, un tema que siempre es interesante y que conviene tener claro, especialmente en aplicaciones con alta concurrencia.

Y por último, interesante también el post de Sahil Malik donde muestra cómo generar imágenes con IA usando modelos locales.

El resto de enlaces, a continuación.

Por si te lo perdiste...

.NET

martes, 4 de marzo de 2025
Persona liberando pajarillos encerrados en una caja llamada ASP.NET Core

Normalmente los servicios usados por nuestra aplicación ASP.NET Core los registraremos en el contenedor de dependencias, para luego ir satisfaciendo los requisitos de los distintos componentes gracias a los mecanismos de inyección de dependencias que nos proporciona el framework. De estos servicios, aquellos que se registran como scoped se liberarán automáticamente al finalizar el proceso de la petición.

Sin embargo, si instanciamos manualmente un servicio durante el proceso de la petición, tendremos que encargarnos nosotros mismos de liberarlo cuando ya no sea necesario. Los que tengan un ámbito de vida corto, normalmente los crearemos y destruiremos utilizando using en algunos de sus sabores (como bloque o con ámbito local implícito), pero cuando queremos que pueda ser compartido entre varios componentes, no es sería tan sencillo... si no fuera porque el framework ya lo ha tenido en cuenta 🙂

Para estos casos, ASP.NET Core proporciona el extensor RegisterForDispose(), que nos permite registrar un servicio para que se libere automáticamente al finalizar la petición.

lunes, 3 de marzo de 2025

Aquí van los enlaces recopilados en la última semana de febrero, una buena colección que espero que os resulte de utilidad.

En esta ocasión, además de contenidos interesantes sobre C#, ASP.NET, Visual Studio, JavaScript, CSS, IA y otros temas, creo que la cosa ha ido de previews:

También me ha parecido muy completo el artículo de Joseph Thacker sobre cómo hackear aplicaciones y agentes basados en Modelos de Lenguaje.

Por último, en el capítulo de despedidas de clásicos, vamos a empezar a decirle adiós a Skype, una herramienta que, aunque en agónico declive desde hace ya tiempo, sin duda marcó una época.

El resto de contenidos, a continuación 🙂

Por si te lo perdiste...

.NET

martes, 25 de febrero de 2025
Una lupa examinando de cerca opciones de configuración

Si lleváis algunos años en esto, seguro recordaréis que en ASP.NET "clásico", los settings de las aplicaciones eran valores inmutables. Se guardaban habitualmente en el célebre archivo Web.config, y cualquier cambio a este archivo implicaba reiniciar la aplicación para que los cambios tuvieran efecto.

En ASP.NET Core, los settings son mucho más flexibles: se pueden cargar desde diferentes orígenes, pueden almacenarse en distintos formatos, y es posible modificarlos en caliente sin necesidad de reiniciar la aplicación. Pero además, ofrecen otra capacidad que es interesante conocer: podemos detectar y reaccionar a cambios en los settings en tiempo real, es decir, en el mismo momento en que se producen.

Para ello, básicamente tendremos que bindear una clase personalizada a la sección de settings que nos interese, y luego utilizar la interfaz IOptionsMonitor, para registrar un manejador personalizado que se ejecute cada vez que se produzca un cambio en los valores de configuración que estamos monitorizando.

En este post vamos a ver cómo hacerlo, paso a paso.

lunes, 24 de febrero de 2025
Arquitecto de SoundCloud trabajando en la modernización de su sistema

Un lunes más, ya tenemos aquí la colección de enlaces a contenidos interesantes recopilados durante la semana pasada. Como de costumbre, encontramos lecturas sobre .NET, ASP.NET Core, Blazor, IA, datos, frontend, JavaScript, TypeScript, MAUI y otros temas que espero os aporten algo 🙂

En esta ocasión, me gustaría destacar algunos de los artículos de la semana que más me han llamado la atención.

Primero, una nueva demostración de la velocidad brutal con la que se van produciendo avances tecnológicos de escala: la presentación por parte de Microsoft de Majorana 1, el nuevo chip que, según anuncian, adelantará el uso real de computación cuántica a unos años, en lugar de las décadas que estaban previstas.

También me ha resultado interesante el post sobre cómo SoundCloud evolucionó su su arquitectura utilizando BFF, microservicios y DDD. Estos contenidos basados en experiencias reales suelen ser bastante inspiradores.

Toda seguridad es poca, por lo que siempre es recomendable volver a echar un vistazo a las guías OWASP sobre cómo asegurar nuestras aplicaciones web full-stack.

Por último, es impresionante leer las mejoras que se van introduciendo en Visual Studio, especialmente las que hacen que el IDE sea cada vez más inteligente y, por tanto, nosotros seamos cada vez más productivos. En esta entrega, encontramos el soporte para tool calling en Copilot, y la información sobre el código usado como referencia para los autocompletados.

El resto, a continuación...

Por si te lo perdiste...

.NET

martes, 18 de febrero de 2025
Un patito de goma al que se ha forzado a ser un coche

Imaginad que tenemos un objeto clase Coche y otro del tipo PatitoDeGoma, sin ningún tipo de relación entre ellos. C# no permite hacer un cast y convertir libremente de uno a otro tipo o viceversa, ¿verdad?

Pues eso pensaba yo también, hasta que hace poco descubrí una característica de .NET que no he usado nunca y dudo que vaya a usar 😝, pero me ha parecido de lo más curiosa y quería compartirla con vosotros. Como podréis comprobar, es una buena candidata para la serie C# bizarro, de la que ya llevamos varias entregas, aunque en realidad se trata de una característica de la plataforma y no del lenguaje.

La protagonista es la clase estática System.Runtime.CompilerServices.Unsafe, que, según indican en la documentación oficial, implementa funcionalidades de bajo nivel para manipular punteros gestionados y no gestionados. Su objetivo, según esta misma fuente, es permitir a desarrolladores de bibliotecas escribir código de alto rendimiento evitando los chequeos de seguridad de .NET.

Esta clase proporciona métodos de aritmética de punteros, conversión de tipos y otras operaciones que no son seguras en C# y que, por tanto, no se permiten salvo en contextos unsafe. Sin embargo, en ocasiones, puede ser útil para realizar operaciones que no son seguras pero que sabemos que no van a causar problemas en tiempo de ejecución.

El que más me ha llamado la atención ha sido el método As(), que permite forzar un cast entre dos tipos que a priori no son compatibles sin realizar comprobaciones de tipo en tiempo de ejecución.

lunes, 17 de febrero de 2025
Gandalf interrogado

Aquí tenemos la colección semanal de enlaces a contenidos interesantes relacionados con el desarrollo de software con C#, ASPNET, Blazor, JavaScript, CSS, Azure, AI, .NET MAUI, Visual Studio y otros.

Por destacar, esta semana encontramos un interesante post de Ricardo Peres donde nos cuenta qué eso de OpenTelemetry, cómo enviar datos de telemetría desde aplicaciones ASP.NET Core, y cómo recopilarlos y consultarlos usando herramientas como Grafana, Loki, Tempo y Prometheus a través de una imagen de Docker. Imperdible.

También me ha parecido curioso Gandalf, el juego al que llego a través del post de Bart Wullems, que nos permite comprobar nuestras habilidades para manipular un LLM usando inyección de prompts. Sin duda, da para un buen rato de maldad y diversión 😉

El resto, a continuación. ¡Espero que os resulten interesantes!

Por si te lo perdiste...

.NET

martes, 11 de febrero de 2025
Desarrollador trabajando con herramientas

Desde que se introdujo en Visual Studio el soporte para archivos .http, he estado usando esta funcionalidad del IDE para probar APIs, dejando casi totalmente de lado a herramientas que había utilizado siempre como Postman o Fiddler. Es genial tenerlo todo en el mismo entorno, que sea tan sencillo de utilizar, y que se integre tan bien con otras herramientas del ecosistema, como el endpoint explorer, user secrets de ASP.NET Core, Azure key vault, etc.

Sin embargo, una limitación importante era que sólo podíamos declarar y asignar variables, pero éstas no podían ser modificadas en tiempo de ejecución. Esto hacía que, por ejemplo, no pudiéramos hacer una llamada a un endpoint de autenticación y utilizar luego el token retornado para acceder a determinados recursos, por lo que teníamos que hacerlo manualmente.

Pero esto cambió con la versión 17.12 de Visual Studio 2022, donde se ha añadido la posibilidad de poder capturar valores de la respuesta de una petición para utilizarlos más adelante en otras peticiones.

lunes, 10 de febrero de 2025
El equipo técnio de una empresa despidiéndose Azure Data Studio

Ya está disponible la entrega semanal número 596 de la serie, donde, como de costumbre, podéis encontrar decenas de links a contenidos que he ido recopilando durante la semana y considero interesantes sobre .NET, ASP.NET Core, Blazor, acceso a datos, inteligencia artificial, programación en frontend, herramientas y otros temas.

En esta ocasión, lo que me más ha llamado la atención es la retirada de Azure Data Studio. Ahora que estaba empezando a tenerle cariño a esta herramienta para gestionar mis bases de datos SQL Server, resulta que la van a discontinuar en favor de la extensión MSSQL extension de Visual Studio Code.

¿Sabíais que la media de tiempo que se tarda en volver a concentrarse en una tarea después de una interrupción es de 23 minutos? Muy interesante el artículo de Milan Milanović sobre cómo los cambios de contexto, o context switching, afectan a la productividad de los desarrolladores. Aunque cualquiera que se dedique al desarrollo ya lo ha sentido en sus carnes, es interesante leer un análisis más profundo sobre el tema.

Vale la pena echar también el vistazo a las reflexiones de Tim O'Reilly sobre cómo afectará la irrupción de la IA en el trabajo de los desarrolladores. ¿Iremos todos a la calle? ¿O, por el contrario, se abrirán nuevas oportunidades? Spoiler: la clave es adaptarse.

El resto de enlaces, a continuación...

Por si te lo perdiste...

.NET

martes, 4 de febrero de 2025
Máquina compleja con piezas explotando

Como sabemos, es muy sencillo implementar servicios en segundo plano alojados en el interior de aplicaciones ASP.NET Core porque el framework nos proporciona infraestructura que simplifica la tarea, permitiendo que nos enfoquemos en la lógica de negocio que queremos ejecutar en background en lugar de tener que preocuparnos de los aspectos de más bajo nivel necesarios para hacer que funcione.

En la práctica, basta con heredar de la clase BackgroundService y sobreescribir el método ExecuteAsync para implementar la lógica que queremos ejecutar en segundo plano. Por ejemplo, el siguiente servicio se encarga de escribir un mensaje en la consola cada segundo:

public class MyBackgroundService : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
	    Console.WriteLine($"Current time: {DateTime.Now:T}");
	    await Task.Delay(1000, stoppingToken);
        }
    }
}

Luego tendríamos registrar este servicio en el contenedor de dependencias de ASP.NET Core, de forma que el framework lo detectará automáticamente y lo lanzará cuando la aplicación sea iniciada:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHostedService<MyBackgroundService>();
...

Al ejecutar, veremos que, en la consola donde hemos lanzado la aplicación, se escribirá periódicamente la hora desde la tarea en segundo plano:

Current time: 13:34:06
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7080
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5148
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: D:\Projects\BackgroundServiceCrash
Current time: 13:34:07
Current time: 13:34:08

Pero bueno, no es esto de lo que quería hablar, sino de lo que ocurre cuando en uno de estos servicios en segundo plano se produce un error... porque ojo, que si no tenemos cuidado puede tumbar completamente nuestra aplicación.

lunes, 3 de febrero de 2025
Desarrollador construyendo una casa con Lego

Estrenamos febrero con la recopilación número 595 de enlaces interesantes, cargado de contenidos variados y de calidad relacionado con el desarrollo de software: .NET, ASP.NET, Azure, conceptos, patrones y buenas prácticas, IA, programación web (HTML, CSS, Javascript, frameworks), Visual Studio y herramientas, .NET MAUI, y otros.

Sin duda, la sorpresa y gran protagonista de la semana ha sido el lanzamiento de DeepSeek R1, la IA open source que ha puesto patas arriba a los que hasta ahora se consideraban los reyes del mambo, demostrando que China compite en primera división de los modelos generativos.

También es interesante echar un vistazo bajo el capó de los navegadores, a los mecanismos encargados de interpretar los para interpretar el código HTML y CSS que les llega y crear su representación visual. Aditya Bhattacharya nos lo cuenta el artículo HTML & CSS Deep Dive Part 1: How Browsers Make Sense of Your Code.

Sergey Teplyakov nos recuerda en el post The Dangers of Async Void lo peligroso que puede ser crear métodos o funciones async void en C#, una práctica que puede llegar a tumbar por completo una aplicación.

El amigo Braulio Díez vuelve con sus historias para no dormir, con el artículo Las migraciones tienen veneno, una visión práctica y realista de lo que hay detrás de estos proyectos que, aunque a primera vista pueden parecer sencillos, tienen bastantes trampas ocultas.

Por último, desde CampusMVP nos llega un post que abre los ojos sobre la realidad del open source: ¿es gratis? ¿quién lo mantiene? ¿quién contribuye? ¿Es sostenible? Muchas preguntas interesantes a las que podremos dar respuesta en el post y vídeo donde José Manuel Alarcón y Jorge Turrado debaten sobre el tema.

El resto de enlaces, a continuación 🙂

Por si te lo perdiste...

.NET Core / .NET

martes, 28 de enero de 2025
Un brazo robótico llamado NuGet gestionando paquetes en un almacén

Habitualmente los paquetes NuGet que usamos en un proyecto se registran en entradas <PackageReference> de su archivo .csproj. Es un mecanismo sencillo y efectivo cuando trabajamos con un único proyecto o un número reducido de ellos.

Sin embargo, cuando la cosa crece y estamos trabajando con muchos proyectos que usan paquetes comunes cuyas versiones deben estar alineadas, todo se complica un poco, y trabajar con ellos se puede convertir en algo bastante tedioso. Y más aún si no usamos una herramienta visual como NuGet Package Manager de Visual Studio.

Para estos escenarios, NuGet 6.2, lanzado en agosto de 2023 y presente por defecto en todas las instalaciones actualizadas de .NET y Visual Studio, introdujo el concepto de gestión centralizada de paquetes (en inglés, Central Package Management o CPM). Esta funcionalidad nos brinda la posibilidad de definir en un archivo independiente los paquetes utilizados, con sus versiones correspondientes, de forma que todos los proyectos de la solución puedan hacer referencia a él y mantener sus dependencias actualizadas.

lunes, 27 de enero de 2025
Enlaces interesantes

Aquí tenemos la entrega número 594 de enlaces a contenidos interesantes que he ido recopilando durante la semana, con mucho .NET, ASP.NET Core, IA, Azure, JavaScript, CSS, herramientas de desarrollo y más.

En esta ocasión me gustaría destacar el post de Neo Kim sobre cómo funciona Bluesky. Me encantan estos posts que detallan los engranajes que hay por detrás de aplicaciones que todos conocemos y que tienen unos requisitos altísimos de escalabilidad y rendimiento.

También me ha resultado muy interesante el post de Milan Jovanović sobre cómo escalar monolitos, porque creo que puede ser de utilidad si tenéis aplicaciones que con el tiempo han ido creciendo más allá de lo que se esperaba en un principio.

También en la sección "cómo funcionan las cosas que usamos todos los días" 😉, el post de Moncef Abboud es muy interesante para profundizar un poco en los algoritmos de compresión más habituales.

Por último, me ha hecho ilusión ver que NDepend sigue evolucionando e introduciendo mejoras para ofrecer perspectivas únicas de nuestras bases de código. Vale la pena echarle un vistazo.

Y ahora, a por el resto...

Por si te lo perdiste...

.NET Core / .NET

martes, 21 de enero de 2025
Programadores intentando entender un código imposible

En general, el uso de expresiones largas debería estar prohibido por ley. Hay pocas cosas que ataquen tanto a la legibilidad de un código como una expresión larga y compleja a la que tengamos que dedicar un buen rato cada vez que intentemos comprenderla. Y no digamos si nos toca modificarla 😱

Aunque esto es aplicable a cualquier tipo de expresión, en este post me voy a centrar en los predicados, que al fin y al cabo representan las condiciones que determinan el comportamiento de una aplicación.

Veamos un ejemplo de if con un predicado que implementa una condición de negocio necesaria para que un usuario user pueda realizar una tarea concreta en la cuenta account:

if (account is not null && account.IsActive && account.HasSubscription 
    && account.SubscriptionStartDate <= DateTime.Today && account.SubscriptionEndDate 
    >= DateTime.Now.AddDays(1) && (account.SubscriptionLevel == "Standard" || 
    account.SubscriptionLevel == "Premium") && user.IsActive && (user.HasRole("admin") 
    || (user.HasRole("owner"))) && user.AccountId == account.Id)
{
    account.ChangePaymentMethod("paypal");
}

Es un poco difícil de leer, ¿verdad? 😅 Bueno, está algo forzado para ilustrar bien el ejemplo, pero seguro que en nuestras bases de código podríamos reconocer fragmentos conceptualmente similares.

Básicamente, la condición anterior verifica si el estado de la cuenta account es válido para realizar la tarea, comprobando que sea correcta, esté activa, y tenga en vigor una suscripción de nivel "Standard" o "Premium", así como que el usuario user tenga permisos para hacerlo, comprobando que esté activo, tenga un rol de "admin" u "owner", y pertenezca a la cuenta account.

Obviamente, no podemos evitar que la lógica de negocio sea compleja, eso no depende de nosotros. Pero sí podemos hacer que la forma de expresarla mediante código sea más sencilla y legible, así que, ¡manos a la obra!

lunes, 20 de enero de 2025
Pitonisa viendo el futuro de JavaScript

Aquí está la recopilación semanal número 593 de enlaces interesantes, donde podéis encontrar un montón de referencias a artículos sobre C#, .NET, ASP.NET, Azure, desarrollo web, inteligencia artificial, Visual Studio y otros temas 🙂

Destacable el post "Tendencias en programación JavaScript para 2025", de José Manuel Alarcón, donde desvela hacia dónde se dirige el desarrollo JavaScript este año recién estrenado, en términos de herramientas, frameworks, metaframeworks, programación en backend y los nuevos paradigmas impulsados por la irrupción de la inteligencia artificial. Si usáis este lenguaje y su ecosistema, no os lo perdáis.

Los que diseñáis sistemas distribuidos con ASP.NET Core, os puede venir bien echar un vistazo a la introducción de Ricardo Peres a la implementación de trazas distribuidas en ASP.NET Core.

El artículo de Mark Heath sobre el uso de tools de forma segura con LLMs, Using Tools (Safely) with LLMs, me ha sido útil para descubrir que las bibliotecas cliente de Azure OpenAI también tienen la capacidad de ejecutar herramientas, algo que pensaba que había que hacer manualmente o con frameworks más potentes como Semantic Kernel.

Y muy bueno el recopilatorio del equipo de Visual Studio sobre novedades destacables que se introdujeron en el producto durante 2024. Si usáis a diario esta herramienta, echadle un ojo porque hay cosas muy interesantes.

Espero que os sean de utilidad 🙂

Por si te lo perdiste...

.NET Core / .NET

martes, 14 de enero de 2025
Enlaces interesantes

Tras el parón navideño, volvemos a la carga con la primera recopilación de 2025 🙂

Bueno, la frase anterior no es del todo cierta. Por una parte, aunque haya dejado de publicar durante un par de semanas, no he dejado de recopilar enlaces, así que esta edición es especialmente extensa: más de 90 enlaces. Y por otra parte, en realidad sería la segunda recopilación, si contamos la revisión de los contenidos más vistos del blog durante el pasado año que publiqué ayer 😊

Pero bueno, al tema...

Es difícil destacar algo en concreto ante tanto contenido, pero quizás me quedo con el post "The Myth of Perfect Code: Why It’s Hurting You More Than Helping", donde Terrance Craddock reflexiona sobre lo que deberíamos considerar "código perfecto".

También me voy a quedar con algo que, por diferente, me ha llamado la atención: "Unique Solving Method for Rubik's Cube", un método para resolver el cubo de Rubik presentado de forma muy visual. Si sois de los que en los 80 pasasteis horas intentando resolverlo, seguro que como mínimo os resultará curioso 🙂

Por si te lo perdiste...

.NET Core / .NET

lunes, 13 de enero de 2025
Top Posts 2024 en Variable Not Found

Pues sí, se acabaron las fiestas y aquí estamos de nuevo, volviendo a la rutina. Con el 2025 recién estrenado, ante todo, me gustaría aprovechar la ocasión para desearos que sea un gran año en todos los sentidos🙂

Y para empezar con buen pie, vamos a seguir la tradición de aprovechar este primer post para hacer un breve recopilatorio de los artículos más leídos el año anterior, con idea de que podáis descubrir contenidos que quizás os habíais perdido, reencontraros con algo que os interesó en su momento, o simplemente ver qué contenidos están llamando más la atención al resto de lectores del blog.

Top 10 posts 2024 en Variable Not Found

En décimo lugar, inaugurando el top ten de 2024 tenemos una llamada de atención: el artículo "¡No uses ContainsKey() en un diccionario .NET para ver si existe un elemento antes de obtenerlo!" muestra el impacto en el rendimiento de la doble búsqueda (una para ver si existe el elemento y otra para obtenerlo) y cómo podemos solucionarlo fácilmente con las herramientas que proporciona el propio framework.

Seguidamente, en el noveno puesto de la lista, respondemos a una pregunta bastante habitual cuando empezamos con ASP.NET Core: ¿por qué mi aplicación no arranca? En el artículo "No se puede conectar al servidor web 'https', el servidor web ya no funciona y otras pistas de que no has lanzado correctamente tu aplicación ASP.NET Core", además de la respuesta, veremos otros síntomas que nos pueden ayudar a identificar el problema. Spoiler: has olvidado incluir el app.Run() al final del código de inicialización 😉