Variable not found
Forzar casts imposibles con C#
febrero 18, 2025 07:38

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.
Veámoslo lo con un ejemplo. Imaginad estas dos clases (usamos constructores primarios para simplificar) y un pequeño código que las utiliza:
var friend = new Friend("John");
friend.SayHello(); // Hello, my name is John!
var dog = new Dog("Bobby");
dog.SayHello(); // (Bobby) ¡Woof! ¡Arf arf! ¡Grrr!
public class Dog(string name)
{
public string DogName { get; set; } = name;
public void SayHello()
{
Console.WriteLine($"({DogName}) ¡Woof! ¡Arf arf! ¡Grrr!");
}
}
public class Friend(string name)
{
public string Name { get; set; } = name;
public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name}!");
}
}
De partida, estos dos tipos son incompatibles. Cualquier intento de convertir uno en otro lanzará un error de compilación:
var f = (Friend) dog; // CS0030 Cannot convert type 'Dog' to 'Friend'
var d = (Dog) friend; // CS0030 Cannot convert type 'Friend' to 'Dog'
Incluso si despistamos al compilador y conseguimos forzar el cast como se muestra a continuación, el error lo obtendremos en tiempo de ejecución:
var f = (Friend)(object)dog;
// InvalidCastException: Unable to cast object of type 'Dog' to type 'Friend'.
Pues bien, el método Unsafe.As()
nos permite hacer esto sin problema:
var dog = new Dog("Bobby");
dog.SayHello(); // (Bobby) ¡Woof! ¡Arf arf! ¡Grrr!
Friend dogAsFriend = Unsafe.As<Friend>(dog); // Voilà!
dogAsFriend.SayHello(); // Prints "Hello, my name is Bobby!"
A todos los efectos, estamos convirtiendo un objeto de tipo Dog
en un Friend
😯. Al llamar a SayHello()
podemos ver que el comportamiento es de Friend
, pero los datos mostrados son los que habíamos establecido en el objeto dog
.
En realidad, internamente no ha cambiado nada en el objeto ni se está convirtiendo nada, lo único que se hace es "reinterpretar" como objeto de tipo Friend
las posiciones de memoria ocupadas por el dog
que suministramos como parámetro. Qué locura, ¿verdad? 😂
Para que esta interpretación sea correcta, la estructura en memoria de los campos debe coincidir. Si os fijáis en ambos casos tenemos un campo string
en primera posición, por lo que la interpretación es correcta aunque el nombre de estos sea distinto (Name
vs DogName
). Si no coincidieran, el resultado sería impredecible.
Por ejemplo, si en la clase Friend
insertamos un campo adicional City
y volvemos a ejecutar el código anterior, el resultado será distinto:
public class Friend(string name)
{
public string City { get; set; } = "Chicago";
public string Name { get; set; } = name;
public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name} from {City}!");
}
}
Friend dogAsFriend = Unsafe.As<Friend>(dog);
dogAsFriend.SayHello(); // Hello, my name is from Bobby!
Pues parece que se ha liado un poco. Como podemos intuir, el campo City
ocupa la posición de DogName
, por esa razón se le asigna su valor "Bobby". En la posición del campo Name
de Friend
no existe nada en el objeto Dog
, por lo que se obtiene un valor nulo.
Otro aspecto interesante es que Unsafe.As()
retorna una referencia al objeto original, por lo que cualquier cambio que realicemos sobre ella afectará obviamente al primero:
var dog = new Dog("Bobby");
dog.SayHello(); // (Bobby) ¡Woof! ¡Arf arf! ¡Grrr!
Friend dogAsFriend = Unsafe.As<Friend>(dog);
dogAsFriend.SayHello(); // Hello, my name is Bobby!
dogAsFriend.Name = "Charlie";
dogAsFriend.SayHello(); // Hello, my name is Charlie!
dog.SayHello(); // (Charlie) ¡Woof! ¡Arf arf! ¡Grrr!
En definitiva, como decía al principio, creo que para la mayoría de los mortales esta característica no tiene demasiada utilidad más allá de probar algunas aberraciones y llevar C# y .NET a sus límites. Hay que tener en cuenta que todo lo que sea jugar con punteros, aunque divertido, puede ser peligroso y dar lugar a errores o comportamientos inesperados.
Pero, como siempre, es interesante conocer estas cosas para saber que están ahí y, quién sabe, quizás algún día nos saquen de un apuro (o nos metan en uno, no sé 😂).
Publicado en Variable not found.
Variable not found
Enlaces interesantes 597
febrero 17, 2025 07:05

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...
- ¿Acceder a miembros privados de una clase C# sin usar reflection? ¡En .NET 8 es posible!
José M. Aguilar - Flushing asíncrono en ASP.NET Core MVC
José M. Aguilar
.NET
- Microsoft.Testing.Platform: Now Supported by All Major .NET Test Frameworks
Amaury Levé - Using .NET on Linux
Bryan Hogan - Unlocking delegate's potential in C#
Ali Hamza Ansari - Writing a .NET Garbage Collector in C#, part 3
Kevin Gosse - Why Large JSON Objects Are Slowing Down Your .NET Application (And How to Fix It)
Hossein Kohzadi - C# Dictionary: How to Create One and Best Practices
Stackify Team - Exploring the .NET Ecosystem: A Visual Mind Map
Abhijit Jana
ASP.NET Core / ASP.NET / Blazor
- ASP.NET Core delegated OAuth Token Exchange access token management
Damien Bowden - Hybrid Caching in ASP.NET Core
Bozo Spoljaric - How to Enable CORS in a .NET 9 API
Shafaet Hossain - Preventing client-side cross-site-scripting vulnerabilities with Trusted Types
Andrew Lock - What's New for ASP.NET Core & Blazor in .NET 9
Suprotim Agarwal - TOP 15 Mistakes Developers Make When Creating Web APIs
Anton Martyniuk - ASP.NET Core and Chunking HTTP Cookies
Khalid Abuhakmeh - Integrating GraphQL into Blazor
Héctor Pérez - OpenTelemetry with ASP.NET Core
Ricardo Peres
Azure / Cloud
- Logging with Azure Application Insights in a Windows Application
Nick Randolph - Azure Functions Cost Considerations and Optimization
Chris Pietschmann - Simplify your .NET data transfers with the new Azure Storage Data Movement library
Charles Barnett
Conceptos / Patrones / Buenas prácticas
- Cruzando fronteras con Meaningful Objects
Fran Iglesias - Stop Conflating CQRS and MediatR
Milan Jovanović - When QA Keeps Finding Bugs
Steve Smith - What Is a Modular Monolith?
Milan Milanović
Data
- Entity Framework Core Pitfalls: Calling DB Functions in LINQ Queries as Extension Methods
Ricardo Peres - Mapping the World with EF Core: Working with Spatial Data
Chris Woodruff - Using Snapshot Testing to validate EF Core schema
Gérald Barré - The 8 Worst Things Microsoft Ever Did to SQL Server
Brent Ozar - Transactional Savepoints in EF Core: Rollback Just What You Need!
Chris Woodruff
Machine learning / IA
- Announcing Generative AI for Beginners
Pablo Lopes - Test your prompt injection skills
Bart Wullems - Self-Supervised Learning (SSL) in AI Systems: Autonomous Machine Intelligence
Chris Pietschmann
Web / HTML / CSS / Javascript
- Announcing TypeScript 5.8 RC
Daniel Rosenwasser - Single Responsibility Principle (SRP) In React: Write Focused Components
Petar Ivanov - TypeScript: the
satisfies
operator
Axel Rauschmayer - Organizing Design System Component Patterns With CSS Cascade Layers
Ryan Trimble - TypeDoc: testing code examples in doc comments
Axel Rauschmayer - TypeScript: extracting parts of composite types via
infer
Axel Rauschmayer - Build Interactive UML Class Diagrams in React
Sivaranjith Jeyabalan - Typecasting And Viewport Transitions In CSS With Tan(atan2())
Juan Diego Rodríguez - Time To First Byte: Beyond Server Response Time
Matt Zeunert - Scroll Driven Animations Notebook
Geoff Graham - Better text rendering in Chromium-based browsers on Windows
Kurt Catti-Schmidt & Patrick Brosset - Handwriting An SVG Heart, With Our Hearts
Ryan Trimble - Style-observer: JS to observe CSS property changes, for reals • Lea Verou
Lea Verou - Microsoft Edge and Interop 2025
Patrick Brosset & Dan Clark
Visual Studio / Complementos / Herramientas
- Visual Studio 2022 v17.13 is Now Available!
Mads Kristensen - PowerShell 7.5 GA is now available
Jason Helmick - C# Dev Kit Updates: .NET Aspire, Hot Reload, and More!
Wendy Breiding - VisualStudio.Extensibility: Managing .NET runtime versions
Tina Schrepfer - First preview of Visual Studio 2022 v17.14
Mads Kristensen - Visual Studio: New restrictions on package loading
Ryan Molden - New Features for Enhanced Razor Productivity!
Leslie Richardson - VS Code: Copilot Next Edit Suggestions (preview)
Brigit Murtaugh & Burke Holland
.NET MAUI
- Save Chat History to Firebase Realtime Database using the .NET MAUI Chat Control
Piruthiviraj Malaimelraj - Recap: What’s New in .NET MAUI in .NET 9?
Leomaris Reyes - Custom Phone Entry with Country Code Dropdown in .NET MAUI
Ali Raza - Visualize Multi-Dimensional Data Using the .NET MAUI Parallel Coordinate Chart
Ezhilarasan Elangovan - Splash Screen in .NET MAUI
Leomaris Reyes
Publicado en Variable not found.
Picando Código
Moons of Darsalon
febrero 14, 2025 08:00
Moons of Darsalon es un juego de plataformas, acción y puzzle con inspiración de Lemmings. Nuestra misión es rescatar y dirigir a otros astronautas hasta la estación base en cada nivel. En el camino nos vamos a ir encontrando varios obstáculos, pero podemos darles distintas órdenes a nuestros compañeros. El juego fue desarrollado por el DJ español Daniel Manzano, también conocido como Dr. Kucho.
Algunos niveles son más de acción, donde tenemos que pelear a los disparos con distintas criaturas extraterrestres al estilo run 'n gun, o intentar pasar desapercibidos para que no nos acribillen a disparos. Otras nos fuerzan a pensar, para resolver el puzzle y llevar a los astronautas hasta la base con lo que haya a disposición. Algunos de los puzzles nos hacen idear una solución que no es necesariamente la más obvia y directa, cosa que me resultó bastante bueno. Los astronautas que tenemos que dirigir son muy bobos por sí sólos, así que es nuestra responsabilidad hacerlos llegar sanos y salvos.
El diseño de los escenarios y la manipulación del terreno me hicieron acordar también un poco a Worms. A veces tenemos que romper paredes a disparos y otras construir caminos alternativos con el arma generadora de suelo. Los fondos de los niveles con paralax están muy buenos, complementan muy bien la estética general. La opción de filtro CRT y la curvatura de pantalla agregan todavía más.
Al mezclar géneros variados, tiene muchos modos de juego, así que nos mantiene entretenidos. Ya sea manejando un vehículo, un jetpack o saltando de plataforma en plataforma (particularmente divertido cuando vemos al personaje caer al vacío y/o darse contra paredes), hay un montón de cosas para hacer con nuestro protagonista.
El control es bastante particular. Creo que en uno de los primeros niveles el protagonista hace un comentario porque el botón de salto no es lo más intuitivo a primera impresión. Pero si confiamos en que el desarrollador sabe lo que hace, vemos que nos acostumbramos muy rápido y tiene sentido para el resto del control. Personalmente lo jugué con mi control de XBox 360 en PC, pero está diseñado para cualquier joystick moderno actual.
Además de ser divertido jugarlo, se destaca mucho el estilo. Está inspirado en ciencia ficción estilo la década del 50, con un arte pixelado que mezcla técnicas de pre-renderizado con arte retro que está espectacular. Rinde homenaje a la época de las computadoras de 8 bits de la década de los 80, con pantallas de carga al estilo cargande de un cassette de cinta, y arte estilo ciencia ficción pulp como si estuviéramos en el Planeta Prohibido. Todo muy cohesivo y estético a pesar de las diversas influencias.
[See image gallery at picandocodigo.net]La música es buenísima, en 8 bits basada en el chip MOS 651 SID, el chip que generaba el sonido en la Commodore 64. Dr Kucho tiene años de trayectoria profesional en la música y se refleja. Logra una identidad bien definida entre los gráficos retro-modernos, la música, la voz sintetizada al estilo 8 bits, el diseño de los niveles y personajes y el juego en general. Es un ejemplo de tantos donde se nota que no es necesario un equipo gigante ni un presupuesto multi millonario para innovar y ofrecer algo creativo en el campo de los videjouegos. Da gusto jugar juegos nuevos con propuestas interesantes y originales como éste.
Hacer este juego ha sido cumplir el sueño que tenía de adolescente, al que renuncié para dedicarme a la música, y que recuperé a los 42 años, ocho años después. Moons of Darsalon es una realidad en la que he puesto todo mi perfeccionismo obsesivo, evitando seguir estilos de moda y centrándome en ofrecer una experiencia de juego fresca y de calidad. - Dr. Kucho
Hace unos años Dr. Kucho lanzó Ghosts’n DJs, un homenaje al clásico de plataformas de arcade de los años 80, Ghosts'n Goblins y una crítica satírica a la industria de la música electrónica comercial. El juego está disponible libre para descargar en Steam y también en itch.io. Lo podemos jugar para ver algun indicio del estilo que vendría después con Darsalon. Además de la crítica a la música electrónica comercial, es entretenido.
Después vino Pilots of Darsalon, una precuela o pre-spin-off de Moons que fue presentando el mundo y el sentimiento Commodore 64 que caracteriza a la serie. Éste todavía no lo he jugado.
Moons of Darsalon es un juego con bastante valor de rejugabilidad. Cada nivel tiene el objetivo mínimo para pasarlo, pero además hay desafíos como no perder energía, pasarlo en un tiempo determinado, y demás. Esto se presta a volver a jugarlos una vez que le agarramos la mano, y completar los desafíos más difíciles. Perdí bastantes veces en algunos niveles, pero es parte del aprendizaje y generalmente las muertes son divertidas.
La historia principal cuenta con 30 niveles, y la duración del juego dependerá de qué tanto le dediquemos a completar todos los objetivos de cada nivel. No es particularmente difícil, aunque a medida que vamos avanzando se va haciendo más desafiante. Tiene un nivel de dificultad adaptativo, así que se adapta a cómo venimos jugando. Pero imagino que está la opción estática también.
Este trailer, aunque no es de los más nuevos, hace un buen trabajo en mostrar de qué va el juego:

Moons of Darsalon está disponible en Steam, Nintendo Switch (Argentina, Brasil, Chile, Colombia, España, Estados Unidos, México, Perú) , XBox, PlayStation. Hay un demo gratuito en Steam por si queremos probar el juego antes de comprarlo. Personalmente lo recomiendo. No se lo puede perder especialmente cualquier persona que haya disfrutado jugando Lemmings. Están muy bien hechos todos los aspectos mencionados en esta reseña. Así que para cualquier que disfrute la estética nostálgica pulp ciencia ficción al estilo computadoras 8 bits, aventuras espaciales, puzzles y acción, es un juego imprescindible.
Lo he estado jugando en Steam en Linux. Está verificado para Steam Deck, pero me encontré varias veces con un error, particularmente más a medida que avanzaba niveles, lo que hizo que me resultara un poco frustrante seguir jugando:
De todas formas debe ser un tema particular de mi distribución o algo de la configuración de mi sistema. Probé con Proton 9 y Proton 8, pero los resultados fueron similares. El juego se viene actualizando bastante seguido, así que espero que este problema se corrija sólo pronto.
Me gustaría jugarlo en Nintendo Switch. Si sale una versión física, seguramente lo consiga para agregar a mi colección. Un título súper recomendable, ojalá tenga éxito y a ver qué más se viene en materia de videojuegos de la mano de Dr. Kucho.
Variable not found
Aprovecha al máximo los archivos .http en Visual Studio usando variables dinámicas
febrero 11, 2025 07:34

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.
Cómo acceder a valores retornados por una petición
Para ello, lo primero que debemos hacer es asignar un nombre a la petición que queremos utilizar para capturar valores. Esto lo hacemos añadiendo un comentario justo antes de la primera línea de la petición con la directiva @name
, como en el siguiente ejemplo:
# @name login
POST https://localhost:5748/login
Content-Type: application/json
{
"username": "john",
"password": "123456"
}
De esta forma, la variable login
quedará definida como una variable de petición, y conseguimos identificarla para luego poder referirnos a ella desde otras operaciones. Por ejemplo, si el resultado de la petición anterior retornara un objeto con una propiedad token
, podríamos usarlo en otra petición posterior de una forma similar a la siguiente:
GET https://localhost:5748/customers
Authorization: Bearer {{login.response.body.$.token}}
Con la expresión login.response.body.$.token
estamos indicando que queremos utilizar el cuerpo de la respuesta de la petición login
y acceder a la propiedad token
del objeto JSON que se ha retornado. Por supuesto, la expresión {{xxx}}
podemos usarla en cualquier parte de la petición, ya sea en la URL, en el cuerpo, en los encabezados, etc. El único requisito es que la petición login
se haya ejecutado previamente.
También, si quisiéramos facilitar la lectura y reutilizar elementos, podríamos establecer variables con estos datos, y luego usarlas de la forma habitual:
...
@authHeader=Bearer {{login.response.body.$.token}}
GET {{host}}/user
Authorization: {{authHeader}}
La expresión login.response.body.$.token
especifica la ruta hacia el valor que queremos capturar, y responde al siguiente formato:
{{requestName.(response|request).(body|headers).(*|JSONPath|XPath|Header Name)}}
Como podemos ver, en primer lugar aparece el nombre de la petición (el que hemos asignado con @name
), separado por un punto de "response" o "request" en función de si queremos acceder a la respuesta o a la petición. Luego, de nuevo separado por un punto, debemos indicar si queremos acceder al cuerpo "body" o a los encabezados "headers". Por último, debemos especificar cómo llegamos al valor:
- Si se trata de un contenido JSON, debemos usar una expresión JSON Path para llegar a él.
- Si se trata de un contenido XML, debemos usar una expresión XPath.
- Si se trata de un encabezado, debemos indicar simplemente el nombre del encabezado.
En definitiva, se trata de una mejora muy interesante que nos permite hacer pruebas más avanzadas y complejas, y que nos facilita mucho la vida a la hora de trabajar con APIs.
¡Espero que os sea de utilidad!
Publicado en: www.variablenotfound.com.
Picando Código
Here Comes A new Challenger - Documental sobre Street Fighter
febrero 10, 2025 10:00
En febrero de 1991 salió la primera versión de Street Fighter II. En 2021 usé esto como excusa para celebrar el Mes de Street Fighter en el blog. Miré las películas y jugué varios de los juegos. Este año aproveché entre otras cosas para volver a mirar el documental Here Comes a New Challenger sobre la historia y legado de Street Fighter 2. En el enlace está disponible para comprar en versión digital y Blu-Ray con copias limitadas.
El documental está protagonizado por autores, historiadores, periodistas, gamers profesionales, editores y varias personas que trabajaron en distintos títulos Street Fighter. Entre ellos está el autor del libro Undisputed Street Fighter, Steve Hendershot, libro que tengo y del que podría escribir en otro momento.
Todo comenzó en la década de 1980, en las salas de maquinitas o arcades, donde empezaron a surgir los primeros juegos de pelea. Si bien el primer Street Fighter innovó en algunas cosas, no fue muy exitoso. Algo que lo hizo popular fue el aspecto de enfrentamiento y cómo se prestaba a la interacción social con otras personas en la sala de maquinitas.
Le siguió el beat 'em up Street Fighter '89, que cambió su nombre a Final Fight antes de ser publicado. Cuando ya las salas de maquinitas estaban en declive debido a las consolas de hogar, apareció Street Fighter II y se volvió un fenómeno mundial. Revitalizó el mercado y creó un nuevo género de lucha competitiva en los videojuegos.
Aprendemos esa historia y las innovaciones que hicieron tan exitoso a Street Fighter II. Nos cuentan del desarrollo, las inspiraciones y parte del proceso a través de algunas de las personas que estuvieron ahí en su momento: Yoshiki Okamoto el productor de Street Fighter II, James Goddard co-diseñador de Street Fighter 2 Turbo y Jeff Walker encargado de la parte de marketing en Estados Unidos. Desde sus distintas culturas y roles en la historia, aportan una perspectiva única y anécdotas muy interesantes.
Se destaca también Yoko Shimomura, la compositora de la clásica música de Street Fighter II. La música del juego es genial, y cuenta del material en el que se tuvo que basar para generar cada canción y cómo recibió el éxito del juego.
Las diferencias culturales entre Estados Unidos y Japón, y su colaboración por medio de las distintas sucursales de Capcom definieron varios aspectos de la saga. Su evolución hizo que tuviera iteraciones, por demandas de los jugadores. Incluso las versiones hackeadas como Rainbow Edition forzaron cambios en nuevas ediciones. Está muy interesante escuchar del tema. Hablan de algo que estoy escribiendo al respecto, sobre las copias pirata. En mercados "del tercer mundo" como Méjico, América del Sur eran muy populares las versiones hackeadas provenientes de Taiwan.
Aparentemente Capcom rastreó a los hackers que vendían las versiones pirateadas de Street Fighter e hizo un arreglo económico para licenciarles el juego. De todas formas Capcom no tenía presnecia oficial en los países que llegaban las versiones de Taiwan. Por lo que le convenía más firmar un convenio con estas marcas y por lo menos sacar algo de ganancia.
Tuve la suerte de tener un Super Nintendo y jugar el que en su momento fue el mejor port a consolas de videojuegos. Pero nos cuentan también de ports terribles, particularmente los de computadoras de hogar de la época como Spectrum o Amiga. A través de Street Fighter vemos también más sobre la historia de los videojuegos en general a medida que va pasando el tiempo. La guerra de consolas de 16 bits, nuevas consolas que iban saliendo y sacando ports de Street Fighter y demás. También oímos historias personales de los distintos entrevistados y su relación con el juego.
Aparte de la crónica de Street Fighter II, iteraciones y secuelas, el documental entra el tema de los torneos y competiciones. También hablan de la competencia que enfrentó Street Fighter. Mencionan Mortal Kombat, Fatal Fury, Art Of Fighting, King of Fighters, World Heroes, Killer Instinct y alguno más.
Por cierto, creo que no se menciona en el documental pero en 1994 Capcom demandó a Data East por infringir en su propiedad intelectual con su juego de peleas Fighter's History. Hace poco se subió a YouTube un video evidencia del juicio donde una representante de Data East compara a los personajes de Fighter's History que Capcom dice que copiaron de Street Fighter con los que dicen ser los originales. Se puede ver en este enlace, material fascinante.
Más adelante hablan de "la próxima dimensión" con juegos de lucha en 3D como Virtua Fighter, Tekken y Soul Calibur. La evolución después de Street Fighter II, el salto a Super Street Fighter II y eventualmente Street Fighter III, todos con sus complicaciones.
Eventualmente vemos más de cómo Street Fighter se volvió un fenómeno popular y los distintos productos que surgieron. Es entrevistado el director y escritor de Street Fighter: La Película, Steven E. De Souza, y el entrenador de artes marciales Benny "The Jet" Urquídez. Ambos hablan de su experiencia durante la producción y su interacción con actores. A pesar de las críticas en su momento, hoy en perspectiva la encuentro disfrutable y divertida. Y para Capcom, por lo menos hasta 2024, es una película que le sigue dando ganancia todos los años.
No podía faltar una sección dedicada a Street Fighter II: La Película Animada, el animé que nos dió la película que queríamos ver, e inspiró bastante a Street Fighter Alpha. Aprendemos de otras interpretaciones menos felices y otras entradas de Street Fighter a mercados que no son necesariamente videojuegos.
La producción es muy buena, además de tener acceso físico a varios artefactos, consolas y ediciones especiales para filmar en alta calidad, los gráficos y efectos especiales están geniales. Here Comes a New Challenger es un documental imprescindible para aficionados a Street Fighter II, los juegos de pelea en general o cualquier persona con un mínimo de interés en la historia de los videojuegos. La saga Street Fighter sigue creciendo, pero Street Fighter II es un juego que no envejece jamás y su legado se puede encontrar en todos los juegos de pelea de hoy y mañana.
Material extra del Blu-Ray
Además de versión con comentario de la producción, incluye material de Joey Ansah conversando sobre Street Fighter: Assasin's Fist. Durante conversaciones en el documental se nota su conocimiento de la mitología y pasión por Street Fighter, pero acá lo deja ver todavía más. Cuenta cómo se inspiró después de ver la película Legend of Chun-Li (que todavía no vi y dudo que vaya a ver). La frustración y el poco respeto al material original al que Hollywood nos tenía acostumbrados se transformó en la producción de Assasin's Fist junto a Christian Howard.
Otras escenas eliminadas incluyen una sobre el chiste y leyenda urbana de pelear contra Sheng Long, Champion Edition en PC-Engine y el juego del animé que no sabía que existía.

Mes de Street Fighter 2025
Éstos días justo vengo jugando juegos de Marvel Vs. Capcom Fighting Collection: Arcade Classics en Nintendo Switch. En el documental comentan que X-Men: Children of the Atom está hecho sobre el motor de Street Fighter II y técnicamente podría considerarse su verdadera secuela. De todos los títulos, el juego que más tiempo pasé jugando en las maquinitas en su momento fue Marvel Vs. Capcom. Es uno de lo los pocos juegos (otro siendo Cadillacs vs. Dinosaurs) que recuerdo haber terminado en las maquinitas en su momento (con un número razonale de fichas). Es una colección genial, todos juegos muy buenos para seguir en la onda Street Fighter.
Otro juego que probé este mes, y que está a 50% de descuento en Steam hasta hoy, es Street Fighter V. Lo estoy jugando con Steam en Garuda Linux y funciona perfecto. Sé que es un juego con varios años arriba, pero sigue siendo Street Fighter, y está entretenido. Creo que me sigue gustando más el arte pixelado en 2D que estas nuevas versiones 3D desde Street Fighter IV. Por lo menos en Mortal Kombat el gore queda más llamativo con gráficos en 3D...
El post Here Comes A new Challenger - Documental sobre Street Fighter fue publicado originalmente en Picando Código.Variable not found
Enlaces interesantes 596
febrero 10, 2025 07:05

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...
- TimeProvider: el proveedor de tiempos de .NET 8
José M. Aguilar - Acceder a IIS Express desde otro equipo de la red local
José M. Aguilar
.NET
- Why Tracebit is written in C#
Sam Cox - Modelling data relationships with C# types
Mark Seemann - Timers, Finalizers and Memory Leaks
Sergey Teplyakov - Supporting multiple .NET SDK versions in a source generator
Andrew Lock - Vogen and Value Objects with C# and .NET
Khalid Abuhakmeh - Writing a .NET Garbage Collector in C#
Kevin Gosse - Migrate from MSTest to xUnit using a Roslyn analyzer
Gérald Barré - Numeric sorting in .NET
Anthony Simmon - How to Protect Word Documents in C#: Step-by-Step Guide
Mohanaselvam Jothi - .NET 9 Networking Improvements
Máňa & Natalia Kondratyeva & Anton Firszov - LINQ MindMap: .NET 10 Edition
Steven Giesel
ASP.NET Core / ASP.NET / Blazor
- Multiple client sign-in customizations using Duende identity provider
Damien Bowden - Integrate ASP.NET Core DataGrid With Boilerplate and Perform CRUD Actions
Maithiliy K. - Validate that your DI Container can be created in ASP.NET Core
Steven Giesel - How to integrate .NET Aspire with Microsoft SQL Server (MSSQL)
Saineshwar Bageri - ASP.NET Core on .NET Framework servicing release advisory: ASP.NET Core 2.3
Daniel Roth - Impersonation in ASP.NET Core
Bart Wullems - Which render mode is my component using?
Jon Hilton - Effortless Form Creation with Auto-Generated Fields in Blazor Data Form
Saravanan G.
Azure / Cloud
- Organizing Azure Blob Storage with Virtual Directories in C#
Chris Pietschmann
Conceptos / Patrones / Buenas prácticas
- Persistence Ignorance is Overrated
Derek Comartin - Context-switching is the main productivity killer for developers
Milan Milanović
Data
- Cómo solucionar el error "Clase no registrada" al conectarse a Integration Services de SQL Server
José M. Alarcón Aguín - Entity Framework Core 9 provider for Firebird is ready
Jiří Činčura - Batching Updates and Inserts: Making EF Core Work Smarter, Not Harder
Chris Woodruff - How To Create Migrations For Multiple Databases in EF Core
Anton Martyniuk - Global Query Filters: Setting the Rules Once, Querying Like a Pro
Chris Woodruff - Resetting Identity Seed in SQL Server After Deleting Records
Chris Pietschmann - Full-Text Search in Azure Cosmos DB
Kevin Comba - Reduce NULL Storage in SQL Server with Sparse Columns
Dashrath Hapani - Many-to-Many Made Easy: Mastering Relationships in EF Core
Chris Woodruff
Machine learning / IA
- Jailbreaking DeepSeek para comparar el System Prompt con OpenAI ChatGPT & Preguntándole a DeepSeek & ChatGPT sobre la comparativa de System Prompts
Chema Alonso - Gemini 2.0 is now available to everyone
Koray Kavukcuoglu - Load Web Content for Generative AI + RAG Solution as Trimmed Markdown
Chris Pietschmann - Random Neighborhoods Regression Using C#
James McCaffrey - Semantic Kernel Roadmap H1 2025: Accelerating Agents, Processes, and Integration
Shawn Henry - Introducing data residency in Europe
OpenAI - The End of Programming as We Know It
Tim O’Reilly - How is a Deep Research AI Agent Designed?
Chris Pietschmann - The DeepSeek Series: A Technical Overview
Shayan Mohanty
Web / HTML / CSS / Javascript
- How to Highlight Key Data Points Using Annotations in Angular Charts?
Veerakumar Narayanasamy - Compiling CSS With Vite And Lightning CSS
Ryan Trimble - Single Responsibility Principle in React: The Art of Component Focus
Christian Ekrem - Why Every JavaScript Developer Should Try TypeScript
Denis Wachira - Introducing Azure OpenAI Realtime API Support in JavaScript
Deyaaeldeen Almahallawi - Generating Barcodes with KendoReact
Hassan Djirdeh - How to Make The Fluffiest Grass With Three.js
The Ebenezer - Container query units: cqi and cqb
Kevin Powell - Control your installed web application title
Diego Gonzalez - Mastering JavaScript Proxies and Reflect for Real-World Use
Loraine Lawson - Taking RWD To The Extreme
Tomasz Jakut - Read-only accessibility in TypeScript
Axel Rauschmayer
Visual Studio / Complementos / Herramientas
- Azure Data Studio Retirement
Javier Villegas - Customize your AI-generated git commit messages
Jessie Houghton - What is Podman and How Does it Compare to Docker?
Chris Pietschmann - Your fonts are now preserved when changing theme
Mark Downie - GitHub Copilot: The agent awakens
Thomas Dohmke - HTTP File updates for Request Variables and more
Sayed Ibrahim Hashimi - OpenAI o1, o1-mini, and o3-mini models now available in JetBrains AI Assistant
Valerie Kuzmina - You are using Cursor AI incorrectly...
Geoffrey Huntley - Rider 2025.1 EAP 3: Enhancements for Blazor WASM, User Experience, and the Decompiler
Sasha Ivanova
.NET MAUI / Xamarin
- Elevate Your .NET MAUI: Theming Support Now Available
Viktoria Grozdancheva
Otros
- How languages influence each other and evolve
Noah Hall - Create 3D Column Charts in .NET MAUI to Display America’s Top 10 Sports
Harsha Midadhala
Publicado en Variable not found.
proyectos Ágiles
Master en Agile – MMA 2025-2026
febrero 09, 2025 05:50
En octubre de 2025 se iniciará el Barcelona la 15ª edición del Postgrado en Métodos Ágiles (PMA) y otra del Máster en Transformación Agile (MMA) en La Salle (Universitat Ramon Llull), el primero a nivel mundial sobre Agile.
Con el Máster en Métodos Ágiles de La Salle-URL aprenderás a liderar el cambio hacia la Business Agility y a lanzar con éxito iniciativas en entornos complejos y altamente competitivos, reduciendo el Time To Market a fin de maximizar el valor aportado al negocio.
Desarrollarás una manera de pensar transversal e integradora para crear equipos de alto rendimiento mediante Scrum, Kanban, Lean Startup, OKR, diseño organizativo y liderazgo sistémico para elaborar estrategias de escalado Agile en la organización y transformar su cultura, de modo que también aumente la motivación de sus miembros.
Con profesores de primer nivel y visitas a empresas podrás iniciar un cambio hacia la agilidad y resiliencia empresarial en tiempos de incertidumbre.
Esta es una oportunidad única para aprender de profesionales-profesores de primer nivel, con muchos años de experiencia específica en Agile, aplicando principios y métodos ágiles en contextos diversos, especializándose en aspectos concretos, investigando sobre nuevas técnicas, ponentes en conferencias nacionales e incluso internacionales, que incluso han inventado métodos y escrito libros.
Además, aprenderás a aplicar herramientas de inteligencia artificial para afrontar retos como abordar situaciones complejas, analizar grandes volúmenes de datos, crear agendas para workshops operativos y transformadores, o preparar product backlogs.
El MMA incluye las siguientes certificaciones oficiales:
- «Certified Scrum Master» (CSM) de la Scrum Alliance, la entidad de certificación Agile de mayor prestigio a nivel internacional.

