Translate

domingo, 28 de marzo de 2021

Webinario Introducción al Frontend - Gugler Lab


Te invitamos a participar del Webinario Introducción al Frontend. El mismo se realizará el día Miércoles 31 de Marzo de 19:00 a 20:30 horas.

Hablaremos sobre maquetación web utilizando las últimas novedades de HTML5, CSS3 y frameworks CSS.

El acceso es libre y gratuito.

Para presenciar el evento diríjase al siguiente link: Webinario Introducción al Frontend, ingresando con su nombre y apellido.

Te esperamos !!!


martes, 23 de marzo de 2021

Arquitectura de .NET Framework

Los dos componentes principales de .NET Framework son Common Language Runtime y .NET Framework Class Library.

Common Language Runtime (CLR) es el motor de ejecución que maneja las aplicaciones en ejecución. Proporciona servicios como administración de subprocesos, recolección de basura, seguridad de tipos, manejo de excepciones y más.

La biblioteca de clases proporciona un conjunto de API y tipos para una funcionalidad común. Proporciona tipos de cadenas, fechas, números, etc. La biblioteca de clases incluye API para leer y escribir archivos, conectarse a bases de datos, dibujar y más.

Las aplicaciones .NET están escritas en lenguaje de programación C#, F# o Visual Basic. El código se compila en un Lenguaje Intermedio Común (CIL) independiente del lenguaje. El código compilado se almacena en ensamblados: archivos con una extensión de archivo .dll o .exe.

Cuando se ejecuta una aplicación, CLR toma el ensamblado y usa un compilador just in time (JIT) para convertirlo en código de máquina que se puede ejecutar en la arquitectura específica de la computadora en la que se está ejecutando.

Future en Java


No me voy a poner a hablar del futuro de Java... 

Supongamos que queremos correr un proceso pero por un cierto tiempo, si demora más de ese tiempo debemos lanzar un error y si no retornar el valor. 

Para esto podemos utilizar java.util.concurrent.Future. 

En pocas palabras, la clase Future representa un resultado futuro de un cálculo asincrónico, un resultado que eventualmente aparecerá en el Future una vez que se complete el procesamiento.

Los métodos de ejecución prolongada son buenos candidatos para el procesamiento asincrónico y la interfaz Future. Esto nos permite ejecutar algún otro proceso mientras esperamos que se complete la tarea encapsulada en Future.

Algunos ejemplos de operaciones que aprovecharían la naturaleza asincrónica de Future son:

  • Procesos computacionales intensivos (cálculos matemáticos y científicos).
  • manipular grandes estructuras de datos (big data)
  • llamadas a métodos remotos (descarga de archivos, desguace HTML, servicios web).
Veamos como podemos hacer un Future : 

public class SquareCalculator {    
    
    private ExecutorService executor 
      = Executors.newSingleThreadExecutor();
    
    public Future<Integer> calculate(Integer input) {        
        return executor.submit(() -> {
            Thread.sleep(1000);
            return input * input;
        });
    }
}

En el ejemplo, crearmos una clase muy simple que calcula el cuadrado de un entero. Esto definitivamente no encaja en la categoría de métodos de "ejecución prolongada", pero ponemos una llamada Thread.sleep () para que dure 1 segundo en completarse.

Ya entendido el Future, veamos como nos puede ayudar para ejecutar procesos un cierto tiempo. 

El método get () bloqueará la ejecución hasta que se complete la tarea.  get() tiene una versión sobrecargada que toma un tiempo de espera y un TimeUnit como argumentos:

Integer result = future.get(500, TimeUnit.MILLISECONDS);

Si esto tarda más de 500 milisegundos, se lanzará TimeoutException. Veamos un ejemplo completo: 

// The synchronous method
timeoutFuture = new SquareCalculator().calculate(10);
try {
    timeoutFuture.get(1000, TimeUnit.MILLIS);
} catch (TimeoutException | InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

Y listo! En el catch podemos informar que no termino en el tiempo requerido. 

Lo malo del método get es que es bloqueante y muchas veces no queremos bloquear nuestra ejecución para esperar. Por lo tanto podemos utilizar el método isDone : 

Future<Integer> future = new SquareCalculator().calculate(10);

while(!future.isDone()) {
    System.out.println("Calculating...");
    Thread.sleep(300);
}

Integer result = future.get();

Future, tal vez no es la mejor opción para procesos asincronos complejos pero para estas cositas viene muy bien y es muy fácil de usar. 

sábado, 20 de marzo de 2021

Records en java 16

 


Ya hable de java 16, ahora vamos a ver una de sus mejoras: Records

El objetivo de los records es poder diseñar de forma rápida, tipos de datos compuestos inmutables. Esta característica no viene a remplazar nuestras queridas clases.  

Antes de java 16 debíamos hacer una clase para representar un tipo de dato inmutable, por ejemplo Point : 

class Point {

    private final int x;

    private final int y;

    Point(int x, int y) {

        this.x = x;

        this.y = y;

    }

    int x() { return x; }

    int y() { return y; }

    public boolean equals(Object o) {

        if (!(o instanceof Point)) return false;

        Point other = (Point) o;

        return other.x == x && other.y == y;

    }

    public int hashCode() {

        return Objects.hash(x, y);

    }

    public String toString() {

        return String.format("Point[x=%d, y=%d]", x, y);

    }

}

Ahora podemos utilizar records : 

record Point(int x, int y) { }

Por lo visto, mucho menos código; record nos ofrece metodos y constructores por defecto y por supuesto que podemos sobreescribirlos, un ejemplo sería : 

record SmallPoint(int x, int y) {

  public int x() { return this.x < 100 ? this.x : 100; }

  public int y() { return this.y < 100 ? this.y : 100; }

}

Sin más dejo link: https://openjdk.java.net/jeps/395



Pattern Matching para instanceof en java 16

 


Ya hable de java 16, ahora vamos a ver una de sus mejoras: Pattern Matching para instanceof

Antes de esta característica hacíamos esto : 

if (obj instanceof String) {

    String s = (String) obj;    // grr...

    ...

}

luego de java 16, podemos resolver el casteo de la siguiente manera : 

if (obj instanceof String s) {

    // Y aca usamos s como un string

    ...

}

Dejo link : https://openjdk.java.net/jeps/394

Java 16


Retarde llegue con la noticia pero bueno, nobleza obliga, llego java 16. Ya a esta altura, de casualidad estoy usando java 11. Paren el tren!!! }

Más allá de mi experiencia personal de estos cambios de versiones, vamos a ver que nos trae Java 16. 

338:Vector API (Incubator)
347:Enable C++14 Language Features
357:Migrate from Mercurial to Git
369:Migrate to GitHub
376:ZGC: Concurrent Thread-Stack Processing
380:Unix-Domain Socket Channels
386:Alpine Linux Port
387:Elastic Metaspace
388:Windows/AArch64 Port
389:Foreign Linker API (Incubator)
390:Warnings for Value-Based Classes
392:Packaging Tool
393:Foreign-Memory Access API (Third Incubator)
394:Pattern Matching for instanceof
395:Records
396:Strongly Encapsulate JDK Internals by Default
397:Sealed Classes (Second Preview)

A nivel de lenguaje lo más importante son Pattern Matching para instanceof y records (a mi entender). 

Sin más dejo link: https://jdk.java.net/16/


martes, 16 de marzo de 2021

Corre Clojure en .net con ClojureCLR


Supongamos que queremos programar en .net y con Clojure. Y se puede! con ClojureCLR. 

Primero debemos instalarlo, utilizando una terminal con el siguiente comando: 

dotnet tool install --global --version 1.10.0-beta1 Clojure.Main

Hoy estoy en powershell, sería algo así  : 

PS C:\dotnet> dotnet tool install --global --version 1.10.0-beta1 Clojure.Main                                          

You can invoke the tool using the following command: Clojure.Main

Tool 'clojure.main' (version '1.10.0-beta1') was successfully installed.


Y luego, escribimos  Clojure.Main en la terminal y podemos acceder al RELP : 


PS C:\dotnet> Clojure.Main

Clojure 1.10.0-beta1

user=> (defn mayor [L]

  (cond

        (empty? (rest L)) (first L)

        (> (first L) (mayor (rest L))) (first L)

        :else (mayor (rest L))

  )

)

#'user/mayor

user=> (mayor '(1 2 3 50 40))

50


Dejo link :  https://github.com/clojure/clojure-clr


.NET Tutorial - Hello World in 10 minutes


Quiero recomendar esta página que permite aprender .net de forma rápida y bastante interactiva. 

En dicha pagina podemos comenzar de 0 a programar software sencillo. Esta muy bueno, para empezar. 

Dejo link: https://dotnet.microsoft.com/learn/dotnet/hello-world-tutorial/intro

lunes, 15 de marzo de 2021

Cursos Gugler : Inscripciones abiertas para el primer cuatrimestre del año 2021

Ya se encuentra disponible el formulario de inscripción a los cursos de extensión que dicta el Laboratorio de Investigación Gugler en modalidad semipresencial y a distancia.





Dejo el link para inscribirse : https://www.gugler.com.ar/

sábado, 13 de marzo de 2021

Primeros pasos con Clojure, parte 32

  Seguimos con Clojure... 

Para terminar esta saga de post, vamos a hacer una pequeña función que permita obtener el mayor número de una lista de números. 

(defn mayor [L] 
  (cond 
        (empty? (rest L)) (first L)
        (> (first L) (mayor (rest L))) (first L)
        :else (mayor (rest L))
  )
)

Esta pequeña expresión nos permite saber el mayor de una lista. Su funcionamiento es fácil, si la lista tiene un solo elemento, ese es el mayor y si la lista tiene varios elementos, bueno compara el primero con el mayor del resto de la lista, si es mayor, entonces es el mayor, sino retorna el mayor del resto de la lista. 

Puff espero que se haya entendido... 

Primeros pasos con Clojure, parte 31

 Seguimos con Clojure... 


Clojure provee manejo de excepciones como Java (try/catch/finally), veamos un ejemplo : 

(try

  (/ 2 1)

  (catch ArithmeticException e

    "divide by zero")

  (finally

    (println "cleanup")))


Tambien podemos lanzar excepciones: 


(try

  (throw (Exception. "something went wrong"))

  (catch Exception e (.getMessage e)))


Clojure provee información extra con : 

  • ex-info toma un mensaje y un mapa y genera una excepción
  • ex-data recupera el mapa generado por ex-info

Veamos un ejemplo : 

(try

  (throw (ex-info "There was a problem" {:detail 42}))

  (catch Exception e

    (prn (:detail (ex-data e)))))

viernes, 12 de marzo de 2021

Primeros pasos con Clojure, parte 30

 Seguimos con Clojure..


Clojure no es un lenguaje funcional puro, por lo tanto tiene funciones con efecto secundario. Vamos a ver algunas : 


dotimes :

user=> (dotimes [i 3]

         (println i))

0

1

2

nil

Muy parecido a un for, empieza de 0 y sigue hasta 3 - 1.


doseq :

user=> (doseq [n (range 3)]

         (println n))

0

1

2

nil

Itera sobre una secuencia (evaluandola si es lazy). Tambien existe la variante que procesa todas las permutaciones del contenido de la secuencia, veamos un ejemplo : 

user=> (doseq [letter [:a :b]

               number (range 3)] ; list of 0, 1, 2

         (prn [letter number]))

[:a 0]

[:a 1]

[:a 2]

[:b 0]

[:b 1]

[:b 2]

nil


for : 

user=> (for [letter [:a :b]

             number (range 3)] ; list of 0, 1, 2

         [letter number])

([:a 0] [:a 1] [:a 2] [:b 0] [:b 1] [:b 2])


La función for se utiliza para generar listas, como listas por comprensión. 

Primeros pasos con Clojure, parte 29

Seguimos con Clojure... 


cond es una serie de condiciones y expresiones. Cada condición se evalúa en orden y la expresión se evalúa y devuelve el resultado de la primera expresión en que condición fue verdadera.

(let [x 5]

  (cond

    (< x 2) "x is less than 2"

    (< x 10) "x is less than 10"))


Si no se cumple ninguna condición, se devuelve nil. Un modismo común es usar una condición final de :else. Las palabras clave (como :else) siempre se evalúan como verdaderas, por lo que siempre se seleccionará de forma predeterminada.


(let [x 11]

  (cond

    (< x 2)  "x is less than 2"

    (< x 10) "x is less than 10"

    :else  "x is greater than or equal to 10"))


case compara un argumento con una serie de valores para encontrar una coincidencia. ¡Esto se hace en tiempo constante (no lineal)! Sin embargo, cada valor debe ser un literal en tiempo de compilación (números, cadenas, palabras clave, etc.).

A diferencia de cond, case arrojará una excepción si ningún valor coincide.

user=> (defn foo [x]

         (case x

           5 "x is 5"

           10 "x is 10"))

#'user/foo


user=> (foo 10)

x is 10


user=> (foo 11)

IllegalArgumentException No matching clause: 11


case puede tener una expresión final que se evaluará si ninguna prueba coincide.


user=> (defn foo [x]

         (case x

           5 "x is 5"

           10 "x is 10"

           "x isn't 5 or 10"))

#'user/foo


user=> (foo 11)

x isn't 5 or 10

Libros Gratuitos de Java Code Geeks

 

Download IT Guides!

 

JMeter Tutorial

JMeter is an application that offers several possibilities to configure and execute load, performance and stress tests using different technologies and protocols. It allows simulating...

 
 

Java Design Patterns

A design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. A design pattern is not a finished design that can be...

 
 

Elasticsearch Tutorial

Elasticsearch is a search engine based on Lucene. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents....

 
 

Docker Containerization Cookbook

Docker is the world's leading software containerization platform. Docker containers wrap a piece of software in a complete filesystem that contains everything needed to run: code,...

 

Libros Gratuitos de Web Code Geeks

 

Download IT Guides!

 

Building Web Apps With Node.js

Node.js applications are designed to maximize throughput and efficiency, using non-blocking I/O and asynchronous events. Node.js applications run single-threaded, although Node.js uses...

 
 

AngularJS Programming Cookbook

It aims to simplify both the development and the testing of such applications by providing a framework for clientside model-view-controller (MVC) and model-view-viewmodel (MVVM)...

 
 

GWT Programming Cookbook

Google Web Toolkit, or GWT Web Toolkit, is an open source set of tools that allows web developers to create and maintain complex JavaScript front-end applications in Java. Other than a...

 
 

Git Tutorial

Git is, without any doubt, the most popular version control system. Ironically, there are other version control systems easier to learn and to use, but, despite that, Git is the favorite...

 

Libro Gratuito : Infrastructure as Code, Dynamic Systems for the Cloud Age

 



Development teams for companies worldwide are attempting to build large infrastructure codebases.

Download this eBook and learn how to effectively use principles, practices, and patterns pioneered by DevOps teams to manage cloud-age infrastructure.
 
GET THE EBOOK

Este libro está dirigido a personas que participan en la provisión y el uso de infraestructura para entregar y ejecutar software. Puede tener experiencia en sistemas e infraestructura, o en desarrollo y entrega de software. Su función puede ser ingeniería, pruebas, arquitectura o administración. Se asume que tiene cierta exposición a la nube o infraestructura virtualizada y herramientas para automatizar la infraestructura mediante código.

Los lectores nuevos en Infrastructure as Code deberían encontrar este libro como una buena introducción al tema, aunque sacará el máximo provecho de él si está familiarizado con el funcionamiento de las plataformas de infraestructura en la nube y los conceptos básicos de al menos una herramienta de codificación de infraestructura.

Aquellos que tienen más experiencia trabajando con estas herramientas deben encontrar una combinación de conceptos y enfoques nuevos y familiares. El contenido debe crear un lenguaje común y articular desafíos y soluciones de manera que los profesionales y equipos experimentados encuentren útiles.

martes, 9 de marzo de 2021

Pattern matching en Python.


Antes de empezar, si no sabes que es pattern matching, lee este post : https://emanuelpeg.blogspot.com/2014/04/pattern-matching.html

El PEP 634 nos muestra como va a ser el pattern matching en Python 3.10. Veamos el ejemplo que es super claro : 


match subject:

    case <pattern_1>:

        <action_1>

    case <pattern_2>:

        <action_2>

    case <pattern_3>:

        <action_3>

    case _:

        <action_wildcard>


Muy parecido a scala pero en vez de => usa los 2 puntos. 

Para que quede aun más claro veamos un ejemplo de uso: 


def http_error(status):

    match status:

        case 400:

            return "Bad request"

        case 404:

            return "Not found"

        case 418:

            return "I'm a teapot"

        case _:

            return "Something's wrong with the Internet"


y también se va a poder enumerar opciones con el |  : 


case 401 | 403 | 404:

    return "Not allowed"


A la vez, igual que en scala se va poder hacer matching con el valor y estructura de los objetos : 


# point is an (x, y) tuple

match point:

    case (0, 0):

        print("Origin")

    case (0, y):

        print(f"Y={y}")

    case (x, 0):

        print(f"X={x}")

    case (x, y):

        print(f"X={x}, Y={y}")

    case _:

        raise ValueError("Not a point")


Y como este matching más complejo podemos utilizar mejor el wildcard, etc... pero este post no trata de hablar de toda la potencia de esta nueva característica sino de trasnmitir la noticia. 


Dejo link : 

https://docs.python.org/3.10/whatsnew/3.10.html#pep-634-structural-pattern-matching

viernes, 5 de marzo de 2021

Primeros pasos con Clojure, parte 28

 Seguimos con Clojure... 


En Clojure, todos los valores son lógicamente verdaderos o falsos. Los únicos valores "falsos" son falsos y nulos; todos los demás valores son lógicamente verdaderos.


user=> (if true :truthy :falsey)

:truthy

user=> (if (Object.) :truthy :falsey) ; objects are true

:truthy

user=> (if [] :truthy :falsey) ; empty collections are true

:truthy

user=> (if 0 :truthy :falsey) ; zero is true

:truthy

user=> (if false :truthy :falsey)

:falsey

user=> (if nil :truthy :falsey)

:falsey


El if solo toma una sola expresión para el "entonces" y "si no". Si necesitamos más devemos utilizar el do para crear bloques más grandes que sean una sola expresión.


(if (even? 5)

  (do (println "even")

      true)

  (do (println "odd")

      false))


when es un if con solo una rama then. Verifica una condición y luego evalúa cualquier número de declaraciones como un cuerpo (por lo que no se requiere do).  Y devuelve el valor de la última expresión. Si la condición es falsa, se devuelve nil.


(when (neg? x)

  (throw (RuntimeException. (str "x must be positive: " x))))


Libros gratuitos de microservicios en español


Quiero compartir un conjunto de libros de microservicios e integración en castellano. Y sin más...

Dejo link: https://assets.softwareag.com/spanish-ebooks

martes, 2 de marzo de 2021

Primeros pasos con Clojure, parte 27

Seguimos con Clojure... 




En Clojure, ¡todo es una expresión! Todo devuelve un valor y un bloque de varias expresiones devuelve el último valor. Las expresiones que realizan exclusivamente efectos secundarios devuelven cero.

Los operadores de control de flujo también se pueden ampliar a través de macros, que permiten ampliar el compilador mediante el código de usuario.

if es la expresión condicional más importante: consta de una condición, un "entonces" y un "más". if solo evaluará la rama seleccionada por el condicional.


user=> (str "2 is " (if (even? 2) "even" "odd"))

2 is even

user=> (if (true? false) "impossible!") ;; else is optional

nil