#Net5 – C#9 “Init-only properties” are super cool 🆒🆒🆒

Buy Me A Coffee

Hi !

So this one does not fit in the line “readability improvement”, however is a nice step in order to write cleaner code. Yes, I know that doesn’t make sense, let me try to explain.

Let’s start with a simple class with 2 properties. Interesting enough the property Age has a new accessor [init] to describe the property as a read-only property:

class Pet
{
  public string Name { get; set; }
  public int Age { get; init; }
}

When we create a new Pet object, we can set the initial value of Age on the construction of the object (object initialization), and that’s it. Otherwise we will get this amazing error.

Error CS8852 Init-only property or indexer 'Program.Pet.Age' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor. 
Csharp9 init only properties

Until C#9, the properties in a class need to be mutable in order to support Object Initialization. And that means some extra code in the property-set definition in order to support read-only properties. Now in C# 9, this is solved with the [init] accessor 😁😁😁

I like this new one 👆 ! Not a great readability improvement, but it saves us a lot of extra code.

Happy coding!

Greetings

El Bruno

References

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#LemonCode 🍋- Pasarelas de pago I – Conceptos

Buy Me A Coffee

Introducción

Si queremos montar un sitio de comercio electrónico, una de las áreas críticas a cubrir es la de gestionar pagos online, no te puedes arriesgar a que:

  • Tus clientes no confíen en tu sitio.
  • Un hacker te robe números de tarjetas de crédito.
  • Un hacker realice compras con tarjetas fraudulentas.


Vamos a ver una solución con un coste de implementación y mantenimiento razonables para negocios pequeños y medianos: las pasarelas de pago.


En este primer post cubriremos conceptos básicos, tomando como referencia la solución de pago Stripe y su pasarela, en siguientes artículos montaremos ejemplos de integración reales.

TL;DR;

Manejar tarjetas de crédito por nuestra cuenta es algo muy delicado, cómo poco tienes que cumplir con el estándar PCI DSS, lo más cómodo para arrancarnos es utilizar una solución de pago que nos ofrezca una pasarela que se encargue de todo y el número de tarjeta no pase en ningún momento por nuestra aplicación.

Cómo suelen funcionar:

  • El usuario navega a mi página y le da al botón de pagar.
  • Esto hace un post a nuestro servidor, generamos la información del pedido, añadiendo información que garantiza que lo hemos generado nosotros.
  • En nuestro BackEnd nos comunicamos con el BackEnd de la solución de pago, le enviamos la información necesaria, y este nos da un identificador de sesión.
  • Volvemos a cliente, pasándole el id de sesión, y aquí redirigimos al usuario a la de pasarela de la solución de pago pasándole el session id (el usuario ve cómo en su navegador va a otro dominio: paypal, stripe, braintree, servired…)
  • Una vez procesado el pago, la pasarela vuelve a redirigir a una página de nuestro sitio: dependiendo de si la operación ha tenido éxito redirige a una de OK (success) o a una de KO (error).
  • ¿Cómo sé si en mí BackEnd si la operación ha ido bien? La misma pasarela conecta con un web hook de nuestra aplicación web (un endpoint de mi api) y nos envía la información cuando la operación ha finalizado.

¿Cómo me puedo asegurar que las peticiones vienen de la solución de pago que tengo contratada? Para ello comparto un secreto con la misma y puedo validar que las peticiones vienen de mi solución de pago y no de un impostor.

¿Quieres saber más en detalle cómo funciona? Sigue leyendo… 🙂

Happy coding!

Greetings

El Bruno

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#Net5 – C#9 logical operators “is” and “is not” are super cool 🆒🆒🆒

Buy Me A Coffee

Hi !

In the line of good features, that are also nice to read, the new use of is and is not is a huge improvement in readability.

As usual, old school validation for objects and types:

// old school
if(!(testObj is MyClass)) {...}

And now, we can type the validation with some style:

// C# 9 style
if(testObj is not MyClass) {...}

I like this new one 👆, now null / not null and other validations will be the same. With an improed readability !

Happy coding!

Greetings

El Bruno

References

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#Net5 – C#9 target-typed new expressions are super cool 🆒🆒🆒

Buy Me A Coffee

Hi !

I know I’m late to the party here, however I’m still enjoying some of the new C# 9 features a lot. I just realized that now, I can create objects in a different way, which is still super clear to read.

Disclaimer: some of the new features are cool, however my gut told me that they will make code harder to read. I also understand that I have 20 years of writing C# code in my back, so I need to find the balance here.

As usual, 2 lines of code are the best way to showcase this:

// old school
var pointOldSchool = new System.Drawing.Point(3, 5);

// new school and still very readable
System.Drawing.Point pointCSharpNine = new(3, 5);

// crappy output
Console.WriteLine("Old School: var pointOldSchool = new System.Drawing.Point(3, 5);");
Console.WriteLine(pointOldSchool);

Console.WriteLine("C#9: System.Drawing.Point pointCSharpNine = new(3, 5);");
Console.WriteLine(pointCSharpNine);

This this output as expected:

Old School: var pointOldSchool = new System.Drawing.Point(3, 5);
{X=3,Y=5}
C#9: System.Drawing.Point pointCSharpNine = new(3, 5);
{X=3,Y=5}

I like this new one 👆

Happy coding!

Greetings

El Bruno

References

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

Publicando una Vue.js app en Azure Static Web Apps

Buy Me A Coffee

Azure ofrece (En modo preview en este momento) un servicio orientado a exponer sitios web (SPA) de una manera fácil y rápida. Este servicio es completamente gratuito en este momento y esto te va permitir sacarle jugo este servicio.

En este momento Azure Static Web Apps ofrece también integración continua con Github Actions lo que permite el despliegue continuo de nuestros sitios con una configuración bastante sencilla.

Dentro del portal de Azure vamos a encontrar el servicio de Static Web Apps (Preview) o en español

Ingresamos y creamos una nueva Static Web App.

Vamos a llenar la información general, la suscripción y grupo de recursos que queremos para este servicio

Luego vamos autorizar a Github para acceder a nuestros repos y escoger el que queramos para exponer en este servicio.

Lee el post completo aquí

Happy coding!

Greetings

El Bruno

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#Podcast – NTN 76 – Feliz Año Nuevo 🎉 con todas las novedades de #Net5 !

Buy Me A Coffee

Buenas!

Feliz Año Nuevo 🎉🎉🎉, empezamos el año dando un repaso a todas las novedades de Net 5 con el gran amigo Miguel Teheran. Comentamos un poco la historia de Net y como Net 5 es el primer paso para la unificación de todos los .Net Frameworks que conocemos.

También hablamos un poco de los lenguajes, de las novedades de C#9, del estado de F# y del pobre VB.Net, donde todos coincidimos que está un poco abandonado.

Gracias y felices fiestas !

Speakers

  • Miguel Teheran es Developer and Software Consultant (LinkedIn)
  • Juan Carlos Quijano Abad es Microsoft Certified Trainer, Arquitecto de Soluciones en Azure, Consultor independiente en implantación de DevOps (LinkedIn)
  • Bruno Capuano es Canada Innovation Lead at Avanade and Microsoft AI MVP (LinkedIn)

Ir a descargar

Resources

Happy coding!

Greetings

El Bruno

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#Net5 – C#9 “records”, “with” and “this”, a super cool mix 🆒🆒🆒

Buy Me A Coffee

Hi !

Our next podcast episode is focused on .Net 5. We had an amazing chat around a lot of features, and of course, C# 9 was part of the conversation.

I got this amazing post [C# 9.0: Records – Work With Immutable Data Classes] from Tomas Huber, in my reading notes and working with records is something that I wanted to test.

In a few words, a record is an immutable class. Which is super cool, because it allows some cool operations for mapping, reflection and more. Again, please read Tomas post.

On of the features of records is that once, you define a record with a constructor, there is no default constructor anymore. Let’s start with a simple person record with 3 properties for Name, Age and Married status (as boolean)

public record PersonRecord(string Name, int Age, bool Married)
{
    public override string ToString() => 
        $"Name: {Name} - Age: {Age} - Married: {Married}";
}

Losing the default constructor can be a challenge if we want to copy a record. However we can take advantage of the with expression and create new objects that uses the protected copy constructor. Let’s take a look at the same person object with a CopyUsingMarriedTrue() function that, creates a new object with the same properties changing the value of the Married property.

public record PersonRecord(string Name, int Age, bool Married = false)
{
    public Guid Id { get; init; } = Guid.NewGuid();
    public override string ToString() => 
        $"Name: {Name} - Age: {Age} - Married: {Married} - Guid: {Id}";

    public PersonRecord CopyUsingMarriedTrue() => this with { Married = true };
}

Now it’s time for a full Console test, where I create a couple of persons and check the values of the person. Important, I added a Guid Id property to test the copy and constructor behavior.

  • Lines 14 to 18, I created a Bruno person with Married as True, and I created a BrunoMarried to check the new created object.
  • Lines 20 to 25, I created a Valentino person with Married as False and I created a ValentinoMarried to check the new created object.
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("start");
var bruno = new PersonRecord("Bruno", 40, true);
Console.WriteLine($"{bruno.ToString()}");
Console.WriteLine($"Bruno Is Married created");
var brunoMarried = bruno.CopyUsingMarriedTrue();
Console.WriteLine($"{brunoMarried }");
Console.WriteLine($"———————————–");
var valentino = new PersonRecord("Valentino", 13, false);
Console.WriteLine($"{valentino.ToString()}");
Console.WriteLine($"Valentino Is Married created");
var valentinoMarried = valentino.CopyUsingMarriedTrue();
Console.WriteLine($"{valentinoMarried}");
}
}
public record PersonRecord(string Name, int Age, bool Married = false)
{
public Guid Id { get; init; } = Guid.NewGuid();
public override string ToString() => $"Name: {Name} – Age: {Age} – Married: {Married} – Guid: {Id}";
public PersonRecord CopyUsingMarriedTrue() => this with { Married = true };
}
}

The output is an awesome surprise. I mean, my code always surprise me, however using this feature is an awesome surprise !