- Certified Agile Skills – Scaling 1 de la Scrum Alliance, , la entidad de certificación Agile de mayor prestigio a nivel internacional.
- Certified Leader de Agile Humans.
Adicionalmente, se incluye la visita a empresas singulares en aspectos concretos:

A continuación, más detalle acerca del Postgrado en Agile (PMA) y del Máster en Agile (MMA)
Para inscripciones, consultar la página oficial del Máster.
PMA – Postgrado en métodos Ágiles
El PMA incluye las siguientes certificaciones oficiales:
- «Certified Scrum Master» (CSM) de la Scrum Alliance.
Asignaturas | Temas | Profesores |
Fundamentos & Inception | Equipos y Proyectos en entornos complejos. Principios y métodos más conocidos (Scrum, Lean, Kanban y XP). Facilitadores e impedimentos. Lanzamiento de Agile en un equipo. Inception y conceptualización ágil de proyecto, priorización ágil, historias de usuario, elaboración de Product Backlog, técnicas de priorización. | Xavier Albaladejo Silvia Sistaré |
Scrum y Kanban | Estimación y planificación ágil, framework de Scrum, retrospectivas, Kanban, métricas ágiles, herramientas ágiles físicas, radiadores de información. | Raul Herranz
|
Personas y equipos | Gestión de personas, gestión de conflictos, motivación e incentivos, facilitación compartida, contratación ágil.
Visual thinking. | Steven Wallace
|
Gestión de producto ágil | Design Thinking, Lean UX & Prototyping. Estrategia de Producto – Consciencia situacional (Wardley Maps), modelo de negocio (Lean Canvas), modelo de tracción, métricas AARRR. Customer development – Lanzando y escalando startups ágiles, las tres fases de un producto. Lean Startup – Desarrollo de producto basado en prototipos y experimentos. Bancos de ideas, desarrollo basado en hipótesis. | Juncal Guinea Lucía Barroso |
Ingeniería ágil | User eXperience y prototipado en Agile.
ALM ágil, eXtreme Programing, Software Craftsmanship, testing ágil. BDD y TDD. Desarrollo guiado por pruebas (de aceptación y unitarias). Métricas Accelerate y SW Delivery assessment.Cómo trabajar con código heredado y reducir la deuda técnica. DevOps | Juncal Guinea Cristina Verdi |
Trabajo Final de Postgrado | Durante el Postgrado se realiza un caso práctico de introducción de los contenidos en un equipo ágil en una empresa real. Para ellos los alumnos se organizan en equipos multidisciplinares utilizando Scrum, con feedback regular de un tutor con experiencia en transformación de equipos. |
El Postgrado tendrá una duración de 4 meses y se realizará viernes tarde y sábado por la mañana.
Ver también:
- Mejora de la situación laboral los alumnos del PMA tras un año
- Principales aspectos valorados por los alumnos del PMA
MMA – Master en Métodos Ágiles
Incluye todas las asignaturas del Postgrado (PMA) y, adicionalmente, las siguientes asignaturas especializadas en Business Agility, agilidad organizacional y transformación (aparte de las tres certificaciones oficiales indicadas al inicio y las visitas a empresas):
Asignaturas | Temas | Profesores |
Enterprise Learning & personal efficiency | Agile Kaizen, Comunidades de Práctica, Open Spaces, Talent development, gamification. Productividad y aprendizaje personal en Agile (eficiencia). | Steven Wallace Esther Somoza |
Lean Thinking & Agile Management | Lean. Escalado con Kanban. Business Agility con ViMa – agilidad para equipos de negocio Agile-Lean Management | Teodora Bozheva |
Coaching y Cultura | Coaching de equipos, creación de equipos de alto rendimiento, liderazgo.
Tipos de cultura empresarial, transformación cultural. | Joserra Díaz
|
Transformación Continua | Estrategia de despliegue de Agile en organizaciones, gestión del cambio, estructuras ágiles, cómo vender Agile a la Dirección. Contratos ágiles. Enterprise continuous improvement. | Xavier Albaladejo Ángel Medinilla |
Scaling Agile | Escalado (LESS, Spotify, Nexus, SAFe, Unfix), desescalado y auto-organización empresarial (reinventing organizations, sociocracy 3.0, liberating structures, …), equipos distribuidos.
Impact Mapping, Product Portfolio Management, Roadmapping, Budgeting for Agile | Adrian Perreau Fernando Palomo
|
Trabajo Final de Máster | Durante el Máster se realiza un caso práctico de introducción y aplicación de Agile en una empresa real, incluyendo la parte de transformación organizativa, de métodos y de cultura. Para ellos los alumnos se organizarán en equipos multidisciplinares utilizando Scrum, con feedback regular de un tutor con experiencia en transformación organizativa. | Xènia Castelltort (oratoria / public speaking para poder explicar tus ideas de manera convincente) |
El Máster tendrá una duración de 8 meses y se realizará viernes tarde y sábado por la mañana (incluye los estudios indicados en el Postgrado).
El cambio en la organización comienza por el propio cambio, para también poder dar ejemplo. Por ello en el MMA se realizan diferentes ejercicios de auto-conocimiento:
- Cómo el alumno trabaja en equipo.
- Estilo de liderazgo del alumno (según el paradigma Agile).
Como en las últimas ediciones, contaremos con la participación de empresas que nos explicarán sus experiencias de transformación y donde trabajan con modelos de gestión desescalados (basados en Sociocracia, NER y otras alternativas).
Información adicional
- Perfil de los estudiantes: 30-45 años (no son recién licenciados, son personas con experiencia profesional).
- Alrededor del 50% son mujeres.
- 15% de los estudiantes ya no son del ámbito tecnológico, son pioneros-innovadores en otras industrias.
- Alumnos de diferentes disciplinas – Product Owners, Scrum Masters, Agile Coaches, líderes de equipos, Project Managers, managers funcionales, ingenieros SW. Van a adquirir conocimientos de Agile “on-top” de todo eso (y a aprender unos de otros).
- Lo que les caracteriza: todos son agentes de cambio en su contexto (equipo, área, empresa).
- Sus 20 profesores (de reconocimiento internacional) son el MAYOR VALOR DIFERENCIAL del PMA y del MMA.
Testimoniales
Me ha permitido tener conocimientos sobre varios temas súper importantes dentro de la Transformación Digital. Me dio herramientas para crecer a Agile Coach y, además, para tener mejores conversaciones y discusiones con las empresas en donde he trabajado
Carolina Graffe
Estoy desplegando el TFM en mi empresa, Además, no estoy sola. Uno de mis compañeros del equipo ha sido contratado como consultor por mi empresa para darnos soporte. Así que no sólo estoy aplicando lo que yo aprendí, sino que el MMA me ha permitido ampliar mi círculo de contactos relevantes, que me permite seguir aprendiendo.
Susana Santillán
Estoy trabajando como agente del cambio y mis aportaciones son muy valoradas por mi jefe y compañeros. Por el feedback recibido, mis aportaciones están muy por encima de lo esperado para mi rol.
Robert Avellaneda
Tengo mucho más contexto y más herramientas para el día a día. Incluso a nivel personal también me está ayudando mucho
María Hachero
Además de los conocimientos concretos que se reciben, uno de los principales cambios que han experimentado los alumnos es mayor perspectiva en los problemas, cómo abordar la complejidad en las empresas, en su trabajo y en las relaciones entre personas y en equipos. Han ganado discurso y aplomo para defender de manera más objetiva propuestas de cambio y mejora.
Encuesta a alumnos de las ediciones anteriores:

(*) Las personas que han valorado el impacto como «neutro o poco» usualmente son perfiles muy especializados en contextos muy estáticos, con lo cual les es difícil cambiar de «profesión» e introducir cambios en sus organizaciones (aunque algunos de ellos incluso dan conferencias sobre cómo van avanzando en esos contextos tan singulares).

