Dejo link: https://university.mongodb.com/
Translate
domingo, 16 de agosto de 2020
university.mongodb.com
sábado, 15 de agosto de 2020
Micronaut 2.0
Esta nueva versión mejora significativamente la experiencia del desarrollador con la disponibilidad de Micronaut Launch, una CLI de Micronaut más rápida y completamente renovada, un nuevo complemento de Maven y una actualización a la versión de Gradle. Ahora es compatible con Java 14, aplicaciones escritas en Groovy 3 y marcos reactivos que incluyen RxJava 3 y Reactor. Las capacidades sin servidor se han ampliado al agregar compatibilidad con Azure Functions y Cloud Functions de Google. También proporciona soporte para HTTP/2 y Servlets y un diseño de seguridad renovado. Finalmente, la nueva versión proporciona un rendimiento mejorado con una integración más profunda con GraalVM, consumo de memoria optimizado y tiempos de inicio mejorados hasta en un 20% en promedio en todo el marco.
Micronaut 2.0 incluye un nuevo servicio de inicio, Micronaut Launch, que ayuda a crear un andamio en las aplicaciones basadas en Micronaut. Disponible tanto como una herramienta basada en navegador como como una API REST, Launch ayuda a construir rápidamente y generar aplicaciones basadas en Micronaut. También ofrece una vista previa de la aplicación generada. La CLI de Micronaut tradicional ha pasado por un rediseño completo con un enfoque en el rendimiento y la eficiencia utilizando imágenes nativas de GraalVM. Micronaut Launch, un wrapper de Micronaut CLI, garantiza la interoperabilidad.
EL soporte de Maven se ha actualizado para traerlo a la paridad de características con el conjunto de características actual de Gradle. Se proporciona un nuevo complemento de Maven (mn: run) que ayuda a ejecutar aplicaciones Micronaut a través de Maven con capacidades de recompilación y reinicio automáticos. Además de esto, los proyectos de Maven heredan de un nuevo POM padre que configura la gestión de dependencias de forma más limpia.
La versión de Gradle se ha actualizado a 6.5, lo que brinda soporte de compilación incremental para proyectos de Micronaut 2.0. Básicamente, esto significa que Micronaut no tiene que ejecutar los procesadores de anotaciones completos para cada compilación.
El soporte sin servidor se ha hecho más sólido con la adición de Google Cloud Functions y Azure Functions, al tiempo que se mejora el conjunto de características para AWS Lambda. Micronaut proporciona dos enfoques para ayudar a crear aplicaciones sin servidor. El primer enfoque define una aplicación Micronaut tradicional y le agrega la característica de función sin servidor correspondiente (por ejemplo, funciones en la nube, funciones de Azure o lambdas). Dependiendo de la plataforma sin servidor elegida, Micronaut proporcionará la infraestructura de plomería necesaria para enrutar las solicitudes de funciones a la aplicación.
El segundo enfoque define un tipo de aplicación de "función sin servidor" que permite a los desarrolladores escribir código de función directo de bajo nivel específico para la función de función sin servidor elegida (p. Ej., Funciones en segundo plano de Google Cloud que se suscriben a mensajes pub-sub).
A continuación se muestra un ejemplo de una función sin servidor de bajo nivel escrita en Micronaut para la plataforma sin servidor de funciones de Google Cloud.
public class Function extends GoogleFunctionInitializer
implements BackgroundFunction<PubSubMessage> {
@Inject LoggingService loggingService;
@Override
public void accept(PubSubMessage message, Context context) {
loggingService.logMessage(message);
}
}
class PubSubMessage {
String data;
Map<String, String> attributes;
String messageId;
String publishTime;
}
mn> create-app demo-servlet --features jetty-server
$ cd demo-servlet
$ ./gradlew run
org.eclipse.jetty.server.Server - Started @1219ms
io.micronaut.runtime.Micronaut - Startup completed in 615ms. Server Running: http://localhost:8080/
Micronaut 2.0 agrega soporte para HTTP / 2 y se puede habilitar usando un simple cambio en el archivo application.yml para una aplicación Micronaut. Este soporte está disponible actualmente solo para el servidor HTTP y el cliente basados en Netty.
La configuración del lado del servidor se muestra a continuación.
micronaut:
ssl:
build-self-signed: true
application:
name: http2Demo
server:
http-version: http_2_0
El soporte para imágenes nativas de GraalVM se ha movido del estado experimental y ahora tiene soporte de primera clase y ampliado en todo el marco, lo que solidifica aún más el compromiso con GraalVM. Esto incluye la configuración automática de recursos estáticos, controladores JDBC, Hibernate, Flyway, AWS SDK 2 y otras áreas.
Dejo link : https://www.infoq.com/news/2020/08/micronaut-v2/
viernes, 14 de agosto de 2020
Records y Pattern Matching para instanceof en JDK 16
record Name(String firstName, String lastName){}
Los registros se pueden declarar en un archivo separado o como parte de otra clase.
Cuando se define una clase normal, implícitamente se agrega un constructor predeterminado. Los registros tienen un comportamiento similar y contienen implícitamente varios miembros:
- Campos privados para todos los componentes del registro.
- Métodos de acceso público para todos los componentes del registro.
- Constructor con argumentos para todos los componentes del registro. Este constructor se denomina constructor canónico.
- equals, toString y hashCode con su implementación.
El registro definido anteriormente no contiene ningún código personalizado, pero es posible definir métodos explícitos. Incluso es posible declarar explícitamente los diversos métodos agregados implícitamente y el constructor canónico. Por ejemplo, es posible crear un método toString personalizado.
En JDK 14, se requería que el constructor canónico fuera público. Desde JDK 15 en adelante, el constructor canónico implícito obtiene el mismo modificador de acceso que la clase de registro. Al definir un constructor canónico explícito, el modificador de acceso debe proporcionar al menos tanto acceso como la clase de registro.
Como parte del cambio, también se modificó la anotación @Override. Ahora se puede utilizar para anotar un método de acceso explícito en un registro.
También vamos a tener pattern matching para el instaceof. Ahora debemos hacer :
if (person instanceof Customer) {
Customer customer = (Customer) person;
customer.pay();
}
y con pattern matching vamos poder hacer :
if (person instanceof Customer customer) {
customer.pay();
}
y podemos utilizarlo en el equals por ejemplo:
@Override
public boolean equals(Object o) {
return o instanceof Customer other &&
name.equals(other.name);
}
Dejo link: https://www.infoq.com/news/2020/08/java16-records-instanceof/
Aprende con Google!!
opensource.microsoft.com
Sin más dejo link: https://opensource.microsoft.com/
miércoles, 12 de agosto de 2020
Trait Objects para hacer Dynamic Dispatch en Rust
Seguimos con rust y el polimorfismo.
Como sabemos el Dynamic Dispatch significa que el compilador llama código que es determinado en tiempo de ejecución.
Cuando usamos objetos de trait, Rust debe usar Dynamic Dispatch. El compilador no conoce todos los tipos que podrían usarse con el código que usa objetos de trait, por lo que no sabe qué método implementado en qué tipo llamar. En cambio, en tiempo de ejecución, Rust usa los punteros dentro del objeto de trait para saber a qué método llamar. Hay un costo de tiempo de ejecución cuando ocurre esta búsqueda que no ocurre con el envío estático. El envío dinámico también evita que el compilador elija insertar el código de un método, lo que a su vez evita algunas optimizaciones. Sin embargo, obtuvimos una flexibilidad adicional propia del polimorfismo.
Algunas reglas complejas gobiernan todas las propiedades que hacen que un objeto de trait sea seguro, pero solo dos reglas son relevantes. Un trait es seguro para objetos si todos los métodos definidos en el trait tienen las siguientes propiedades:
- El tipo de retorno no es Self.
- No hay parámetros de tipo genérico.
La palabra clave Self es un alias para el tipo en el que estamos implementando los métodos. Los objetos de trait deben ser seguros para objetos porque una vez que has usado un objeto de rasgo, Rust ya no sabe el tipo concreto que está implementando ese rasgo. Si un método de rasgo devuelve el tipo Self concreto, pero un objeto rasgo olvida el tipo exacto que es Self, no hay forma de que el método pueda usar el tipo concreto original. Lo mismo ocurre con los parámetros de tipo genérico que se completan con parámetros de tipo concreto cuando se utiliza el rasgo: los tipos concretos pasan a formar parte del tipo que implementa el rasgo. Cuando el tipo se olvida mediante el uso de un objeto de rasgo, no hay forma de saber con qué tipos completar los parámetros de tipo genérico.
Un ejemplo de un trait cuyos métodos no son seguros para objetos es el trait Clonar de la biblioteca estándar. La firma para el método de clonación en el rasgo Clonar se ve así:
pub trait Clone {
fn clone(&self) -> Self;
}
El tipo String implementa el rasgo Clone, y cuando llamamos al método clone en una instancia de String, obtenemos una instancia de String. De manera similar, si llamamos a clonar en una instancia de Vec <T>, obtenemos una instancia de Vec <T>. La firma del clon necesita saber qué tipo sustituirá a Self, porque ese es el tipo de retorno.
El compilador le indicará cuando esté intentando hacer algo que viole las reglas de seguridad de los objetos con respecto a los objetos característicos. Por ejemplo, digamos que intentamos implementar la estructura Screen en el Listado 17-4 para contener los tipos que implementan el rasgo Clonar en lugar del rasgo Dibujar, así:
pub struct Screen {
pub components: Vec<Box<dyn Clone>>,
}
Obtendríamos este error:
$ cargo build Compiling gui v0.1.0 (file:///projects/gui) error[E0038]: the trait `std::clone::Clone` cannot be made into an object --> src/lib.rs:2:5 | 2 | pub components: Vec<Box<dyn Clone>>, | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `std::clone::Clone` cannot be made into an object | = note: the trait cannot require that `Self : Sized` error: aborting due to previous error For more information about this error, try `rustc --explain E0038`. error: could not compile `gui`. To learn more, run the command again with --verbose.
Este error significa que no puede usar este trait de esta manera. Si está interesado en obtener más detalles sobre la seguridad de los objetos, consulte Rust RFC 255.
Dejo link: https://doc.rust-lang.org/book/ch17-02-trait-objects.html
Scala 3, indentación en vez de llaves ???
- Primero, algunos programas mal sangrados van a estar marcados con un error de tipo advertencias.
- En segundo lugar, algunas apariciones de llaves {...} se hacen opcionales. Generalmente, la regla es que agregar un par de llaves opcionales no cambiará el significado de un programa bien sangrado.
sábado, 8 de agosto de 2020
Rust by Example
En la docu oficial de Rust hay un apartado Rust by example, que esta muy bueno. Dada que la docu es muy extensa este apartado viene bien para aterrizar algunos conceptos programando.
Sin más, dejo link: https://doc.rust-lang.org/stable/rust-by-example/
Polimorfismo con traits en Rust
Programación funcional, pros y contras
- funciones puras;
- evitar el estado compartido, datos mutables y efectos secundarios;
- La prevalencia de un enfoque declarativo más que imperativo.
- Relájate :) Al principio será muy complicado, teniendo en cuenta que tendrás que dejar atrás lo que sabes y aprender nuevos enfoques y principios. Y eso esta bien. Piense en la primera vez que aprendió a codificar. Nada malo sucederá.
- Comience con micro tareas para tenerlo en sus manos.
- Comience a aprender Haskell y luego pase a Scala (o F #) para comenzar a comprender los principios de programación funcional (y al mismo tiempo comenzar a pensar más "funcional").