
Buah, siempre se dice que el tiempo pasa volando, pero es que es verdad. Parece que fue ayer cuando decidí comenzar a escribir en este blog, y hoy hace 18 años de eso. ¡El blog ya es mayor de edad! 🎉
Cuando empecé a escribir por aquí, aún bajo el dominio de Blogger jmaguilar.blogspot.com y con un nombre ligeramente más largo (Variable not found, 0:1, como homenaje a mi querido ZX Spectrum), Windows XP aún llenaba de color las pantallas de nuestros vetustos PC, aunque empezábamos a oír hablar de un nuevo sistema operativo llamado Windows Vista.
Programábamos aplicaciones ASP.NET 2.0 en Visual Studio 2005, usando un C# que apenas acababa de incorporar el soporte para generics o tipos anulables, y las desplegábamos por FPT a hostings o servidores on-premise, porque las nubes eran simplemente algo con formas caprichosas que veíamos en el cielo.
Los teléfonos móviles no eran nada inteligentes, eso de los smartphones llegó más tarde. En aquellos tiempos estos dispositivos sólo servían para hacer llamadas y enviar SMS. A lo sumo, podíamos jugar al Snake, pero poco más. Nada que ver con los dispositivos que llevamos en el bolsillo en este momento, ni las herramientas que éstos han propiciado.
El código fuente de los proyectos lo guardábamos donde podíamos, muchas veces incluso sin usar sistema de gestión de código o control de versiones, o utilizando herramientas poco amigables (¿alguien tiene todavía pesadillas con Source Safe? 😉)
Internet era muy distinto. Aunque las ADSL ya habían llegado a muchos hogares, la velocidad de conexión era mucho menor que la que disfrutamos ahora. Servicios, que ahora son indispensables para nuestro trabajo, como Stack Overflow o GitHub aún no existían, como tampoco (o estaban muy en pañales) las redes y aplicaciones sociales que hoy en día nos mantienen informados y en contacto, como Twitter (creo que nunca me acostumbraré a llamarlo "X" 🤦♂️), Instagram, Facebook, WhatsApp, Youtube, Twitch o TikTok.
Y por supuesto, esto de la inteligencia artificial tal y como la estamos conociendo en este momento era absolutamente impensable. Los que no trabajábamos en ese campo, apenas empezábamos a oír hablar de cosas como el machine learning o redes neuronales, y no tenían aplicación en aplicaciones, digamos, "normales".
Las cosas han cambiado mucho desde entonces, pero una sigue igual: mi pasión por la tecnología y por compartir lo que voy aprendiendo siguen intactos. Por eso, aunque a veces cueste encontrar tiempo para escribir, sigo aquí, en este rincón de la red, compartiendo con vosotros lo que voy aprendiendo, lo que me parece interesante o lo que creo que puede ser útil para alguien.
Pero todos es gracias a vosotros, esa pequeña pero fiel pandilla de amigos que me lee, me comenta y me anima a seguir adelante. ¡Muchas gracias a todos!
Y como todos los años por estas fechas, vamos a hacer balance de cómo han ido las cosas en el blog, que ya os adelanto que regular 😔
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: aniversario, autobombo, blogging

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Validación de servicios en entornos distintos a "Development" en ASP.NET Core 6
José M. Aguilar - La nueva directiva @inject de ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- Adventures serializing absolutely everything in C#
Isadora Sophia Rodopoulos - Switch expression for void methods
Bart Wullems - Introducing OpenSilver 2.2 with LightSwitch Support
OpenSilver - Creating a .NET AsciiMath parser and using it in a Markdig extension
Andrew Lock - Secure your container build and publish with .NET 8
Richard Lander - Working with Rust Libraries from C# .NET Applications
Khalid Abuhakmeh - Some more C# 12
Tom Deseyn - How does a List know that you changed it while enumerating it?
Steven Giesel - Checking your solution for NuGet vulnerabilities or deprecated packages
Steven Giesel - Generate Images in C# Using ImageMagick & Generate Images in C# Using ImageSharp
Emmanuel Adom - General Performance Tip: Choosing Between Conditional Statements – If, Switch, and Switch Expression Performance in C#
David McCarter

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Retornar archivos estáticos desde una carpeta distinta a "wwwroot" en ASP.NET Core 6
José M. Aguilar - Filtros asíncronos en ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- Getting Started with Primary Constructors in .NET 8 and C# 12
Anton Martyniuk - Don't Do This With Extension Methods
Adam Storr - C# 12: Collection expressions and primary constructors
Tom Deseyn - How to Convert a String to Byte Array in C#
Nick Cosentino - Using type aliases to make code clearer with generics
Gérald Barré - XML External Entity Attack and .NET Core
Bart Wullems - Hacking together an AsciiMath parser for .NET
Andrew Lock - C#: How to iterate over a dictionary?
Chris Pietschmann - Does readonly make your code faster?
Steven Giesel - Refactor your C# code with primary constructors
David Pine - C#: Console App that Accepts Command-Line Arguments
Chris Pietschmann - Try Catch in C#: The Basics You Need to Know
Nick Cosentino - .NET JsonElement and Schema Validation
Ian Griffiths - What’s new for .NET in Ubuntu 24.04
Richard Lander - Unit Testing with Semantic Kernel
Sophia Lagerkran - C# 13 Params Collections
Fons Sonnemans - Working with IAsyncEnumerable in C#
Camilo Reyes - Code It Any Way You Want: Comparison of Passing Parameters in Methods
David McCarter - How to Create a Zip File in Memory In C#
Matjaz Prtenjak - C# DateTime Format In A Nutshell
Ndepend Team - Type pattern matching in C# and TypeScript
Bart Wullems

