#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: