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 ;)

19 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, 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 😉

lunes, 23 de diciembre de 2024
Enlaces interesantes 591, christmas edition

Aquí van los enlaces recopilados durante la semana pasada, en lo que será ya la última entrega del año. Volveremos a las tareas de recolección la primera semana de enero, semana arriba o semana abajo  (¡soy malo para esto de las estimaciones!😉).

Esta edición incluye enlaces a casi 50 contenidos que me han llamado la atención, aunque me gustaría resaltar especialmente algunos de ellos.

En primer lugar un gran repaso de CampusMVP a los CWE Top 25 de 2024 o, en otras palabras, a los principales agujeros de seguridad que dejamos por detrás los desarrolladores al crear nuestras aplicaciones. Algunos de ellos seguro que los conoces ya, como inyección SQL o XSS, pero hay muchas más perversidades que debemos conocer y evitar. 

Muy interesante, como siempre, los resultados publicados por JetBrains sobre el estado del ecosistema de desarrolladores del año que está a punto de terminar, obtenidos de una encuesta a más de 23.000 developers de todo el mundo. Aquí encontraréis información valiosa sobre los proyectos en los que más trabajamos, qué lenguajes son los más utilizados en distintas áreas, qué herramientas son las preferidas, o si seguimos pensando que la IA nos va a quitar el trabajo a todos los desarrolladores antes de acabar totalmente con la humanidad, o si en cambio es una gran aliada 😉

Por último, también me parece destacable los anuncios que Microsoft ha dejado caer hace unos días: la disponibilidad de un nuevo plan gratuito de GitHub Copilot para los usuarios de Visual Studio y Visual Studio Code. Bueno, obviamente tiene sus limitaciones, pero es un buen punto de partida para los que aún no habéis podido probarlo o no tenéis acceso a licencias superiores.

Por último, aprovecho también para desearos a todos unas muy felices fiestas. Disfrutad de la mejor compañía posible y pasadlo bien, pero eso sí, sin excesos, que luego vienen los arrepentimientos... 😉

Por si te lo perdiste...

.NET Core / .NET

martes, 17 de diciembre de 2024
Programador rupestre

A principios de siglo, con un C# aún bastante primitivo, las propiedades que almacenaban datos en una clase teníamos que definirlas siempre usando un backing field, es decir, un campo privado que almacenaba el valor, y accediendo a él mediante métodos getter y setter. Es decir, algo así:

public class Customer
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    ...
}

Esto cambió en 2007 con la llegada de las propiedades automáticas, una maravilla para nuestros cansados dedos, que desde entonces usamos en la mayoría de ocasiones. Gracias a ellas, podemos definir una propiedad sin tener que implementar sus métodos accesores ni su campo privado correspondiente, porque el compilador se encargaba de crearlos por nosotros. De esta forma, código anterior quedaba así:

public class Customer
{
    public string Name { get; set; }
    ...
}

En realidad, se trataba sólo de un azucarillo sintáctico. Por detrás, el compilador está generando el campo privado y transformando nuestro código para utilizarlo; de hecho, el código generado de la clase anterior es algo así (algo simplificado para que se pueda leer mejor):

public class Customer
{
    private string <Name>k__BackingField;

    public string Name
    {
        get { return <Name>k__BackingField; }
        set { <Name>k__BackingField = value; }
    }
}

Aunque obviamente usar propiedades automáticas es mucho más cómodo que la opción anterior, tiene un inconveniente: no tenemos forma de acceder al campo generado por el compilador, algo que puede resultar interesante si nos interesa realizar algún tipo de validación o lógica adicional en el getter o setter más allá de simplemente devolver o asignar el valor.

Por ejemplo, imaginemos que queremos que el nombre de nuestro cliente siempre esté en mayúsculas. Con una propiedad automática, simplemente no podemos hacerlo, y tendremos que recurrir a las verbosas propiedades tradicionales con backing fields.

Y aquí es donde entran en escena las propiedades semiautomáticas...

lunes, 16 de diciembre de 2024
Enlaces interesantes 590

Esta semana la cosecha ha sido especialmente prolífica y traemos más de 70 enlaces a contenidos que creo que vale la pena echar un vistazo, como siempre, categorizados por área de interés: .NET, ASP.NET Core, Azure, patrones y buenas prácticas, acceso a datos, inteligencia artificial, programación web (HTML, CSS, Javascript...), herramientas de desarrollo, .NET MAUI y otros.