Cuando tenemos una colección de datos para procesar, es relativamente habitual tener que hacerlo por lotes, es decir, dividir la colección en partes más pequeñas e irlas procesando por separado.
Para ello, normalmente nos vemos obligados a trocear los datos en lotes o chunks de un tamaño determinado, y luego procesar cada uno de ellos.
Por ejemplo, imaginad que tenemos un método que recibe una lista de objetos a procesar y, por temas de rendimiento o lo que sea, sólo puede hacerlo de tres en tres. Si la lista de elementos a procesar es más larga de la cuenta, nos veremos previamente obligados a trocearla en lotes de tres para ir procesando cada uno de ellos por separado.
Tradicionalmente, es algo que hemos hecho de forma manual con un sencillo bucle for
que recorre la lista completa, y va acumulando los elementos en un nuevo lote hasta que alcanza el tamaño deseado, momento en el que lo procesa y lo vacía para empezar de nuevo.
Pero otra posibilidad bastante práctica, y probablemente más legible, sería pasar la lista de elementos previamente por otro proceso que retorne una lista de chunks, o pequeñas porciones de la lista original, para que luego simplemente tengamos que ir procesándolos secuencialmente. Es decir, algo así:
private char[] array = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
private int chunkSize = 3;
var chunks = GetChunks(array, chunkSize); // [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i'], ['j']
foreach (var chunk in chunks)
{
ProcessChunk(chunk); // 'chunk' sería un array de 3 elementos
}
Y la pregunta es, ¿cómo podríamos implementar ese método GetChunks()
en C#? Vamos a ver varias opciones.

Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Omisión condicional de propiedades al serializar con System.Text.Json
José M. Aguilar - Interpolación de cadenas en C# 6
José M. Aguilar
.NET Core / .NET
- Automated NuGet package version range updates in .NET projects using Renovate
Anthony Simmon - Improvements in the Using Directive for Additional Types in C#
Georgios Panagopoulos - The New C# Interceptors vs. AOP.
Marek Sirkovský - C# Optional Parameters Explained
NDepend Team - Linting and Code Formatting in .NET Projects
Hamed Shirbandi - 10 Advanced C# Tricks for Developers
Konstantin Fedorov - .NET 8 and C# 12 — Interceptors
Henrique Siebert Domareski - Streamline your container build and publish with .NET 8
Richard Lander - How to Use HttpOnly Cookie in .NET Core for Authentication and Refresh Token Actions
Marinko Spasojević - C# URI Concatenation
Bill Boga - Code It Any Way You Want: Checking Strings for Null
David McCarter - Computing code coverage for a .NET project
Gérald Barré - C# Regular Expression Benchmarks – How To Avoid My Mistakes!
Nick Cosentino - What’s New in .NET 8 for Developers?
Vinoth Kumar Sundara Moorthy - The Difference Between Invariance, Contravariance and Covariance in Generics in C#
Georgi Georgiev - Baseline Styling in BenchmarkDotNet
Januarius Njoku

Hace poco vimos cómo serializar y deserializar datos en JSON de forma personalizada usando custom converters e implementamos un ejemplo simple capaz de introducir en campos de tipo int
de .NET casi cualquier valor que pudiera venir en un JSON.
Pero como comentamos en su momento, la serialización y deserialización de objetos más complejos no es una tarea tan sencilla y requiere algo más de esfuerzo. En este post vamos a ver la solución para un escenario que creo que puede ser relativamente habitual: deserializar un objeto JSON a un diccionario Dictionary<string, object>
.
En otras palabras, queremos que funcione algo como el siguiente código:
using static System.Console;
...
var json = """
{
"name": "Juan",
"age": 30
}
""";
var dict = ... // Código de deserialización
WriteLine($"{dict["name"]} tiene {dict["age"]} años"); // --> Juan tiene 30 años