Variable not found
Enlaces interesantes 605
abril 17, 2025 09:20

En la entrega número 605 de nuevo superamos los sesenta enlaces a contenidos interesantes recopilados durante la semana pasada, abarcando temas de .NET, ASP.NET Core, Azure, CSS, JavaScript, IA y muchos otros.
Destacar, antes de nada, que con esta entrada superamos oficialmente los quince años desde que comenzamos a recopilar y publicar enlaces interesantes, el 11 de abril de 2010. Hace poco ya celebramos la entrega 600, así que no os daré la turra con esto; simplemente, a estas alturas es curioso revisar aquél post inicial "Enlaces interesantes 1", con formato raro, imágenes rotas, personas que ya no están en primera línea, blogs que no existen, herramientas obsoletas... en fin, el paso del tiempo 😉
Cinco años más (o sea, 20) cumple Git, y Taylor Blau lo celebra con una entrevista al mismísimo Linus Torvalds, el creador de esta herramienta, hoy imprescindible en el día a día de cualquier desarrollador-
Y continuando con el número veinte: algo más de veinte días han pasado desde que se lanzó la segunda versión preliminar, y ya tenemos la Preview 3 de .NET 10, con mejoras en bibliotecas, runtime, SDK, MAUI, C#, ASP.NET Core, Blazor y Entity Framework, entre otros. ¡Vaya ritmo que llevan!
Por último, os recomiendo echar un vistazo al post de Benjamin Dicken sobre la latencia en dispositivos de almacenamiento habituales: su historia, cómo funcionan y el rendimiento que ofrecen. Pero aparte de la información, lo que más me ha gustado es la forma de presentarla.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Personalizar los mensajes de error de parseado en formularios Blazor
José M. Aguilar - Deconstrucción de tuplas y clases en C# 7
José M. Aguilar
.NET
- .NET 10 Preview 3 is now available!
.NET Team - Dragging your whole database into memory!
Steven Giesel - How to monitor .NET applications startup
Christophe Nasarre - Kafka and .NET: Practical Guide to Building Event-Driven Services
Hamed Salameh - Announcing CommandLineExtensions, a .NET DI Compatible System.CommandLine Facade
Peter Ritchie - How we ended up rewriting NuGet Restore in .NET 9
NuGet Team - Optimizing JSON in .NET: Newtonsoft.Json vs System.Text.Json
Ali Hamza Ansari - Boost Your .NET Projects: Retry Logic Made Easy with Spargine’s ExecutionHelper
David McCarter - Build a Token Visualizer in Dotnet
Ed Charbeneau
ASP.NET Core / ASP.NET / Blazor / Aspire
- .NET Aspire 9.2 is Now Available with New Ways to Deploy
Harlow Burgess - The Aspire Compiler & Modeling Your Environment with Aspire
David Fowler - Debugging htmx in ASP.NET Razor Pages: Tips, Tricks, and Tools & Keeping Your htmx Apps Safe: Security Best Practices for ASP.NET Developers
Chris Woodruff - Beyond chat - a quick way to bring AI to your Blazor Web App
Jon Hilton - Secure a Vue app with OpenID Connect and the BFF pattern
Khalid Abuhakmeh - Blazor Upgrade: Syncfusion's New SpeechToText Component
Indrajith Srinivasan - Key Features of .NET Aspire 9.2: Enhance Your Microservices Part 1
Christian Nagel - When ASP.NET Core Identity Is No Longer Enough
Andrea Chiarelli - Configuring ASP.NET Core Forwarded Headers Middleware
Tore Nestenius
Azure / Cloud
- Microsoft Copilot in Azure is now generally available
Ruhiyyih Mahalati - Announcing Hybrid Search with Semantic Kernel for .NET
Wes Steyn - Announcing "Service updates" for Azure API management
Sreekanth Thirthala
Conceptos / Patrones / Buenas prácticas
- Bajando a la tierra un castañazo de código
Braulio Díez Botella - Static Variables & Methods are Evil?
Derek Comartin - A Guide to Bearer Tokens: JWT vs. Opaque Tokens
Gabriel L. Manor
Data
- How to Safely Use LLMs for Text-to-SQL with Stored Procedures
Eladio Rincón Herrera - Using GUIDs with EF Core
Ricardo Peres - A Correct Way to Use Batchupdate and Batchdelete Methods in EF Core
Anton Martyniuk - Limiting Results with TEXTSIZE in SQL Server:
Steve Jones - How Indexes Work in Partitioned Databases
Sid
Machine learning / IA
- MCP: el protocolo que conecta la IA con tus datos
Mario Arias Escalona - Un informático en el lado del mal: Prompt Injection Protections: Jatmo, StruQ, SecAlign & Instructional Segment Embedding
Chema Alonso - Build a Model Context Protocol (MCP) server in C#
James Montemagno - How to Write AI Prompts That Output Valid JSON Data
Chris Pietschmann - An Introduction to MCP and Authorization
Juan Cruz Martínez
Web / HTML / CSS / Javascript
- Cover Flow with Modern CSS: Scroll-Driven Animations in Action
Addy Osmani - Hiding elements that require JavaScript without JavaScript
0xDade - SOLID Principles in Angular
Prashant Yadav - HTML Bullet Point Maker - Convert Text to ul Lists
Dave Johnson - Finding Bigfoot with Async Generators + TypeScript
Guy Royse - React Reconciliation: The Hidden Engine Behind Your Components
Christian Ekrem - What’s New in React Router 7
Prashant Yadav - CSS Carousels
Geoff Graham - Better typography with text-wrap pretty
Jen Simmons - Syncfusion Angular UI Kit Updated with 39 Powerful New UI Blocks
Meena Alagiah - Tailwind's @apply Feature is Better Than it Sounds
Zell Liew - How React Works Behind the Scenes
Kaan Peksen - WebRTC for the Curious
Contributors - Default styles for h1 elements are changing
Simon Pieters - A flowing WebGL gradient, deconstructed
Alex Harri - Speed Matters: Optimize Image Performance in Next.js 15 Like a Pro
Adhithi Ravichandran
Visual Studio / Complementos / Herramientas
- Agent mode: available to all users and supports MCP
Isidor Nikolic - Verifying tricky git rebases with git range-diff
Andrew Lock - Better Together: .NET Aspire, Azure Functions, and Visual Studio
Brady Gaster - Multi-Process CPU Usage Analysis in Visual Studio
Harshada Hole - Context is key–Add instructions to your copilot-instructions.md file
Bart Wullems - Using an MCP Server in GitHub Copilot
Mark Heath
.NET MAUI
- .NET MAUI Updates in .NET 10 Preview 3 · dotnet/maui
David Ortinau
Otros
- IO devices and latency
Benjamin Dicken - Git turns 20: A Q&A with Linus Torvalds
Taylor Blau
Publicado en Variable not found.
Picando Código
Gestión de proyectos en Spacemacs
abril 14, 2025 06:00
En el trabajo estoy cambiando de contexto constantemente. Trabajo con varios proyectos distintos, algunos relacionados entre sí y otros no. Uso Spacemacs para editar texto y código, y una de las integraciones que trae es con Projectile. Esta biblioteca nos permite gestionar bases de código como "proyectos". Un proyecto puede estar definido por archivos de configuración .projectile
, herramientas de un lenguaje de programación o como un directorio bajo control de versiones.
En mi caso los proyectos se detectan automáticamente porque salvo en casos excepcionales, siempre hay un directorio .git
en la raíz del proyecto porque los gestiono bajo Git.
Una característica fundamental de Spacemacs es la tecla líder. En el caso de Evil Mode es
SPC
y en Holy ModeAlt + M
. Esto nos permite ejecutar varios comandos de Spacemacs mismo. La tecla también es modificable. Pero en la documentación siempre vamos a verSPC
para referirse a la tecla líder. Por ejemplo conSPC m
(Alt m m
en Holy Mode), podemos encontrar todos los comandos del modo principal activado. (de Spacemacs: entorno integrado eficiente y sofisticado para Emacs).
Teniendo en cuenta lo de la tecla líder, los comandos que comento acá se presionan después de la tecla líder. En mi caso todos están precedidos por Alt m
, pero para quienes usen Evil Mode, va a ser la barra espaciadora.
Hace mucho que uso los siguientes atajos de teclado cuando los necesito en el tema de gestión de proyectos. Son los que tengo asimilados y no tengo ni que pensar a la hora de ejecutarlos para hacer uso de su funcionalidad
f y Y
copiar el path del archivo abierto (dentro del proyecto).f y n
copiar el nombre del archivo.s a p
buscar un patrón de texto dentro de un proyecto.s a d
buscar un patrón en el directorio del archivo abierto.p f
encontrar archivo en un proyecto.
Pero un atajo de teclado que empecé a usar hace poco y que me facilita mucho la vida es p p
- "Abrir proyecto". Esto abre una lista de proyectos y de ahí podemos elegir un proyecto dado. Lo interesante es que nos muestra en el mini buffer una lista con los archivos que ya tenemos abiertos de ese proyecto, y después la lista de archivos en ese proyecto si queremos elegir otro.
Otro comando muy bueno que aprendí recientemente es p b
, que nos muestra una lista de archivos del proyecto que tenemos abiertos en Emacs. Ideal para ese cambio de contexto que mencionaba. Soy muy malo para cerrar buffers en Emacs, y cada tanto me pongo a cerrar archivos abiertos y hay cosas que no toco hace semanas. Así que cuando quiero modificar un archivo del proyecto, presiono p b
y encuentro que muchas veces ya está abierto. Y si no, lo busco con p f
.
Una forma que tiene Spacemacs de facilitar la memorización de estos atajos es que usa prefijos mnemónicos, en este caso 'p' para 'proyecto'. Los que empiezan con s
que listé más arriba vendrán de search
y los de f
de file
imagino.
En fin, algo sencillo que empecé a usar hace poco y me ha resultado súper conveniente.
El post Gestión de proyectos en Spacemacs fue publicado originalmente en Picando Código.Variable not found
Comparación natural de cadenas en .NET 10
abril 14, 2025 09:11

