Variable not found
Enlaces interesantes 560
marzo 18, 2024 07:28
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Constructores estáticos, inicializadores de módulos y startup hooks: tres formas de ejecutar código antes que Program.Main()
José María Aguilar - Inicialización de diccionarios en C# 6
José María Aguilar
.NET Core / .NET
- Measuring .NET Performance: Unleashing the Power of BenchmarkDotNet
Antão Almada - Fastest Way to Get the First N Characters of a String in C#
Januarius Njoku - Understanding System.Diagnostics DiagnosticSource and DiagnosticListener (Part 1)
Steve Gordon - How to Automatically Cast Between Types in C#
Nick Cosentino - Behind the implementation of .NET's PriorityQueue
Andrew Lock - C# 12: Primary Constructors
Thomas Claudius Huber - Mocking HttpClient requests for C# unit tests
Thomas Ardal - Get started with .NET 8 and AI using new quickstart tutorials
Jordan Matthiesen - Fastest Way to Generate a Random Boolean in C#
Matjaz Prtenjak - How to Use StringPool to Reduce String Allocations in C#
Osman Sokuoglu - Plugin Architecture in C# for Improved Software Design
Nick Cosentino - Why I Don't Use AutoMapper in .Net
Grant Riordan - LINQ Query Improvements in Marten 7
Jeremy D. Miller - Async Event Handlers in C#: What You Need to Know
Nick Cosentino - Comparing Performance of the switch and if-else Statements in C#
Michal Kaminski - Activator.CreateInstance vs Type.InvokeMember – A Clear Winner?
Nick Cosentino
ASP.NET Core / ASP.NET / Blazor
- .NET Aspire preview 4
David Pine - bUnit v2 - The Blazor unit testing library vNext
Steven Giesel - AspNetCore.Http.Abstractions is deprecated
Bart Wullems - Blazor Basics: Advanced Blazor Form Validation
Claudio Bernasconi
Azure / Cloud
- Generate Local .NET Secrets from Azure Deployments
Frank Boucher - Azure SQL Trigger Binding for Azure Functions goes GA
Brian Spendolini
Conceptos / Patrones / Buenas prácticas
- The Facade Design Pattern in C#: How to Simplify Complex Subsystems
Nick Cosentino - Boundaries are explicit
Mark Seemann - Falsehoods programmers believe about time zones
Zain Rizvi - Why reaching 100% Code Coverage must NOT be your testing goal (with examples in C#)
Davide Bellone - Events are an API. Treat them like one.
Derek Comartin
Data
- A primer on transaction management in Entity Framework
Dennis Frühauff - Essential Strategies and Practices for Entity Framework Core
Admir Mujkic - The How To Write SQL Server Queries Correctly Cheat Sheet: Cross Apply And Outer Apply
Erik Darling
Machine learning / IA / Bots
- How Much Does It Cost to Call OpenAI APIs?
Stephen Walther - Calling Custom Functions with ChatGPT
Stephen Walther
Web / HTML / CSS / Javascript
- Type Safety in TypeScript
Sachin Chaurasiya - 7 JavaScript Unit Test Frameworks Every Developer Should Know
Binara Prabhanga - HTMX and Web Components: a Perfect Match
Igor Roztropiński - How to tackle compatibility issues in ECMA Script modules (and in general)
Oskar Dudycz - Building A Real-Time App with React, Node and WebSockets
Thomas Findlay - How to use No-Class Frameworks to Move Fast in Style
Khalid Abuhakmeh - Centering an Image in CSS: A Detailed Guide
Alex Anie - CSS: will-change
Robin Rendle - 25 Unnoticeable Features of JavaScript
M. Mainul Hasan - Detect Caps Lock with JavaScript
David Walsh - Creating a Random Walk Simulation
Kirupa Chinnathambi - Vue 3 with TypeScript Jump-Start
Marina Mosti - Debouncing in Your Framework
Jonathan Gamble - ChartJs Visualization Library
DevGroves Technologies - React vs. Angular: Component Architecture
Christian Nwamba
Visual Studio / Complementos / Herramientas
- How HEAD works in git
Julia Evans - Introducing Visual Studio 17.10 – Preview 2 is Here!
Mark Downie - Unity extension for Visual Studio Code - Now Generally Available
Jb Evain - Refining Your Search: Introducing NuGet.org's Compatible Framework Filters
Advay Tandon - Generate Unit Tests Using AI Assistant
Andrii Rublov
.NET MAUI / Xamarin
- What’s New in .NET MAUI 9 Preview 2
Vijay Anand - Enhancing User Experience: Implementing Typos Tolerance in .NET MAUI Autocomplete
Selva Ganapathy Kathiresan - Sands of MAUI: Issue #136
Sam Basu - Introducing the 11th Set of New .NET MAUI Controls and Features
Gayathri Ramalingam
Otros
- Microsoft elimina el subsistema Android de Windows
CampusMVP - La historia del Primer Videojuego Español del que hay constancia
Manuel Llaca Carrera
Publicado en Variable not found.
proyectos Ágiles
El diamante de la autonomía – empoderamiento – ownership
marzo 13, 2024 05:00
Para que la autonomía de una persona o un equipo funcione, es necesario considerar varios aspectos:
- Tener un objetivo compartido, unas expectativas acordadas entre ambas partes, que sean factibles.
- Unas competencias que permitan que se dé esa autonomía, lo cual implica que el desarrollo de las personas en la organización (a nivel personal y profesional) sea algo clave. Y esto no se trata solamente de formación, es cuestión de dar oportunidades, acompañar, ofrecer feedback constructivo cuidando a la persona, etc.
- Unas restricciones o límites claros (tiempos, recursos, principios, directivas o valores [E.g. Esto aquí NO lo hacemos tratando mal a la gente]).
- La información necesaria para poder tomar buenas decisiones (a veces no se comparte lo suficiente y se acaba haciendo algo que no aporta lo suficiente). Tiene que estar fácilmente disponible, comunicada todas las veces que haga falta hasta que llegue y se entienda, suficientes conversaciones alrededor del tema con las personas relevantes e impactadas, …).
¿Cuántas veces hemos tenido problemas por no tener alguno de estos ámbitos suficientemente claros o trabajados?
Todo esto permite que la gente esté motivada y tenga más compromiso (es una consecuencia, no una exigencia), pasar del empoderamiento a las personas al “ownership” por parte de las personas, movilizar la inteligencia colectiva y que puedan avanzar con confianza si aparecen problemas, creando un círculo virtuoso de confianza mutua en la organización (y, al contrario, no hay que crear sistemas de trabajo que impliquen un castigo por el error).
Variable not found
Acceder al objeto HttpContext desde componentes Blazor
marzo 12, 2024 07:38
Los que llevamos muchos años programando con ASP.NET/ASP.NET Core y todos los frameworks que han ido surgiendo en su ecosistema, estamos familiarizados con el concepto de "contexto HTTP".
Materializado en forma de objeto de tipo HttpContext
, el contexto HTTP es una de las piezas fundamentales de la infraestructura de ASP.NET Core, y nos permite acceder a información sobre la petición HTTP que se está procesando, como los encabezados, el cuerpo de la petición, las cookies, etc., así como base para la generación de la propia respuesta a través de su propiedad Response
. En muchos escenarios, se trata de un recurso imprescindible para procesar la petición de la forma adecuada, por lo que estamos acostumbrados a usarlo cuando es conveniente.
Sin embargo, cuando saltamos a Blazor, pronto nos llama la atención que HttpContext
no está disponible. Y si lo pensamos, esto tiene bastante sentido en los dos modos de renderización clásicos:
-
En Blazor WebAssembly, dado que el código .NET se ejecuta directamente en el cliente, no existen peticiones que procesar y, por tanto, no existe
HttpContext
. Se trata de una abstracción que sólo existe en el backend. -
En Blazor Server, aunque el código se está ejecutando en el servidor, tampoco tenemos disponible
HttpContext
porque realmente no existen peticiones: el lado cliente y servidor se comunican mediante un canal websockets implementado con SignalR, que es por donde viajan ascendentemente las acciones realizadas por el usuario y descendentemente las actualizaciones del DOM de la página.
Con la llegada de Blazor 8, ha tomado relevancia el nuevo modo de renderizado, llamado Server-Side Rendering (SSR) o renderización en el lado servidor, que ya vimos por aquí hace algún tiempo.
Como ya sabemos, el funcionamiento de Blazor SSR es similar al de otros frameworks de backend puros, como MVC o Razor Pages: el servidor recibe la petición, la procesa y genera una respuesta HTML que se envía al cliente. En este escenario, durante el proceso del componente Blazor sí existe un contexto HTTP.
En estos casos, el framework introduce en la cascada de parámetros un objeto de tipo HttpContext
que podemos recuperar fácilmente desde cualquier componente usando el atributo [CascadingParameter]
sobre una propiedad pública de este tipo, por ejemplo así:
@code {
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
}
Simplemente con esto, ya podríamos usar el objeto HttpContext
para acceder a la información de la petición, o incluso modificar la respuesta. En el siguiente bloque de código podemos ver un ejemplo simple, donde mostramos el contenido del encabezado Host
de la petición y modificamos el código de estado de la respuesta:
@page "/Test"
Host: @HttpContext.Request.Host
@code
{
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
protected override void OnInitialized()
{
HttpContext.Response.StatusCode = 210;
}
}
Eso sí, tened en cuenta que, dado que HttpContext
es una abstracción sólo válida en el lado servidor, no podremos usarla en el proyecto cliente (<MiProyecto>.Client)
de la Blazor Web App, puesto que sus componentes se ejecutan en el navegador y allí no existe el contexto HTTP. De hecho, según indican en la documentación oficial, sólo deberíamos usarla en el componente raíz (normalmente App.razor
).
Si desde el lado cliente quisiéramos acceder a datos presentes en el contexto, como encabezados, cookies HttpOnly
o similares, tendríamos que buscar la forma de obtener esos valores desde el servidor y hacerlos llegar al lado cliente. Publicaré un post futuro donde podamos ver un ejemplo de esto.
Publicado en Variable not found.
Picando Código
Programando Tetris con DragonRuby
marzo 11, 2024 04:30
En octubre de 2016 me dispuse a aprender a programar videojuegos con Ruby usando la biblioteca Gosu. Siempre me gustó el juego Tetris y me pareció un buen ejemplo como primer proyecto. Es relativamente simple como para llegar al punto de declararlo “terminado” sin sentirme abrumado. En el proceso, podía aprender lo suficiente de las herramientas como para tener una idea mínima para arrancar algo nuevo.
Todavía tengo el código que escribí en ese momento. No es buen código, pero dado que lo escribí para experimentar y aprender, no lo juzgo tanto. Conseguí recursos gráficos libres de internet, y en menos de 200 líneas de código logré esto:
No es gran cosa, pero en su momento me voló un poco la cabeza poder mover piezas con un gamepad y ver que el código que había escrito se traducía en cosas tan gráficas. Acostumbrado a tanta programación backend y web, esto era novedoso. Si bien había experimentado con PyGame y otras cosas antes de esto, me animaba la idea de programar con un lenguaje que me gusta y conozco tanto como Ruby. De todas formas, el experimento no pasó mas de eso.
Mi historia con el desarrollo de videojuegos siguió de forma bastante infrecuente. Recientemente hice un par de cursos con Godot, que me parece una herramienta genial para desarrollar videojuegos, y poca cosa más. Pero siempre mantuve el tema en la cabeza y hasta empecé un cuaderno donde voy anotando ideas de cosas que se me ocurren para desarrollar en juegos.
En algún momento de mi carrera me enteré de la existencia de DragonRuby, otra biblioteca para desarrollar videojuegos con Ruby. Amir Rajan, el fundador y uno de los desarrolladores de DragonRuby, publicó un juego hecho con DR en Nintendo Switch. El hecho de que pudiera usar Ruby y éste último dato me motivaron para conseguir una licencia. Teniendo las herramientas, era cuestión de tiempo que me pusiera a aprender a usarlo y empezara a desarrollar mis juegos, ¿no? Bueno, sí, pero demoré un rato.
DragonRuby no es gratuito, pero tiene un precio bastante accesible y se vende a precio de descuento muy frecuentemente (algunas veces se consigue gratis por alguna promoción o game jam). Encima de eso, hay muchos factores que permiten obtener una licencia gratuita: ser menor de 18 años, estudiante de cualquier tipo, quieres enseñar a alguien a programar, y más. O simplemente se puede escribir un correo electrónico a Amir explicando por qué quieres una licencia gratis y te la va a otorgar.
Amir tiene la costumbre de usar una frase “now build a game dammit” (algo así como “ahora crea un juego maldición”). Cada vez que leía esta frase, ya fuera en el Discord del proyecto o en Mastodon, me sentía un poco mal… Un día que tuve libre en el trabajo recientemente decidí poner en uso esa licencia de DragonRuby que había obtenido hace tiempo, y hacer un juego. Había visto que Ryan C. Gordon (@icculus) – desarrollador de SDL, portador de muchos juegos a Linux, entre otras cosas- tenía un tutorial para desarrollar Tetris con DragonRuby. Así que ese dichoso día me fijé el objetivo de seguir el tutorial, y lo conseguí. Ya tenía los recursos gráficos de mi primer intento con Gosu, era hora de darle vida a una versión más de Tetris.
Programar con DragonRuby fue sumamente divertido. Me hizo acordar por qué me resultaba tan divertida la programación, algo que no me pasaba desde hace bastante tiempo. Por primera vez en muchos años, volví a quedarme despierto hasta tarde programando. No tengo la más mínima idea de programación de videojuegos. No conozco los patrones, o las buenas prácticas y tenía básicamente cero experiencia. Se me ocurre algo que quiero que pase en el juego, y tengo que pensar de cero cómo se podría implementar en el contexto del framework. Esto me forzó a pensar en soluciones totalmente nuevas para mí, expandir mi creatividad y salir de mi zona de confort. Esa sensación de descubrimiento y resolución de problemas me resultó casi como una droga!
DragonRuby tiene unos principios fundamentales atados a GTK:
- El juego corre en una función principal
- que se ejecuta 60 veces por segundo
- y tiene que decirle a la computadora qué dibujar cada vez
El “Hola Mundo” de DragonRuby se ve así:
def tick args
args.outputs.labels << [580, 400, '¡Hola mundo!']
end
Esa función se va a ejecutar 60 veces por segundo (¡60fps!), así que hay que programar todo en relación a eso y ese paradigma es totalmente distinto a lo que acostumbro a programar. La lógica del juego, los menúes, interacciones y demás, van todo por esos 60 ticks por segundo. Una vez que esto hace clic en la cabeza, se empieza a pensar en relación a eso y ya las ideas van mutando a formas de implementarlas en base al tick.
Empecé a usar mi cuaderno donde anotaba ideas (y apuntes de cosas que aprendía) para desarrollo de videojuegos como agenda. Inicialmente le agregué algunas cosas simples al juego base del tutorial:
- Niveles - Cada 10 líneas se sube de nivel, lo que acelera un poco la caída de las piezas.
- Apariencia - El tutorial nos enseña cómo dibujar sólidos en la pantalla, que los cambié por sprites que conseguí en OpenGameArt, así como el fondo y otros detalles más. La animación inicial de los bloques del título en base a funciones matemáticas me divirtió mucho!
Prácticamente todos los días desde que empecé el proyecto dediqué aunque sea unos minutos después del trabajo o antes de acostarme para agregarle al código. Fui agregando varias cosas más: Pantalla de inicio con menú de opciones, efectos al hacer dobles, triples o tetris, pausar el juego, créditos, ayuda, pantalla completa opcional, y más ajustes. Corregí unos errores de colisión, aunque hay un bug todavía al momento de rotar piezas que necesito arreglar.
Para la música, usé el editor de música de GB Studio, un entorno de desarrollo de videojuegos para Game Boy. La breve melodía que se escucha al iniciar el juego es el resultado de aprender a usar la herramienta con ensayo y error en unos minutos, metiendo las notas a mano de oído hasta tener algo relativamente aceptable. La canción deja que desear, pero probablemente en algún momento le dedique algo más de tiempo como para tener una versión más decente de Korobeiniki, la canción folclórica rusa en la que está basada el tema de Tetris.
DragonRuby hace súper fácil la publicación en itch.io, así que agregué a mi cuenta el perfil de "desarrollador" y subí mi versión de Tetris en este enlace. Empecé con el nombre "Picando Tetris", pero no tengo idea si eso podría traerme problemas por usar un nombre registrado. Otras versiones tuvieron el nombre código "Picandotris", hasta que un amigo me sugirió "Fertris" (Fernando's Tetris!) y ahí quedó porque nombras cosas es difícil. Se puede descargar gratis para Linux, RaspberryPi, Mac OS y Windows. Si la llegan a probar, cuenten qué tal anduvo.
El resultado final se ve algo así:
No creo que comparta el código porque si lo ve un desarrollador de videojuegos profesional me va a mandar preso. Hablando en serio, es un código para experimentar y aprender y no creo que nadie más que yo pueda beneficiarse mucho de él.
La experiencia de agregarle cosas al Tetris de icculus queda, y además de haberme divertido, es una de las tantas cosas que aportan a mi experiencia como programador. Pero por sobre todo, ¡me divertí! Si ya sabes Ruby y te interesa, te recomiendo leer más sobre DragonRuby y empezar a hacer juegos. Y si bien ya no me voy a sentir mal cada vez que lea a Amir pidiendo que haga juegos, todavía tengo que arrancar uno propio de cero. La parte más difícil de Tetris es la lógica del juego, y eso lo hizo todo icculus en este ejemplo. Además Amir ya me dijo "seguí haciendo juegos maldición", ¡ya vendrán otros proyectos!
Siempre me ha interesado la idea de desarrollar mi propio videojuego, pero no sé si cambiaría mi carrera como para dedicarme a eso a tiempo completo. Es un tema que me interesa mucho, y me fascinan los distintos procesos creativos que se involucran: programación, diseño, arte, sonido. Pero sí me encantaría poder publicar varias de las ideas que tengo como videojuegos en algún momento. El tiempo que pasé programando y experimentando con DragonRuby se me pasó volando. Así que por lo menos para mantener esa sensación de programar cosas divertidas, espero seguir desarrollando juegos como pasatiempo.
El post Programando Tetris con DragonRuby fue publicado originalmente en Picando Código.Variable not found
Enlaces interesantes 559
marzo 11, 2024 07:05
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Requerir parámetros de la query string en ASP.NET Core
José María Aguilar - Rendimiento de nameof en C#
José María Aguilar
.NET Core / .NET
- Key derivation in .NET using HKDF
Anthony Simmon - An introduction to the heap data structure and .NET's priority queue
Andrew Lock - How To Use Polly In C#: Easily Handle Faults And Retries
Nick Cosentino - ConfigureAwaitOptions in .NET 8
Bart Wullems - Introduction to Brighter in .NET
Code Maze - Unveiling Spargine 8: A Comprehensive Guide to .NET 8 Integration and Exciting Feature Updates
David McCarter - Implicit Operators in C#: How To Simplify Type Conversions
Nick Cosentino - Optional parameters may appear in the middle of the parameter list
Gérald Barré - From SerilogTimings to SerilogTracing
Nicholas Blumhardt - Read a Text File Without Specifying the Full Path in C#
Aneta Muslic - Typesafety in xUnit with TheoryData<T>
Steven Giesel - Using parameters in BenchmarkDotNet
Bart Wullems - Extract Method Refactoring Technique in C# – What You Need To Know
Nick Cosentino - Stop Using string.ToLowerInvariant() to Compare Strings. InvariantCulture Comparisons are Slow
Darren Horrocks - Difference Between Abstraction and Encapsulation in C#
Almir Tihak - General Performance Tip: Hashing Data
David McCarter - R3 — A New Modern Reimplementation of Reactive Extensions for C#
Yoshifumi Kawai
ASP.NET Core / ASP.NET / Blazor
- Multi client blob storage access using ASP.NET Core with Entra ID authentication and RBAC
Damien Bowden - An Intro to Minimal APIs with ASP.NET Core and .NET 8.0
Jamie Maguire - Creating your own custom middleware in ASP.NET Core
David Grace - The quickest way to integrate PayPal checkout with Blazor SSR in .NET 8
Jon Hilton - Blazor Basics: Validating Form Data with Blazor
Claudio Bernasconi - Performance test your ASP.NET Core app using Bombardier
Bart Wullems - ASP.NET 8 – Multilingual Application with Single Resx File
Mark Pelf - Updating to .NET 8, updating to IHostBuilder, and running Playwright Tests within NUnit headless or headed on any OS
Scott Hanselman - Comparing Raw ASP.NET Request Throughput across Versions
Rick Strahl - What's new for the Microsoft Fluent UI Blazor libraries 3.6 and 4.5
Vincent Baaij
Azure / Cloud
- Azure Functions Extensibility - Extensions and Isolated Worker Model
Tomasz Pęczek - Custom Alerts in Application Insights
Paul Michaels
Conceptos / Patrones / Buenas prácticas
- Seguridad del código: el código zombi y cómo te afecta
CampusMVP - Event Interception
Ian Cartwright, Rob Horn & James Lewis - Event-Driven Architecture lost its way
Derek Comartin
Data
- 3 Essential SQL Tricks You Absolutely Need to Know
Nariman Esmaiely Fard - Get Started with Milvus Vector DB in .NET
Luis Quintanilla
Machine learning / IA / Bots
- Introducing the next generation of Claude
Anthropic - Demo Review: Azure Vector Search AI Assistant
Jason Haley - Architecting AI Apps with Semantic Kernel
Sophia Lagerkran - Navigating the Transition: Semantic Kernel .NET V1 Migration Guide
Sophia Lagerkran
Web / HTML / CSS / Javascript
- Announcing TypeScript 5.4
Daniel Rosenwasser - How we reduced the size of our JavaScript bundles by 33%
Umair Nadeem - WebKit Features in Safari 17.4
Jen Simmons and Jon Davis - CSS for printing to paper
Voussoir.net - How to Integrate HTMX and Shoelace Web Components
Khalid Abuhakmeh - Learn These Viewport-Relative CSS Units (100vh, 100dvh, 100lvh, 100svh)
George Martsoukos - Internationalization with React-Intl
Hassan Djirdeh - Modern CSS Tooltips And Speech Bubbles (Part 2)
Temani Afif - Angular has your back when it comes to XSS
Tim Deschryver
Visual Studio / Complementos / Herramientas
- Como configurar Prettier y no morir en el intento, extensiones de VSCode que te ayudarán 🤯
Geovany - Code coverage features in Visual Studio Enterprise
Faisal Hafeez - Using ChatGPT and GitHub Copilot to Generate the XAML for your Windows application
Nick Randolph - GitHub Copilot Chat General Availability in JetBrains IDE
GitHub - GitHub Actions: Run Pandoc To Convert Markdown To Word Document
Chris Pietschmann
.NET MAUI / Xamarin
- Using WSA for .NET MAUI Android Development
Vijay Anand - .NET MAUI: painfully slow debugging resolved with speedscope
Jean-Marie Alfonsi - Syncfusion Free Ebooks | .NET MAUI Community Toolkit Succinctly
Alessandro Del Sole - Syncfusion's Response to Xamarin’s End of Life: A Comprehensive Plan
Paul Anderson
Publicado en Variable not found.
Picando Código
Mar10: El Día de Mario mirando películas de Mario
marzo 10, 2024 11:49
Con motivo de Mar10 (10 de marzo, “Día de Mario”), hoy volví a mirar las películas de Mario. No se pueden comparar entre sí por varias razones: La película de 1993 no tenía más que unos pocos títulos con poco o nada de historia en la que basarse. Además fue pionera en su género, no se sabía qué funcionaba en la transición del videojuego al cine, y es una película totalmente experimental. Ni que hablar que Nintendo le dió ruenda suelta a Hollywood con los personajes, y no se involucró prácticamente en la producción. La película de 2023 tiene 30 años de juegos, spin-offs y demás legado de dónde sacar ideas. Además contó con la producción de Shigeru Miyamoto y el involucramiento directo de Nintendo.
Son dos productos completamente distintos, pero disfrutables a su manera, y una gran parte de la historia de los hermanos Mario.
Super Mario Bros. (1993)
La primera película live-action basada en un videojuego no fue bien recibida ni por la crítica ni por el público general. Es la primera vez que vuelvo a mirarla después de no sé cuántos años. Está bueno que la puedo ver con una perspectiva totalmente nueva. No sólo no me acuerdo, sino que mis gustos y expectativas han ido cambiando con el tiempo. En su momento seguramente la haya visto en el cine, y si no recuerdo mal, tenía las figuras de acción de Mario, Luigi y un Goomba de la película en mi arsenal.
Mientras la miraba, varias veces me surgió la pregunta “¿para quién es esta película?”. Tiene sus partes más “familieras” (escenas que llaman a un estilo de película como “Home Alone”), y otras un poco más adultas. Los extras del Blu-Ray respondieron la pregunta. Incluyen unos videos con entrevistas donde varias de las personas responsables hablan sobre el proceso unos cuantos años después. Tuvo un montón de problemas de producción: el guión fue re-escrito varias veces, el enfoque iba cambiando casi que todo el tiempo y unos cuantos problemas más. Esto explica que a veces parece enfocada a niños pero también muestra cosas que alguien esperaría de una película noventera para adultos.
La trama es absoluamente desquiciada, pero podría haber funcionado muy bien. Con la influencia de Super Mario World, Mario y Luigi viajan a una dimensión paralela donde los dinosaurios siguieron evolucionando en paralelo con los mamíferos hasta llegar a ser básicamente humanos reptilianos. Su ciudad es una Manhattan distópica con estética cyberpunk. El arte es muy bueno, tanto la magia que hicieron transformando la planta de cemento abandonada donde filmaron, como el maquillaje, los efectos especiales y demás. El diseño de las armas que usan para “desevolucionar” en la película está basadao en el Super Scope. Las bob-ombs son bombas a cuerda con dos piecitos que se asemejan mucho a las de Super Mario Bros. 3 o World con un “product placement” en sus zapatos muy chiste de película noventera. Creo que estas dos piezas de utilería son los dos únicos aspectos fieles al videojuego.
Pero la fidelidad no importa. Con la edad y la experiencia uno aprende a entender que el mundo de las películas es alternativo al material en el que están basadas. Y si no nos gusta, la podemos ignorar y volver a disfrutar del material original. Hay que disfrutarlas como una nueva interpretación basada en personajes. Con esa idea ya asimilada, realmente quise que me gustara más. Pero la mata el guión. Si hubiera tenido un guión mejor escrito, más cohesivo y con buenos diálogos, podría ser excelente. Bob Hoskins y John Leguizamo están muy bien interpretando a Mario y Luigi. Yoshi es un dinosaurio hecho con efectos prácticos realista con un resultado en pantalla excelente, unos días antes de que se estrenara Jurassic Park. Y en general la historia podía haber dado para una secuela tranquilamente.
La idea es totalmente alocada, y podría haber funcionado mucho mejor. Pero ahí quedó como un producto de su época y problemas de producción. Si no fuera por la siguiente película de Mario que voy a comentar y su éxito, no descartaría que con la falta de ideas que está teniendo Hollywood en los últimos tiempos, no se hiciera un reboot de esta idea en particular. Que sería igual de desquiciado, pero igual la miraría.
¿Recomiendo verla? Sí, si tienen un domingo donde no pueden salir por alguna razón, es entretenida para pasar el tiempo. Por lo menos nos quedó esta tremenda versión de “Walk the Dinosaur” y una escena bajando por un túnel congelado con este temún de Joe Satriani…
Super Mario Bros 2023
Avanzamos 30 años y tenemos una de las películas de videojuegos más entretenidas hasta el momento. Donde la anterior tenía unas pocas referencias a cosas del videojuego, en ésta casi cada personaje, nota musical, o escenario es una referencia directa a algún juego de Mario o de Nintendo. Incluso se transforma en una cacería encontrar cada detalle que se relaciona a algún juego de Mario o Nintendo. Habiendo crecido jugando Super Mario y juegos de Nintendo, disfruté de cada una de las que encontré, así como los guiños y homenajes de todo tipo. Se rumorea que hasta hay Pikmins escondidos por ahí…
La historia no es demasiado profunda, pero es entretenida y la plataforma para introducir el mundo y los personajes a la audiencia y contar varios chistes, aparte de promocionar juegos. Nintendo reportó vender muchas copias nuevas de juegos de Mario en Nintendo Switch gracias al éxito en taquilla. También se muestran coss que potencialmente podrían dar para contar más historias, pero las irán dejando para las secuelas, que la primera ya está anunciada (más información al final de este post).
Desde el momento en que se anunció, venía renegando con Chris Pratt como Super Mario porque el tipo hacía la misma voz en todas sus películas. Pero la verdad que mirándola no me doy cuenta y se me pasa. Dejando de lado eso, la selección de actores para las voces me parece muy bien. Charlie Day como Luigi, Anya Taylor-Joy como Peach, Charles Martinet -que estoy seguro crearon el personaje sólo para que esté - y demás actores están muy bien con sus personajes. De destacar Seth Rogen como Donkey Kong, elección inesperada que pega muy bien y que no sólo hace su contagiosa risa característica sino que canta el DK Rap. Y para mí la estrella más grande es Jack Black con su interpretación de Bowser y la canción “Peaches”, que no puedo evitar escuchar en mi cabeza cada vez que paso por la sección de frutas de un mercado y veo la palabra escrita. La estrella cínica de Mario Galaxy se lleva muchos aplausos y risas también por su humor negro.
Se aprecia cariño y conocimiento del material original, pero es lógico asumiendo que seguramente más de una de las personas involucradas hayan crecido jugando Nintendo. Los avances en animación también dan lugar a escenas de acción muy buenas que se traducen de manera excelente del videojuego al cine y evocan distintas etapas de la vida de un jugón como uno pegado al televisor. La música acompaña muy bien, tanto interpretaciones orquestrales de melodías que tenemos quemadas en el cerebro por pasar tantas horas jugando Nintendo, como canciones más populares. Como ejemplo una escena con un tema de Bonnie Tyler es genial y la canción la enriquece mucho.
Si les gusta Super Mario, seguramente ya la hayan visto, y si no, recomiendo que lo hagan. La miré en el cine cuando salió y me divertí mucho. Tras verla de nuevo casi un año después en Blu-Ray, volví a disfrutarla y se mantiene siendo una de mis tres películas preferidas del año pasado (las otras dos son Barbie y Godzilla Minus One). Tendré que volver a mirarla el 10 de Marzo de 2025 si no tengo nada mejor que hacer o poco antes que se estrene la secuela para refrescar la memoria.
Noticias sobre Mario en su día
Hoy Nintendo publicó un video donde Shigeru Miyamoto comenta que están trabajando junto a Illumination en la secuela de la película animada de Super Mario Bros. Se espera que esté disponible en Estados Unidos y otras regiones el 3 de abril de 2026. En el mismo video se confirman fechas de disponibilidad de algunos juegos de Mario para Nintendo Switch este año:
- Paper Mario: The Thousand-Year Door – 23 de mayo, 2024
- Luigi’s Mansion 2 HD – 27 de junio, 2024
- Dr. Mario (Game Boy), Mario Golf (Game Boy Color) y Mario Tennis (Game Boy Color) disponibles a partir del 12 de Marzo en Nintendo Online.
Bueno, me voy a jugar un rato a Super Mario Bros. Wonder y me acuesto a dormir…
El post Mar10: El Día de Mario mirando películas de Mario fue publicado originalmente en Picando Código.proyectos Ágiles
Master en Agile – MMA 2024-2025
marzo 10, 2024 11:55
En octubre de 2024 se iniciará el Barcelona la 14ª 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.
El Máster en Métodos Ágiles de La Salle-URL va dirigido a profesionales que ven en las metodologías ágiles la mejor manera de adaptar rápidamente sus productos en entornos complejos y altamente competitivos, reduciendo el Time To Market de los mismos a fin de maximizar el valor aportado al negocio.
El Máster te permitirá desarrollar actitudes y capacidades para crear equipos de alto rendimiento con Scrum, Kanban, Design Thinking, Lean Startup para ajuste rápido de producto al mercado y te proporcionará herramientas y estrategias para escalar Agile en la organización, transformar su cultura y así conseguir mayor Business Agility.
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.
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 Project, Portfolio, And Operations Management for Business Agility de Businessmap, creadora de la herramienta Kanbanize.
- Certified Agile Skills – Scaling 1 de la Scrum Alliance, , la entidad de certificación Agile de mayor prestigio a nivel internacional.
Adicionalmente, se incluye la visita a las siguientes empresas:
PMA – Postgrado en métodos Ágiles
El PMA incluye las siguientes certificaciones oficiales:
- «Certified Scrum Master» (CSM) de la Scrum Alliance.
- Opción de acceder al Certified Project, Portfolio, And Operations Management for Business Agility de Businessmap.
Asignaturas | Temas | Profesores |
Fundamentos & Inception | Principios y métodos más conocidos (Scrum, Lean, Kanban y XP). Facilitadores e impedimentos.
Inception y conceptualización ágil de proyecto, priorización ágil, historias de usuario, elaboración de Product Backlog, técnicas de priorización. | 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. | Laia Montaño 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. | Laia Montaño
|
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 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 Olga Vela |
Lean Thinking & Agile Management | Lean. Escalado con Kanban.
Visual Management Framework (VIMA – Agile para cualquier área – Fuera de tecnología). Agile-Lean Management | Teodora Bozheva
|
Coaching y Cultura | Coaching de equipos, creación de equipos de alto rendimiento, liderazgo.
Tipos de cultura empresarial, gestión del cambio organizativo. | Joserra Díaz
|
Transformación Continua | Estrategia de despliegue de Agile en organizaciones, cómo vender Agile a la Dirección. Contratos ágiles. Enterprise continuous improvement. Enterprise software development, Team Topologies & DevOps. | Xavier Albaladejo
|
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 2023 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).
Picando Código
Publicado Gleam v1.0.0
marzo 08, 2024 11:00
Esta semana se publicó la versión 1.0.0 del lenguaje de programación Gleam, un “lenguaje amigable para hacer sistemas que escalan con tipado seguro”. Ya he escrito sobre Gleam en el blog antes, pero no he escrito tanto código como hubiera querido. Es uno de los tantos lenguajes que me gustan y con los que me gustaría programar más. Gleam cuenta con “el poder de un sistema de tipado, la expresión de la programación funcional, y la seguridad del entorno de ejecución tolerante a fallas y de alta concurrencia de Erlang, con una sintaxis moderna y familiar”.
El 4 de marzo Louis Pilfold, su creador, publicó esta primera versión “estable” del lenguaje, lo que describe como un gran hito para el ecosistema. En el anuncio escribe:
¿Qué es Gleam?
Gleam es un lenguaje de programación que intenta hacerle el trabajo de quienes escriben y mantienen sistemas de software lo más predecible, libre de estrés y disfrutable posible.
El lenguaje es consistente y tiene un área de superficie pequeña, haciendo posible aprenderlo en una tarde. Acompañado de una falta de magia y una fuerte intención de tener una sóla manera de hacer las cosas, Gleam es típicamente fácil de leer y entender. Leer y debuggear código es más difícil que escribir código nuevo, así que optimizamos para esto.
Gleam tiene un análisis de tipos estáticos robusto y un sistema de tipos inspirado en lenguajes como Elm, OCaml y Rust, así que el compilador sirve de asistente de programación, dándote contexto adicional para ayudarte a hacer el cambio que quieras hacer. No te preocupes por escribir código perfecto de primera, con Gleam refactorizar es de bajo riesgo y bajo estrés así puedes continuar mejorando tu código mientras aprendes más sobre el problema que estás resolviendo.
Ejecutar y administrar software es tan importante como escribirlo. Gleam corre sobre la máquina virtual de Erlang, una plataforma madura y probada que habilita a muchos de los sistemas más confiables y escalables del mundo, como WhatsApp. Gleam también puede ejecutarse en entornos JavaScript, siendo posible ejecutar código Gleam en el navegador web, en dispositivos móviles o en cualquier otro lado.
Gleam se ve así:
import gleam/json
import gleam/result.{try}
import my_app/person
import wisp.{type Request, type Response}
pub fn handle_request(req: Request, ctx: Context) -> Response {
use json <- wisp.require_json(req)
let result = {
use data <- try(person.decode(json))
use row <- try(person.insert(ctx.db, data))
Ok(person.to_json(row))
}
case result {
Ok(json) -> wisp.json_response(json, 201)
Error(_) -> wisp.unprocessable_entity()
}
}
¿Qué incluye Gleam v1?
Esta versión cubre todas las API públicas del repositorio git principal de Gleam:
- El diseño del lenguaje Gleam
- El compilador Gleam
- La herramienta de compilación de Gleam
- El gestor de paquetes de Gleam
- El formateador de código de Gleam
- El servidor de lenguaje de Gleam
- Las herramientas del compilador para JavaScript y el API WASM.
La biblioteca estándar Gleam y otros paquetes que son mantenidos por el equipo central obtendrán una publicación v1 en breve. Antes de publicarlas, vamos a estar haciendo pull requests a paquetes populares de la comunidad para relajar sus limitaciones de versionado en el gestor de paquetes para asegurarnos que la actualización a la V1 sea lo más sencilla posible para todos los usuarios de Gleam.
¿Qué significa V1?
La versión 1 es una declaración sobre la estabilidad y disponibilidad de Gleam para ser usado en sistemas en producción. Creemos que Gleam es adecuado para usar en proyectos que importan, y Gleam va a poveer una fundación predecible y estable.
Gleam sigue el versionado semántico, así que es prioridad mantener compatibilidad hacia atrás. Vamos a estar haciendo todo el esfuerzo para asegurarnos que Gleam no introduzca cambios que rompan la compatibilidad hacia atrás. La excepción a esto es por problemas de seguridad y robustez. Si se descrube un bug crítico de esta naturaleza, nos reservamos el derecho de corregir el problema de seguridad, incluso si algunos programas estuvieran tomando ventaja del bug.
¿Qué sigue para Gleam?
Gleam es un lenguaje práctico con la intención de hacer cosas reales, así que nuestro foco para Gleam post-v1 va a estar dividido entre productividad para usuarios de Gleam y sustentabilidad para el proyecto.
Productividad para usuarios de Gleam
Además de no introducir cambios que rompan la compatibilidad, se va a evitar agregar demasiado al lenguaje para que no se convierta en un lenguaje más complejo y difícil de entender. Pretenden mantener la simplicidad, agregando características nuevas al lenguaje, pero de forma conservadora. Va a haber un foco en mejorar el servidor de lenguaje Gleam para mejorar la productividad. También se va a trabajar en las bibliotecas de Gleam, con un foco inicial en desarrollo de páginas y servicios web.
Otra de las prioridades es la documentación, con trabajo en tutoriales y guías para todo tipo de tareas en Gleam.
Sustentabilidad
Gleam es un proyecto comunitario sin apoyo de una corporación. Louis es el desarrollador principal y trabaja en el lenguaje a tiempo completo, junto a voluntarios part-time concentrados en trabajo con impacto y sentido para la comunidad. Van a continuar también el trabajo en la documentación interna para que sea fácil para más gente colaborar con el proyecto.
Un tema importante es la sustentabilidad financiera. Louis trabaja a tiempo completo en el proyecto gracias a los sponsors en GitHub. Cuentan con un sponsor principal, Fly.io, que provee gran parte de los fondos. Pero están buscando diversificar la financiación del proyecto con más sponsors corporativos y otras vías de ingreso.
Mascota
El anuncio cierra presentando a Lucy, la nueva mascota del proyecto, así como mejoras en el sitio web gleam.run.
Instalación
Podemos instalar Gleam siguiendo esta guía. Personalmente vengo usando asdf para gestionar versiones de Gleam y algunos otros lenguajes de programación. Teniéndolo instalado, podemos gestionar las versiones de Gleam en nuestro sistema agregando el plugin:
Una vez instalado asdf
y el plugin de gleam, podemos ejecutar lo siguiente para empezar a usar esta nueva versión:
$ asdf global gleam 1.0.0
$ gleam -V
gleam 1.0.0
Y con esto ya podemos empezar a programar en Gleam. Hay mucha información en la documentación, incluyendo guías de referencia viniendo de otros lenguajes.
El post Publicado Gleam v1.0.0 fue publicado originalmente en Picando Código.Picando Código
10 años de emacs.sexy
marzo 05, 2024 10:30
Esta semana se cumplen 10 años desde que registré el dominio y publiqué el sitio web emacs.sexy. Se ve que 2014 fue un año bastante ocupado en cuanto a proyectos personales…
En su momento escribí en el blog al respecto en Emacs es Sexy. Como comentaba originalmente, el sitio surgió como respuesta a vim.sexy
, pero con un objetivo un poco más productivo: Con la disponibilidad de los nuevos TLD .sexy, hace poco salió en La Internet el sitio vim.sexy. Tiene pinta de ser una respuesta paródica al editor de texto hipster del momento Atom. Pero mi problema era: Si bien es una parodia graciosa, vim.sexy no aporta mucho (en mi humilde opinión). Supuse que alguien habría hecho algo similar para Emacs, por la eterna relación entre Emacs y Vim. Al ver que no era así, registré el dominio e intenté crear un sitio que sumara un poco más. En el mismo tono humorístico creé una página web más constructiva, con información sobre Emacs y con la meta de lograr motivar a alguna persona curiosa a probar y dejarse enganchar por Emacs.
Así que la idea es difundir y compartir Emacs y recursos para aprender a usarlo y más. Siempre tuve la idea de implementar un sistema multi lenguaje para poder publicarlo en varios idiomas, pero nunca le dediqué el tiempo necesario. ¡Algún día prometo tenerlo también en español! Tuve la suerte de que el sitio creció mucho gracias a aportes de mucha gente gracias a su naturaleza de código abierto, así que
El diseño cambió bastante y está mucho más moderno que el original gracias a la grande de Mery, la versión inicial se veía mucho más “hecha por un programador”:
Es interesante reflexionar sobre “el editor de texto hipster del momento” que comentaba en su momento. En 2014 era Atom. No sé si antes o después vino Sublime, y ahora un montón de gente se pasó a Visual Studio Code. Mientras estos editores van y vienen, Emacs y Vim los miran pasar. Hace años que uso Emacs y sigo aprendiendo cosas nuevas bastante seguido. De sólo pensar en tener que aprender una herramienta nueva para tener que editar texto o escribir código en un lenguaje de programación específico me estresa
Así que si no conocen Vim, Emacs o Spacemacs (lo mejor de ambos mundos), les invito a entrar a al sitio y aprender un poco más. De repente aprenden una herramienta para toda la vida como vengo haciendo yo.
El post 10 años de emacs.sexy fue publicado originalmente en Picando Código.Variable not found
Acceder a parámetros de query string desde componentes Blazor 8 de cualquier tipo
marzo 05, 2024 07:32
En Blazor es posible acceder a valores de parámetros de la query string exclusivamente desde componentes de tipo página, es decir, aquellos definidos con la directiva @page
.
Para ello, bastaba con declarar una propiedad pública y decorarla con los atributos [Parameter]
y [SupplyParameterFromQuery]
. Por ejemplo, si desde una página quisiésemos obtener el valor del parámetro term
de la query string, podríamos hacerlo de la siguiente forma:
@page "/search"
<p>Searching term: @Term</p>
@code {
[Parameter]
[SupplyParameterFromQuery]
public string Term { get; set; }
}
Sin embargo, como sabéis, esto no funcionaba si intentábamos acceder así a estos parámetros desde componentes que no fueran páginas, es decir, que no fueran instanciados por el sistema de routing.
Pues bien, a partir de Blazor 8, el atributo [SupplyParameterFromQuery]
puede ser utilizado sobre propiedades de componentes de cualquier tipo, no sólo de aquellos decorados con la directiva @page
. Por tanto, cualquier tipo de componente podrá acceder directamente a parámetros de la query string, evitando tener que pasárselos de forma manual o usando valores en cascada.
También es interesante destacar que si usamos [SupplyParameterFromQuery]
, ya no será necesario añadir el atributo [Parameter]
, como ocurría en versiones anteriores, así que nos ahorramos de paso una línea de código 😉
[SupplyParameterFromQuery]
public string Term { get; set; }
...
Publicado en Variable not found.
Picando Código
Colección de novelas de Cory Doctorow en Humble Bundle
marzo 04, 2024 02:04
En este blog se lee bastante a Cory Doctorow. Y en Humble Bundle publicaron una colección de novelas del autor al precio que elijas:
Incluye los clásicos Little Brother, Homeland, así como el cuento corto del mismo universo Lawful Interception y la secuela Attack Surface. También pueden obtener Radicalized, uno de mis libros preferidos del autor, varias de sus primeras obras y dos de sus trabajos más recientes de ficción: Red Team Blues y The Lost Cause.
Red Team Blues es el primer título en una serie basada en Martin Hench, un contador forense, retirado que se dedica a destapar estafas y estafadores de Silicon Valley. Es un estilo algo distinto a libros anteriores, más en el género crímen/detectivesco. En éstos días el autor está promocionando la recientemente publicada secuela, y aparentemente la tercera parte ya está escrita también.
The Lost Cause hasta donde tengo entendido vuelve a su más familiar ciencia ficción. En el futuro no muy lejano, la humanidad empezó a mitigar los desastres del cambio climático a la vez que debe pelear contra los fanáticos de derecha que creen que el cambio climático es un un engaño. Supuestamente tiene una visión un poco optimista, algo que me viene bien cada tanto para limpiar el paladar entre ciencia ficción distópica. Lo tengo en formato papel en mi biblioteca esperando a ser leído (con suerte este año).
El paquete contiene 18 libros en total, y tiene un costo mínimo de €1/USD 1. Como es costumbre con los “Humble Bundles”, podemos elegir el precio final y a dónde va el dinero que pagamos: podemos ajustar la cantidad entre la editorial y apoyar con nuestro aporte a la Electronic Frontier Foundation.
Los libros están disponibles en ePub, formato compatible en computadoras, lectores de libros digitales y varios dispositivos más.
El paquete se encuentra disponible hasta el 23 de marzo y se puede obtener desde este enlace.
El post Colección de novelas de Cory Doctorow en Humble Bundle fue publicado originalmente en Picando Código.Variable not found
Enlaces interesantes 558
marzo 04, 2024 07:05
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Una forma más eficiente de comprobar si un texto es un JSON válido
José María Aguilar - El operador nameof de C# 6
José María Aguilar
.NET Core / .NET
- String Performance: Comparing Strings with Globalization
David McCarter - A C# LINQ one-liner to check if exactly one of a set of conditions is met
Raymond Chen - Testing exceptions
Mark Seemann - Parallel.ForEachAsync and Exceptions
Jeremy Clark - C# Tip: IFormattable interface, to define different string formats for the same object
Davide Bellone - Reflection in C#: 4 Simple But Powerful Code Examples
Nick Cosentino - Lock statement patterns
Steven Giesel - async await in C#: 3 Beginner Tips You Need to Know
Nick Cosentino - MoaidHathot/Dumpify: Adding
.Dump()
extension methods to Console Applications, similar to LinqPad's.
Moaid Hathot - Continue Processing with Parallel.ForEachAsync (even when exceptions are thrown)
Jeremy Clark - Mocking authorization tokens with WireMock.NET
Cezary Piątek - Activator.CreateInstance in C# – A Quick Rundown
Nick Cosentino
ASP.NET Core / ASP.NET / Blazor
- The FAST and the Fluent: A Blazor story
Vincent Baaij - Delegated read and application write access to blob storage using ASP.NET Core with Entra ID authentication
Damien Bowden - Create Responsive Web Designs Like a Pro with Blazor Media Query
Silambarasan Ilango - Automatically Register Minimal APIs in ASP.NET Core
Milan Jovanović - Using Unix domain sockets with ASP.NET Core and HttpClient
Andrew Lock - Shoelace Web Components with ASP.NET Core
Khalid Abuhakmeh - Fetching and Sharing Data with Blazor’s Auto Render Mode
Jon Hilton - Blazor — Accessibility Enhancements and Options
DevExpress Blogs - How to Fix CORS Error With AnyOrigin and AllowCredentials
Code Maze
Azure / Cloud
- Persisting the ASP.NET Core Data Protection Key Ring in Azure Key Vault
Tore Nestenius - Troubleshoot your App Service Hybrid Connections with the Hybrid Connection Debug Utility
Jordan Selig
Conceptos / Patrones / Buenas prácticas
- App Configuration: where does it go?
Derek Comartin
Data
- Challenges in Migrating ASP.NET Apps to Containers
Mohammad Elsheimy - EF Core - Cannot convert from 'string' to 'System.FormattableString'
Bart Wullems - Single and Split Queries in Entity Framework Core
Code Maze - EF Core - System.InvalidOperationException : The required column 'Id' was not present in the results of a 'FromSql' operation.
Bart Wullems - How to Add Unique Constraints to a Property in EF Core Code-First
Ivan Gechev
Machine learning / IA / Bots
- Introducing Mistral-Large on Azure in partnership with Mistral AI
Eric Boyd - Creating Intelligent Apps on App Service with .NET
Jeff Martinez - How to Use SemanticKernel with OpenAI and Azure OpenAI in C# – 1/N
Bruno Capuano - RAG is Dead. Long Live RAG!
David Myriel
Web / HTML / CSS / Javascript
- Guía completa para crear un proyecto con React: explorando las diferentes opciones
José Manuel Alarcón - JavaScript Bloat in 2024
Nikita Prokopov - Mastering Type-Safe JSON Serialization in TypeScript
Maksim Zemskov - Should We Switch from Redux to Redux ToolKit?
Nishani Dissanayake - Reporting Core Web Vitals With The Performance API
Geoff Graham - Advanced CSS Selectors – How and When to Use Them
Ophy Boamah - Understanding CommonJS vs. ES Modules in JavaScript
Poorna Theekshana - Creating A CSS Class Name Directive In Apline.js 3
Ben Nadel - Rest and Spread Operators Explained in JavaScript
Ezekiel Lawson - Mastering Event Propagation in JavaScript: Bubbling vs. Capturing
Soumya Ranjan Tripathy - An HTML Switch Control
Anne van Kesteren & Jon Davis - Async vs Defer in JavaScript: Which is Better?🤔
Fidal Mathew - 4 Reasons to Use Angular for Your Next Web App
Alyssa Nicoll - Modern CSS Tooltips And Speech Bubbles (Part 1)
Temani Afif - 30 JavaScript Tricky Hacks
M Mainul Hasan
Visual Studio / Complementos / Herramientas
- Visual Studio Code February 2024
VS Code Team - Critical Thinking in an AI-Powered World
Khalid Abuhakmeh - GitHub Copilot Enterprise is now generally available
Thomas Dohmke - ReSharper 2024.1 EAP 6: The Most Feature-Rich Update Yet
Sasha Ivanova - Docker Init for ASP.NET Core Compared to VS or VS Code Extensions
Julie Lerman - GitHub Copilot Analysis, Customized Rules, and more come to the Azure Migrate application and code assessment
Mike Rousos
.NET MAUI / Xamarin
- .NET MAUI – Native Embedding
Vijay Anand - .NET MAUI Community Toolkit 2023 Highlights
Kym Phillpotts - .net MAUI: Disable scrolling on Android
Jean-Marie Alfonsi - MAUI ImageButton AspectFit and the Missing Image
Iris Classon - Getting Started with the Media Picker in .NET MAUI
Leomaris Reyes
Publicado en Variable not found.
Variable not found
Enlaces interesantes 557
febrero 26, 2024 07:05
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Verificar si una cadena de texto es un JSON válido
José María Aguilar - Uso de miembros estáticos en C# 6, ¿una buena idea?
José María Aguilar
.NET Core / .NET
- How to Check if a Number Is Positive or Negative in C#
Code Maze - Developing Optimized GitHub Actions with .NET and Native AOT
David Pine - Getting all exceptions thrown from Parallel.ForEachAsync
Gérald Barré - C# System.Text.Json
Karen Payne - How to Get the Number of Lines in a Text File in C#
Karthikeyan N. S. - A Detailed Guide to String Concatenation in .NET
Aleksei - The case for an application-level tracing API in .NET
Nicholas Blumhardt - WinForms in a 64-Bit world - our strategy going forward
Klaus Loeffelmann - AddConsole is obsolete: This method is retained only for compatibility
Bart Wullems - C# for Beginners – 5 Simplified Concepts in C#
Nick Cosentino - .NET JsonElement Error Handling
Ian Griffiths
ASP.NET Core / ASP.NET / Blazor
- Using a CSP nonce in Blazor Web
Damien Bowden - Blazor WASM Dynamic Component
Abdul Rahman Shabeek Mohamed - How to Call SignalR Hub from Controller in ASP.NET Core
Alexandra Ogubuike - Using Scoped Services From Singletons in ASP.NET Core
Milan Jovanović - Using named pipes with ASP.NET Core and HttpClient
Andrew Lock - Reading Raw ASP.NET Request.Body Multiple Times
Rick Strahl - Blazor’s Enhanced Navigation Fully Explained
Ed Charbeneau - Method Injection in ASP.NET Core: API Controllers vs. MVC Controllers
Jeremy Clark - Dealing with C# records in ASP.NET Core model binding
Alexander Zeitler - Using real-time data in Angular with SignalR
Lewis Cianci - Blazor and .NET 8: How I Built a Fast and Flexible Website
Jeff Fritz
Azure / Cloud
- Using dependency injection with Azure .NET SDK
Alexandre Nédélec - Using Azure Key Vault for signing and encrypting JSON Web Tokens
Joonas Westlin - Azure Functions Extensibility
Tomasz Pęczek
Conceptos / Patrones / Buenas prácticas
- Avoid multiple boolean parameters
Steven Giesel - Introducing Modular Monoliths: The Goldilocks Architecture
Steve Smith - Decoding Why 0.6 + 0.3 = 0.8999999999999999 in JS and How to Solve?
Jeeva Ramanathan - ORMs can lead to FAT domain models. Slim them down!
Derek Comartin - Clean Architecture in .NET
Muhammed Saleem
Data
- How to Map SQL Results To Any Object Using Entity Framework Core 8
Khalid Abuhakmeh
Machine learning / IA / Bots
- LlamaIndex Response Modes Explained
Bobby Gill
Web / HTML / CSS / Javascript
- Announcing TypeScript 5.4 RC
Daniel Rosenwasser - A11y: Vanilla javascript aria-live announcer
Cristian-Florin Calina - Union, intersection, difference, and more are coming to JavaScript Sets
Phil Nash - Best of Both Angular Worlds: Standalone & Modules Combined
Dany Paredes - New JavaScript Array Methods That Every Web Developer Should Learn
Shalitha Suranga - throbber Web Component
Zach Leatherman - HTML Streaming and DOM Diffing Algorithm
Aral Roca - Ramblings about JavaScript scope, weird errors and frameworks
Salma Alam-Maylor - Understanding the Basics of Singly Linked Lists in JavaScript
FrontBackGeek - Vanilla JavaScript, Libraries, And The Quest For Stateful DOM Rendering
Frederik Dohr - Vanilla JavaScript, Libraries, And The Quest For Stateful DOM Rendering
Frederik Dohr
Visual Studio / Complementos / Herramientas
- JetBrains Rider and the .NET Aspire Plugin
Khalid Abuhakmeh & Rival Abdrakhmanov - Visual Studio–Share your settings
Bart Wullems - VisualStudio.Extensibility: Install extensions without restarting Visual Studio! & A Streamlined Extension Manager comes to Visual Studio 17.9
Maia Kelner - An Active Local NuGet Server
Steve Smith - How To Use AI Assistant to Generate Test Data For .NET Applications
Khalid Abuhakmeh
.NET MAUI / Xamarin
- Exploring 4 Behaviors from the .NET MAUI Community Toolkit
Leomaris Reyes - Easily Manage Contacts in Your .NET MAUI App with SQLite and Perform CRUD Actions
Jeyasri Murugan - Creating an E-Book OnBoarding screen in .NET MAUI
Leomaris Reyes - Using Visual Studio Code for .NET MAUI Development
Vijay Anand
Otros
- Apple elimina las PWA en Europa: ¿Libertad o seguridad?
CampusMVP - Share a private key without using passwords
Bart Wullems - 22 years later, YAML now has a media type
Tim Perry - A Practical Guide To Designing For Colorblind People
Vitaly Friedman
Publicado en Variable not found.
Blog Bitix
Configurar GNU/Linux para usar forward DNS y el servidor DNS de Consul
febrero 24, 2024 04:00
Una de las cuestiones que tenía pendiente de mirar sobre Consul es como hacer que un nodo con GNU/Linux pueda acceder al catálogo de servicios mediante la interfaz DNS que ofrece Consul. Para esto es necesario configurar el forward DNS.
Blog Bitix
Obsidian, una herramienta para almacenar conocimiento
febrero 10, 2024 06:00
Hace ya unos meses desde que estoy usando Obsidian, pasado este tiempo considero que es un salto a los anteriores editores y aplicaciones de notas que he estado usando. A nivel personal como diario y otros asuntos ofrece varias funcionalidades que facilitan el gestionar el conocimiento y que no he visto en los anteriores editores que he usado. Es más que un editor de texto es una herramienta para almacenar conocimiento.
Picando Código
Actualización en SuperTimeTracker.com
febrero 02, 2024 11:00
Feliz día de la marmota, y felices 10 años a mi proyecto SuperTimeTracker.com
Aprovechando que tuve que renovar el dominio (pasando por esa etapa en que uno se cuestiona: ¿debería volver a renovar el dominio o darme por vencido y abandonarlo?), actualicé un poco mi “proyecto de fin de semana”:
Super Time Tracker es una aplicación web muy simple y minimalista para gestionar el tiempo de tareas. No necesitas crear una cuenta, grupo o clientes. No necesitas compartir tu correo electrónico, nombre o número de teléfono (en su momento era una aplicación para Firefox OS). Sólo traquea tu tiempo. Tu información no es compartida con terceros y te permite traquear tiempo en paz.
La información se guarda en el cache del navegador web y se puede usar la aplicación offline (incluso bajándote el código y ejecutándola en tu computadora).
El domingo 2 de febrero de 2014 registré el dominio para subir la web, y el lunes siguiente lo publiqué en mi blog.
Una actualización “silenciosa” que le hice hace un tiempo fue eliminar Google Analytics. Sinceramente no lo revisaba hace años, y un día me dispuse a eliminar ese maldito código JavaScript de Google Analytics que tenía todavía colgado en alguno de mis proyectos. La verdad es que la cantidad de visitas que llegan ya me resulta irrelevante, particularmente cuando tienden a 0
la mayoría del tiempo. Y usar Google Analytics en mis páginas ahora que sabemos cómo usan nuestros datos todas estas corporaciones, me parece poco ético.
Los otros dos cambios son gracias a Ismael Padilla. Él mismo encontró los dos primeros errores reportados en la aplicación y abrió Pull Requests en GitHub para corregirlos. Perdón Ismael por haber demorado unos años en revisarlos y aceptarlos
El primer Pull Request corrige un error que tenía al guardar una tarea mientras el reloj estaba corriendo. El reloj se detenía para volver a cero, pero el botón de play/pausa quedaba en “pausa”, por lo que había que presionarlo dos veces para volver a empezar el timer.
El segundo corrige un problema con el manejo de fechas si abrimos la página en dos ventanas de navegador distintas.
Se pueden ver los cambios en supertimetracker.com y el código fuente en GitHub.
Qué loco que ya hayan pasado 10 años, a ver si vuelvo a tener esos momentos de inspiración que dan para proyectos de fin de semana y compro algunos dominios nuevos…
El post Actualización en SuperTimeTracker.com fue publicado originalmente en Picando Código.Arragonán
Buscando el Product Market Fit y Arquitectura Hexagonal
enero 23, 2024 12:00
Hace un par de meses estuve en La Vertical by Mercadona Tech hablando sobre DDD estratégico. Al final del evento, pude conocer a algunas personas con quienes estuve compartiendo impresiones, ideas, proyectos…
En un momento dado, una persona me preguntó sobre qué opinaba de usar el estilo de arquitectura de Ports & Adapters, más popularmente conocida como Arquitectura Hexagonal, cuando el contexto es la fase de búsqueda o consolidación del Product Market Fit. Me pilló la pregunta algo a contrapié y creo que le respondí de forma un poco tibia; podríamos resumirlo con un clásico: “No lo sé, creo que depende del equipo y del contexto“.
Esto es algo sobre lo que he compartido mi punto de vista en petit comité en bastantes ocasiones, así que quería extender un poco esa respuesta aterrizándolo en este artículo.
¿Product Market Fit?
Este es el momento en el que un producto no está validado a nivel de negocio, o al menos no totalmente. Son momentos donde aún no es rentable y hay que probar a lanzar soluciones para cubrir los problemas de nuestros potenciales clientes e ir iterando (o descartando) esas soluciones. Más info sobre esto en este artículo de la lista de correo de Ignacio Arriaga: ¿Qué es el product market fit y cómo acelerarlo?.
Así que en una situación en la que no hemos consolidado el Product Market Fit, la capacidad de iterar un producto de software a una velocidad razonablemente alta es crítica para hacerlo. Más en situaciones en las que tenemos un presupuesto limitado, como suele ser el de la mayoría de startups.
¿Arquitectura Hexagonal?
Si seguimos el estilo de Hexagonal Architecture o Ports & Adapters o Clean Architecture, colocamos en el medio nuestra lógica de negocio y nos abstraemos de los detalles de implementación de infraestructura.
Esta infraestructura son tanto los driver ports que son el mecanismo de entrega para interactuar con la lógica de negocio, como podrían ser server-side rendering, REST, gRPC, GraphQL, CLI, tareas programadas… Como los driven ports que son los encargados de mantener el estado vía persistencia de datos y la comunicación hacia otros sistemas.
Las características principales de este estilo de arquitectura son la cambiabilidad de la infraestructura y, como consecuencia de eso, la testeabilidad. Ya que al utilizar inyección de dependencias nos abstraemos de las diferentes piezas de infraestructura y podemos testear la lógica de negocio de forma unitaria.
Frente a lo que me parece percibir a veces, no hay una forma única de implementar software con este estilo de arquitectura. En mi caso, ha evolucionado un poco mi forma de trabajar con este enfoque, pero como base siguen siendo bastante válidos los contenidos que compartimos en algunas charlas de hace algunos años con Coding Stones.
Lo malo
Este estilo de arquitectura se ha popularizado mucho en los últimos tiempos y ha crecido de la mano con el uso conjunto de los patrones tácticos de DDD. Tanto que para muchas personas creo que no hay diferencia, no se percibe que son cosas distintas que unas veces se complementan y otras no tiene demasiado sentido aplicar, al menos no de forma purista.
Así que esto en ocasiones lleva a sobreingeniería en el diseño, en forma de exceso de abstracciones y aumento de complejidad extrínseca, haciendo un código más difícil de modificar y extender funcionalmente. Lo que provoca que en esos casos de aplicaciones con una lógica de dominio no demasiado compleja, se ralentice la velocidad de iteración en el producto.
También, otras veces, se espera que al aplicar este estilo de arquitectura desaparezcan todos los problemas asociados a la deuda técnica. Como si ya vineran integrados mágicamente en ello principios como DRY, YAGNI, KISS, Separation of concerns, ley de Demeter, las 4 reglas del diseño simple… y nos fuera a evitar tener code smells.
Lo bueno
Para mí, lo que aporta este tipo de arquitectura en este tipo de contextos es principalmente la testeabilidad. Cuando se quiere iterar rápido, tener una batería de tests en la que puedas confiar y que se ejecuta rápido es una gran ayuda para mantener el foco en lo que estás desarrollando.
En segundo grado, la cambiabilidad nos aporta que podemos posponer decisiones, por ejemplo, usando soluciones de infraestructura a priori simplistas que nos permitan validar que se aporta valor a pequeña escala, sabiendo que de ser necesario, podemos cambiarla en el futuro con menos esfuerzo al no afectar al diseño.
Depende del equipo y del contexto
Sobre el contexto, empiezo desde una situación en la que se ha llegado a la conclusión de que no podemos servirnos de herramientas no-code ni de un prototipo o prueba de concepto que podamos tirar a la basura dentro de pocos meses. Así que no nos quedan más narices que desarrollar algo que pueda evolucionar, iterarse y adaptarse a lo que nos vayamos encontrando en el futuro.
Normalmente en estos casos seremos un equipo pequeño, con capacidad financiera limitada tanto para contratar como para subcontratar y donde querremos tener buena capacidad para entregar software. Porque, de lo contrario, difícilmente podremos iterar nada.
Cualquier decisión técnica para mí debería ir encaminada a usar soluciones conocidas siempre que sea posible. En general, creo que la línea a seguir es la de Choose Boring Technology, con más razón en el caso de estar consolidando el Product Market Fit.
Algunas preguntas que podemos hacernos para pensar sobre esto: ¿Quiénes formamos parte del equipo? ¿Cuánto hemos trabajado usando el estilo de arquitectura de Ports & Adapters? ¿Nuestro software tiene un dominio con cierta complejidad o se parece más a CRUD que encajaría bien acoplado con algún framework? ¿Tenemos algún framework de desarrollo con el que todas las personas del equipo seamos productivas? ¿Sabemos o hemos comprobado si estaremos peleando contra ese framework si lo combinamos con ese estilo de arquitectura? …
Alternativas
En algunas ocasiones, mi aproximación ha sido quedarme un poco a medio camino, utilizando alguno de los artefactos o prácticas que habitualmente se asocian a la Arquitectura Hexagonal, pero manteniendo el acoplamiento al framework en cierto puntos. Esto es: capa de use cases para representar lo que hace el producto de software, inyección de dependencias para tener piezas cambiables y hacer que la lógica sea más fácil de testear y, si encaja con las necesidades iniciales del producto, también modelar eventos.
Use Cases
Esta capa representa las acciones que se pueden hacer sobre el producto de software. A partir de aquí, se encapsula lógica y se orquestan las llamadas a infraestructura. En esta capa no se sabe si va a ser llamada desde un API rest, un comando desde CLI, un cron…
En mi caso, normalmente son clases con constructor y un solo método público para ejecutarlas, así que en un momento dado hasta podrían ser funciones.
En caso de que usemos un ORM (o un ODM o similar), utilizo esas mismas entidades para representar el dominio. Al menos hasta el momento donde se percibe que el modelo de dominio y el modelo de datos entran en conflicto como para tener que hacer una separación.
Inyección de dependencias
En los constructores de los use cases, hago uso intensivo de inyección de dependencias, más para ganar en testeabilidad que en cambiabilidad de la infraestructura. Esto es que en lenguajes de tipado estático, en los constructores normalmente se espera la inyección de una dependencia de una clase y no de una interfaz. El esfuerzo que sí trato de hacer al inyectar esas clases a los use cases, es no acoplarme a nivel de naming de clases y métodos sobre la implementación.
En algunas ocasiones, esta inyección la he mantenido manualmente y otras a través de algún framework de IoC, dependiendo principalmente de si el framework de desarrollo lo trae de serie o si la base de código es aún manejable sin ello.
Eventos (opcional)
En casos donde desde el inicio se observa que existen muchos side-effects en un producto tiendo a introducir eventos de dominio, seguramente no para todos los use cases, pero al menos sí los más relevantes. Pistas para introducirlos pueden ser necesidades relacionadas con: auditoría, distintos tipos de notificaciones, desacoplar la comunicación con otros módulos o sistemas, instrumentar behavioral analytics en el backend, etc.
Conclusiones
El mero hecho de usar o no Ports & Adapters no es relevante para que el producto tenga éxito, pero la capacidad de iterar rápido el producto es crítica.
Dentro de que nunca vamos a tener certezas, en momentos donde estamos buscando Product-Market fit a nivel técnico normalmente deberíamos ir hacia lo más seguro y conocido por parte del equipo. Bastantes riesgos existen en esos contextos como para asumir más.
Ya sea un estilo de arquitectura completamente acoplado a un framework, de Ports & Adapters o se quede en algún punto intermedio para desarrollar un producto de software, lo que considero innegociable para iterar rápido es acompañarlo de otras 3 prácticas técnicas:
- Hacer testing automático, al menos unitario y de integración de forma bastante intensiva para tener confianza en los cambios y poder iterar más rápido.
- Tener automatizado el pipeline de entrega y que lo pueda hacer cualquiera en el equipo, ya sea pulsando un botón o con un push en el sistema de control de versiones.
- Preparar un mínimo de telemetría técnica y de producto, para saber de forma temprana si han surgido problemas en producción a partir de un cambio y poder analizar cómo es el comportamiento de quiénes están usando el producto.
Blog Bitix
Compro un soporte de monitor para ganar espacio en la mesa
enero 20, 2024 06:00
Finalmente he adquirido un soporte de monitor junto con unas bandejas para regletas y enchufes. Ha sido una gran mejora inmediata para ganar espacio y organización de mi mesa. Ahora tengo mucha más comodidad y una mesa en la que puedo dejar muchos más elementos si necesito para la tarea que realice. Un soporte de monitor es algo a comprar adicionalmente al monitor pero el espacio liberado en la mesa lo vale.
Navegapolis
¿Por qué le llaman Agilidad cuando quieren decir lo de siempre?
enero 17, 2024 11:56
Hay titulares que se pasan de frenada, como el del libro del mismísimo Jeff Sutherland: “Scrum: el arte de hacer el doble de trabajo en la mitad de tiempo“.
Llamativo y tentador, porque ¿Quién no desea cuadruplicar la productividad?
¿Por qué vender una idea equivocada de la agilidad?
¿Para vender más libros?
Es verdad que los equipos ágiles alcanzan niveles altos de productividad, calidad y creatividad, pero esta no es la finalidad de la agilidad, sino la consecuencia. La finalidad es crear ambientes de trabajo en los que las personas trabajen motivadas y comprometidas.
La agilidad es para los que quieren equipos que disfruten construyendo productos increíbles o brindando servicios de primera. Personas que encuentran plenitud en su trabajo, no sólo un cheque a fin de mes.
Querer las consecuencias de la agilidad —hacer el doble en la mitad de tiempo— sin un interés real en el desarrollo y plenitud de las personas acaba rompiendo la magia: la motivación y el compromiso. Es como querer una pareja para obtener su dinero, sus cuidados o sus favores.
La entrada ¿Por qué le llaman Agilidad cuando quieren decir lo de siempre? se publicó primero en Navegápolis.
Una sinfonía en C#
Cómo crear una imágen de Docker sin tener Docker instalado gracias a Azure
enero 16, 2024 12:00
Introducción
Todos nos hemos encontrado en la encrucijada de tener que crear una imagen de Docker y no tener Docker instalado en nuestro equipo. En este post vamos a ver cómo podemos crear una imagen de Docker sin tener Docker instalado en nuestro equipo utilizando una cuenta de Azure.
El problema
Primero necesitamos una cuenta de Azure y una instancia de Azure Container Registry a la que tengamos acceso. La idea es que teniendo el código o el binario, lo que queramos meter en la imagen (Sea lo que sea, multistae o no) y el Dockerfile podemos utilizar la capacidad de Azure Container Registry de crear una imagen a partir de un Dockerfile.
Importante, nuestro código o binario subirán a la nube durante el proceso
Entonces, teniendo ya el código o binario y el Dockerfile, vamos a crear la imagen.
Pasos para crear la imagen y subirla al ACR
Antes de nada tenemos que tener (además de la cuenta de Azure y el ACR) instalado el Azure CLI. Lo podemos descargar desde aquí
- Hacer login en Azure
- Seleccionar la suscripción donde tenemos el ACR
- Crear la imagen
az login
az account set --subscription KKKKKK-KKKK-KKKK-KKKK-KKKKKKKKK
az acr build --registry miurl.azurecr.io -f Dockerfile --image test:latest .
como vemos el comando acr build es idéntico al docker build, pero en vez de utilizar el contexto local, lo hace en la nube.
Y como dije antes, tomará un tiempo porque subirá el código o binario a la nube y luego creará la imagen.
Una vez que termine, podemos ver la imagen en el ACR.
Enjoy!
Blog Bitix
Hemeroteca #23
diciembre 22, 2023 05:00
Este complicado año 2023 termina con varios cambios en el blog y a nivel personal. El blog ha bajado en gran medida las visitas e ingresos por publicidad AdSense y en el que he dejado de publicar artículos con un calendario fijo semanal.
Juanjo Navarro
We're hiring!
noviembre 30, 2023 07:59
Genial esta parodia de una oferta de trabajo:
We work only with the very latest technologies, frameworks and languages. At least that’s what we claim and it doesn’t matter if there’s zero correlation to our actual product: […] It’s purely functional Web Assembly all the way to the core neural network running the heart of what’s essentially an imageboard with nicer design.
Our development toolchain is exclusively open source. This naturally doesn’t apply to our own product, because we love money. However, we do encourage all our employees to give back to the FOSS community – they just have to do it on their own free time. We’re not completely stupid.
Y sobre el proceso de selección:
A lengthy recruitment process which will take up significant amounts of your spare time, except for the interviews. We always interview on prem and during office hours.
IQ tests and bizarre questions designed to trap you in logical cul-de-sacs while simultaneously having nothing at all to do with programming or relevant domain-specific knowledge.
Blog Bitix
Desempaquetado de lector de libros electrónico Amazon Kindle Paperwhite (11ª generación)
noviembre 09, 2023 08:00
Una parte del tiempo libre que dispongo la dedico a la lectura, de novelas y libros técnicos principalmente. Tras tener un Kindle Touch del 2012 y venderlo me he vuelto a comprar un Kindle Paperwhite de 11ª generación. Tras casi 10 años de diferencia entre ambos dispositivos las mejoras técnicas entre ambos dispositivos son notables, teniendo el Paperwhite una pantalla mucho mejor e iluminación entre otros añadidos que hacen del Paperwhite un salto grande y merezca el cambio de dispositivo.
Blog Bitix
Desempaquetado de lector de libros electrónico Amazon Kindle Paperwhite
noviembre 09, 2023 08:00
Una parte del tiempo libre que dispongo la dedico a la lectura, de novelas y libros técnicos principalmente. Tras tener un Kindle Touch del 2012 y venderlo me he vuelto a comprar un Kindle Paperwhite de 11ª generación. Tras casi 10 años de diferencia entre ambos dispositivos las mejoras técnicas entre ambos dispositivos son notables, teniendo el Paperwhite una pantalla mucho mejor e iluminación entre otros añadidos que hacen del Paperwhite un salto grande y merezca el cambio de dispositivo.
Metodologías ágiles. De lo racional a la inspiración.
Scrum master a tiempo completo: 42 Tareas
octubre 26, 2023 09:11
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