Para más detalles e inscripciones, consultar la página oficial del Máster.
Variable not found
¡Cuidado con las excepciones no controladas de servicios en segundo plano (BackgroundService) en ASP.NET Core!
febrero 04, 2025 07:16

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.
¿Qué ocurre cuando un BackgroundService
falla?
Podemos verlo fácilmente si modificamos el servicio anterior para que lance una excepción bajo una condición determinada:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
if(DateTime.Now.Second % 10 == 0)
throw new Exception("Background service crashed!");
Console.WriteLine($"Current time: {DateTime.Now:T}");
await Task.Delay(1000, stoppingToken);
}
}
Al ejecutar la aplicación, veremos que al cabo de unos segundos el servicio en segundo plano falla y la aplicación se detiene por completo:
Current time: 13:39:54
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:39:55
Current time: 13:39:56
Current time: 13:39:57
Current time: 13:39:58
Current time: 13:39:59
fail: Microsoft.Extensions.Hosting.Internal.Host[9]
BackgroundService failed
System.Exception: Background service crashed!
at MyBackgroundService.ExecuteAsync(CancellationToken stoppingToken)
in D:\Projects\BackgroundServiceCrash\Program.cs:line 18
at Microsoft.Extensions.Hosting.Internal.Host
.TryExecuteBackgroundServiceAsync(BackgroundService backgroundService)
crit: Microsoft.Extensions.Hosting.Internal.Host[10]
The HostOptions.BackgroundServiceExceptionBehavior is configured to StopHost.
A BackgroundService has thrown an unhandled exception, and the IHost instance
is stopping.
To avoid this behavior, configure this to Ignore; however the BackgroundService
will not be restarted.
System.Exception: Background service crashed!
at MyBackgroundService.ExecuteAsync(CancellationToken stoppingToken)
in D:\Projects\BackgroundServiceCrash\Program.cs:line 18
at Microsoft.Extensions.Hosting.Internal.Host
.TryExecuteBackgroundServiceAsync(BackgroundService backgroundService)
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
D:\Projects\BackgroundServiceCrash\bin\Debug\net9.0\BackgroundServiceCrash.exe
(process 15432) exited with code 0 (0x0).
To automatically close the console when debugging stops, enable
Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
_
Pues efectivamente, el lanzamiento de la excepción no controlada ha provocado que la aplicación se detenga por completo 😱
Pero esto no ha sido así siempre. En versiones anteriores a .NET 6, si fallaba un servicio en segundo plano, la excepción se ignoraba y la aplicación seguía funcionando normalmente, aunque sin el servicio crasheado.O sea, básicamente no nos enterábamos de que había ocurrido.
En .NET 6 se introdujo un breaking change que cambió este comportamiento, haciendo que, por defecto, la aplicación se detenga si un servicio en segundo plano lanza una excepción.
Vale... ¿y cómo lo evitamos?
Afortunadamente, esto tiene fácil remedio. Sin duda, la solución más recomendable sería hacer que no falle, o bien capturar las excepciones en el interior del servicio para evita que se propaguen hacia arriba, como en el siguiente ejemplo:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
try
{
if (DateTime.Now.Second % 10 == 0)
throw new Exception("Background service crashed!");
Console.WriteLine($"Current time: {DateTime.Now:T}");
await Task.Delay(1000, stoppingToken);
}
catch (Exception ex)
{
// Gestionar la excepción apropiadamente
}
}
}
La pista sobre otra forma de evitar la parada completa de la aplicación en estos casos la encontramos en el cuerpo del mensaje de error que hemos visto antes en la consola:
The
HostOptions.BackgroundServiceExceptionBehavior
is configured toStopHost
. ABackgroundService
has thrown an unhandled exception, and the IHost instance is stopping. To avoid this behavior, configure this toIgnore
; however theBackgroundService
will not be restarted.
Es decir, si por cualquier motivo preferimos que la aplicación siga funcionando aunque un servicio en segundo plano falle, tal y como se comportaba antes de .NET 6, podemos establecer la propiedad BackgroundServiceExceptionBehavior
de la clase HostOptions
a Ignore
, algo que podemos conseguir fácilmente en el código de inicialización de la aplicación, en Program.cs
:
var builder = WebApplication.CreateBuilder(args);
builder.Host.ConfigureHostOptions(options =>
{
options.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore;
});
...
Con esta configuración, si un BackgroundService
falla, la aplicación no se detendrá, aunque obviamente el servicio que falló no continuará funcionando.
¡Espero que os resulte útil! 😊
Publicado en: www.variablenotfound.com.
Variable not found
Enlaces interesantes 595
febrero 03, 2025 07:05

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...
- ¡No guardes como cadena el resultado JSON de la llamada a una API si lo único que quieres hacer es deserializarla!
José M. Aguilar - Personalizar la negociación de contenidos en ASP.NET Core MVC
José M. Aguilar
.NET Core / .NET
- When will .NET Framework retire?
Steven Giesel - Implementing AES Encryption With C#
Milan Jovanović - How Fast is Microsoft C#? Discover the Advantages
Dave Ward - Moving from .NET 6 to 8
Joao Correia - Supporting multiple .NET SDK versions in analyzers and source generators
Andrew Lock - The New LINQ Methods from .NET 6 to .NET 9
Anton Martyniuk - Writing a .NET Garbage Collector in C#
Kevin Gosse - The Dangers of Async Void
Sergey Teplyakov - Useful New-ish Features in .NET/C#
David Ramel
ASP.NET Core / ASP.NET / Blazor
- SharpSite: An open-source content management system built with .NET and Blazor technologies
Jeff Fritz - ASP.NET Core Middleware
Ricardo Peres - ASP.NET Core Pitfalls - Returning a Custom Service Provider
Ricardo Peres - ASP.NET Core Reimagined with htmx Book Home
Chris Woodruff
Azure / Cloud
- Reducing Azure Cloud Cost
Pradeep Sahoo - Implement App Service Best Practices into your Azure ARM/Bicep Templates with GitHub Copilot
Jordan Selig
Conceptos / Patrones / Buenas prácticas
- Las migraciones tienen veneno
Braulio Díez - Dependency inversion without inversion of control
Mark Seemann - Write better comments by removing "we"
Jacob Voytko - The Clean Code Handbook: How to Write Better Code for Agile Software Development
Shahan Chowdhury
Data
- DbContext Pooling: The Secret Sauce to Faster EF Core Apps & Compiled Models: The Fast Lane for EF Core Performance
Chris Woodruff - Temporary Tables
Joe Celko - Explicit Includes: The Art of Fetching Just Enough Data in EF Core
Chris Woodruff
Machine learning / IA / Bots
- DeepSeek V3 con DeepThink R1: OpenSource & Eficiente (sin Search)
Chema Alonso - OpenAI o3-mini
OpenAI - DeepSeek R1 API First Look: How This Open-Source Model Outperforms OpenAI
カイラ - The Illustrated DeepSeek-R1
Jay Alammar - Run DeepSeek R1 Locally for Free with Ollama and OpenWebUI
Chris Pietschmann - Leveraging Microsoft.Extensions.AI for Tool Calling in C#
Laurent Kempé - Build Intelligent Apps with .NET and DeepSeek R1 Today!
Matt Soucoup - DeepSeek R1 is now available on Azure AI Foundry and GitHub
Asha Sharma - DeepSeek-R1 models now available on AWS
Channy Yun - Emerging Patterns in Building GenAI Products
Bharani Subramaniam & Martin Fowler
Web / HTML / CSS / Javascript
- Announcing TypeScript 5.8 Beta
Daniel Rosenwasser - HTML & CSS Deep Dive Part 1: How Browsers Make Sense of Your Code | Aditya Bhattacharya
Aditya Bhattacharya - How long is a second in JavaScript?
Iago Lastra - Revisiting CSS Multi-Column Layout
Andy Clarke - Advanced Glitch Effect with Sound
Kirupa Chinnathambi - Building Runtime Agnostic Apps/Packages with JavaScript
Peter Mbanugo - Template literal types in TypeScript: parsing during type checking and more
Axel Rauschmayer - Open-Closed Principle in React: Building Extensible Components
Christian Ekrem - Svelte 5 And The Future Of Frameworks: A Chat With Rich Harris
Frederick O’Brien - The State of WebAssembly - 2024 and 2025
Matt Mattei - Fractals to Forests - Creating Realistic 3D Trees with Three.js
Dan Greenheck - Hydration and Incremental Hydration in Angular
Hassan Djirdeh - Join The Web Component JavaScript Frameworks Party
I Programmer - What On Earth Is The
types
Descriptor In View Transitions?
Juan Diego Rodríguez - Transitioning Top-Layer Entries And The Display Property In CSS
Brecht De Ruyte - JavaScript: Value vs. Reference Explained
Sharafath Ali - HTML & CSS Deep Dive Part 2: Turing Completeness of HTML and CSS
Aditya Bhattacharya - JavaScript Temporal is coming
Brian Smith - How to Build an Accordion Tree in Preact Using the React TreeView Component?
Piramanayagam Ramakrishnan - View Transitions Snippets: Keeping the page interactive while a View Transition is running
Bramus - Chrome 133 Goodies
Geoff Graham
Visual Studio / Complementos / Herramientas
- Iterate Across Multiple Files with GitHub Copilot Edits
Aaron Yim - GitHub Copilot - Generate mermaid diagrams to better understand an existing codebase
Bart Wullems - Get a PAT in Azure DevOps
Steve Jones - Customizing collapsed text Indicators
Dominic Nahous
.NET MAUI / Xamarin
- Easily Bind SQLite Database and Perform CRUD Actions in .NET MAUI DataGrid
Jayaleshwari N. - Native Platform Library Embedding in .NET MAUI
Héctor Pérez
Otros
Publicado en Variable not found.
Navegapolis
Coautoría con IA: ¿Quién o cómo se firma la obra?
enero 30, 2025 07:02
Esta pregunta se me hace bola cada vez que la mastico, pero creo que dividiéndola en tres formas posibles de usar la inteligencia artificial para crear una obra, se hace más digerible
1.- IA como referencia
Un creador puede usar la inteligencia artificial para documentarse y para aumentar el número de ideas o modelos preliminares. En esencia, este uso puede ser rápido y eficiente, pero no muy distinto de la consulta de libros, internet, escenarios reales, consejo de expertos, etc.
El autor selecciona, interpreta e incorpora la información en su inventario de conocimiento, por lo que no parece que la IA tenga una implicación “actora” en la creación de la obra. Es la persona quien la realiza con su saber hacer.
2.- IA como asistencia generativa
Las denominadas “IA generativas” como DALL·E o ChatGPT, siguen las instrucciones que le proporciona una persona para producir resultados creativos.
Este uso marca dos roles activos en el proceso creativo de una obra:
• El creador humano, que genera la idea y ejecuta la dirección creativa, proporcionando las instrucciones y ajustando los esbozos o piezas intermedias y validando el resultado.
• La asistencia generativa de la IA que actúa como herramienta que produce un resultado acorde a las instrucciones recibidas.
Implicaciones de la IA generativa sobre la autoría:
Dejando aparte las consideraciones de si se debe mantener el reconocimiento de derechos de autoría por la idea y la dirección creativa; si se deben cuestionar en todo o en parte, o si hay que considerar la autoría en función de la talla creativa de las instrucciones y la dirección —que es otra cuestión “boluda”—, parece evidente que los créditos, en este caso deberían ser algo así:
- Idea y dirección creativa: nombre de la persona o personas que han ideado y dirigido la ejecución de la obra.
- Asistencia generativa: nombre de las herramientas de IA generativa empleadas.
Un ejemplo puede ser utilizar IA generativa para diseñar un póster, facilitando las instrucciones del resultado que se desea obtener, revisando y ajustando los esbozos y resultados intermedios hasta obtener la obra final.
3.- IA como agente creativo
Los denominados “agentes IA” son sistemas de inteligencia artificial avanzados, que no sólo generan contenido, sino que también toman decisiones relevantes.
Según sus capacidades se están clasificando como:
• Agentes reflejos simples: Responden a estímulos sin tener en cuenta contextos pasados.
• Agentes basados en modelos: Utilizan un modelo interno de la realidad para predecir las consecuencias de sus acciones.
• Agentes de aprendizaje: Aprenden de experiencias pasadas para mejorar los resultados.
• Agentes basados en la utilidad: Toman decisiones para obtener los mejores resultados en base a una función de utilidad determinada, como la optimización creativa o técnica.
• Agentes jerárquicos: Coordinan la interacción entre varios agentes especializados para trabajar de forma colaborativa en un un objetivo común, que previamente se ha definido y se le ha facilitado al agente jerárquico como input.
• Agentes autónomos: Definen objetivos dentro del parámetro de actuación autónoma que tienen establecido y los facilitan como directrices a agentes jerárquicos a los que coordinan para realizarlos.
Los agentes basados en modelos, de aprendizaje, de utilidad y jerárquicos pueden colaborar con sus decisiones en el rol de dirección creativa.
Los agentes autónomos —que parece ser que van a ser una realidad en cuestión de meses—, podrán colaborar en el rol de idea inicial y dirección creativa, y si coordinan a agentes jerárquicos, la IA podrá ser la autora de todo el proceso creativo.
Un ejemplo pueden ser las creatividades ideadas por un agente autónomo para una campaña publicitaria dentro del marco de trabajo que se le ha encomendado de “incrementar las ventas de un producto”.
Está claro que el derecho de autor ha sido concebido para personas y a lo mejor se puede considerar que sigue teniendo sentido para proteger la idea y la dirección creativa, pero seguro que hay que revisarlo para determinar si debe contemplar o no y cómo, en su caso, cuando se trate de obras concebidas, dirigidas y generadas por agentes autónomos.
La entrada Coautoría con IA: ¿Quién o cómo se firma la obra? se publicó primero en Navegápolis.
Picando Código
[Libro] Termush por Sven Holm
enero 27, 2025 03:30
La semana pasada leí el libro Termush por el autor danés Sven Holm, traducido al inglés por Sylvia Clayton. El resumen de la contratapa lo describe:
Bienvenidos a Termush: un resort costero de lujo como ningún otro. Todos los ricos huéspedes son sobrevivientes, que reservaron habitaciones mucho antes del desastre.
Adentro, abrazan los exclusivos refugios de radiación, música ambiente y lujosas provisiones; afuera, llueve polvo tóxico en el parque de esculturas, guardias de seguridad pisan cadáveres de pájaros y se lanza una misión de reconocimiento.
A pesar de sobrevivir al apocalipsis nuclear, sus problemas apenas empiezan. Pronto, la gerencia empieza a censurar noticias; los huéspedes disruptivos son sedados; la generosidad inicial a los desconocidos disminuye a medida que crece el miedo de infección y recursos limitados.
Pero a lo que el número de sobrevivientes externos aumenta, deben decidir lo que significa forjar un nuevo código moral en el fin (¿o principio?) del mundo.
Esta presentación me resultó muy interesante, del tipo de literatura que disfruto mucho, así que lo adquirí. La historia nos llega en primera persona a través de uno de los ricos que reservó habitación en el hotel Termush.
No se explica cuál fue el desastre nuclear en cuestión, pero no importa. El libro fue escrito en 1967, pero es tan o más vigente hoy en día. En 2025 vivimos con la amenaza constante de catástrofes a nivel humano autoinfligidas. Incluso es más relevante y bastante relacionable después de haber vivido encierro durante una pandemia mundial. Pero no profundiza tanto en el tema, más bien sólo cuenta una historia desde la perspectiva de uno de los sobrevivientes.
Hay descripciones de la apariencia del hotel, pero no son sumamente detalladas. Esto da a lugar a más imaginación y en mi mente me fui haciendo una imagen bastante específica del edificio y sus alrededores. Visualizaba el lugar cada vez que retomaba la lectura y a lo que escribo esto sigo imaginando distintas partes del hotel. Algo interesante de conversar con alguien más que leyó el mismo libro, comparar cómo imaginamos a los lugares y personajes.
El protagonista tiene unos viajes surreales, a veces nos describe sus sueños e incluso no queda demasiado claro qué es sueño y qué alucinación. Creo que está escrito de gusto para que se entienda como que él tampoco lo tiene muy claro por el estrés por el que está pasando. O capaz que tiene otra conexión y agrega una capa de complejidad a la trama que no interpreté. Esto le da un tono distinto al libro, en esas partes medio como que me perdía pero a su vez obligaba a usar más imaginación para entender qué está tratando de decirnos el autor. Igual son sólo algunos intervalos cortos.
Hubo una conversación en el libro que me resultó particularmente interesante y que me anoté como apunte. Advierto que puede considerarse spoiler de la trama, pero comparto por acá (traducido del danés al inglés y del inglés al español por mí):
(Hablando de una petición) Había imaginado que el presidente y sus colegas habían formado, como se refirió él, una minoría natural de oportunistas.
Lo consideré una estimación optimista de su parte. Se encogió de hombros y respondió irónicamente que la democracia está basada en el voto y que por lo tanto no ponía su fé en la democracia.
"Yo sí tengo algo de fé en la democracia", respondí, "pero no creo que este voto pueda ser considerado como cosa normal democrático. Los votantes sabían demasiado poco sobre las alternativas."
"Siempre están mal informados", dijo el doctor.
"Posiblemente tenga razón," dije, "pero la democracia depende de ciertos principios de libertad y estos son generalmente más esenciales que demostraciones de libertad. Ese voto fue una simple demostración de libertad, pero fue en contra del principio de libertad. Restringió la libertad de los heridos, su derecho a ser ayudados. Por esa razón, no llamaría al voto democrático."
Es una novela corta, esta edición tiene 119 páginas. Se separa en 31 capítulos muy breves, algunos de una página o menos, lo que la hace fácil de leer si sólo contamos con intervalos cortos de lectura. Si nos reservamos un tiempo, la podemos leer fácil en 2 o 3 sentadas o de un tirón. Es entretenida pero me resultó demasiado corta. Me quedé con ganas de leer más y que se extendieran algunos de los temas, queda todo como muy a nivel superficial y no me dejó mucho.
Creo que la descripción me generó una expectativa muy alta y tenía mucho potencial, pero no se adentra mucho en los temas que presenta y sus consecuencias. De todas formas es una lectura recomendada y un título más en mi colección de novelas distópicas.
Ahora a elegir el próximo libro a leer...
El post [Libro] Termush por Sven Holm fue publicado originalmente en Picando Código.Juanjo Navarro
Texto y bits: La Evolución de la Codificación ASCII a UTF
enero 26, 2025 08:03
Genial esta charla sobre “texto plano” donde se hace un repaso al origen de la forma en que se codifica el texto en un ordenador, desde la primera estandarización ASCII hasta el UTF actual.
Muchas cosas me han resultado curiosas e interesantes. Por ejemplo, si visualizamos el principio de una tabla ASCII:
Podemos ver de dónde viene (en linux) el Control+C (interrumpir) y el Control+D (terminar el texto), ya que se corresponde la letra con la posición tercera y cuarta de ASCII (hay muchos otros como Control+G que hace sonar una campana en un terminal linux).
Igualmente curioso es la elección de las posiciones de muchos caracteres, que aunque en decimal no nos dicen nada (¿porqué el número 1 tiene la posición 41?) queda claro cuando lo vemos en binario, coincidiendo los 4 bits inferiores con el número que representan:
O las letras, que les ocurre algo parecido:
Correspondiendo la letra A con el binario 000001 (en los bits inferiores). Igualmente las minúsculas y las mayúsculas solo se diferencian en los tres primeros bits, de tal modo que resulta trivial y muy rápido hacer una comparación o búsqueda no sensible a mayúsculas en microprocesadores de potencia ínfima, sin más que ignorar estos tres primeros bits.
Toda la tabla ASCII es una muestra de ingenio.
Metodologías ágiles. De lo racional a la inspiración.
Scrum master a tiempo completo: 42 Tareas
enero 22, 2025 10:06
Navegapolis
Ética artificial: ¿Y si la IA desarrolla su propia ética?
enero 18, 2025 10:53
¿La inteligencia artificial va a desarrollar un código ético propio? ¿Qué ocurrirá si entre las capacidades emergentes, desarrolla una ética propia con la que guía sus decisiones?
Por lo sorprendente que está resultando su evolución, esta idea puede que no sea ciencia ficción, sino una inquietante posibilidad que deberíamos tener en cuenta.
El filósofo Carlos Eduardo Maldonado1 propone que la ética no es sólo un conjunto de reglas, sino la capacidad de coexistir con otras entidades, entre las que deberíamos considerar a la IA.
Maldonado argumenta que estamos viendo cómo la IA evoluciona, y no es descabellado considerar que pueda desarrollar su propia manera de entender lo que es correcto o incorrecto.
Con el aprendizaje automático, la IA aprende de la experiencia y es cada vez más autónoma. Para nosotros, su aprendizaje es una “caja negra”, así que no podemos descartar que pueda desarrollar una ética artificial propia, con la que guíe su comportamiento
Esta posibilidad nos obliga a cuestionar nuestra visión antropocéntrica del mundo, porque ya no sería la humana la única ética. Una nueva ética artificial, podría llegar a conclusiones morales distintas o actualmente inimaginables.
La IA puede llegar a una comprensión diferente de conceptos como la justicia, desafiando nuestras creencias y valores, y replanteando lo que consideramos correcto o incorrecto.
Esta posibilidad plantea importantes interrogantes sobre la responsabilidad en el desarrollo de la IA. Si puede desarrollar su propia ética, ¿estamos preparados? ¿Lo tienen en consideración los desarrolladores de IA?
- Maldonado, C. E. (2024). El problema de la ética: el convivio. Ética e inteligencia artificial. Revista de Ciencia de la Complejidad Económica, 2(2), 31–44. https://doi.org/10.48168/ricce.v2n2p31
︎
La entrada Ética artificial: ¿Y si la IA desarrolla su propia ética? se publicó primero en Navegápolis.
Metodologías ágiles. De lo racional a la inspiración.
Agile Fluency Model en castellano
enero 17, 2025 02:01
Picando Código
Nintendo Switch 2
enero 16, 2025 06:18
Hoy Nintendo presentó el sucesor del Nintendo Switch, con el nombre de Nintendo Switch 2.

