Translate

jueves, 8 de julio de 2021

EBOOK Gratuito : Real-Time APIs: Design, Operation, and Observation

 


Miren lo que encontré en infoQ : 


EBOOK

Real-Time APIs: Design, Operation, and Observation

Download this free eMagazine from NGINX on effective planning, architecture, and deployment of APIs for reliable flexibility.

DOWNLOAD FOR FREE

Si, se que quedo medio feita las letras, pero bueno...

Dejo link : https://www.nginx.com/resources/library/real-time-api-design-operation-observation/?utm_medium=paid-display&utm_source=infoq&utm_campaign=ww-nx_rtapi&utm_content=eb-sponsoredupdate#download

martes, 6 de julio de 2021

Diferencia entre Null y String vació en C#


Una cadena vacía es una instancia de un objeto System.String que contiene cero caracteres. Las cadenas vacías se utilizan a menudo en varios escenarios de programación para representar un campo de texto en blanco. Puede llamar a métodos en cadenas vacías porque son objetos System.String válidos. Las cadenas vacías se inicializan de la siguiente manera: string s = String.Empty;

Por el contrario, una cadena nula no se refiere a una instancia de un objeto System.String y cualquier intento de llamar a un método en una cadena nula provoca una NullReferenceException. Sin embargo, puede utilizar cadenas nulas en operaciones de concatenación y comparación con otras cadenas. Los siguientes ejemplos ilustran algunos casos en los que una referencia a una cadena nula hace y no provoca que se lance una excepción:


Las operaciones de cadenas en .NET están altamente optimizadas y, en la mayoría de los casos, no afectan significativamente el rendimiento. Sin embargo, en algunos escenarios, como bucles  que se ejecutan cientos o miles de veces, las operaciones de cadenas pueden afectar el rendimiento. La clase StringBuilder crea un búfer de cadenas que ofrece un mejor rendimiento para estos casos. La cadena StringBuilder también le permite reasignar caracteres individuales, algo que el tipo de datos de cadena incorporado no admite. 

Web API en F# y .net 5

Vamos a hacer una web Api con F# y Entity Framework. 

Primero hacer la web Api e instalar Entity Framework. 

dotnet new webapi --language "F#"

dotnet add package Swashbuckle.AspNetCore --version 5.6.3

dotnet new tool-manifest

dotnet tool install dotnet-ef

dotnet tool install paket

dotnet paket convert-from-nuget

dotnet paket add Microsoft.EntityFrameworkCore.Sqlite

dotnet paket add EntityFrameworkCore.FSharp

code  .


Ahora creamos el modelo: 

Hice un archivo Prueba.fs : 

namespace webAPIFsharp

open System

[<CLIMutable>]
type Prueba =
{ Id: int
Name : string
Summary: string }

Y hacemos el dbcontext : 

namespace webAPIFsharp

open System.ComponentModel.DataAnnotations
open Microsoft.EntityFrameworkCore
open EntityFrameworkCore.FSharp.Extensions

type ApiDbContext() =
inherit DbContext()

[<DefaultValue>]
val mutable pruebas : DbSet<Prueba>

member public this.Pruebas with get() = this.pruebas
and set p = this.pruebas <- p

override _.OnModelCreating builder =
builder.RegisterOptionTypes() // enables option values for all entities

override __.OnConfiguring(options: DbContextOptionsBuilder) : unit =
options.UseSqlite("Data Source=base.db") |> ignore

Ahora debemos indicar que compile estas clases agregando estas entradas en el fsproj : 

<Compile Include="Prueba.fs" />
<Compile Include="ApiDbContext.fs" />

Luego compilamos 

dotnet build

Si funciona debemos hacer la migración : 

dotnet ef migrations add Initial

Y ahora agregamos la migración a fsproj :

<Compile Include="Migrations/*.fs" />

Y ahora creamos la base : 

dotnet ef database update

Y ahora agregamos el context a el Startup.fs : 

// Configure EF
services.AddDbContext<ApiDbContext>() |> ignore

Y luego hacemos el controler : 

namespace webAPIFsharp.Controllers

open System
open System.Collections.Generic
open System.Linq
open System.Threading.Tasks
open Microsoft.EntityFrameworkCore
open Microsoft.AspNetCore.Mvc
open Microsoft.Extensions.Logging
open webAPIFsharp

[<ApiController>]
[<Route("[controller]")>]
type PruebaController (logger : ILogger<PruebaController>,
dbContext : ApiDbContext) =
inherit ControllerBase()


[<HttpGet>]
member _.Get() = ActionResult<IEnumerable<Prueba>>(dbContext.Pruebas)

[<HttpPost>]
member _.PostSync(prueba:Prueba) =
dbContext.Pruebas.Add prueba |> ignore
dbContext.SavedChanges |> ignore