Como vengo haciendo últimamente, me gustaría destacar el gran post de José Manuel Alarcón sobre técnicas de carga especulativa en páginas web que te ayudarán a mejorar el rendimiento de las aplicaciones.

Muy bueno también el deep dive de Ricardo Peres sobre los tokens de cancelación de tareas, a veces unos grandes desconocidos.

Por último, dos avisos a navegantes: primero, David Grace nos recuerda que en .NET 9, los proyectos de APIs ya no incorporan por defecto Swagger y propone algunas alternativas, y, segundo, Steve Smith alerta de los peligros de usar eventos de .NET en aplicaciones ASP.NET Core y aporta opciones para conseguir lo mismo.

Todo esto, y mucho más, a continuación...

Por si te lo perdiste...

.NET Core / .NET

martes, 10 de diciembre de 2024
Boyscout dudando

Aunque un día más tarde de lo normal debido al puente, aquí van los tradicionales enlaces recopilados durante la semana pasada. Como es habitual, la mayoría de los enlaces son a contenidos en inglés,  pero también hay algunos en español que me gustaría destacar en esta ocasión.

Por una parte, Jose Manuel Alarcón explica cómo clonar superficialmente un repositorio GIT (shallow clone) para obtener sólo los últimos commits y ahorrar tiempo y espacio en disco.

También muy interesante el post de Braulio Díez, donde reformula la clásica regla del Boy Scout y, quitándole algo de épica romántica, nos recuerda que a veces no siempre es buena idea tocar donde no debemos, o hacerlo de cualquier forma.

Y ahora, vamos a por el resto...

Por si te lo perdiste...

.NET Core / .NET

martes, 3 de diciembre de 2024
Imagen decorativa de la barra de tareas de Windows

Hoy me voy a salir un poco de las temáticas habituales para compartir un pequeño truco que llevaba buscando desde hace meses, pero que hasta ahora no había tenido tiempo de investigar.

Como seguro os ocurre a muchos de vosotros, tengo un par de cuentas de Gmail (personal y profesional) y estoy habitualmente saltando de una a otra para gestionar los correos y calendarios. He intentado durante bastante tiempo usar herramientas de escritorio de Windows para gestionar el mail y la agenda de ambas cuentas, pero no he conseguido dar con ninguna que me convenciera del todo, así que he llegado a la conclusión de que realmente la mejor interfaz para Gmail o Google Calendar está en la web.

Pero por otro lado, no me gusta usarlas directamente desde el navegador, así que la opción de instalarlas como aplicaciones web progresivas (PWA) me parecía la mejor solución. Basta con acudir a la página que queremos instalar, por ejemplo https://mail.google.com, abrir el menú de Chrome, acceder a la opción "Enviar, guardar y compartir > Instalar página como aplicación..." y listo. Durante el proceso, incluso se nos pregunta si queremos anclar la aplicación a la barra de tareas, así que podremos tener muy a mano un acceso directo a la aplicación.

El problema es que, al instalarlas, se abren siempre con el usuario de Google que tengamos configurado como por defecto. En la práctica, la aplicación anclada se abrirá siempre con la misma cuenta, que es aquella con la que nos logamos primero en el navegador. Y esto es un problema si queremos tener acceso rápido a varias cuentas, como es el caso.

lunes, 2 de diciembre de 2024
Representación de un millón de tareas ejecutándose concurrentemente

Es lunes, así que vamos a por los enlaces interesantes de la semana. Quizás algo más escasos que otras veces, probablemente debido a la festividad de acción de gracias del otro lado del charco, pero aún así tenemos una buena colección 🙂 

Esta semana, me ha llamado la atención a una interesante pregunta: ¿cuánta memoria necesitarías para ejecutar un millón de tareas concurrentes? Así a ojo es imposible saberlo, pero hay quien ha hecho la prueba con muchos lenguajes, y vemos que C# no sale nada mal parado.

También es un must read el post "¿Y qué trae de nuevo Angular 19?", donde Jose Manuel Alarcón se ha tomado la molestia de recopilar todas las novedades y explicarlas con gran detalle.

Por último, mi descubrimiento de la semana: los bloques de alertas en Markdown. Markdown es mi formato favorito para escribir un montón de cosas (entre otras, los posts de este blog) y era algo que desconocía y me ha parecido bastante interesante y práctico.

Y ahora, a por el resto de enlaces. ¡Espero que los disfrutes! 😊

Por si te lo perdiste...

.NET Core / .NET

martes, 26 de noviembre de 2024
Página principal de source.dot.net