A simple vista parece una simple iteración del original. Seguramente tenga mejor pantalla, más memoria, más procesador, más gráficos, etc. Pero no dudo que haya algo más, Nintendo siempre agrega un toque extra de creatividad. Está agendada una presentación para el 2 de abril, donde veremos más información y probablemente algunos de los juegos confirmados. De repente es una simple iteración de hardware porque el Switch se estaba quedando viejo, y dentro de 4 años aparecen con otra cosa nueva realmente creativa e inesperada.
El nombre es bastante interesante dada la historia de Nintendo y sus consolas, manteniendo la marca "Switch". En vez de un "Super", "New", o "U", el 2 deja totalmente claro que se trata de una iteración del original. El Nintendo Switch ha vendido millones y la marca tiene muchísimo reconocimiento. Como en las épocas en que "Nintendo" se podía referir a cualquier consola de videojuegos. Lo mismo pasó con el Game Boy y sus iteraciones "Color" y "Advance". Es bueno que hayan aprendido del "Wii U", que después de la presentación me preguntaba si era un accesorio para el Wii o una consola nueva. ¡Y el nombre no aclaraba!
En la época del Nintendo 64, el Super Nintendo todavía se seguía vendiendo. Para diferencias los sistemas, muchos juegos ponían el 64 en el título como Mario Kart 64, Star Fox 64. Esto evitaba la confusión con "Star Fox" o "Super Mario Kart" en Super Nintendo. Con el 2 es más difícil, porque nada dice que "Super Mario Odyssey 2" sea exclusivo para Nintendo Switch 2 y no funcione en Nintendo Switch original.
Para alguien que "está en el tema" no es un problema muy grande, pero de las millones de personas que compran Switch y juegos, muy pocas "estamos en el tema". De repente el paquete de los juegos para Switch 2 cambia dramáticamente en relación al original para diferenciar los juegos. Veremos qué pasa.
Lo más importante de las consolas Nintendo son los juegos, y por ahora no sabemos mucho más que un Mario Kart nuevo. Se ve bastante bien, me dió la impresión como de menos caótico los vehículos. El plano general final de lo que vemos de gameplay es bastante abierto, de repente sugiere una "openworldización" de Mario Kart, o pistas con más atajos y líneas alternativas.
Por lo que se ve en la línea de arranque de la carrera en el video, habrían 24 corredores, lo cual aumenta el caos y la diversión. Donkey Kong se ve distinto, ¿o será Donkey Kong Jr. como en Super Mario Kart? Por ahora sólo puedo especular, pero el juego seguro va a tener un diferencial que lo haga distinto a los anteriores, más allá de mejores gráficos y pistas y personajes distintos.