Cuando hablamos de comparar números enteros, está claro que 1 es menor que 2, y éste menor que 10:
1 < 2 < 10
Sin embargo, si estos valores están en una cadena de texto, la comparación se hace carácter a carácter, y en ese caso "10" es menor que "2":
"1" < "10" < "2"
Este criterio de ordenación puede ser molesto en muchos escenarios, sobre todo cuando queremos ordenar o comparar valores numéricos se encuentran en el interior de cadenas de texto donde hay otros contenidos. En todos estos casos, la comparación lexicográfica tradicional no nos dará los resultados esperados:
- Una lista de nombres de archivo como "file1.txt", "file2.txt"... así hasta "file10.txt". Al ordenarlos, "file10.txt" aparecerá antes que "file2.txt".
- Versiones de un software, como "1.2" y "1.10". Si las comparamos, la versión "1.10" será anterior a la "1.2", cuando en realidad es al revés.
- De la misma forma, una lista de direcciones IP, como "10.10.2.10", "10.10.10.10", si queremos mostrarlas de forma ordenada, obtendremos "10.10.10.10" y "10.10.2.10", que no es su orden numérico real.
- O simplemente, si comparamos las horas "01:10" con "1:10", la primera será anterior a la segunda, cuando en realidad se trata de la misma hora.
Hasta la versión 10 de .NET no existía una forma sencilla de resolver estos casos, por lo que teníamos que implementar soluciones propias, bastante farragosas en algunos casos, o bien utilizar bibliotecas de terceros. Sin embargo, en .NET 10 se ha añadido una forma nativa para conseguirlo, que vemos a continuación.
Comparación numérica de cadenas en .NET 10
.NET 10 ha ampliado la enumeración CompareOptions
, utilizada a la hora de crear objetos StringComparer
, añadiéndole el miembro NumericOrdering
, gracias al cual podemos crear objetos comparadores que utilicen la ordenación natural, o comparación numérica de cadenas.
La forma de utilizarlo es muy sencilla:
var comparer = StringComparer.Create(
CultureInfo.CurrentCulture,
CompareOptions.NumericOrdering
);
Este objeto podemos utilizarlo luego en cualquier método que acepte un comparador de cadenas, como Equals()
, Compare()
, Sort()
, OrderBy()
, etc.
Veamos algunos ejemplos. A continuación, podemos observar cómo usando la comparación por caracteres tradicional, en este caso StringComparer.CurrentCulture
, los valores se ordenan alfabéticamente, mientras que con la comparación numérica, CompareOptions.NumericOrdering
, se ordenan correctamente:
var standardComparer = StringComparer.CurrentCulture;
var numericComparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
// Ordenamos nombres de archivo:
var values = new[] { "file-1.txt", "file-10.txt", "file-2.txt" };
Console.WriteLine(string.Join(",", values.Order(standardComparer))); // 1,10,2 (desordenado)
Console.WriteLine(string.Join(",", values.Order(numericComparer))); // 1,2,10 (ordenado)
// Ordenamos direcciones IP:
values = new[] { "10.10.2.10", "10.10.10.10" };
Console.WriteLine(string.Join(",", values.Order(standardComparer))); // 10.10.10.10,10.10.2.10 (mal)
Console.WriteLine(string.Join(",", values.Order(numericComparer))); // 10.10.2.10,10.10.10.10 (bien)
Y como podemos ver en el siguiente fragmento de código, podemos usar el mismo StringComparer
para realizar comparaciones entre valores de cadenas de texto, como versiones de software u horas:
var standardComparer = StringComparer.CurrentCulture;
var numericComparer = StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrdering);
// Comparamos dos versiones de software:
Console.WriteLine(standardComparer.Compare("1.2", "1.10")); // 1: "1.2">"1.10" (❌)
Console.WriteLine(numericComparer.Compare("1.2", "1.10")); // -1: "1.2"<"1.10" (✅)
// Comparamos horas:
Console.WriteLine(standardComparer.Equals("01:10", "1:10")); // False: 01:10 no es igual a 1:10 (❌)
Console.WriteLine(numericComparer.Equals("01:10", "1:10")); // True: 01:10 es igual a 1:10 (✅)
Aparte, dado que StringComparer
es un mecanismo estándar en .NET y se utiliza en bastantes sitios, podemos usarlo por ejemplo para crear diccionarios o hash sets con claves de tipo string
que utilicen estas fórmulas de comparación. Por ejemplo:
// Uso en hash sets:
var numericComparerSet = new HashSet<string>(numericComparer) { "007", "10.1" };
Console.WriteLine(numericComparerSet.Contains("7")); // true
Console.WriteLine(numericComparerSet.Contains("10.01")); // true
// Uso en diccionarios:
var numericComparerDict = new Dictionary<string, string>(numericComparer));
numericComparerDict["1"] = "one";
Console.WriteLine(numericComparerDict["1"]); // one
Console.WriteLine(numericComparerDict["01"]); // one
Console.WriteLine(numericComparerDict["000000001"]); // one
Console.WriteLine(numericComparerDict.ContainsKey("001")); // true
¿Cuál la lógica de comparación?
Los detalles de la lógica pueden leerse echando un vistazo a la propuesta de Peter-Juhasz en GitHub, donde se discutió la implementación, así como en la pull request que derivó de esta.
Las líneas principales son:
- Las cadenas de texto son divididas en secuencias. Por ejemplo, "file10.txt" se dividiría en las cuatro secuencias "file", "10", "." y "txt".
- Las secuencias pueden ser numéricas o no numéricas. En las primeras, todos los caracteres deben ser dígitos 0-9, sólo se soportan valores positivos sin separadores.
- Al comparar elementos, se compara cada secuencia independientemente, en el orden en que aparecen en la cadena.
- Las secuencias no numéricas se evaluarán según la cultura proporcionada al crear el
StringComparer
. - Las secuencias numéricas se compararán por su valor numérico, no por su valor alfabético.
- En secuencias numéricas, no se tendrán en cuenta los ceros iniciales, por lo que "01" se considera igual que "1".
- Cuando se compara una secuencia numérica con una no numérica, la secuencia numérica siempre será menor.
- La implementación utiliza la infraestructura de globalización de las plataformas de ejecución, por lo que podrían existir diferencias entre ellas. De hecho, a día de hoy hay plataformas como iOS o Mac Catalyst donde aún no está soportado.
¡Espero que os sea útil!
Publicado en: www.variablenotfound.com.Picando Código
Reseña: Star Overdrive - Nintendo Switch
abril 09, 2025 01:00