Cuando estamos usando alguna clase de .NET en nuestro código, a veces tenemos interés o necesidad de ver qué hace por dentro, para lo que nos gustaría tener acceso rápido a su código fuente. Aunque los IDEs modernos disponen en muchos casos de herramientas o extensiones que lo permiten, está bien saber que hay otras fórmulas sencillas para conseguirlo muy rápida y cómodamente.

Hace poco me he topado con una de ellas, que me ha parecido muy útil y quería compartirla con vosotros, por si hay alguien más que aún no la conoce: la página https://source.dot.net.

lunes, 25 de noviembre de 2024
Enlaces interesantes

Una semana más, vamos con los contenidos interesantes que he ido encontrando por la red. Esta vez, entre los más de 50 enlaces de la entrega, me gustaría destacar tres de ellos.

En primer lugar, el trabajazo de José Manuel Alarcón para resumir todas las novedades de .NET 9 en un único y magnífico artículo. Si queréis poneros al día en unos minutos, no os lo perdáis

También me ha resultado interesante el post sobre Web Share, una API JavaScript que desconocía, sencillísima de utilizar, relativamente bien soportada en los navegadores, y que puede sernos útil para facilitar la compartición de contenido en nuestras aplicaciones web.

Por último, a modo de homenaje porque durante años ha sido una valiosa fuente de contenidos e información para muchos, me gustaría destacar la semi-despedida de CodeProject, un sitio que si lleváis unos añitos en esto seguro que habéis visitado más de una vez para consultar algunos de sus casi 66.000 artículos técnicos para desarrolladores. Aunque de momento seguirá en línea en modo de sólo lectura, de alguna forma, el post CodeProject is changing anuncia el fin de una era. 

Y ahora, vamos con el resto de contenidos que, como siempre, espero que os resulten interesantes.

Por si te lo perdiste...

.NET Core / .NET

martes, 19 de noviembre de 2024
Nuevos métodos LINQ en .NET 9

Me encanta LINQ. Bueno, ciertamente la sintaxis de consultas integrada en el lenguaje no la uso desde hace muchísimos años, pero los métodos de extensión que proporciona son una maravilla para recorrer y operar sobre colecciones de datos en memoria o almacenados en sistemas externos.

LINQ ha sido uno de los objetivos de .NET 9. Además de mejorarlo internamente y optimizar su rendimiento (en algunos casos, considerablemente), se han incluido tres nuevos métodos, CountBy(), AggregateBy() e Index(), que amplían las posibilidades que teníamos hasta el momento, simplificando la escritura de código y aumentando su legibilidad en algunos escenarios.

Vamos a verlos en detalle.

lunes, 18 de noviembre de 2024
Alan Turing echándose las manos a la cabeza

Como todos los lunes, vamos con los enlaces a contenidos interesantes que he ido encontrando por la red.

Esta semana se ha publicado .NET 9, por lo que tenemos bastantes contenidos relacionados con el lanzamiento y novedades que encontramos en la nueva versión.

Aparte, me ha llamado la atención el post "Understanding LLMs from Scratch Using Middle School Math" de Rohit Patel, que explica cómo funcionan los modelos de lenguaje de gran tamaño (LLMs) de forma sencilla, sin grandes complicaciones matemáticas. Muy recomendable para comprender lo que se cuece bajo el capó de estas tecnologías tan fascinantes.

Y en la sección "hay gente pa tó", me ha parecido curioso el artículo "HTML: The Programming Language", una implementación de un lenguaje Turin completo con sintaxis HTML. Muy útil no parece, pero desde luego es original 😉

Por si te lo perdiste...

.NET Core / .NET

martes, 12 de noviembre de 2024
Un armario simulando ser la caché de nivel 1, con usuarios accediendo a ella. También hay camiones transportando contenidos al nivel 2

Hace unas semanas estuvimos echando un vistazo a HybridCache, la alternativa de .NET 9 al sistema de caché distribuida que apareció con .NET Core años atrás. Como vimos entonces, HybridCache aporta una serie de ventajas respecto a su predecesor, como la protección contra estampidas, la caché multinivel, invalidación por etiquetas, y otras mejoras.

Sin embargo, también introduce algunos inconvenientes que debemos tener en cuenta si queremos sacarle el máximo partido. En esta ocasión, nos centraremos en la penalización debido a excesiva deserialización de objetos de la caché local, un detalle que puede pasar desapercibido pero que puede tener un impacto significativo en el rendimiento de nuestra aplicación.