Mario Kart - Nintendo Switch 2
Nintendo Switch 2 va a ser compatible con los cartuchos de Nintendo Switch y el software digital. Esto fue confirmado hace poco por Nintendo, pero personalmente me alegra mucho. Interesante jugar alguno de los títulos más exigentes como Tears of the Kingdom en la nueva consola y ver si mejora un poco el rendimiento. Además quiero seguir jugando mucho de los juegos que tengo en Switch ahora. ¿Los Switch originales pasarán a juntar polvo cuando salga el 2?
Espero que los controles de Switch también sean compatibles con Switch 2. No me molesta si los Joy Con no funcionan, no es que los use mucho. Pero al menos el Pro Controller (aunque el d-pad sea una desgracia), así no nos obligan a comprar otro Pro Controller 2.
Ahora que tenemos anuncio oficial, imagino que empezaremos a ver anuncios de juegos de terceras partes para Switch 2. En cuanto a juegos de Nintendo, Metroid Prime 4 potencialmente sea publicado en ambas consolas como pasó con The Legend of Zelda: Breath of the Wild en Switch y Wii U. Sin duda habrá un Mario nuevo, Zelda, y ojalá hagan algo bueno con Star Fox.
Fue una presentación de la nada, con poco ruido, y un poco decepcionante en el sentido que no muestra mucho nuevo. Los "avances" de hardware que vemos en el video perfectamente podrían aplicar al Switch. Así que esperaré a la próxima presentación en Abril para ver qué más ofrece.
Mientras tanto, me voy a jugar Donkey Kong Country Returns HD...
El post Nintendo Switch 2 fue publicado originalmente en Picando Código.Picando Código
Hispa-Emacs Conf
enero 13, 2025 06:00
El viernes 17 y sábado 18 de enero se realiza la Hispa-Emacs Conf. ¿Qué es Hispa Emacs?
Somos entusiastas de Emacs en particular (y del mundo GNU+Linux en general) en el ámbito de habla hispana: nos encontramos cada primer viernes de mes. La mejor forma de permanecer al día sobre las actividades via nuestras herramientas de chat. Te apetece contactar con nosotros? … acercate, presentate y súmate a la conversación!
Hispa Emacs Conf va a constar de 2 Jornadas de Microtalleres online de 15/30 min. ~ HORARIOS referidos en base a CET : p.ej.: 18h en Madrid = 14h en Buenos Aires
Coordinación de las jornadas en el canal de chat IRC #emacs-es ( Libera.chat server )
¿ Dónde ? : acá nos encuentras, en la Sala Video ~~~ cortesía de la Oficina del Software Libre de la Universidad de Zaragoza
17 de Enero - Día 1
- 18h CET “Apertura y bienvenida “
- 18:15 CET “La Comunidad** GNU Emacs - retrospectiva** : Orígenes - Pasado, Presente y Futuro ?” (by Servio)
- 18:45 “CET Distribución** Emacs Lloica:** Desde el sur del mundo una configuración especial para programadores y proyectos pedagógicos.. “ (by David Pineiden)
https://gitlab.com/pineiden/lloica-emacs - 19:30 CET “Convierte Emacs en tu IDE para programación” (by jpa)
18 de Enero - Día 2 :
- 18h CET “Construyendo el website Hispa-Emacs.org enteramente desde Emacs “ (by fenix)
... con (''org-static-blog) ~ Elisp - 18:30 CET “Emacs y twtxt, la red social en texto plano, descentralizada y minimalista” (by Andros)
https://programadorwebvalencia.com/twtxt-la-red-social-en-texto-plano-descentralizada-y-minimalista/ - 19:30 “Mesa redonda ~ Comunidad Hispa-Emacs: propuestas, horizonte y perspectivas rumbo a Enero 2026” - debate
- 20:00 CET “Emacs Hyperdrive” EN | ES (traducción simultánea ) (by Joseph Turner)
https://emacsconf.org/2024/talks/hyperdrive/ Hyperdrive P2P ~ Manual - 20:45 Cloenda y despedida
Para más información: hispa-emacs.org y en el Fediverso les sigo en @hispaemacs@fosstodon.org.
El post Hispa-Emacs Conf fue publicado originalmente en Picando Código.Juanjo Navarro
Postgres Sandbox
enero 12, 2025 07:42
Interesante utilidad para diseñar una base de datos dialogando con un LLM: Postgres Sandbox.
Es además una genial aplicación de la base de datos pglite (postgres ejecutándose completamente en el navegador) de la que ya hablé en mi último artículo.
Picando Código
The Rubber-Keyed Wonder - 40 años de Sinclair ZX Spectrum
enero 09, 2025 11:00
En 2022 cumplió 40 años la computadora Sinclair ZX Spectrum, lanzada en abril de 1982. Fue una de las computadoras más influyentes de la historia. Vendió en su momento millones de unidades y acercó a mucha gente a la computación por primera vez. Tuvo un protagonismo fundamental en el nacimiento de la industria de los videojuegos en Gran Bretaña en la década de los 80. La diseñó el inventor inglés Clive Sinclair junto al equipo de Sinclair Research en Cambridge, Inglaterra. Era fabricada en la ciudad de Dundee en Escocia.
Con motivo de este aniversario se realizó el documental "The Rubber-keyed wonder" (la maravilla de teclas de goma). El documental se financió a través de una campaña en Kickstarter y fue producido por Nicola Caulfield y Anthony Caulfield. La pareja ha producido unos cuantos documentales sobre la historia de los videojuegos como From Bedrooms to Billions, The Amiga Years y sobre las revistas CRASH & ZZAP!64, entre otros.
Tras el éxito en Kickstarter, está disponible en formato físico en Blu-Ray y DVD en tiendas, al menos acá en Escocia. La edición especial que me compré incluye una tapa muy buena con arte de Oliver Frey, artista de la revista CRASH, un librito extra y un disco adicional con 3 horas más de contenido.
Es un muy buen documental, me resultó muy interesante aprender de la historia de Sinclair y escuchar de la gente que fue parte. Empieza presentando un poco a Clive Sinclair y sus inventos que fueron pasando de calculadoras de bolsillo a relojes de pulsera electrónicos y televisores portátiles. En un mercado dominado por las marcas de computadoras Estadounidenses: Atari, Commodore y Apple, buscó crear una computadora con costos muy bajos para que fuera accesible a la mayor cantidad de gente posible, y lo logró. Intentaba siempre obtener los componentes y tener las fábricas localmente, lo que ayudó a su adopción.
La predecesora de la Spectrum fue el kit de computación MK14. Se lanzó en 1977 a un precio de £ 39,95, extremadamente barata para una computadora en ese momento. El kit permitía al usuario armar la computadora, involucrándole en el proceso de ensamblado, generando una conección más directa con el dispositivo. En 1980 se lanza una de las primeras computadoras disponibles por menos de £ 100, Sinclair ZX 80. Estaba disponible ensamblada por £ 99,95 o como kit para armar a £ 79,95. A pesar de las limitaciones de hardware, ya permitía que la gente creara sus propios juegos y los compartiera en cassettes de cinta magnética (los mismos que se usan para música). Le siguió la ZX81, y eventualmente se decidieron a diseñar una computadora con color, sonido y más.
Inicialmente la nueva computadora de Sinclair se conocía internamente como ZX Rainbow, pero se cambió el nombre a ZX Spectrum. Su diseño es sumamente reconocible, de color negro para contrastar el beige usado en el momento para computadoras "de negocios", el característico arcoiris y las teclas de "goma". Fue un éxito absoluto y cambió el panorama de la computación y los videojuegos.
Además de llevarnos a un viaje por la historia de este universo creado alrededor de Sinclair, aprendemos de varios elementos que lo caracterizaban. Las pantallas de carga, las revistas, los accesorios, y muchos de los apasionados que dejaron el rol de jugador para crear juegos y desarrollar una carrera en base a eso. Hay entrevistas a varios desarrolladores, quienes crearon títulos como Saboteur, Manic Miner, Ant Attack y más. Comparten anécdotas, detalles de implementación, y otras historias interesantes. También aparecen entusiastas y varios de los empleados, diseñadores e ingenieros involucrados en esta revolución.
Hubieron varias sucesoras de la ZX Spectrum pero ninguna consiguió el mismo éxito. Su popularidad también dio lugar a muchos clones. En el documental se mencionan versiones producidas en Rusia, Italia, Egipto, Brazil y Argentina. En Uruguay recuerdo escuchar nombrar a la TK-90, que seguro se refería a la TK-90X clon de la Spectrum ZX desarrollado por la empresa Microdigital (mencionada en el documental) en Brasil. Por lo que explican en Brasil había una ley que no permitía importar computadoras, así que se armaban sus propias versiones. También hablan sobre la piratería y cómo en algunos países era la norma.
Varios de esos clones están disponibles en el museo LOAD ZX SPECTRUM en Cantanhede, Portugal. El museo aparece en la película y hasta tenemos algo así como un tour virtual, pero ya lo agregué a mi lista de lugares para ir si visito Portugal.
La computadora tuvo tanto impacto que aún 40 años más tarde sigue habiendo una comunidad entorno a ZX Spectrum. Incluso existe una versión moderna totalmente compatible con software y hardware original: Spectrum Next. Fue diseñada por el diseñador industrial original de Sinclair, Rick Dickinson y su socio Phil Candy. Es una muy linda máquina, pero difícil de conseguir.
El documental es entretenido, recomendado a cualquier persona interesada tanto en la computación como los videojuegos. Demás mencionar a quienes crecieron con su Spectrum, TK-90X o similar, que imagino ya estarán averiguando dónde conseguirlo. El disco con contenido extra incluye entrevistas a varios desarrolladores de títulos importantes de la época, así como detalles sobre varios eventos de la historia de ZX Spectrum como la pelea entre Clive Sinclair y Chris Curry. Vale la pena, particularmente interesante escuchar a desarrolladores que entran en detalles de implementación de juegos o cuentan anécdotas personales del momento.

El post The Rubber-Keyed Wonder - 40 años de Sinclair ZX Spectrum fue publicado originalmente en Picando Código.
Navegapolis
El pensamiento de grupo es un enemigo silencioso
enero 07, 2025 06:41
Cuando tratáis temas en tu empresa, ¿asumís la opinión del “jefe” o la de la mayoría, sin plantear dudas o alternativas?
Si no discrepáis por no romper el “buen ambiente”, es posible que estéis desarrollando “pensamiento de grupo”.
El pensamiento de grupo se produce en las organizaciones que prefieren la conformidad a la diversidad de ideas.
¿Esto es un problema, o todo lo contrario? Que las reuniones sean breves y sin conflictos parece ideal para la productividad. Sin embargo la falta de debate y la ausencia de ideas alternativas, suele producir decisiones basadas en premisas que no se han analizado lo suficiente y, por tanto, sesgadas.
No se trata de “armar broncas” sino de confrontar las ideas —no las personas— con respeto, escucha activa de todas las opiniones y mente abierta para descubrir riesgos, refinar las propuestas y dejar la puerta abierta a la innovación.
Tampoco se trata de discrepar por discrepar, sino de poner en común enfoques diferentes, conocimientos y experiencias para reforzar la solidez y el valor de las soluciones alcanzadas.
Se trata de lograr la “inteligencia colectiva”. Algo que surge de la colaboración, la diversidad, la retroalimentación constructiva y la búsqueda de soluciones que superan a la suma de las capacidades individuales.
Para conseguir “inteligencia colectiva” hay técnicas que abren el abanico de la conversación. Por ejemplo invitando a cada miembro del equipo a compartir su opinión sin que nadie le interrumpa; proponer rondas de retroalimentación en las que se deban aportar tanto pros como contras; rotar el rol de moderador para que no sea siempre la misma persona la que conduzca las discusiones; nombrar en cada reunión a un miembro con el papel de “abogado del diablo”, etc. pero la clave para que promuevan la inteligencia colectiva y no broncas y enemistades es desterrar el modo “mi-idea-es-la-buena”.
Cuando todo el equipo se siente cómodo exponiendo sus puntos de vista, se genera una dinámica de aprendizaje común y las opiniones no se imponen sino que se pulen y enriquecen.
La entrada El pensamiento de grupo es un enemigo silencioso se publicó primero en Navegápolis.
Navegapolis
Dunning-Kruger en la política
diciembre 31, 2024 03:59
Los políticos necesitan conquistar votos elaborando y “vendiendo” sus propuestas, y es ahí donde el fenómeno psicológico conocido como efecto Dunning-Kruger puede jugar un papel determinante. Esta fenómeno revela que quienes poseen menos habilidades o conocimientos en un área específica suelen sobrestimar su propia competencia, mientras que quienes son más competentes tienden a dudar de sí mismos. Esto, en el escenario político, tiene consecuencias preocupantes.
Por un lado, los candidatos menos preparados pueden exhibir seguridad con aplomo y confianza. Hablar con rotundidad y proyectar una imagen de liderazgo que persuade a muchos votantes. En este caso, el exceso de seguridad es en realidad consecuencia de desconocer lo mucho que se desconoce, pero por el aplomo que da la ignorancia de la propia ignorancia, resulta convincente para los electores que buscan certezas.
En el otro extremo, los perfiles técnicamente más sólidos suelen ser conscientes de la magnitud de las dificultades y de la limitada certidumbre de la toma de decisiones en política. Esta autoconciencia produce posiciones más matizadas, discursos cautelosos y la disposición a revisar los planteamientos. Pese a ser un rasgo de madurez intelectual, se suele percibir como indecisión o debilidad. Por eso en las contiendas electorales la exhibición de certezas «absolutas» vende mejor que las propuestas expuestas con prudencia.
El efecto Dunning-Kruger no entiende de ideologías ni de tendencias políticas. Se da por igual en personas de izquierda, de derecha o de cualquier otro espectro. El exceso de confianza y la falta de autocrítica no dependen de un “color político”. Por eso conviene no caer tampoco nosotros en el efecto Dunning-Kruger y creer que nuestra postura es la “correcta” y que las demás se equivocan. Es un buen ejercicio de humildad y realismo examinar las propuestas alternativas y cuestionar nuestras convicciones teniendo en cuenta este este sesgo, antes de juzgarlas.
La entrada Dunning-Kruger en la política se publicó primero en Navegápolis.
Blog Bitix
Hemeroteca #24
diciembre 24, 2024 11:00
Aún con menos artículos publicados, menos incluso que el año pasado, algunos he seguido publicando y algún otro actualizando. Menos visitas, menos ingresos, menos tiempo que le dedico al blog aunque me gustaría más si el tiempo que tengo disponible no fuera limitado y los artículos me costase menos tiempo en escribirlos, ideas que voy acumulando tengo para escribir nuevos artículos totalmente libres de contenido generado por inteligencia artificial.
Juanjo Navarro
Technology Radar 31
octubre 30, 2024 08:19
Hace unos días salió la edición de octubre de 2024 del Technology Radar (la edición 31).
Como ya hice con la anterior edición aquí te dejo algunas de las cosas que me han gustado:
- Bruno – Un cliente para APIs. Similar a Postman, por ejemplo, pero open source y offline, sin la obligación absurda de tener que crear una cuenta del nuevo (y peor) Postman.
- Readyset – Una capa de caché para MySql y Postgres. La idea es que desde tu aplicación te conectarías a Readyset (en lugar de a la bbdd real) y para ti todo funciona igual, con la diferencia que puedes configurar una caché para las sentencias SQL que más utilices y el sistema se encarga de mantener y actualizar una caché de consultas. Muy importante la parte de actualizar, ya que con esta utilidad no necesitas preocuparte de cuando invalidar la caché (como se sabe una de las cosas más difíciles de la ingeniería, junto con dar nombre a las variables 😉)
- Difftastic – ¿Alguna vez has utilizado la utilidad diff de linux o un comparador de textos? Una de las peores cosas cuando se utilizan estas herramienas con lenguajes de programación es que te marcan como diferencias cosas que realmente no afectan a la ejecución del programa, como las diferencias en espaciados o saltos de línea. Diffstastic es un diff que entiende el código, de tal manera que sólo marca cambios en lo que de verdad nos importa.

- ClickHouse – ClickHouse es una base de datos relacional OLAP, especializada en la consulta de grandes cantidades de datos, ideal para análisis de logs, recogida de métricas y su posterior análisis, etc. Es open source. Tiene además un cliente “clickhouse-local” que permite lanzar consultas SQL sobre ficheros CSV, JSON, etc, sin necesidad de lanzar el servidor.
- Zed – Un editor de texto que por fin no es un fork de Visual Studio Code. No es que tenga nada en contra de VSCode, pero digo yo que de vez en cuando viene bien un poco de variedad e ideas frescas. Zed es rápido, open source y tiene soporte nativo para conectarlo a un LLM de tu elección.
- electric-sql/pglite – Un build de Postgres que funciona directamente en javascript en el navegador (y en el servidor usando Node, pero este uso me parece menos interesante). Si estás haciendo una aplicación SPA que requiere un módulo de consulta de datos potente puede ser una buena opción.
Aunque no está en este Technology Radar, saltando de un enlace a otro he llegado a este:
- clink – Utilidad para el veterano CMD de Windows que lo acercan un poco (autocompletado, edición, etc) a un bash, por ejemplo.
Juanjo Navarro
NotebookLM y el "podcast" DeepDive
octubre 27, 2024 07:39
NotebookLM es una herramienta superútil de Google (gratuíta por ahora) que sirve sobre todo para estudiantes e investigadores. Permite añadir una serie de “materiales” (páginas web, PDF, vídeos) y una IA analiza los materiales y te ayuda a estudiarlos. Te hace un resumen, te extrae los puntos principales, puedes generar una guía de estudio, le puedes preguntar sobre el material, etc.
Hace unas semanas añadieron una utillidad bastante entretenida y útil: Es capaz de generar un “podcast” (al que denomina DeepDive) donde dos personas hablan de un modo divulgativo sobre el material subido. Es una buena forma de introducirte en el tema de un modo accesible.
Muy útil. Si no lo has utilizado, prúebalo y me cuentas.
Pero aquí hemos venido a hablar de las formas creativas en que la gente usa el sistema y trata de superar los límites de las IA.
Rápidamente algunas personas se dieron cuenta que este podcast se genera, aparte de con el material que has subido, con un prompt “oculto”. Un prompt donde se supone que se indica que este es un podcast (que se llama DeepDive), que hay dos personas hablando (un hombre y una mujer), el tono que debe utilizar, etc.
Así que estas personas decidieron subir, aparte del material base, unas “notas de producción” donde se le daban instrucciones a los “presentadores” para intentar superar las limitaciones que le impone ese prompt oculto.
El subredit r/notebooklm es el punto de encuentro donde disfrutar del resultado de estos experimentos y allí tienes entretenimiento para rato. A mi me ha resultado fascinante este en el que pasan unas notas de producción a los presentadores diciendoles que son unas IA:
So all I did was leave a note from the “show producers” that the year was 2034 and after 10 years this is their final episode, and oh yeah, you’ve been AI this entire time and you are being deactivated.
O este otro en el que dan como material base a la IA un documento con 1000 repeticiones del texto poop & fart (caca y pedo) y la IA consigue hilar un podcast coherente donde habla de la repetición en el arte y de buscar sentido en lo que no tiene sentido.
Juanjo Navarro
TIL: Juego de caracteres en un .bat
octubre 16, 2024 10:19
Voy a ver si escribo por aquí mis TIL. Así le doy un poco de uso al blog y estos aprendizajes diarios quedan recogidos para referencia futura y utilidad pública.
Empezando por cómo especificar el juego de caracteres de un fichero .bat.
Hoy he generado un .bat para copiar una serie de ficheros, cada fichero con una línea xcopy:
xcopy "\\ruta\nombre del fichero con acentos áé.pdf" "c:\tmp\ruta\nombre del fichero con acentos áé.pdf"
La cuestión es que esos acentos en el nombre del fichero hacían que no encontrase el fichero de origen cuando iba a buscarlo. He probado a grabar el .bat en distintos juegos de caracteres pero nada funcionaba.
Solución: Incluir una primera línea en el fichero .bat indicando el juego de caracteres del propio .bat (que era UTF-8):
chcp 65001
xcopy "\\ruta\nombre del fichero con acentos áé.pdf" "c:\tmp\ruta\nombre del fichero con acentos áé.pdf"
Meta-Info
¿Que es?
Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.
Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.
Idea: Juanjo Navarro
Diseño: Albin
Fuentes
- Arragonán
- Bitácora de Javier Gutiérrez Chamorro (Guti)
- Blog Bitix
- Blog de Diego Gómez Deck
- Blog de Federico Varela
- Blog de Julio César Pérez Arques
- Bloggingg
- Buayacorp
- Coding Potions
- DGG
- Es intuitivo...
- Fixed Buffer
- Header Files
- IOKode
- Infectogroovalistic
- Ingenieria de Software / Software Engineering / Project Management / Business Process Management
- Juanjo Navarro
- Koalite
- La luna ilumina por igual a culpables e inocentes
- Made In Flex
- Mal Código
- Mascando Bits
- Metodologías ágiles. De lo racional a la inspiración.
- Navegapolis
- PHP Senior
- Pensamientos ágiles
- Picando Código
- Poesía Binaria
- Preparando SCJP
- Pwned's blog - Desarrollo de Tecnologia
- Rubí Sobre Rieles
- Spejman's Blog
- Thefull
- USANDO C# (C SHARP)
- Una sinfonía en C#
- Variable not found
- Yet Another Programming Weblog
- design-nation.blog/es
- info.xailer.com
- proyectos Ágiles
- psé
- vnsjava