[<HttpPost("async")>]
member _.PostAsync(entity: Prueba) =
async {
dbContext.Pruebas.AddAsync(entity) |> ignore
let! _ = dbContext.SaveChangesAsync true |> Async.AwaitTask
return entity
}

[<HttpGet("{id}")>]
member _.getById id =
dbContext.Pruebas
|> Seq.tryFind (fun f -> f.Id = id)

Y listo! 

dotnet run

Yo agregue swagger para mayor detalles dejo link de github: 

https://github.com/emanuelpeg/FsharpWebApiExample


sábado, 3 de julio de 2021

Clases y métodos genéricos en C#


Generics introduce el concepto de parámetros de tipo en .NET, lo que hace posible diseñar clases y métodos que difieren la especificación de uno o más tipos hasta que la clase o método sea declarado e instanciado por el código del cliente. Veamos un ejemplo: 


Las clases y métodos genéricos combinan la reutilización, la seguridad de tipos y la eficiencia de una manera que sus contrapartes no genéricas no pueden. Los genéricos se utilizan con mayor frecuencia con las colecciones y los métodos que operan en ellas. El espacio de nombres System.Collections.Generic contiene varias clases de colección basadas en genéricos. Las colecciones no genéricas, como ArrayList, no se recomiendan y se mantienen por motivos de compatibilidad.

Veamos un ejemplo: 



Un método declarado con los parámetros de tipo para su tipo o parámetros de retorno se denomina método genérico.



Los métodos AddorUpdate () y GetData () son métodos genéricos. El tipo de datos real del parámetro del elemento se especificará en el momento de instanciar la clase DataStore <T>, como se muestra a continuación.


Una clase no genérica puede incluir métodos genéricos especificando un parámetro de tipo entre paréntesis angulares con el nombre del método, como se muestra a continuación.


viernes, 2 de julio de 2021

DateTime en C# parte 2


 Seguimos con: https://emanuelpeg.blogspot.com/2021/07/datetime-en-c.html

La estructura DateTime incluye los siguientes métodos para convertir una fecha y hora en una cadena.

Método

Descripción

ToString

Convierte un valor DateTime en una cadena en el formato especificado de la referencia cultural actual. Permite pasar el formato de fecha por parámetros.

ToShortDateString

formato M/d/yyyy

ToShortTimeString

formato h:mm:ss

ToLongDateString

formato dddd, MMMM d, yyyy

ToLongTimeString

formato h:mm:ss tt




Veamos un ejemplo: 



Una cadena de fecha y hora válida se puede convertir en un objeto DateTime usando los métodos Parse (), ParseExact (), TryParse () y TryParseExact ().

Los métodos Parse () y ParseExact () generarán una excepción si la cadena especificada no es una representación válida de una fecha y hora. Por lo tanto, se recomienda usar el método TryParse () o TryParseExact () porque devuelven falso si una cadena no es válida. 

Veamos un ejemplo: 




jueves, 1 de julio de 2021

The Complete NGINX Cookbook

Ma llego este mail con un libro gratuito : 

NGINX Cookbook

Level up on NGINX with this free O'Reilly eBook, updated for 2021. Get sample configurations for the most popular NGINX deployments: load balancing, caching, security, cloud deployment, automation, containers and microservices, high availability, performance tuning, and more.

In this ebook you will learn:

  • Solutions for more than 100 real‑world application delivery use cases, presented as easy-to-follow recipes
  • How to protect your applications with NGINX App Protect, plus configurations for mitigating DDoS attacks, stopping Layer 7 attacks, and enabling single sign‑on with OpenID Connect
  • How to configure NGINX for features like gRPC, microservices and containers, API gateways, and more
  • About using NGINX Controller to optimize your NGINX deployment

DateTime en C#


 C # incluye la estructura DateTime para trabajar con fechas y horas. Para utilizarlo solo es necesario construirlo de la siguiente manera : 

DataTime dt = new DataTime()

El valor predeterminado y más bajo de un objeto DateTime es el 1 de enero de 0001 00:00:00 (medianoche). El valor máximo puede ser el 31 de diciembre de 9999 a las 11:59:59 p.m.

La estructura DateTime incluye campos, propiedades y métodos estáticos. El siguiente ejemplo muestra propiedades y campos estáticos:

Con DateTime.Now obtenemos la fecha y la hora actual y con DateTime.Today el día actual. Utc es tiempo universal coordinado que tiene la maquina según su configuración.

TimeSpan es una estructura que se utiliza para representar el tiempo en días, horas, minutos, segundos y milisegundos.


La estructura DateTime sobrecarga los operadores +, -, ==,! =,>, <, <=,> = Para facilitar la suma, resta y comparación de fechas. Estos facilitan el trabajo con fechas.