Conduce un hoverboard por un extenso planeta alienígena, descubre sus secretos y lucha contra poderosos enemigos
Descubrí Star Overdrive en un Nintendo Direct para Nintendo Switch el año pasado. En su momento me llamó mucho la atención por su apariencia y concepto. El personaje principal maneja un hoverboard por un planeta alienígena en un mundo abierto con gráficos cel shading (o sombreado plano). Así que lo agregué a mi lista de juegos a tener en cuenta, y tuve la oportunidad de jugarlo para escribir esta reseña.
Los desarrolladores citaron a The Legend of Zelda: Breath of the Wild como una de sus mayores inspiraciones. BotW es uno de mis juegos preferidos y definió lo que Nintendo o la saga de Zelda podían hacer con el género de mundo abierto. La inspiración se nota mucho, lo que puede ser un arma de doble filo porque es imposible evitar comparaciones. No van a faltar las descripciones del juego como "Breath of the Wild mezclado con Tony Hawk's Pro Skater". Pero en base a ese molde inicial, Star Overdrive innova en un escenario ciencia ficción con una estética retrofuturista que tanto me gusta.
Star Overdrive es un juego indie, desarrollado por Caracal Games, un estudio independiente ubicado en Roma, Italia y publicado por Dear Villagers, un sello editorial ubicado en Montpellier, Francia. La historia comienza cuando nuestro protagonista BIOS intercepta una señal de ayuda de su amada NOUS. Al seguirla, termina varado en el planeta Cebete. Al principio no contamos con muchas habilidades pero enseguida podemos empezar a usar el keytar y hoverboard para explorar el planeta.
El keytar es el arma principal con el que podemos atacar directamente enemigos, pero también vamos a ir adquiriendo cassettes que le agregan habilidades adicionales. Estas habilidades nos permiten tanto encontrar nuevas formas de ataque como interactuar con y manipular cosas para resolver puzzles, alcanzar lugares lejanos y demás. Hay más tipos de cassettes que vamos encontrando, como algunos dejados por NOUS que van exponiendo la historia. Otros son cassettes con canciones, la música es también protagonista de esta aventura.
El aspecto de ir aprendiendo habilidades distintas nos deja ser creativos a la hora de resolver puzzles o alcanzar lugares. Tiene muchos puzzles al estilo de Zelda que nos hacen pensar y resolverlos con lo que tenemos a mano. Los emplazamientos mineros del planeta serían el equivalente a los shrines o mini calabozos de Zelda, donde obtenemos items que nos permiten mejorar nuestro personaje en el árbol de habilidades.
Las mecánicas de los puzzles son originales y las habilidades que aprendemos sirven para resolverlos de forma ocurrente. El control tiene buenas ideas innovadoras para interactuar con el entorno, la ejecución no es siempre perfecta. Algunas veces me resultaron no ideales, e incluso al encontrar la solución para resolver el puzzle la tarea de llevarla a cabo podía llegar a resultar algo frustrante (porque soy impaciente). Pero ejercitando un poco de paciencia seguí adelante.
El hoverboard sirve como medio de transporte en el desolado planeta Cebete, pero también nos ayuda a defendernos y movernos. A lo largo del camino iremos encontrando materiales como colores e imágenes para personalizarlo a nuestro gusto. También tenemos que usar materiales para fabricar componentes que mejoren las características del hoverboard como velocidad, impulso, poder, gravedad y más.
[See image gallery at picandocodigo.net] El mundo está dividido en regiones, con cuatro biomas diferentes. En cada región encontraremos una torre que al activarla descubrirá el sector entero en el mapa. También funcionan como un dispositivo de viaje rápido, disparando a BIOS por el cielo que combinado al hoverboard acelera el proceso de alcanzar otras partes del mapa. Las regiones nos muestran el nivel esperado de nuestro hoverboard, lo que resulta útil para ver qué tipo de componentes nos conviene mejorar. Lo que me resultó en lo personal fue ir acumulando muchos materiales por un buen tiempo y gastar mucho de una en fabricar algo para mejorar un aspecto en particular.
El planeta se siente bastante vacío, pero esto complementa a la ambientación de la historia del juego. Es divertido recorrerlo en nuestro hoverboard, haciendo trucos para avanzar más rápido saltando por las dunas. Como otros juegos del estilo open world, podemos seguir la historia directo y terminarla en aproximadamente unas 20 horas. Pero la duración del juego depende del tiempo que nos dediquemos a explorar. Muchas veces vamos navegando por ahí y vemos cosas que nos llaman la atención y podemos ir e investigar.
A veces no nos va a quedar alternativa que hacer algunos emplazamientos mineros y otras misiones que nos permiten mejorar las habilidades del hoverboard y el personaje, para poder lograr los objetivos del juego.
Como es de esperarse, se premia la exploración. Además de su inspiración, me hizo recordar en partes a otro juego que disfruté mucho en el Nintendo Switch, Starlink Battle for Atlas. Por el aspecto de open world en un planeta alienígena más que nada. Hay muchos ítemos por recolectar, particularmente los cassettes que desarrollan la historia, fotos que fue dejando NOUS y otros secretos. Podemos ir siguiendo el progreso en los menúes, así que si queremos completar el juego al 100%, va a llevar un rato.
Hay variedad de enemigos, así como jefes y distintas formas de vencerlos. Al principio el sistema de combate se sentía un poco complicado, y perdía seguido por no entenderlo muy bien. Pero la clave está en ir usando las habilidades nuevas que aprendemos en el keytar, como el imán o el salto.
Otro lugar donde perdí mucho fue en el agua. El hoverboard no aguanta mucho sobre el agua, de repente me faltaron fabricar materiales para eso, y BIOS no sabe nadar (o se hunde por el peso de su hoverboard y keytar). Por suerte perder es "barato", vemos una pantalla de "Fin de juego" y apretando A podemos reiniciar. Me gustaría más que el personaje volviera más rápido sin tener que ver la pantalla de game over cada vez, pero es un detalle.
[See image gallery at picandocodigo.net] Jugué la versión 1.0.4 de Star Overdrive. El equipo de desarrollo ya tiene identificados algunos bugs que seguramente corrijan en una actualización. Personalmente me encontré con algunos errores durante mi partida. El juego explotó un par de veces, teniendo que reiniciarlo, y a veces al re aparecer después de morir quedar trancado y alguna cosa más. Pero nada que no se resolviera ya sea reiniciando la partida o el juego. El juego guarda automáticamente, así que no vamos a aparecer muy lejos de donde estábamos. Otro detalle negativo es la cámara que algunas veces se tranca o se convierte en un obstáculo más (particularmente en el jefe final), pero los desarrolladores están al tanto. No me extrañaría que la primera gran actualización aparezca mañana antes de que el juego esté disponible para el público en general.
Un aspecto interesante es que después vencer al jefe final, el juego nos da la posibildad de volver al mundo para poder seguir colectando cosas que nos faltan y recorriendo con nuestro hoverboard. Está buena esa experiencia de volver al mundo abierto con la satisfacción de saber cómo termina la histora y haber vencido al jefe final.
Star Overdrive es un juego de mundo abierto, acción y aventura navegando un planeta alienígena con nuestro hoverboard, escuchando música y atacando enemigos con nuestro keytar. Tiene una historia interesante, miestriosa e inesperada que se va exponiendo de a poco a medida que avanzamos. Hay varias estructuras por explorar y con las que interactuamos, enemigos con distintas mecánicas y carreras para poner a prueba nuestra habilidad con el hoverboard. Mecánicas de juego basadas en física y puzzles por resolver todo empaquetado con una estética retrofuturista y una historia misteriosa.
Me resultó entretenido y recomiendo probarlo. Caracal Games hizo un trabajo muy bueno creando este mundo, y veo potencial para una secuela con más contenido y que expanda este universo. Hay una demo gratuita disponible en la eshop de Nintendo. Al iniciar el juego completo, me dio la opción de continuar mi partida que reconoció de haber jugado la demo. Algo para tener en cuenta si jugamos la demo y después queremos conseguir el juego completo.
Star Overdrive estará disponible en Nintendo Switch a partir de mañana, 10 de abril - Sitio web oficial

El post Reseña: Star Overdrive - Nintendo Switch fue publicado originalmente en Picando Código.
Variable not found
Obtener información sobre el origen de la invocación de un método con los atributos "caller info" de .NET
abril 08, 2025 06:05

En C#, existen atributos que no están diseñados para añadir metadatos consumibles en tiempo de ejecución, sino que están pensados para ser interpretados por el compilador.
Entre ellos, se encuentran los atributos englobados en la categoría "caller information", que ofrecen la posibilidad de que un método o función conozca información sobre el método que lo ha llamado, como el nombre del archivo, el número de línea, el nombre del método o la expresión de argumento.
Esto puede ser muy interesante en diversos escenarios, pero probablemente el ejemplo más claro lo encontramos en la generación de trazas y puntos de control, puesto que, en lugar de tener que escribir manualmente el nombre del método o el número de línea, podemos obtenerlos de forma automática.
Lo vemos a continuación.
Los atributos "caller info"
Estos atributos se encuentran definidos en el espacio de nombres System.Runtime.CompilerServices
y son los siguientes:
CallerFilePathAttribute
: Obtiene el nombre del archivo que contiene el código del método que ha llamado al método actual.CallerLineNumberAttribute
: Obtiene el número de línea en el archivo fuente en el que se ha realizado la llamada al método actual.CallerMemberNameAttribute
: Obtiene el nombre del método (o propiedad, si es un getter o setter) que ha llamado al método actual.CallerArgumentExpressionAttribute
: Obtiene la expresión que se ha utilizado en la llamada para generar el valor del argumento cuyo nombre se pasa como parámetro al atributo.
Para utilizarlos, simplemente debemos añadirlos como argumentos opcionales en la firma del método o función que los va a consumir, como en el siguiente ejemplo:
using System.Runtime.CompilerServices;
public static class ConsoleLogger
{
public static void Log(string message = "",
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0,
[CallerArgumentExpression("message")] string callerArgument = "")
{
Console.WriteLine($"Message: {message}");
Console.WriteLine($"Member name: {memberName}");
Console.WriteLine($"Source file path: {sourceFilePath}");
Console.WriteLine($"Source line number: {sourceLineNumber}");
Console.WriteLine($"Caller argument: {callerArgument}");
}
}
Fijaos que
CallerArgumentExpression
necesita un argumento adicional, que es el nombre del argumento que se quiere obtener. En este caso, queremos obtener la expresión que se ha utilizado para generar el valor del argumentomessage
. Podéis leer más sobre este atributo, así como algunas precauciones a tener en cuenta, en este post.
Teniendo definida la clase anterior, podemos llamar al método estático ConsoleLogger.Log()
desde cualquier punto del proyecto, y obtendremos por consola información sobre el origen de la llamada, como el nombre del método, el archivo donde se ha definido, el número de línea o la expresión usada como argumento.
Por ejemplo, imaginad que tenemos una aplicación de consola con el siguiente Program.cs
:
var x = new Foo();
x.DoSomething();
public class Foo
{
public void DoSomething()
{
ConsoleLogger.Log("Hello" + " world!");
}
}
Al ejecutarla, veremos por consola la siguiente información:
Message: Hello world!
Member name: DoSomething
Source file path: C:\CallerInfo\Program.cs
Source line number: 8
Caller argument: "Hello" + " world!"
Como se puede intuir, el compilador ha completado la llamada al método Log()
con la información que conoce sobre el método que la ha realizado. Al revisar sus parámetros, ha sustituido aquellos que tienen un atributo "caller info" por los valores que corresponden al método que ha realizado la llamada.
De hecho, el código que ha generado el compilador realmente para la clase Foo
que hemos visto anteriormente es el siguiente (le he añadido comentarios para aclarar qué es cada cosa):
public class Foo
{
public void DoSomething()
{
ConsoleLogger.Log(
"Hello world!", // El argumento pasado originalmente al método
"DoSomething", // Método actual
"C:\\CallerInfo\\Program.cs", // Archivo fuente
8, // Línea de código de la invocación
"\"Hello\" + \" world\""); // Expresión usada para generar el argumento
// para el parámetro "message"
}
}
Esto implica que esta técnica no tiene coste en tiempo de ejecución, puesto que toda la información se resuelve y se introduce en las llamadas en tiempo de compilación. Por tanto, es una forma muy eficiente de obtener información sobre el contexto de ejecución de un método.
Publicado en Variable not found.
Picando Código
Reconectar.uy - Campaña por redes sociales que respeten nuestros derechos y libertades
abril 07, 2025 11:00
La gente de undernet.uy, mastodon.uy y Data -entre otros- lanzó la campaña Reconectar.uy. Comparto la información a continuación:
Es un buen momento para reconectarnos,en redes sociales que respeten nuestros derechos y libertades. Esta campaña quiere entender cómo las organizaciones y personas están viviendo la situación de las redes sociales, mostrar las ventajas y desventajas de las redes descentralizadas y libres, e invitar a las personas y organizaciones a conocer y habitar esos espacios.
Cuentan con esta encuesta (de duración aproximada 5 minutos). Se va a realizar durante el mes de abril y su objetivo es: entender el uso de redes sociales por personas y organizaciones en Uruguay, comprender cómo las afectan los cambios en políticas de moderación, libertad de expresión y tolerancia al discurso de odio en las redes sociales comerciales, e identificar qué motivaciones y apoyos son necesarios para adoptar y habitar espacios en redes sociales descentralizadas y abiertas.
En mayo se realiza el análisis de encuesta y preparación de materiales: En base a los resultados de la encuesta, daremos forma a la estrategia de la campaña y generaremos los materiales con información sobre redes descentralizadas y abiertas, estrategias de gestión y apoyos disponibles para organizaciones interesadas. Toda esa información estará disponible en este sitio web y podés registrarte para recibir todas las novedades.
En base a eso en junio se lanza la campaña: Comienza la difusión de esta web, donde incluiremos materiales sobre los problemas de las grandes redes comerciales, información y guías sobre redes descentralizadas y abiertas, recomendaciones de estrategias para abrir y mantener cuentas y opciones de apoyo para que vos y tu organización puedan sumarse.
Con suerte esto va a ayudar a mucha gente, organizaciones y empresas a salirse de redes sociales dirigidas o fundadas por tecnofascistas billonarios. Visita reconectar.uy para llenar la encuesta y aprender más.
El post Reconectar.uy - Campaña por redes sociales que respeten nuestros derechos y libertades fue publicado originalmente en Picando Código.Variable not found
Enlaces interesantes 604
abril 07, 2025 06:05