start
Name: Bruno - Age: 40 - Married: True - Guid: 82e60022-0fb2-456d-89c0-ab88bef5aff6
Bruno Is Married created
Name: Bruno - Age: 40 - Married: True - Guid: 82e60022-0fb2-456d-89c0-ab88bef5aff6
-----------------------------------
Name: Valentino - Age: 13 - Married: False - Guid: 7acca9e2-f461-4fc9-8e29-06f6f0ffb6c6
Valentino Is Married created
Name: Valentino - Age: 13 - Married: True - Guid: 7acca9e2-f461-4fc9-8e29-06f6f0ffb6c6
csharp 9 with and records

Happy coding!

Greetings

El Bruno

References

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

Desplegando Data Factory Pipelines en Microsoft Azure

Alb3rto Alonso

En este artículo vamos a describir en detalle los pasos a seguir para completar el despliegue automático de pipelines de Azure Data Factory en los entornos de Desarrollo (dev), Staging (stg) y Producción (prd). En desarrollo de software, el uso de la integración (CI) y el despliegue continuo (CD) se realiza para liberar mejor código de un modo rápido. Esta posibilidad existe también para los ingenieros de datos que trabajan con Azure Data Factory. Es decir, tendremos la posibilidad de mover pipelines entre los distintos entornos. Además, trabajando de este modo, varias personas del equipo podrán estar trabajando al mismo tiempo sobre el mismo data pipeline. En este caso, vamos a trabajar en un ejemplo de automatización del despliegue desde dev hasta prd. Todo gracias a la integración de ADF con Azure DevOps Automation. Veamos cómo

La infraestructura necesaria para completar este proceso es

  • Azure Resource Group
  • Azure…

View original post 1,731 more words

#LemonCode – nodejs + TypeScript

Buy Me A Coffee

Introducción

Cuando desarrollamos en el lado de Front End, esta muy estandarizada la integración de TypeScript en nuestros proyectos, sea utilizando Babel + Webpack, o tirando de cli y plantillas.

Pero… ¿Y en una aplicación nodejs? ¿Cómo podemos añadir soporte a TypeScript? Aquí no solemos tirar de Webpack, ni generamos bundles, en este post veremos que pasos tenemos que dar.

TL;DR;

Para integrar nodejs con TypeScript una buena combinación es:

  • Tirar de tsc (TypeScript) para ejecutar la validación de tipos (ver que no hay errores).
  • Usar _Babel_ para transpilar los ficheros ts a js.

De Babel usaremos:

  • @babel/node: para ir trabajando en local, es un sustituto del cli de nodejs (haciendo una analogía con webpack, es como si fuera nuestro webpack-dev-server).
  • babel: para cuando queramos hacer un build tener el código transpilado.

Si quieres utilizar alias puedes usar babel-plugin-module-resolver

Si quieres poder debuggear tus ficheros TypeScript puedes usar Visual Studio Code.


Si te planteas minificar ficheros puedes usar: babel-preset-minify


Puedes encontrar un ejemplo en este enlace: https://github.com/Lemoncode/node-typescript-babel-example

Si tienes ganas de ver cómo funciona en detalle sigue leyendo 👇👇👇

Post completo

Happy coding!

Greetings

El Bruno

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría:

#Net5 – Migrating a fully functional Windows Form app to Net 5 in 10 minutes !

Buy Me A Coffee

Hi !

TbVolScroll is a super cool project, take a look 👇

Simple utility to enable volume control when your mouse cursor is positioned above the taskbar.
Hold the left ALT key to enable precise volume control (decrease/increase volume by 1%). Standard volume step is 5%. The volume bar will follow the cursor when it’s moved.
By default, if the volume is lower than 10% precise volume control is automatically enabled.

TbVolScroll

Note: As far as I remember, this feature is available in other OS.

And thanks to his author the code of the tool is available in GitHub (see references).

The original project is a .Net Framework 4.7.2 project, so I decided to test how much time it will take to migrate the project to .Net 5. I didn’t perform a deep analysis of the source project, before start. This is my labs migration path

  • Create a new Windows Form Net 5 project named [TbVolScrollNet5]
  • Copy all the files from the original project, avoiding the .csproj file
  • Rebuild !

And it worked ! I mean, I fixed some namespaces, added a missing NuGet package and 10 minutes later it was working. Of course, I submitted a pull request with the migration project, in the meantime I will keep this local just for fun.

And I want to use it ! So now is the time to pack and publish a local version of the tool. I created a local publish profile and defined

  • Build in Release | Any CPU
  • Deployment as Self-Contained
  • Runtime win-x86
  • Produce as single file
  • Enable ReadyToRun compilation
tbvolscroll publish profile as self contained

And that’s it! 150 MB to a fully functional working app 👇😸👇

tbvolscroll published version

Now back to work, and in my next steps I’ll publish this as a clickonce app so it’s easy to distribute. And the perfect excuse to learn more about .Net 5 !

References

¿Con ganas de ponerte al día?

En Lemoncode te ofrecemos formación online impartida por profesionales que se baten el cobre en consultoría: