Translate

lunes, 10 de mayo de 2021

Delegate en C# parte 2


Seguimos con delegate en C# 

Un Multicast delegate es un delegado pero mantiene referencias a más de un método. Este tipo de delegado debe contener únicamente métodos que devuelvan un void, de otro modo se lanzará una excepción en tiempo de ejecución. Al invocar al delegado, se ejecutarán todos los métodos asociados en el mismo orden en el cual fueron agregados al delegado.

Para agregar métodos al delegado se emplea el operador  ‘+=’ y para eliminar métodos del delegado se emplea el operador ‘-=’. Un mismo método se puede añadir a un objeto delegado más de una vez. Veamos un ejemplo: 

using System;

 public delegate void MiDelegadoMultiCast(int i); 

public class Test

{

  public static void Main()

  {

    MiClase miClase = new MiClase();

    // instanciamos un delegado. Observa que el método MiMetodo1 de la clase 

    // MiClase cumple con la firma definida en el delegado

    MiDelegadoMultiCast delegado = miClase.MiMetodo1;

    delegado(83); // Se hace la llamada al delegado

    // agregamos ahora el Metodo2 

    delegado += miClase.MiMetodo2;

    // Se hace la llamada al delegado y se ejecutarán en orden secuencial ambos métodos

    delegado(55); 

    // eliminamos ahora el Metodo1 

    delegado -= miClase.MiMetodo1;

    // Se hace la llamada al delegado y se ejecutará únicamente el Método2

    delegado(14); 

  }

}

  

public class MiClase

{

  public void MiMetodo1(int i)

  {

    Console.WriteLine("El valor pasado al METODO1 como parámetro es: {0}", i);

  }

  public void MiMetodo2(int i)

  {

    Console.WriteLine("El valor pasado al METODO2 como parámetro es: {0}", i);

  }

}

Dejo link: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/using-delegates



domingo, 9 de mayo de 2021

Pyston un python más rápido


Pyston es una implementación del JIT para Python 3.8.8 que promete ser más rápida que Python. Además han puesto el proyecto en código abierto. 

Pyston v2.2 es un 30% más rápido que el Python de serie en los benchmarks de servidores web, de acuerdo con un anuncio realizado por Kevin Modzelewski, creador de Pyston. Modzelewski afirma que Pyston elimina "muchas de las características de depuración poco utilizadas que admite Python" en cuanto a la velocidad, para reducir la carga que la depuración de Python crea para los ordenadores.

A la vez es muy fácil cambiar de Pyston a python. Esto la da muchas posibilidades a esta nueva implementación. 

Dejo link: https://github.com/pyston/pyston

viernes, 7 de mayo de 2021

Curso intensivo de aprendizaje automático


Google nos regala un curso sobre aprendizaje automático totalmente gratuito y en español. Como es habitual en google, el curso esta muy bien hecho y cuenta con una parte práctica utilizando tensorflow.

Dejo el link: https://developers.google.com/machine-learning/crash-course

miércoles, 5 de mayo de 2021

Primera Aplicación en .net 5 en VB

Vamos rapidito, antes que nada tenemos que tener .net instalado y visual code (con el plugin de VB)

Y luego creamos una carpeta y hacemos una aplicación de consola: 

mkdir miPrimerApp

cd miPrimerApp

dotnet new console -lang VB

code .

Como verán le puse miPrimerApp a la carpeta y luego ejecute visual code con el comando "code ."

En visual code podemos ver la clase Program.vb que se va a ejecutar : 

Imports System

Module Program
Sub Main(args As String())
Console.WriteLine("Hello World!")
End Sub
End Module


Buenisimo, ya casi estamos, ahora podemos ejecutarlo desde la consola con : 

$ dotnet run
Hello World!

o con visual code desde "run -> start debugging" 


Libros Gratuitos de Python


Este repositorio de github se encuentra un proyecto que trata de reunir la mayor cantidad de libros gratuitos online de Python. 

Por ahora la lista de temas es la siguiente : 

List of free Python books

Dejo link : https://github.com/pamoroso/free-python-books

lunes, 3 de mayo de 2021

Primera Aplicación en .net 5 en F#


Vamos rapidito, antes que nada tenemos que tener .net instalado y visual code (con el plugin de F#)

Y luego creamos una carpeta y hacemos una aplicación de consola: 

mkdir miPrimerApp

cd miPrimerApp

dotnet new console -lang "F#"

code .

Como verán le puse miPrimerApp a la carpeta y luego ejecute visual code con el comando "code ."

En visual code podemos ver la clase Program.fs que se va a ejecutar : 

// Learn more about F# at http://docs.microsoft.com/dotnet/fsharp

open System

// Define a function to construct a message to print
let from whom =
sprintf "from %s" whom

[<EntryPoint>]
let main argv =
let message = from "F#" // Call the function
printfn "Hello world %s" message
0 // return an integer exit code

Buenisimo, ya casi estamos, ahora podemos ejecutarlo desde la consola con : 

$ dotnet run
Hello world from F#

o con visual code desde "run -> start debugging" 


Como correr los test proyecto clojure?


Si vieron este post : https://emanuelpeg.blogspot.com/2021/04/como-crear-un-proyecto-clojure.html

Deben haber pensado: y los test, donde están los test?

Bueno, vamos a hacer una pequeña función cuadrado por ejemplo : 

(defn cuadrado [n] (* n n))

Y vamos a hacer un test : 

(ns recfun.core-test
(:require [clojure.test :refer :all]
[recfun.core :refer :all]))

(deftest a-test-of-cuadrado
(testing "2 * 2 = 4 "
(is (= (cuadrado 2) 4))))

Y corremos los test con :

$ lein test

lein test recfun.core-test

Ran 1 tests containing 1 assertions.
0 failures, 0 errors.

Y listo, voy a hacer un test que termine mal, así se ve : 

(deftest other-test-of-cuadrado
(testing "2 * 2 = 5 (solo para que termine mal) "
(is (= (cuadrado 2) 5))))

Y termina mal :

$ lein test

lein test recfun.core-test

lein test :only recfun.core-test/other-test-of-cuadrado

FAIL in (other-test-of-cuadrado) (core_test.clj:11)
2 * 2 = 5 (solo para que termine mal) 
expected: (= (cuadrado 2) 5)
  actual: (not (= 4 5))

Ran 2 tests containing 2 assertions.
1 failures, 0 errors.
Tests failed.

sábado, 1 de mayo de 2021

Primera Aplicación en .net 5 en C#



Vamos rapidito, antes que nada tenemos que tener .net instalado y visual code (con el plugin de C#)

Y luego creamos una carpeta y hacemos una aplicación de consola: 

mkdir miPrimerApp

cd miPrimerApp

dotnet new console

code .

Como verán le puse miPrimerApp a la carpeta y luego ejecute visual code con el comando "code ."

En visual code podemos ver la clase Program.cs que se va a ejecutar : 

using System;

namespace prueba
{
class Program
{
/**
Mi Primer App
*/
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}

Buenisimo, ya casi estamos, ahora podemos ejecutarlo desde la consola con : 

$ dotnet run
Hello World!

o con visual code desde "run -> start debugging" 


viernes, 30 de abril de 2021

Delegate en C#


Un delegate es un tipo que representa referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Es la versión de .NET de los punteros a función de C++ pero con seguridad de tipos (type-safe), es decir, se comprueban los tipos de retorno y de los parámetros del mismo. La clase de delegado no sólo contiene una referencia a un método, también puede mantener referencias a varios métodos mientras cumplan con la firma definida. Veamos un ejemplo: 


using System;

 

public delegate void MiDelegado(int i); 

  

public class Test

{

  public static void Main()

  {

    MiClase miClase = new MiClase();

    

    // instanciamos un delegado. Observa que el método MiMetodo de la clase 

    // MiClase cumple con la firma definida en el delegado

    MiDelegado delegado = new MiDelegado(miClase.MiMetodo);

    delegado(83); // Se hace la llamada al delegado

  }

}

  

public class MiClase

{

  public void MiMetodo(int i)

  {

    Console.WriteLine("El valor pasado como parámetro es: {0}", i);

  }

}


Como podemos instanciar delegados? Tenemos diferentes maneras: 

  1. Constructor:  MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
  2. Directamente con asignación:  MiDelegado delegado = miClase.MiMetodo;
  3. Anonymous methods: MiDelegado delegado = delegate(int i) { Console.WriteLine("El valor pasado como parámetro es: {0}", i); };
  4. Y lambda expressions: MiDelegado delegado = x => { Console.WriteLine("El valor pasado como parámetro es: {0}", x); };

La verdad no entiendo muy bien, la ventaja y desventaja ante clausuras o lambdas. Voy a tener que seguir leyendo. 

Dejo link: https://www.tutorialsteacher.com/csharp/csharp-delegates

jueves, 29 de abril de 2021

Como crear un proyecto clojure?

 Esto es muy fácil hacemos así : 


$ lein new app nombreDeLaApp

Generating a project called nombreDeLaApp based on the 'app' template.


Como ustedes pueden ver utilice el template app, pero que es eso de los templates? Bueno, leiningen provee un conjunto de template que permiten hacer proyectos con una estructura determinada. 

Y si quieren ver los template acá dejo el link : https://clj-templates.com/

Y listo! Ahora si queremos correr la app hacemos : 

$ cd nombreDeLaApp
$ lein run

Y listo!!!!


domingo, 25 de abril de 2021

Jetbrain presenta code with me, y se ve muy bien!



Me llego un mail de jetbrain con la presentación de "code with me" que es una nueva funcionalidad de su Ide y la verdad es que esta muy bueno. 

Dejo el video : 


miércoles, 21 de abril de 2021

¿Como detectar la fragmentación de indices en base de datos oracle?


Es muy probable que no sepas que los indices se fragmentan pero si se fragmentan (sino para que escribo este post) y lo que podemos hacer es reconstruirlos, lo cual es un proceso lento (si el indice es grande) pero puede mejorar la performance de los indices. 

Por lo tanto una tarea recomendada es chequear los indices cada tanto y reconstruirlos (cuando no esten utilizando la base) 

Lo que hice es un script que inserta en la tabla INDEX_REBUILD los datos de los indices que deben ser reconstruidos. Y luego podemos reconstruirlos de forma automatica o manual.  

Lo hice para base de datos oracle pero es interesante hacerlo para otros motores : 


DROP TABLE INDEX_REBUILD CASCADE CONSTRAINTS;

CREATE TABLE INDEX_REBUILD AS (select * 

        from index_stats);


DECLARE


CURSOR INDEX_NAMES is

SELECT INDEX_NAME FROM all_indexes 

where TABLE_OWNER = 'nombreDelEsquema'

  -- AND TABLE_NAME = 'nombreDeLaTabla'; -- Si deseo correrlo para una tabla puedo descomentar esta linea.

BEGIN

     FOR N IN INDEX_NAMES LOOP

       EXECUTE IMMEDIATE 'analyze index ' || N.INDEX_NAME || ' validate structure';

       dbms_output.put_line(  N.INDEX_NAME );

     END LOOP;

     

     INSERT INTO INDEX_REBUILD select * 

        from index_stats

        where round((del_lf_rows/lf_rows)*100,2) >= 20

        OR height > 3

        OR lf_rows > lf_blks;

        

      COMMIT;

END; 

Dado que tenemos los indices a reconstruir en una tabla, podemos hacer esto de forma automática : 


CURSOR INDEX_NAMES is

SELECT NAME FROM INDEX_REBUILD;


BEGIN

FOR N IN INDEX_NAMES LOOP

       EXECUTE IMMEDIATE 'ALTER index ' || N.NAME || ' REBUILD';

     END LOOP;

END; 


Pero tenemos que tener cuidado porque este proceso puede llevar mucho tiempo. Si se hace para una o dos tablas puede servir, pero para una base de datos grande o mediana, nunca terminaría. En ese caso es mejor hacerlo manual con un equipo de mate y bizcochitos. 

Talvez tendría que hacer un post explicando un poco más la fragmentación y porque esos valores mágicos que pongo en la consulta, pero eso va llevar mucho tiempo...


OpenJS Foundation


La misión de OpenJS Foundation es impulsar la adopción y el desarrollo continuo de soluciones JavaScript y tecnologías relacionadas.

Los objetivos principales de la Fundación OpenJS son:

Promover la adopción generalizada y el desarrollo continuo de soluciones web, JavaScript y tecnologías relacionadas.

Facilitar la colaboración dentro de la comunidad de desarrollo de JavaScript.

Crear un centro de gravedad para proyectos de código abierto en todo el ecosistema de JavaScript de un extremo a otro, guiándolos hacia una gobernanza abierta y diversas bases de colaboradores.

Para alojar la infraestructura para admitir proyectos de código abierto de JavaScript alojados.

Permitir, a través del avance de Proyectos y alianzas estratégicas, una web abierta y accesible.

La idea es proporcionar un hogar neutral para proyectos críticos, con principios comunes de gobernanza técnica y responsabilidad. Al hacerlo, estan proporcionando la sostenibilidad a largo plazo tanto de los proyectos individuales como del ecosistema en su conjunto.

Dejo link : https://openjsf.org/

martes, 20 de abril de 2021

Microsoft presenta : Rust para Windows


Microsoft anunció Rust para Windows, que tiene como objetivo permitir la creación de aplicaciones Rust para Windows utilizando cualquier API de Windows.

Rust para Windows tiene como objetivo poner a disposición las API más antiguas y más recientes aprovechando el proyecto win32metadata para crear proyecciones idiomáticas de la API de Windows para lenguajes distintos de C# y F#.

Este framework puede generar enlaces a todas las API de Windows necesarias sobre la marcha. Lo que debemos hacer es especificar qué tipos de API necesitamos dentro de un archivo build.rs:

fn main() {

    windows::build!(

        Windows::Data::Xml::Dom::*,

        Windows::Win32::WindowsProgramming::CloseHandle,

        Windows::Win32::WindowsAndMessaging::MessageBoxA,

        Windows::Win32::SystemServices::{

            CreateEventW, SetEvent, WaitForSingleObject

        },

    );

}

Los enlaces generados se pueden importar y usar en los archivos fuente de Rust:

use bindings::{

    Windows::Data::Xml::Dom::*,

    Windows::Win32::SystemServices::{CreateEventW, SetEvent, WaitForSingleObject, PWSTR},

    Windows::Win32::WindowsAndMessaging::{MessageBoxA, HWND, MESSAGEBOX_STYLE},

    Windows::Win32::WindowsProgramming::CloseHandle,

};

Microsoft ha proporcionado varios programas de muestra que utilizan varias API de Windows, incluidos Direct2D, Microsoft.Web.WebView2.Core, Win2D y otros. 

Win32metadata no solo permite proyecciones automatizadas de API de Windows, sino que también se esfuerza por facilitar su uso al convertir tipos no específicos como uint en enumeraciones específicas, tipos opacos como objetos HANDLE y GDI en estructuras fuertemente tipadas, etc.

La documentación de Rust para todas las API proyectadas también está disponible para describir cómo se proyectan las API y los tipos de Windows en Rust idiomático.

Rust para Windows todavía está en versión preliminar y el proyecto agradece las contribuciones para identificar y corregir errores en el código fuente.

Dejo video : 

Dejo link: https://docs.microsoft.com/en-us/windows/dev-environment/rust/rust-for-windows

lunes, 19 de abril de 2021

NET 6: Date y Time


Un problema de larga data con la biblioteca de clases base de .NET es la incapacidad de representar por separado los valores de fecha y hora. Como parte de .NET 6, las nuevas clases DateOnly y TimeOnly buscan corregir esto.

Avance rápido a .NET 6 y obtenemos la propuesta DateOnly y TimeOnly. Como implican los nombres, estas estructuras están diseñadas para contener solo una fecha o solo una hora. El nombre original de la estructura DateTime era solo Date. Esto continúa en VB, donde la palabra clave Date continúa haciendo referencia a DateTime. Por lo tanto, se eligió el nombre DateOnly para evitar confusiones.

Otra razón por la que se eligió el nombre DateOnly es que DateTime.Date ya devuelve un valor DateTime. Esto no se puede cambiar, pero los nuevos programadores esperan que devuelva una fecha. Al llamar al tipo DateOnly, la nueva propiedad coincidente se puede llamar DateTime.DateOnly.

De manera similar, TimeOfDay es problemático ya que muchas propiedades y métodos lo usan para referirse a un valor de DateTime o TimeSpan.

DateOnly y TimeOnly no implementarán el atributo Serializable. En .NET Core y versiones posteriores, este atributo se considera obsoleto, al igual que las bibliotecas de serialización que dependen de él.

En este momento, no hay planes para abordar escenarios avanzados como el manejo de la zona horaria real y el período frente a la duración. Este rol lo maneja en gran parte la biblioteca Noda Time. Basado en Joda Time de Java, también le permite representar fechas parciales como "3 de enero" o "marzo de 2021", donde el año, el día o el mes faltan intencionalmente.

Dejo link : https://www.infoq.com/news/2021/04/Net6-Date-Time/