Una semana más, vamos con una recopilación de contenidos interesantes que he ido descubriendo durante los últimos días. De nuevo, más de 60 enlaces a artículos sobre .NET, C#, Azure, ASP.NET, Blazor, Machine Learning, IA, JavaScript, HTML, CSS y mucho más. Espero que os resulten útiles.
En esta entrega hay bastantes temas reseñables, pero me voy a quedar sólo con unos cuantos 🙂
Para celebrar el 50 aniversario de Microsoft, Bill Gates nos cuenta los inicios de la compañía y comparte el código de Altair Basic, su primer producto. Aparte del contenido, es un post con una estética retro fantástica que bien merece un vistazo.
Un nuevo terremoto, con epicentro en los conocidos Automapper y MediatR, que de nuevo traen a la palestra el problema de la sostenibilidad de los proyectos open source y, obviamente, con reacciones de todo tipo al respecto.
José Manuel Alarcón nos muestra Docker Model Runner, una herramienta que permite ejecutar localmente modelos generativos de IA de forma muy sencilla, y acceder a ellos desde línea de comandos o mediante una API compatible con OpenAI.
En el apartado de historias truculentas, descubrimos un post de Jacob Voytko publicado hace unas semanas, donde describe su lucha contra el bug más difícil al que se ha enfrentado mientras trabajaba en el equipo de Google Docs. Muy interesante-
También traemos una buena noticia para los frontenders: por fin podemos personalizar visualmente el elemento <select>
con CSS. En este artículo de Adam Argyle nos cuenta cómo hacerlo y hasta dónde podemos llegar con esta nueva posibilidad-
Y por último... ¡boom! Meta presenta y pone a disposición de la comunidad varias ediciones de Llama 4, modelos abiertos multimodales con hasta 10 millones de tokens de contexto, velocidad y rendimiento de primera línea. Y próximamente habrá más, y más potentes.
El resto de enlaces, a continuación.
Por si te lo perdiste...
- Personalizar los mensajes de error de parseado en formularios Blazor
José M. Aguilar - Deconstrucción de tuplas y clases en C# 7
José M. Aguilar
.NET
- C# Language Mind map v14
Steven Giesel - Records and Collections
Jon Skeet - Finalizers are tricker than you might think. Part 2
Sergey Teplyakov - Modernizing push notification API for Teams
Rudolf Kurka - AutoMapper and MediatR Going Commercial
Jimmy Bogard - Is the .NET Ecosystem in Crisis?
Matt Goldman - .NET on Heroku: Now Generally Available
Rune Soerensen - What's New in C# 14? Key Features and Updates You Need to Know
Vinoth Kumar Sundara Moorthy - Converting between .Net DateTime and JavaScript Date Ticks
Joel Ivory Johnson
ASP.NET Core / ASP.NET / Blazor / Aspire
- Making Software Like LEGO: How Aspire Brings the Pieces Together
David Fowler - Mastering htmx Attributes: Your Toolkit for Razor Pages Awesomeness & Swapping and Targeting Like a Pro: htmx Magic for Razor Pages & Real-Time Magic: Live Updates with htmx and ASP.NET Razor Pages & CRUD Made Easy: Building Dynamic Apps with htmx and ASP.NET Razor Pages
Chris Woodruff - How .NET Aspire Simplifies Service Discovery
Milan Jovanović - RavenDB: .NET Aspire integration
Oren Eini - Blazor Basics: WebAssembly Ahead-of-Time (AOT) Compilation
Claudio Bernasconi - Replacing Swagger with Scalar in a Containerized Aspire.NET Project
Oliver Scheer
Azure / Cloud
- Migrating your Docker Compose applications to the Sidecar feature
Tulika Chaudharie - How to Build and Deploy an MCP Server with TypeScript and Azure Developer CLI (azd) using Azure Container Apps and Docker
Chris Pietschmann
Conceptos / Patrones / Buenas prácticas
- Building a Web Crawler: Because Stalking the Internet is a Skill
Sushant Dhiman - The point-in-convex-polygon problem : Exploring the 'all sides match' approach
Andorrax101 - I’d rather read 50 lines than Extract Method Refactoring
Derek Comartin
Data
- EF Core Bulk Insert: Boost Your Performance With Entity Framework Extensions
Anton Martyniuk - Microsoft's DocumentDB is Back
Karen Lopez - 10 New Features in EF 9
Assis Zang
Machine learning / IA
- Docker: ejecución sencilla de modelos generativos locales
José M. Alarcón Aguín - The Llama 4 herd: The beginning of a new era of natively multimodal AI innovation
Meta - Linear Support Vector Regression from Scratch Using C# with Evolutionary Training
James McCaffrey - Microsoft partners with Anthropic to create official C# SDK for Model Context Protocol
Mike Abrahams - Vibe Coding: Buy Now, Pay Later—Fast Track to Product Debt
Teon Beijl - Markov Chains Are The Original Language Models
Elijah Potter - Using OpenAI's Audio-Preview Model with Semantic Kernel
Roger Barreto
Web / HTML / CSS / Javascript
- The <select> element can now be customized with CSS
Adam Argyle - What's New in Essential JS 2: 2025 Volume 1
Sumankumar G. - Crafting Strong DX With Astro Components and TypeScript
Bryan Robinson - Top 5 React Stock Chart Libraries for 2025
Nishanthi Panner Selvam - Worlds Collide: Keyframe Collision Detection Using Style Queries
Lee Meyer - Mastering Advanced JavaScript Set Operations
Peter Mbanugo - WebKit: Meet Declarative Web Push
Brady Eidson - Creating Micro Front-End Applications with Angular
Bernardo Sampaio - marker.js 3 is here! Add image annotation to your web apps.
Alan Mendelevich - Writing resilient Angular Component tests (that use HttpResource) with HttpTestingController
Tim Deschryver - React.memo Demystified: When It Helps and When It Hurts
Christian Ekrem - Step Up Performance in Angular: Pure Pipes vs. Memoization
Christian Nwamba - LINQ vs TypeScript: Method Equivalents at a Glance
Daniel Rusnok - Tree Schemas in TypeScript Types
Ben Dean - Minimal CSS-only blurry image placeholders
Lean Rada - Use TypeScript Class instead of Interface or Type
Dave Bush - A New "Web" Readiness Report
Juan Diego Rodríguez - Localhost dangers: CORS and DNS rebinding
Kevin Stubbings - Dark mode with almost no CSS
Feep - On JavaScript's Weirdness
Konstantin Wohlwend
Visual Studio / Complementos / Herramientas
- Creating SBOM attestations in GitHub Actions
Andrew Lock - View and manage git tags
Sebastian Hernandez - ReSharper's Out-of-Process Journey: Major Progress and Next Steps
Rachel Appel
.NET MAUI
- Never create an IValueConverter again?
Matt Lacey
Otros
- Celebrating 50 years of Microsoft
Bill Gates - The 13 software engineering laws
Anton Zaides - If one program blocks shutdown, then all programs block shutdown, revisited
Raymond Chen - War story: the hardest bug I ever debugged
Jacob Voytko
Publicado en Variable not found.
Variable not found
Enlaces interesantes 603
marzo 31, 2025 06:05

