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

20 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, 20 de octubre de 2025
Película de karatecas mostrándose en el interior de una antigua versión de Paint

Amit Bahree está escribiendo una serie de artículos sobre cómo construir un modelo de lenguaje grande (Large Language Model, LLM) desde cero. En la primera publicación hace una introducción y en la segunda habla sobre la recopilación de datos y los tokenizadores personalizados. Muy recomendable si te interesa el tema de la inteligencia artificial más allá de utilizar APIs de terceros.

Raymond Chen desvela por qué, en versiones antiguas de Windows, al tomar una captura de pantalla de un vídeo y pegarla en Paint, el vídeo se reproducía dentro de esta aplicación. Todo un misterio que por fin queda resuelto, y el motivo es cuanto menos curioso.

Y también bastante curioso el post de MaiZure analizando en profundidad el código de Altair BASIC 3.0, recientemente publicado por Bill Gates para celebrar el 50 aniversario de Microsoft.

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

Por si te lo perdiste...

.NET

martes, 14 de octubre de 2025
Desarrollador con dudas sobre cuál de las 42 unidades de medida de CSS debe utilizar

Te propongo un experimento: abre un documento en blanco con el block de notas y anota todas las unidades de medida de CSS que se te ocurran (por ejemplo, px, em, etc.) Luego, cuéntalas... ¿cuántas has recordado? Yo nueve, entre las que había una inventada 😕 Por eso me ha llamado la atención el artículo de Nikolaus Gebhardt en el que recopila las ¡42! unidades de medida que define CSS.

Una lectura de interés también el artículo Ricardo Peres explica cómo restringir el acceso a un método de acción en ASP.NET Core MVC utilizando el filtro [Authorize], atributos de autorización personalizados, políticas y otros mecanismos proporcionados por el framework.

Por último, Juan Irigoyen nos muestra una metodología práctica para generar código con IA usando prompts estructurados en formato Markdown.

El resto de contenidos interesantes recopilados durante la semana pasada, a continuación.

Por si te lo perdiste...

.NET

martes, 7 de octubre de 2025
Brazo robótico llamado Random usando una ruleta de casino para obtener números aleatorios

Llevamos utilizando la clase Random de .NET para generar números aleatorios desde hace mucho tiempo, en su aparición con la versión 1.1 de .NET Framework (año 2002). Probablemente por eso, muchos de nosotros la usamos de forma automática, sin pararnos a estudiar todas sus posibilidades y las novedades que le han ido añadiendo a lo largo del tiempo.

En este artículo vamos a ver algunas características de la clase Random que quizás no conocías... o quizás sí, pero que no está de más refrescarlas:

  • Los números generados no son realmente aleatorios.
  • En versiones antiguas de .NET, era más probable que Random generara números impares.
  • No se debe usar Random para operaciones criptográficas.
  • No es buena idea crear un objeto Random cada vez que necesitemos un número aleatorio.
  • Si estamos en .NET 6+, mejor usar Random.Shared.
  • El método Shuffle() desordena arrays.
  • El método GetItems() permite obtener elementos aleatorios de una colección.
  • Podemos heredar de Random.

¡Vamos a ello!

lunes, 6 de octubre de 2025
C# muy afectado por el boxing

Aquí están los enlaces recopilados durante la semana pasada 😊

Entre los contenidos destacables, una pregunta: ¿somos conscientes del coste real de las operaciones de boxing y unboxing en .NET? Normalmente no las tenemos en cuenta, pero pueden llegar a ser importantes, y podemos aprender a detectarlas y evitarlas. Ali Hamza Ansari nos lo explica en su artículo.

También, Anton Martyniuk ha recopilado en este post una serie de paquetes NuGet que pueden mejorar tu productividad y la calidad de tus proyectos si usas Entity Framework Core.

Y Addy Osmani nos cuenta la historia, evolución y futuro de Core Web Vitals, los indicadores de rendimiento web que Google utiliza para medir la experiencia de usuario en las páginas web. Muy interesante.

El resto, a continuación...

Por si te lo perdiste...

.NET

lunes, 29 de septiembre de 2025
Usuario poniendo a dormir su PC en una pequeña cama

Ya he publicado en mi blog la colección de enlaces a contenidos interesantes de la semana pasada 🙂

Para destacar, Milan Jovanović nos habla sobre el problema que surge al intentar coordinar tareas que se ejecutan en distintos procesos o instancias, algo que escapa al alcance de los mecanismos de sincronización tradicionales como mutex, locks o semáforos de .NET, y algunas fórmulas para resolverlo.

Andrew Lock comparte los detalles del desarrollo de 'sleep-pc', una pequeña herramienta de línea de comandos que permite poner el PC a dormir después de un tiempo determinado. Usa .NET Native AOT y es instalable directamente desde NuGet.

Y por último, David Grace nos explica los distintos atributos que xUnit pone a nuestra disposición para proporcionar datos a los tests, y las diferencias entre ellos.

El resto, a continuación.

Por si te lo perdiste...

.NET

martes, 23 de septiembre de 2025
Inspector examinando con lupa un código C#

Hace algún tiempo hablamos sobre el atributo [MemberNotNullWhen] y vimos cómo se podía usar para mejorar la seguridad frente a valores nulos en nuestras aplicaciones.

Como recordaréis, este atributo lo aplicábamos sobre miembros booleanos para asegurar que otro miembro de su misma clase no contendrá null, dependiendo del valor (true o false) del primero. El ejemplo que lo ilustraba era el siguiente:

public class Result<T>
{
    [MemberNotNullWhen(true, nameof(Value))]  // Si Success es true, Value no es null
    [MemberNotNullWhen(false, nameof(Error))] // Si Success es false, Error no es null
    public bool Success { get; init; }

    public string? Error { get; init; }
    public T? Value { get; init; }

    // Constructores, factorías, etc
}

Pero también comentamos que existían muchos otros atributos que el compilador empleaba para afinar en la detección de posibles problemas similares en el código. Al usarlos, el compilador comprende mejor las intenciones de nuestro código respecto a la utilización de nulos, y puede generar advertencias que impiden posteriores errores en tiempo de ejecución, pero sólo cuando son estrictamente necesarias.

En este nuevo post, vamos a echar un vistazo a los siguientes:

  • [NotNullWhen]
  • [NotNullIfNotNull]
  • [MemberNotNull]