martes, 29 de junio de 2021

Que es .NET MAUI?


 .NET MAUI en la interfaz de usuario o UI de aplicación multiplataforma .NET. Es un framework multiplataforma para crear aplicaciones nativas de escritorio y móviles con C # y XAML. Con .NET MAUI, puede desarrollar aplicaciones que pueden ejecutarse en Android, iOS, macOS y Windows desde una única base de código compartida.

La pregunta que se me ocurre, luego de ser contestada la del titulo, es como se pronuncia en castellano? dotnetMiau? jeje

.NET MAUI es de open source y es la evolución de Xamarin.Forms, extendido desde escenarios móviles a de escritorio, con controles de IU reconstruidos desde cero para rendimiento y extensibilidad. 

Con .NET MAUI, puede crear aplicaciones multiplataforma con un solo proyecto, pero puede agregar código fuente y recursos específicos de la plataforma si es necesario. Uno de los objetivos clave de .NET MAUI es permitirle implementar la mayor cantidad posible de la lógica de la aplicación y el diseño de la interfaz de usuario en una única base de código.

Dejo link: https://github.com/dotnet/maui

domingo, 27 de junio de 2021

StringBuilder en C#

StringBuilder, Representa una cadena mutable. Esta clase no puede heredarse.

StringBuilder es un objeto que permite el manejo de string sin consumir tanta memoria. Normalmente se utiliza como un buffer donde podemos acumular string, dado que este objeto es mutable, utiliza menos memoria que un string. 


La propiedad StringBuilder.Length indica el número de caracteres que contiene actualmente el objeto StringBuilder. Si agrega caracteres al objeto StringBuilder, su longitud aumenta hasta igualar el tamaño de la propiedad StringBuilder.Capacity, que define el número de caracteres que puede contener el objeto. Si el número de caracteres agregados hace que la longitud del objeto StringBuilder exceda su capacidad actual, se asigna nueva memoria, se duplica el valor de la propiedad Capacity, se agregan nuevos caracteres al objeto StringBuilder y se ajusta su propiedad Length. La memoria adicional para el objeto StringBuilder se asigna dinámicamente hasta que alcanza el valor definido por la propiedad StringBuilder.MaxCapacity. Cuando se alcanza la capacidad máxima, no se puede asignar más memoria para el objeto StringBuilder e intentar agregar caracteres o expandirlo más allá de su capacidad máxima arroja una excepción ArgumentOutOfRangeException o una excepción OutOfMemoryException.

El siguiente ejemplo ilustra cómo un objeto StringBuilder asigna nueva memoria y aumenta su capacidad dinámicamente a medida que se expande la cadena asignada al objeto. El código crea un objeto StringBuilder llamando a su constructor predeterminado (sin parámetros). La capacidad predeterminada de este objeto es de 16 caracteres y su capacidad máxima es de más de 2 mil millones de caracteres. Añadiendo la cadena "Esta es una oración". da como resultado una nueva asignación de memoria porque la longitud de la cadena (19 caracteres) excede la capacidad predeterminada del objeto StringBuilder. La capacidad del objeto se duplica a 32 caracteres, se agrega la nueva cadena y la longitud del objeto ahora es igual a 19 caracteres. Luego, el código agrega la cadena "Esta es una oración adicional". al valor del objeto StringBuilder 11 veces. Siempre que la operación de agregar hace que la longitud del objeto StringBuilder exceda su capacidad, su capacidad existente se duplica y la operación de agregar tiene éxito.



Y el resultado será : 


StringBuilder provee un conjunto de constructores que permiten crear un objeto StringBuilder a partir de un string o podemos utilizar un constructor vació. Y también cuenta con un constructor que permite definir sus propiedades. 

StringBuilder provee un conjunto de métodos para acumular strings, metodo Append y para transformar un StringBuilder a string utilizamos el método ToString



sábado, 26 de junio de 2021

Python Programming Cookbook eBook

 Dear fellow geek,


in case you haven't done already, check out our ebook on the Python Programming Cookbook. You can access it for FREE here.

Python Programming Cookbook eBook


Python is a widely used high-level, general-purpose, interpreted, dynamic programming language. Its design philosophy emphasizes code readability, and its syntax allows programmers to express concepts in fewer lines of code than would be possible in languages such as C++ or Java. The language provides constructs intended to enable clear programs on both a small and large scale.

Python supports multiple programming paradigms, including object-oriented, imperative and functional programming or procedural styles. It features a dynamic type system and automatic memory management and has a large and comprehensive standard library.

In this ebook, we provide a compilation of Python examples that will help you kick-start your own projects. We cover a wide range of topics, from multi-threaded programming to web development with Django. With our straightforward tutorials, you will be able to get your own projects up and running in minimum time.

 

viernes, 25 de junio de 2021

Métodos de String en C#

String tiene diferentes métodos que permiten interactuar con él y nos facilitan el desarrollo, veamos un ejemplo : 


Además podemos  acceder de modo solo lectura a caracteres individuales con la notación [] , como en el siguiente ejemplo:


Se acuerdan de javaFx??


Tal vez ustedes son muy jóvenes pero hace tiempo existió una tecnología llamada imagen de vector que inundó la web, de forma muy rápida fue adoptada por los principales proveedores de software como la manera de hacer interfaces y muy muy rápidamente fue olvidada y remplazada por HTML 5. 

De esta historia (de terror para muchas empresas) nace JavaFx que fue un framework que no solo aposto por una tecnología a punto de morir, sino que llego muy tarde al mercado. 

Pero no todo es tristeza en esta historia, la tecnología de imagen de vector es super interesante y se puede utilizar en el escritorio. 

Por ende no todo esta perdido y JavaFx puede ser una opción para algunos nichos. 

JavaFx fue donada a la comunidad por parte de oracle y ahora se encuentra en la web : https://openjfx.io/

Les cuento que tenia pensado hacer un post más largo y más lindo pero cuesta mucho o bastante que en internet es mucho, encontrar un ejemplo cerrado. Pero bueno, el que busca encuentra y acá hay un repositorio con muchos ejemplos : https://github.com/jjenkov/javafx-examples/

Veamos uno : 

import javafx.application.Application;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.layout.VBox;

import javafx.stage.Stage;


/**

 * Shows a simple JavaFX Button - and prints a text when the button is clicked.

 */

public class ButtonExample extends Application {


    public static void main(String[] args) {

        launch(args);

    }


    @Override

    public void start(Stage primaryStage) {

        Button button = new Button();

        button.setText("Click me!");

        button.setOnAction((event) -> {

            System.out.println("Button clicked!");

        });

        VBox vbox = new VBox(button);

        Scene scene = new Scene(vbox);

        primaryStage.setScene(scene);

        primaryStage.show();

    }

}

Como se puede ver más allá de un conjunto de detalles es muy parecida a una aplicación swing o SWT. 


lunes, 21 de junio de 2021

Convertir desde String a otros tipos en C#

C# provee una clase Convert que permite convertir string a números. La siguiente tabla enumera algunos de los métodos de la clase Convert que puede usar para convertir una cadena en un número.

Veamos un ejemplo de uso de estos métodos:



Para pasar un tipo a string tenemos el método ToString y si el casteo es implícito C# utilizará este método.

Formatear Cadenas en C#


Un String.Format  es una cadena cuyo contenido se determina dinámicamente en tiempo de ejecución. String.Format se crean incrustando expresiones interpoladas o marcadores de posición dentro de llaves dentro de una cadena. Todo lo que esté dentro de las llaves ({...}) se resolverá en un valor y se mostrará como una cadena formateada en tiempo de ejecución. Hay dos métodos para crear String.Format : interpolación de cadenas y formateo compuesto.



Disponible en C # 6.0 y versiones posteriores, las cadenas interpoladas se identifican mediante el carácter especial $ e incluyen expresiones interpoladas entre llaves. 

La interpolación de cadenas logra los mismos resultados que el método String.Format, pero mejora la facilidad de uso y la claridad en línea.



String.Format utiliza marcadores de posición entre llaves para crear una cadena de formato. Este ejemplo da como resultado una salida similar al método de interpolación de cadenas utilizado anteriormente.


sábado, 19 de junio de 2021

Paquetes EF Core NuGet

 

Entity Framework Core (EF Core) se instala con paquetes NuGet.  El proceso habitual para instalar paquetes es:

  • Decidir sobre un proveedor de base de datos e instalar el paquete apropiado 
  • Instalar Microsoft.EntityFrameworkCore y Microsoft.EntityFrameworkCore.Relational si utiliza una base de datos relacional. Esto ayuda a garantizar que se utilicen versiones coherentes y también significa que NuGet le informará cuando se envíen nuevas versiones de paquetes.
  • Opcionalmente, decidir qué tipo de herramientas necesita e instale los paquetes apropiados para eso.

Asegúrese de instalar la misma versión de todos los paquetes EF Core enviados por Microsoft. Por ejemplo, si está instalada la versión 5.0.3 de Microsoft.EntityFrameworkCore.SqlServer, todos los demás paquetes Microsoft.EntityFrameworkCore. * También deben estar en 5.0.3.

También asegúrese de que los paquetes externos sean compatibles con la versión de EF Core que se esté utilizando. En particular, verifique que el proveedor de la base de datos externa sea compatible con la versión de EF Core que está utilizando. Las nuevas versiones principales de EF Core generalmente requieren un proveedor de base de datos actualizado.