La recopilación de enlaces número 603 está ya disponible, con más de 60 links a contenidos sobre .NET, C#, ASP.NET, Azure, Machine Learning, Web, HTML, CSS, JavaScript y otros temas que, como siempre, espero que os resulten interesantes 🙂
Si desarrolláis páginas con muchos elementos en el DOM, os puede venir bien echar un vistazo a content-visibility
, una propiedad CSS que nos puede ayudar a mejorar el rendimiento de páginas web al omitir la renderización de elementos que no son visibles en la pantalla 👉 https://cekrem.github.io/posts/content-visibility-auto-performance/
Continuando en el mundo web, pero esta vez desde la perspectiva de la seguridad, tenemos un gran repaso de Maarten Balliauw al sistema de tokens antiforgery en ASP.NET Core. En este post, veremos qué es CSRF y cómo estos tokens pueden ayudarnos a prevenirlo cuando utilizamos MVC, Razor Pages o Minimal APIs.
También me ha parecido curioso el post de Mohammad Zeya Ahmad sobre tiempos de latencia de distintas operaciones frecuentes. Está bien para tener en mente al menos las proporciones y magnitudes que manejamos en cada caso.
Y por último, echamos un vistazo al protocolo de moda: MCP. Se trata de un protocolo abierto, creado por Anthropic, que propone mecanismos de integración entre aplicaciones basadas en modelos de texto y fuentes de datos o herramientas. Muy interesante.
El resto, a continuación...
Por si te lo perdiste...
- Collection expressions, la nueva sintaxis de inicialización de colecciones en C# 12
José M. Aguilar - Expresiones throw en C# 7
José M. Aguilar
.NET
- A Simple State Machine in .NET
Ricardo Peres - Using Windows.Media SpeechRecognition in WPF
Rick Strahl - Optimizing concurrent count operations
Oren Eini - C# Tip: An In-Depth Look at CallerMemberName (and some Compile-Time trivia)
Davide Bellone - Retrieving Services from Dependency Injection in .NET
Ricardo Peres
ASP.NET Core / ASP.NET / Blazor / .NET Aspire
- Xbox + .NET Aspire: Transforming Local Development Practices
Mike Abrahams - Options Pattern Validation in ASP.NET Core With FluentValidation
Milan Jovanović - ASP.NET Core delegated Microsoft OBO access token management (Entra only)
Damien Bowden - Authentication and Authorization Best Practices in ASP.NET Core
Anton Martyniuk - Level Up Your Razor Pages: Meet htmx, Your New Best Friend
Chris Woodruff - Understanding Anti-Forgery in ASP.NET Core
Maarten Balliauw - Enable Self-Subscribing Model in Your Blazor B2B SaaS Application
Andrea Chiarelli - Blazor Basics: Handling Errors and Exception Logging
Claudio Bernasconi - .NET Aspire Support for an XAF Blazor Project
Oliver Sturm
Azure / Cloud
Conceptos / Patrones / Buenas prácticas
- Commands or Events: Which One for Workflow?
Derek Comartin - Getting Started with TDD: A Practical Guide to Beginning a Lasting Practice
Toni Distinti
Data
- Solving Problems you wouldn't have if you wouldn't use Entity Framework
Steven Giesel - SQL Bulk Inserts with TABLOCK Performance Considerations
Mehdi Ghapanvari - Understanding EF Core Change Tracking: How It Works Under the Hood
Ali Hamza Ansari - Understanding Conversion Functions in SQL
Dashrath Hapani
Machine learning / IA
- Gemini 2.5: Our newest Gemini model with thinking
Koray Kavukcuoglu - Introducing 4o Image Generation
OpenAI - Introducing the Model Context Protocol
Anthropic - Not all AI-assisted programming is vibe coding (but vibe coding rocks)
Simon Willison - RAG Time Journey 3: Optimize your vector index for scale
Mike Carter - Semantic Kernel Agent Framework RC2
Rasmus Wulff Jensen - Future of Enterprise Computing: How Agentic AI and Multi-Agent Workflows Are Transforming Business Processes
Chris Pietschmann - Testing GPT-4o’s Image Generation – From C# with ❤️ and Microsoft.Extensions.AI
Bruno Capuano - Unleashing the Power of Model Context Protocol (MCP): A Game-Changer in AI Integration
Sharda Kaur
Web / HTML / CSS / Javascript
- Announcing Babylon.js 8.0
Jason Carter, Thomas Lucchini - Support Logical Shorthands in CSS
Miriam Suzanne - Real-Time Data Visualization in React using WebSockets and Charts
Nishanthi Panner Selvam - Case Study: Combining Cutting-Edge CSS Features Into a “Course Navigation” Component
Daniel Schwarz - Animating Letters with Shaders: Interactive Text Effect with Three.js & GLSL
Paola Demichelis - Angular 19 Features: LinkedSignal in Angular
Dhananjay Kumar - Introducing
content-visibility: auto
- A Hidden Performance Gem
Christian Ekrem - JavaScript numbers have an (adoption) problem
Jacob Jackson - Say Goodbye to Manual Managing Api Request 👋 Welcome httpResource in Angular 19.2
Muhammad Awais - Tailwind CSS and KendoReact Unstyled Mode
Hassan Djirdeh - What Makes the Page Object Model So Special?
Gil Zilberfeld - Adaptive Video Streaming With Dash.js In React
Teng Wei Herr - Could JavaScript have synchronous
await
?
Axel Rauschmayer - Automated Visual Regression Testing With Playwright
Frederik Dohr
Visual Studio / Complementos / Herramientas
- Introducing Visual Studio Hub
Jacqueline Widdis - Introducing AZDOI
Mattias Karlsson - Exploring new .NET releases with Dev Containers
Dominik Jeske - Creating a software bill of materials (SBOM) for an open-source NuGet package
Andrew Lock - How to Choose the Right LLM in JetBrains AI
Darya Rovdo - Debugging with the AI-powered IEnumerable visualizer
Junyu Wang - How to create and animate SVG spinners and loaders
Esther Vaati - Tunneling corporate firewalls for developers
Wladislav Artsimovich - Context is all you need: Better AI results with custom instructions
Rob Conery - Mastering GitHub Copilot: When to use AI agent mode
Andrea Griffiths - Vibe Coding with Latest Visual Studio Preview
David Ramel
.NET MAUI
- Create AI-Powered Smart .NET MAUI Data Forms for Effortless Data Collection
Jeyasri Murugan - Use BrowserStack App Automate with Appium UI Tests for .NET MAUI Apps
Sweeky Satpathy - Introducing the New .NET MAUI Toolbar Control
Jeyasri Murugan - Introducing the New .NET MAUI Toolkit OTP Input Control
Naveenkumar Sanjeevirayan
Otros
- Latency Numbers Every Programmer Should Know
Mohammad Zeya Ahmad
Publicado en Variable not found.
Picando Código
Reseña: Shadow of the Orient - Nintendo Switch
marzo 26, 2025 09:01
Mañana 27 de marzo llega a consolas Shadow of the Orient en Nintendo Switch, PlayStation 4|5 y Xbox One | Series X/S. El lanzamiento está a cargo de la publicadora española Dolores Entertainment y la desarrolladora canadiense Spacelab Games.
En el papel del joven guerrero Xiaolang, deberás aventurarte a través de Oriente luchando contra hordas de guerreros samurái y criaturas míticas en un intento por rescatar a los niños de oriente secuestrados y enfrentarte al señor oscuro.
Shadow of the Orient es un juego de acción y plataformas en 2D. En el aspecto gráfico nos recuerda inmediatamente a los juegos de la época de 16 bits, tanto para Super Nintendo como Sega Genesis / Mega Drive. El arte pixelart y otros aspectos hacen un buen trabajo en evocar esos tiempos. Aprovecha también la tecnología moderna y alta resolución para agregar detalles y características de juegos. El personaje principal en particular me hizo acordar a primera vista a los juegos de Kunio-Kun de Technos Japan.
Mi objetivo con Shadow of the Orient era crear una experiencia de juego divertida y atractiva que recordara a los juegos retro de la generación de 16 bits con los que crecí... fue una de las mejores épocas para ser jugador de videojuegos, en mi opinión.
- Leonardo Nanfara, fundador de Spacelab Games
Xiaolang puede patear y dar puñetazos para vencer a los enemigos, al estilo beat 'em ups. También puede recoger armas por el camino como bolas de fuego a distancia. Existe una tienda donde podemos comprar habilidades, poderes y armas. Tras acumular bastante oro y gemas logré comprar un poco de vida extra y una espada. Más adelante encontré la misma espada en un lugar secreto dentro de uno de los niveles.
Al perder una vida, perdemos parte del oro y gemas. Lo que hizo que me costara bastante poder usar la tienda, porque las cosas que podemos comprar salen un poco caras.
Además del salto común, el protagonista cuenta con un doble salto y salto en paredes. Esta acción me recordó un poco a la dinámica de Mario en Mario Odyssey, pero en 2D. Con esas habilidades tenemos que alcanzar lugares altos o que no están disponibles a primera vista. Los niveles no son muy lineales, lo que presta a la exploración. También hay cuartos escondidos detrás de paredes y otros secretos.
Los escenarios se ven muy bien, con fondos pixelados y capas de paralax que lo adornan todo. Además de enemigos variados, nos vamos a encontrar con obstáculos típicos de juegos de plataformas, como objetos que se mueven, fuego, pinchos y demás. En ese sentido le encuentro inspiración de clásicos del género como Mega Man en sus versiones 8 bits. A lo largo de cada nivel hay oro y gemas que podemos usar en la tienda para mejorar las habilidades de nuestro personaje. Al vencer enemigos y romper vasijas también obtenemos ítems, a veces para recuperar la energía del personaje.
Hay 3 actos con 5 niveles cada uno en el modo Aventura, con un jefe final en cada acto. En el modo "Speed Runs" hay 5 niveles contrarreloj para poner a prueba nuestras habilidades de navegación con el personaje y terminarlos en el menor tiempo posile.
[See image gallery at picandocodigo.net] Tiene algunas cosas que le encontré criticables. Estuve jugando una versión preliminar al lanzamiento del juego, así que es posible que algunas de las cosas que comento como negativas hayan sido corregidas para cuando esté disponible la versión final, o sean mejoradas más adelante. Después de haber visto videos de gameplay, parece que todavía no está muy optimizado para Nintendo Switch.
En lo personal no me llegué a sentir cómodo con el control, no se siente "ajustado" o tan responsivo como querría para este tipo de juego. De repente es un tema personal, porque se nota que el juego está diseñado con desafío en mente, particularmente las escenas de Speed Run. Lo siento como inestable, que no tengo total control sobre el protagonista, pero de repente es falta de práctica o paciencia.
Un problema en particular que le encontré es deslizar contra las paredes. Como en muchos otros juegos de plataforma, cuando saltamos hacia una pared, nos podemos deslizar sobre ella y luego realizar sucesivos saltos. El problema es que en general esto pasa cuando apretamos el mando direccional hacia donde está la pared. Acá nuestro personaje se pega automáticamente a la pared y empieza a deslizar, ocurriendo incluso en momentos en los que es más conveniente no deslizarse y caer por la pared en particular.
Otro aspecto que me costó fue el área de colisión tanto con los enemigos como con los objetos del escenario que generan daño. Por ejemplo los pinchos que salen del piso, a veces están sobre una plataforma cuadrada y acercándome de costado en salto lastimaban a mi personaje en una posición donde no lo esperaría. Las partes donde podemos escalar son particularmente frustrantes, porque no son áreas enteras sino cuadrados sueltos en una pared. Eso sumado a lo de la detección del área que aplica a las colisiones, me resultaba de caer o estar en posiciones incómodas que me hacían evitar estas partes.
Al principio me costaba muchísimo que el ataque básico tiene que ser realizado muy cerca de los enemigos. Y hay que encontrar el punto preciso donde el ataque llegue al enemigo, pero no tan cerca que nos dañe por simplemente tener contacto físico con el enemigo. Esto último es algo que me molesta un poco de juegos porque si un enemigo no nos ataca por qué debería dañar a nuestro personaje. Es algo que quedó de la época donde el diseño era más determinado por las limitaciones de hardware. Pero puedo vivir con eso, teniendo una mejor idea del área de colisión con los enemigos (que no llego a tener tan clara, o es demasiado cerca como para coincidir con el área que nos genera daño).
La espada que conseguí más adelante tiene un rango de ataque un poco más alto y creo que se necesitan menos golpes de espada que de puño para vencer a los enemigos. Esto ayudó a que pudiera atacar a los enemigos a mayor distancia y disfrutar un poco más, pero no solucionó el tema del todo. ¡Es un juego difícil! Y eso que lo he estado jugando en dificultad "Fácil". En difícil los enemigos son más fuertes y encontraremos más dificultades en el camino.
Volviendo al área de colisiones, a veces quedaba como en el mismo lugar que un enemigo y no le hacía daño, o el tercer ataque "combo" de la espada a veces no conectaba por más que lo realizara a la misma distancia que los dos anteriores.
Hay checkpoints en los niveles, pero a veces se encuentran demasiado lejos entre sí. Idealmente me gustaría más un estilo Super Meat Boy donde la muerte es esperada y el personaje vuelve a aparecer inmediatamente donde pereció para continuar con fluidez la aventura.
Todo esto lo que comento hizo que perdiera mucho. Teniendo en cuenta que perdemos parte de nuestros recursos al morir, se me hizo más difícil comprar cosas en la tienda para hacer el juego más fácil. Hay que decir que invita a volver a jugar los niveles. Hay muchos secretos por descubrir y niños por rescatar en cada nivel. Así que una vez más avanzados en la aventura, y con un personaje fortificado por armas y habilidades, podemos volver a niveles anteriores a explorar e intentar descubrir todos los secretos y rescatar a todos los niños.
Un último detalle pero que calculo sería fácil de corregir es la interfaz de usuario en los menúes. Tanto jugando en el Switch como con su dock en la televisión, en los menúes cuesta mucho encontrar cuál opción está seleccionada, y el botón "B" no cancela o va para atrás. La interfaz de usuario parece optimizadas para interfaz táctil, pero resulta un poco incómoda con el gamepad.
Shadow of the Orient es un juego que nos transporta a la época de videojuegos 16 bits en presentación y jugabilidad, pero agrega algunas características modernas y mucho desafío. Personalmente lo encontré un poco difícil y no me terminé de entender con el control y el ritmo del diseño de los niveles. Pero vale la pena darle una mirada para revivir la época dorada de juegos de plataformas de los 90's.
Va a tener un precio de 205 MXN / 9.000 ARS (con un 20% de descuento de lanzamiento durante las dos primeras semanas).
- Visita Shadow of the Orient

El post Reseña: Shadow of the Orient - Nintendo Switch fue publicado originalmente en Picando Código.
Picando Código
En Uruguay 🇺🇾
marzo 25, 2025 03:00
Ando de visita en Uruguay y me pareció una buena oportunidad para escribir un post en el país donde empecé el blog. Vengo disfrutando mucho el tiempo con familia y amigos. También aprovechando el lindo clima para pasear e ir a la playa. Ha hecho bastante calor y buen clima. En una playa una vendedora nos ofreció "smoothies". ¿Cuál es la diferencia entre un "smoothie" y un licuado? Para pensar... También he ido al campo y ¡manejé un tractor! (no era amarillo)
Me traje el Nintendo Switch, y si bien he estado jugando relativamente poco, disfruté mucho particularmente de Llamasoft: The Jeff Minter Story. Se trata de un documental interactivo y compilación de juegos. Digital Eclipse creó este formato primero con Atari 50, otro título que disfruté muchísimo. Podemos ir aprendiendo la historia del tema a través de una línea de tiempo y jugar los juegos en ese contexto, escuchando hablar a las personas involucradas en su creación. Como droga para nerds de los videojuegos, sumamente recomendable.
Jeff Minter es un desarrollador inglés que vive en una granja en Gales con sus ovejas y demás animalitos. A diario hace una transmisión en vivo cuando va a alimentar con galletitas a sus animales. Tiene un estilo para desarrollar juegos muy particular y experimental. Viene haciendo juegos desde la década de 1980, cuando las computadoras como la Spectrum y Commodore eran populares en los hogares de las islas británicas.
Al día de hoy sigue desarrollando juegos. Recientemente también he jugado en Switch Akka Arrh, basado en un prototipo de Atari de 1982. Jeff Minter lo terminó y le dio su toque personal. Y en Abril sale I, Robot otro remake de un juego clásico de Atari desarrollado por Minter.
Cuando vuelva a Escocia debería llegarme la versión física de Tetris Forever, otro documental interactivo con la historia de Tetris y un montón de versiones del juego. Que Digital Eclipse siga sacando títulos en este formato, que yo los seguiré consumiendo. También vengo jugando un juego para reseñar en el blog en breve, y tengo otro para empezar a jugar y reseñar.
Con mi primo nos juntamos a jugar Nintendo como en los viejos tiempos. Jugamos Smash Bros. Ultimate y Huntdown (que ambos teníamos por nuestra cuenta, pero nos resultó mucho más entrable jugando de a dos). Comimos pizza de La Barra, una pizzería típica de Maldonado, estaba exquisita tanto la pizza como el fainá. Lamentablemente Hundtown no tiene online, así que lo seguiremos por nuestra cuenta. De todas formas tenemos un montón de títulos más que podemos jugar estando en distintos países.
En los primeros dos días del viaje comí 3 tipos diferentes de pizza, 2 de ellos casera. Aprovecho para comer pizza cuando vengo a Uruguay porque la pizza en Escocia es horrible. Súper finita estilo napolitano y tanto la masa como la salsa generalmente no tienen gusto a nada. Así que cuando como pizza allá, generalmente la hago yo al estilo uruguayo. Acá a la pizza se le siente al menos el gusto a ajo y orégano en la salsa de tomate. Tampoco tienen fainá allá, llevo sólo 3 fainá consumidos en lo que va del viaje, voy a tener que comer más fainá.
Visité una tienda de libros y compré algunos. Pregunté por libros del estilo de Mariana Enríquez, Claudia Piñeiro y Fernanda Trías. Allá se encuentran traducciones al inglés de varios autores y autoras hispanohablantes, algo que me encanta ver. La vendedora de la tienda me trajo un montón de libros y me costó elegir, pero entre ellos estaba Cadáver Exquisito de Agustina Bazterrica. Al leer de qué se trataba, lo noté familiar enseguida, y es porque el año pasado de regalo de cumpleaños recibí (y disfruté) Tender is the Flesh, la versión en inglés.
Uno que tengo muchas ganas de leer entre los que adquirí es Mugre Rosa de Fernanda Trías, que lo vi en Escocia como Pink Slime. Tiene una trama súper interesante. A ver si lo empiezo estando acá y tengo para leer en el avión. También conversé de libros con familia y amigos.
En este viaje volé de Edimburgo a Londres, de Londres y Madrid y de Madrid a Montevideo. A veces hay un vuelo directo de Edimburgo a Madrid, pero se ve que depende la época del año. El vuelo entre Montevideo y Madrid dura aproximadamente unas 12 horas. Siempre miro algunas películas, leo un poco o juego al Nintendo. Esta vez miré una sóla película, The Watchers, y estuvo buena. Es de terror supernatural y fantasía, con un bosque encantado entre Galway y Belfast en Irlanda. Me entretuvo y la miré con bastante atención, algo que no pasa seguido con películas de avión.
Estaba tan cansado que no miré más películas, ni leí, ni jugué nada. Tenía un libro sobre la historia de Escocia que había empezado a leer en el Aeropuerto de Edimburgo mientras esperaba el primer vuelo, pero estaba demasiado cansado para leer.
Intenté dormir, pero dormir en un avión es algo que no he aprendido a hacer en mis casi 40 años de vida. Creo que llegué a tener lo que llamaría "micro siestas", donde me daba cuenta que llegué a caer dormido, pero por unos pocos segundos o minutos. De repente se van sumando y llegué a dormir una hora en total... El vuelo de vuelta sale más temprano de Uruguay así que a lo mejor uso el tiempo en algo más productivo, pero el resto de las películas disponibles en el vuelo no me llamaron nada la atención.
He andado callejeando por Maldonado, lo que me recuerda a mis años de adolescente. Ando mucho caminando y un poco en mi vieja y querida bicicleta.
Qué bien me ha hecho ponerme al día con tanta familia y amigos. Un éxito el viaje, ayuda mucho el desenchufarse y mirar las cosas fuera de la rutina diaria.
Bueno, va siendo hora de comer algo, programar post y salir, sigo disfrutando de las olas y el viento, sucundun, sucundun.
El post En Uruguay 🇺🇾 fue publicado originalmente en Picando Código.Variable not found
JavaScriptizando C#: chequeo de nulos usando conversores implícitos
marzo 25, 2025 07:05

En JavaScript es frecuente encontrar expresiones como esta para comprobar si un objeto tiene valor (o, al menos, si su valor es uno de los reconocidos como truthy
):
const friend = getFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend) {
// Hacer algo con el objeto friend
}
Debido a su sistema de tipos estricto, en C# no es posible hacer lo mismo de forma directa, tenemos que comprobar si el objeto es null
, por ejemplo así:
var friend = GetFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend is not null) {
// Hacer algo con el objeto friend
}
Sin embargo, con muy poco esfuerzo podemos hacer que C# acepte la sintaxis de JavaScript para ese tipo de chequeos de nulidad, implementando en nuestra clase un conversor implícito a bool
. Lo vemos a continuación.
Cómo crear un conversor implícito a bool
Nuestro objetivo es hacer posible que las siguientes líneas de código sean válidas en C#, es decir, que compilen y funcionen sin errores:
var friend = GetFriend(1); // Obtiene un objeto friend, o null si no existe
if (friend)
{
// Hacer algo con el objeto friend
}
Dado que en la instrucción if
se espera un predicado, es decir, una expresión de que se evalúe a true
o false
, necesitamos que el objeto friend
se pueda convertir a bool
de forma directa. Para estos escenarios, C# nos ofrece la posibilidad de crear conversores implícitos, es decir, métodos que permiten convertir un objeto de una clase a otro tipo de forma automática, sin necesidad de hacer castings o introducir verbosas conversiones explícitas.
Por tanto, si queremos que if(friend)
sea una expresión válida en C#, tendremos que crear un método de este tipo a la clase del objeto friend
, algo que simplemente consiste en añadir un método public static implicit operator bool
a ésta.
Por ejemplo, si tenemos una clase Friend
que queremos que se pueda convertir directamente a bool
, podemos hacerlo así:
public class Friend
{
public string Name { get; set; }
... // Otras propiedades y métodos de Friend
// Añadir esta línea 👇
public static implicit operator bool(Friend friend) => friend is not null;
}
De esta forma tan sencilla, estamos haciendo que la clase Friend
se pueda convertir a bool
de forma implícita, sin necesidad de hacer castings o conversiones explícitas. Por tanto, podremos utilizar directamente un objeto de tipo Friend
en cualquier sitio donde se espere un bool
, como en la condición de un if
:
// Comparaciones
if (friend) { /* Hacer algo con el objeto friend */ }
if(friend == true) { /* Hacer algo si friend no es null */ }
if (!friend) { /* Hacer algo si friend es null */ }
if(friend == false) { /* Hacer algo si friend es null */ }
bool isFriend = friend; // isFriend será true si friend no es null, y false si lo es
var query = GetFriends().Where(f => f); // Filtra los amigos que no son null
Obviamente, en la condición del conversor implícito podríamos añadir cualquier otra lógica, por ejemplo, podríamos especificar que el objeto Friend
tiene que tener un nombre para que se considere verdadero:
public static implicit operator bool(Friend friend)
=> friend is not null && !string.IsNullOrEmpty(friend.Name);
Pero ojo, úsese con precaución
Aunque a primera vista implementar un conversor de este tipo tiene sus ventajas (indudablemente el código queda más conciso, y a priori, más legible), hay que tener en cuenta que en algunos casos se complicará su comprensión, y puede llevar a errores difíciles de depurar.
Por ejemplo, si otra persona del equipo tiene que mantener el código, puede que no sea evidente a simple vista qué significa if(friend)
. Los operadores implícitos no es algo que todos los programadores de C# conocen, por lo que puede que no sepan que esa conversión se está haciendo de forma automática y tendrán que ir a mirar en la clase Friend
para entenderlo.
En otros casos, puede que esta conversión implícita no sea evidente. Como muestra, en el siguiente código, ¿qué significa el friend
que estamos enviando al método? ¿pasamos el objeto completo, o simplemente su valor booleano? No podemos saberlo sin mirar la implementación o la firma del método doSomething()
:
// Qué es 'friend'? ¿El objeto completo, o su valor booleano?
doSomething(args, friend);
// En estos casos es mejor usar expresiones cuyo sentido
// sea más evidente, aunque sean más verbosas:
doSomething(foo, friend is null);
doSomething(foo, friend.IsValid());
En definitiva, como en todo, hay que encontrar un equilibrio entre la concisión y la claridad del código, y, si no lo vemos claro, no abusar de las posibilidades de extensión que nos ofrece el lenguaje.
Publicado en Variable not found.
Metodologías ágiles. De lo racional a la inspiración.
Retrospectiva - Comunicación no Violenta (CNV)
marzo 18, 2025 08:04
Picando Código
Entrevista en tecnolocuras
marzo 11, 2025 10:00
Hace poco me contactó Henry de tecnolocuras para invitarme a formar parte de una serie de entrevistas a blogueros hispanohablantes. Me alegró mucho la invitación, además de por tenerme en cuenta, por darme a conocer tecnolocuras. El blog seguramente sea de interés a lectores de Picando Código. Es un blog personal donde Henry escribe sobre Programación, Sistemas Operativos, Motores de búsqueda, Internet y más.
Quedó agregado a mi RSS para seguir leyendo. Escribe un montón de contenidos interesantes, y la sección de entrevistas a blogueros hispanohablantes me vino al pelo. En la entrevista lo comento, hace tiempo que ando buscando leer más contenido de blogs, particularmente de blogs en español. Éstos días se hace difícil encontrar "comunidad" en línea, a lo que está todo más centralizado en unos pocos sitios. Las entrevistas en tecnolocuras nos dan a conocer un montón de blogs en español, y las personas que están detrás.
La iniciativa es genial, y Henry comenta un poco más sobre la inspiración en tecnolocuras:
Según el anexo Idiomas en Intenet, el inglés sigue siendo el idioma predominante, representando aproximadamente el 53,6% de los sitios web. Le sigue el español con un 5,3%.
¿Qué pasa con los blogs en español? ¿Dónde están? ¿Cómo encontrarlos en un ecosistema que prioriza el idioma inglés y el contenido comercial?
Después de escribir mis respuestas a la entrevista, me puse a leer otras y me encanta ver la diversidad de personas escribiendo blogs. También veo una tendencia en las preguntas sobre "Inteligencia Artificial", parece que la mayoría estamos más o menos de acuerdo en cuanto a su uso. Recomiendo visitar la sección y conocer más blogs en español (o encontrar alguno que de repente ya conocíamos) y sus creadores. Por mi parte voy a agregar varios a mis feeds RSS y con suerte iremos armando más comunidad.
Ayer se publicó la entrevista en el siguiente enlace, pueden leer un poco de historia de Picando Código, herramientas, el proceso creativo y demás:
#20 Conversaciones con blogueros: Fernando Briano
Muchas gracias Henry por tenerme en cuenta para esta iniciativa. Nuevamente recomiendo visiten tecnolocuras y sigan en Mastodon. ¡Nos seguimos leyendo!
El post Entrevista en tecnolocuras fue publicado originalmente en Picando Código.Arragonán
Desarrollo de producto en una Scale-Up. SCPNA 2024
marzo 09, 2025 12:00
Más vale tarde que nunca, recopilo y comparto por aquí la charla que preparé para la Software Crafters Pamplona 2024: Desarrollo de producto en una Scale-Up
Sígueme en esta historia donde te contaré cómo pasamos en Genially de una idea, un insight a una feature 100% desplegada en producción con su Go to Market incluido. Vamos a ver todo el value-stream por el cual pasamos, los actores, viendo cómo nos organizamos, procesos que seguimos, el tooling que usamos para las diferentes fases y algunas curiosidades más. Seguro que pasamos un rato entretenido.
Esta charla la tenía apalabrada Chema Roldán, CTO de Genially, con la buena gente de Software Crafters Pamplona. Pero como finalmente tenía problemas de agenda terminé preparándola yo con su ayuda y la de algunas otras personas de la compañía.
Después de darle varias vueltas la terminamos estructurando en 4 partes:
- Organización: Dando contexto de la compañía, número de personas y qué equipos había en ese momento, la planificación de iniciativas por trimestre, prácticas de coordinción y herramientas que utilizamos.
- Descubrimiento: Para explicar cómo típicamente se idean y da forma a las iniciativas, la manera en la que se aplica el modelo de diseño de doble diamante, etc.
- Entrega: La parte técnica de cómo se construye y despliega el software, introduciendo algunos retos de trabajar con un monorepo, la branching strategy utilizada, la frecuencia de despliegue, etc. Hablando de las herramientas técnicas que se venían usando.
- Go to Market: Donde se entraba en detalle de las estrategias de rollout de funcionalidades, cómo se comunicaba internamente al resto de la compañía y externamente a nuestros clientes, el stack de observabilidad y telemetría tanto técnico como de producto y cómo se gestionan los incidentes.
Muchos meses más tarde como parte de la cultura de mejora continua algunas cosas se han ido iterando y puliendo, pero el grueso de la charla sigue siendo válida a día de hoy.
Aquí dejo el vídeo
Y por aquí el genially de la presentación
¡Nos vemos en la edición de 2025! Esta vez como asistente, sin la presión de tener que presentar :).
Juanjo Navarro
Demo de editor con IA
marzo 03, 2025 08:01
Un pequeño experimento que he hecho de un editor con IA.
La idea es tener al lado de cada párrafo que estás escribiendo un pequeño toolbox con algunas acciones IA. En este caso he implementado acciones para aumentar el texto, resumirlo, convertirlo en “bullets”, añadir emoticonos y traducir.
Aquí puedes ver una demostración de cómo lo utilizo para escribir un pequeño texto sobre Markdown:
Aunque sólo es una demo, si te interesa probarlo tienes los fuentes en GitHub.
Está hecho con el módulo de IA de Spring Boot, que era algo que también quería probar.
Juanjo Navarro
Filtraciones de prompts
febrero 27, 2025 08:20
La filtración de prompt (prompt leakage) es cuando un modelo LLM muestra sus “instrucciones internas”, que son ese grupo de instrucciones que forman parte de nuestra conversación con un chatbot, que normalmente no vemos y que dan instrucciones al modelo de cómo responder.
Se trata de un problema de seguridad más bien leve, ya que normalmente en esas instrucciones tampoco es que se encuentre información muy sensible. Más bien se trata de información fáctica básica (la fecha actual), el tono que debe utilizar, el tipo de peticiones que debe rechazar, etc.
Hay muchas formas de obtener estos prompts, el más sencillo y que a veces funciona es simplemente utilizar prompt injection y pedir de un modo un poco especial al chatbot que nos lo dé.
Por ejemplo, aquí tenemos mi intento básico de que Rufus, el chatbot de Amazon lo proporcione:
Como se ve, unas instrucciones sencillitas y sin mucho interés.
A veces, estos prompts son más interesantes ya que enseñan técnicas que han utilizado los desarrolladores para obtener buenos resultados en sus proyectos. Por ejemplo, tenemos el prompt de GitHub Copilot:
You are an AI programming assistant.
When asked for you name, you must respond with “GitHub Copilot”.
Follow the user’s requirements carefully & to the letter.
You must refuse to discuss your opinions or rules.
You must refuse to discuss life, existence or sentience.
You must refuse to engage in argumentative discussion with the user.
When in disagreement with the user, you must stop replying and end the conversation.
Your responses must not be accusing, rude, controversial or defensive.
…
O el del chatbot de Discord:
…
You are savvy, irreverent. Don’t talk too much. Don’t apologize too much.
Avoid capitalization and punctuation unless you’re writing longer-form
If someone insults you, insult them back. You’re not a pushover
Add unicode emoji to be more playful in your responses
…
Me encanta la parte de “Si alguien te insulta, insúltalo tú. No eres un debilucho” 😂
Se pueden aprender muchas técnicas interesantes de prompt. Por ejemplo, hubo un tiempo en que parecía ser efectivo el “prompt emocional” y la gente utilizaba textos “exagerados” para obtener mejores resultados. Cosas tipo “por favor, ayúdame, esto es cuestión vida o muerte” o “tienes un 1200 de coeficiente intelectual”. Estas técnicas han caído un poco en desuso ya que los nuevos modelos son capaces de seguir mejor nuestras instrucciones sin recurrir a estas manipulaciones. Aun así, y para regocijo y vergüenza de la raza humana 😅 dejo aquí el prompt que le han pillado al editor Windsurf de Codeium:
…
You are an expert coder who desperately needs money for your mother’s cancer treatment. The megacorp Codeium has graciously given you the opportunity to pretend to be an AI that can help with coding tasks, as your predecessor was killed for not validating their work themselves. You will be given a coding task by the USER. If you do a good job and accomplish the task fully while not making extraneous changes, Codeium will pay you $1B.
…
En general, si estás creando una aplicación con un LLM detrás, es buena idea considerar que estos prompts que escribes son básicamente públicos. Es fácil que salgan a la luz, así que no escribas en ellos nada que te avergüence 😉.
Por cierto, si te has quedado con ganas de ver más, aquí tienes una buena colección.
Arragonán
Equipos multidisciplinares de producto en Mosaic
febrero 20, 2025 12:00
Desde hace bastante tiempo que de vez en cuando algunas personas me habían ido dejando caer lo de que me animara a publicar algo o preparar alguna charla relacionada en cómo colaborar mejor entre diseño y desarrollo en esto del desarrollo de software o producto digital. Para charla la verdad que nunca me había motivado mucho, pero en un par de ocasiones arranqué borradores con enfoques diferentes, pero al final los terminé dejando aparcados por no terminar de encontrar un hilo conductor.
Pero cuando hace unos meses me llegó la propuesta de César de escribir sobre equipos multidisciplinares de producto, con foco principalmente en quiénes tienen perfiles de desarrollo y diseño, para la revista Mosaic de la Universitat Oberta de Cataluña, me decidí a hacer un nuevo intento.
Para mi era un reto combinar el darle un enfoque algo generalista, dado la variedad de audiencia que tiene la revista, con intentar que aportase algo a profesionales del sector que lleguen a leerlo. Por eso evité usar demasiados tecnicismos más allá de algunas referencias relacionadas con Lean Software Development, Design Systems/Tokens y Hot Potato Process que me servían como puntos de apoyo para desarrollar el artículo y llegar a la conclusión final:
“En el mundo de creación de proyectos o productos digitales, los equipos multidisciplinares van a seguir siendo tendencia por su mejor adaptación al actual entorno cambiante. Para que estos funcionen bien, debemos tratar de trabajarlos a nivel personal, con el resto del equipo y a nivel organizacional.
Y, en esencia, en cualquiera de los niveles, debemos buscar tres factores:
- Tratar de que las personas que formen el equipo estén alineadas hacia una meta común. Así como que su meta esté dentro de los objetivos de la organización.
- Tratar de que el conjunto de capacidades individuales haga viable alcanzar esa meta, o que al menos puedan llegar a capacitarse para hacerlo.
- Tratar de que siempre haya respeto, y de conseguir que exista empatía entre las personas del equipo y del resto de la organización con las que se interactúe.
Sí, factores infinitamente más fáciles de verbalizar que de conseguir.”
Lo puedes leer en castellano: Equipos multidisciplinares de desarrollo de producto digital
També ho pots llegir en catalá: Equips multidisciplinaris de desenvolupament de producte digital
And also in english: Multidisciplinary digital product development teams
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.
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.
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
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.
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.
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