Translate

jueves, 1 de agosto de 2019

Primeros pasos con Flutter parte 3, más Flutter que nunca!

Seguimos con Flutter. No nos basta un ejemplito.

Veamos el directorio de un proyecto en Flutter.

Directorio lib, donde va a estar toda la acción de desarrollo, y el archivo main.dart el cual es el punto de entrada de ejecución de la aplicación.

También podemos ver:
Directorios Android / IOS: contienen proyectos generados, 100% nativos, que pueden abrirse en las IDE correspondientes a cada plataforma.

Assets: Directorio para incluir imágenes/fuentes. Todos los archivos en esta carpeta se incluirán de manera automática en el bundle final. También podemos agregar directorios y archivos.

Test: Directorio para clases y archivos de unit testing.




El archivo main es el punto de entrada de una aplicación. El runtime buscara el método “main” dentro de este archivo y debe invocar el método runApp con un widget.

En flutter, todo es un widget. Un icono, una imagen, un botón y hasta los elementos de layout, como un contenedor, una Column, Row o un Stack todos son widgets; y tanto cada pantalla como nuestra app final, será simplemente, una composición de dichos widgets.

Un widget es representado por una clase, que debe heredar de la clase del framework StatelessWidget o StatefulWidget (dependiendo de si nuestro widget tiene información estado o no), y debe además sobrescribir el método build. Dicho método debe estar en todo widget, y debe retornar un Widget.

Cada widget puede contener un hijo, que se especifica en su propiedad child. En el caso de algunos widgets de layout como “Row” o “Column”, se pueden especificar varios widgets hijos, en la propiedad children. Flutter construye los widgets a modo de árbol, invocando el método build de cada widget.

El manejo de estado más básico de un widget en Flutter, se hace mediante llamados al método setState. SetState notifica al framework del cambio de estado, y redibuja los widgets que sean necesarios.

El manejo de estado mediante el método setState puede funcionar para aplicaciones muy pequeñas, o para manejo de estado relacionado al widget en sí, Flutter ofrece mejores maneras para manejo de estado más complejo. 


Una pregunta muy común que surge a la hora de ver setState como método de manejo de estado es, ¿“Que pasa si quiero compartir información entre pantallas y widgets?” Si bien siempre podemos pasar la información mediante parámetros en los constructores, es una solución poco práctica y engorrosa. Para eso, Flutter ofrece Inherited Widget

Antes hablamos como los widgets en Flutter se anidan y estructuran en un árbol. Para que un widget pueda acceder a otro que se encuentra arriba en el árbol es que tenemos Inherited Widget. A nivel de código, no es más que otro widget, simplemente debe heredar de la clase InheritedWidget e implementar el método updateShouldNotify, para definir condicionalmente cuando disparar la notificación de update.

Con este código, ya tenemos un widget que puede ser accedido por todos los widgets hijos en el árbol. El acceso al InheritedWidget se logra utilizando el método “of”. Claramente leyéndolo así suena todo muy abstracto, en un próximo post vamos con un ejemplo. 

Dejo link: https://flutter.dev

SASI : Una nueva implementación del índice secundario en Cassandra


La versión Cassandra 3.4 incluía una implementación alternativa de índices secundarios conocida como SSTable Attached Secondary Index (SASI). SASI fue desarrollado por Apple y lanzado como una implementación de código abierto de la API del índice secundario de Cassandra. Como su nombre lo indica, los índices SASI se calculan y almacenan como parte de cada archivo SSTable, a diferencia de la implementación original de Cassandra, que almacena los índices en tablas separadas, "ocultas".

La implementación SASI existe junto con los índices secundarios tradicionales, y puede crear un índice SASI con el comando CQL CREATE CUSTOM INDEX:

CREATE CUSTOM INDEX user_last_name_sasi_idx ON user (last_name)
USING 'org.apache.cassandra.index.sasi.SASIIndex';

Los índices SASI ofrecen funcionalidad más allá de la implementación de índice secundario tradicional, como la capacidad de realizar búsquedas de desigualdad (mayor o menor que) en columnas indexadas. También puede utilizar la nueva palabra clave "LIKE" para realizar búsquedas de texto en columnas indexadas. Por ejemplo, podría usar la siguiente consulta para encontrar usuarios cuyo apellido comience con "N":

SELECT * FROM user WHERE last_name LIKE 'N%';

Si bien los índices SASI se desempeñan mejor que los índices tradicionales al eliminar la necesidad de leer de tablas adicionales, aún requieren lecturas de un mayor número de nodos que un diseño desnormalizado.

Libres Gratuitos!!!

Download IT Guides!

 
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 different type of requests against all kind of databases, FTP, HTTP, HTTPS or other kind of servers. Originally JMeter was designed to test web applications, but its functionality has expanded and nowadays allows testing against almost any kind of program and can be used to perform functional tests in your applications.. 
 
 
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 transformed directly into source or machine code. It is a description or template for how to solve a problem that can be used in many different situations. Patterns are formalized best practices that the programmer can use to solve common problems when designing an application or system.
 
 
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. Elasticsearch is developed in Java and is released as open source under the terms of the Apache License. Elasticsearch is the most popular enterprise search engine followed by Apache Solr, also based on Lucene.
 
 
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, runtime, system tools, system libraries, anything that can be installed on a server. This guarantees that the software will always run the same, regardless of its environment. Docker provides an additional layer of abstraction and automation of operating-system-level virtualization on Linux.
 

domingo, 28 de julio de 2019

Deep Learning vs. Machine Learning: elegir el mejor enfoque


Quiero recomendar un libro/pagina gratuito sobre machine learning y deep learning, es provisto por la empresa MathWorks que es la responsable de Mathlab.

Si van a la pagina van a poder leer:

" Tiene datos, hardware y un objetivo: todo lo que necesita para implementar los algoritmos de Machine Learning y de Deep Learning. ¿Pero cuál debería usar?

Este ebook interactivo tiene un enfoque centrado en el usuario para guiarlo hacia los algoritmos que debe considerar desde el principio.

Aprenda qué algoritmos están asociados con seis tareas comunes, que incluyen:


  • Predicción de una salida basada en datos históricos
  • Identificación de objetos en imagen, video y datos de señal
  • Moverse físicamente o en una simulación "

Como dice en la descripción es un libro interactivo por lo que no tenemos un formato "pdf" sino que es una pagina, con videos, links y ejemplos interactivos.

Muy recomendable.

Dejo link:
https://la.mathworks.com/campaigns/offers/deep-learning-vs-machine-learning-algorithm.html


jueves, 25 de julio de 2019

Mezclando datos de diferentes almacenes de datos con Apache Spark SQL


Vamos a hacer un ejemplo con Apache Spark SQL. Algo simple, vamos a tomar algunas tablas de una base de datos relacional y vamos hacer unas consultas y luego vamos a importar datos de un csv para tambien hacer consultas:

//Primero importamos la clase de SQLContext y creamos el contexto.

import org.apache.spark.sql.SQLContext
val sqlContext = new org.apache.spark.sql.SQLContext(sc)

//Vamos a importar los datos de la base de datos, en este caso la tabla "actor"

val url = "jdbc:mysql://0.0.0.0:3306/sakila"

val dfActor = spark.read.format("jdbc").option("url", url)
.option("dbtable", "actor")
.option("user", "sparkDb")
.option("password","sparkDb").load()

//Ya tenemos la tabla en el dataframe ahora vamos a imprimir el esquema y ver los datos.

dfActor.printSchema()
dfActor.show()
dfActor.count()

//Consultamos el campo nombre

dfActor.select("first_name").show()

//Registramos la tabla para poder consultarla con SQL

dfActor.registerTempTable("actors")

// Y consultamos

spark.sql("select first_name, last_name from actors").show

//Vamos a traernos una tabla relación entre el actor y el film

val dfActorFilms = spark.read.format("jdbc").option("url", url).option("dbtable", "film_actor").option("user", "sparkDb").option("password","sparkDb").load()

//Registro la tabla temporal

dfActorFilms.registerTempTable("actors_films")

//Selecciono los datos del actor y en cuantas peliculas actuo

spark.sql("select a.first_name, a.last_name, count(af.film_id) from actors a join actors_films af on (a.actor_id=af.actor_id) group by a.first_name, a.last_name").show

// Ahora vamos a traernos los datos del film pero desde un archivo csv
// Creamos una clase que me va hacer util leer los datos de forma estructurada.

case class Film(film_id: Int, title: String, description: String, release_year: Int)

// Leemos el archivo CSV :

val dfFilms = sc.textFile("/home/spark/films.csv").map(_.split(",")).map(p => Film(p(0).trim.toInt, p(1), p(2), p(3).trim.toInt)).toDF()

// Vemos que tiene el archivo

dfFilms.show

//Registramos el dataframe para poder hacer consultas sobre él

dfFilms.registerTempTable("films")

//Realizamos una consulta con joins al datafame actos_films para saber cuantos actores trabajaron en los films.

val dfFilmsCountActors = spark.sql("select f.title, count(af.film_id) from films f join actors_films af on (f.film_id=af.film_id) group by f.title")

//Registramos el dataframe como una tabla temporal

dfFilmsCountActors.registerTempTable("films_Count_Actors")

//Hacemos una consulta sobre esa tabla con filtro.

spark.sql("select * from films_Count_Actors fca where fca.title like '%SANTA%' ").show

//Por ultimo exportamos este resultado.

dfFilmsCountActors.coalesce(1).write.csv("/home/spark/filmsCount.csv")

Fin!

La idea era poder hacer un conjunto de acciones que nos sirvan como ejemplo de las cosas que se pueden hacer con Spark SQL. Espero que les sirva!!

martes, 23 de julio de 2019

VoltDb regala un libro

La gente de VoltDb una base NewSQL me regala un libro y quiero compartir con ustedes. Me llego el siguiente mail :

VoltDB-5G-world-email-header-560px
Hi Emanuel,
We are excited to announce the release of our brand new interactive eBook, Smart Stream Processing for a New 5G World
In this eBook, we explore the smart stream processing architecture – the data stream processing architecture built for the real-time needs of the 5G era – and illustrate how this innovative new architecture empowers you to truly address the challenges and opportunities 5G presents. 
Check out this eBook for an interactive examination into topics, including: 
  • How a smart stream processing architecture works
  • Why smart stream processing will shape the 5G world
  • Using smart stream processing for real-time decision making
  • And more
Download Now
Enjoy!
The VoltDB Team

Como puedo exportar un dataframe a un archivo en Apache Spark??


Tuve que exportar un dataframe a un archivo csv es spark y con scala, como no sabia lo tuve que buscar y ahora te lo comparto. En Spark 2 simplemente podemos hacer lo siguiente:

df.write.csv ("/la/carpeta/donde/queremos/que/este/el/archivo")

Si deseamos asegurarnos que el archivo sea uno, es decir que ya no estén particionados, agregue un .coalesce (1) de la siguiente manera;

df.coalesce (1) .write.csv ("/la/carpeta/donde/queremos/que/este/el/archivo")

Espero que les sea de ayuda!!

Apache NetBeans 11.1 fue liberado

La versión 11.1 de Apache NetBeans fue liberado, la primera versión que se lanzará después de convertirse en un proyecto de top level de Apache.

La nueva versión cuenta con soporte para la sintaxis Java 11 y 12, así como una estrecha integración con los proyectos Jakarte EE / Java EE 8 a través de los servidores de aplicaciones Payara y Glassfish. Los proyectos se pueden crear directamente a través de Maven y Gradle, utilizando el nuevo arquetipo webapp-javaee8. Esto permite a los desarrolladores trabajar y depurar aplicaciones completamente a través de los sistemas de compilación nativos, en lugar de un archivo de proyecto separado que emula al sistema de compilación.

Los desarrolladores de aplicaciones móviles o de escritorio pueden aprovechar la contribución de Gluon de las muestras de OpenJFX en NetBeans. Combinado con la comunidad GraalVM, OpenJFX permite a los desarrolladores codificar en Java y crear ejecutables nativos que se ejecutan directamente en dispositivos móviles. Usando NetBeans, los desarrolladores pueden crear y depurar estas aplicaciones antes de la implementación dentro de las tiendas de aplicaciones móviles. NetBeans también contribuyó a la creación de GraalVM este permite la visualización de gráficos de dependencia de programas, basados ​​en la plataforma NetBeans.

NetBeans tambien ofrece soporte para el desarrollo JavaScript en el lado del cliente o servidor, así como soporte nativo para aplicaciones PHP 7.4.

Y ya podemos bajarlo dejo link :
https://netbeans.apache.org/
http://netbeans.apache.org/download/nb111/index.html

domingo, 21 de julio de 2019

Primeros pasos con Flutter parte 2, la venganza de Flutter

Ahora voy a utilizar Android studio. Ya aprendi la lección lo mejor es utilizar Android Studio si queremos renegar menos. Antes que nada debemos instalar el sdk, como lo instalamos en el post anterior.

Primero instalar android studio, se puede bajar de aquí o yo en mi caso lo instale del market de linux:

Al iniciar android studio vamos a intalar el plugin de flutter :


Ahi elegimos el plugin de flutter :

Y nos va a pedir instalar el plugin de Dart y le decimos que si.

Y luego reniciamos la IDE.

Ahora ponemos new Flutter Project. Y le metemos...




Como se puede ver en las imagenes es un wizard muy simple. Lo único para destacar es que tenemos que indicar donde se instalo la sdk de fluter.

Con este proyecto, el wizard crea un proyecto de ejemplo. Así que ya tenemos nuestro ejemplo ahora prodremos probarlo, peeeeeero antes debemos crear un dispocitivo a donde probarlo. Ahora tenemos que ir a AVD manager y crear el device. El wizard es simple tambien, tenemos que elegir el tipo de dispositivo, luego el sistema operativo, si no tenemos instalado ninguno te permite bajar alguno,




Y con el dispositivo, ahora si podremos probar nuestra aplicación. Listo, para cerrar el post vamos a ejecutar la aplicación y ver como funciona. Y funciona!!!




jueves, 18 de julio de 2019

Indices secundarios en Cassandra


Si intentamos filtrar una tabla por una columna que no es parte de la clave primaria, no tendremos éxito, veamos un ejemplo :

cqlsh:my_keyspace> SELECT * FROM user WHERE last_name = 'Goette';

InvalidRequest: code=2200 [Invalid query] message="No supported
secondary index found for the non primary key columns restrictions"

El mensaje de error es claro, nosotros necesitamos crear un indice secundario, para la columna last_name. Los indices secundarios no son parte de la clave primaria y nos permiten filtrar por estos campos.

cqlsh:my_keyspace> CREATE INDEX ON user ( last_name );

Nosotros podemos darle un nombre al indice con la sintaxis :

CREATE INDEX <name> ON... ;

Si no especificamos el nombre, automáticamente utiliza el nombre :
 <table name>_<column name>_idx

Ahora vamos a hacer el mismo select :

cqlsh:my_keyspace> SELECT * FROM user WHERE last_name = 'Nguyen';

first_name | last_name
 ------------+-----------
Bill            | Nguyen

(1 rows)

Se pueden crear indices para tipos simples y colecciones, los mapas se pueden indexar por clave, por valor o por ambos.

Por último podemos remover un indice con drop index, por ejemplo :

cqlsh:my_keyspace> DROP INDEX user_last_name_idx;

Los indices secundarios no son recomendados para los siguientes casos:

  • Columnas muy grandes
  • Columnas con valores poco diferentes como por ejemplo titulo, los valores serán (señor, señorita, …) 
  • Columnas que son actualizadas con mucha frecuencia. 



martes, 16 de julio de 2019

Definir nuestros propios datos en Cassandra

Muchas veces debemos guardar datos compuestos, como direcciones, identificación, telefono, etc. Una forma es guardarlo todo en una columna de texto, pero luego vamos a tener que parcear, los resultados. Sería mejor si pudiéramos definir una estructura en la que almacenar por ejemplo las direcciones para mantener la integridad de los diferentes componentes.

Afortunadamente, Cassandra nos da una manera de definir nuestros propios tipos. Luego podemos crear columnas de estos tipos definidos por el usuario. Vamos a crear nuestro propio tipo de dirección, insertando algunos saltos de línea en nuestro comando para facilitar la lectura:

qlsh:my_keyspace> CREATE TYPE address (
... street text,
... city text,
... state text,
... zip_code int);

Podríamos haber escrito CREATE TYPE my_keyspace.address. Si ejecuta el comando DESCRIBE KEYSPACE my_keyspace, verá que el tipo de dirección es parte de la definición del espacio de claves.

Ahora que hemos definido nuestro tipo de dirección, intentaremos usarlo en nuestra tabla de usuarios, pero inmediatamente nos encontramos con un problema:

cqlsh:my_keyspace> ALTER TABLE user ADD addresses map<text, address>;

InvalidRequest: code=2200 [Invalid query] message="Non-frozen
collections are not allowed inside collections: map<text,
address>"

¿Que esta pasando aqui? Resulta que un tipo de datos definido por el usuario se considera una colección, ya que su implementación es similar a un conjunto, lista o mapa.

Las versiones de Cassandra anteriores a 2.2 no son totalmente compatibles con el anidamiento de colecciones. Específicamente, la capacidad de acceder a los atributos individuales de una colección anidada aún no se admite, ya que la colección anidada se serializa como un solo objeto por la implementación.

La congelación es un concepto que la comunidad Cassandra ha introducido como un mecanismo de compatibilidad hacia adelante. Por ahora, puede anidar una colección dentro de otra colección marcándola como congelada.

En el futuro, cuando las colecciones anidadas sean totalmente compatibles, habrá un mecanismo para "descongelar" las colecciones anidadas, permitiendo el acceso a los atributos individuales.
También puede usar una colección como clave principal si está congelada.

Ahora que hemos tomado un breve desvío para hablar sobre la congelación y las tablas anidadas, volvamos a modificar nuestra tabla, esta vez marcando la dirección como congelada:

cqlsh:my_keyspace> ALTER TABLE user ADD addresses map<text, frozen<address>>;

Ahora agreguemos una dirección de casa para Mary:

cqlsh:my_keyspace> UPDATE user SET addresses = addresses + {'home': { street: '7712 E. Broadway', city: 'Tucson', state: 'AZ', zip_code: 85715} } WHERE first_name = 'Mary';


Collections en Apache Cassandra


Como casandra no permite joins es muy dificil mantener relaciones como lo hariamos en una base SQL normal, por ejemplo si queremos mantener datos de un usuario y sus emails, una forma de hacerlo sería crear columnas adicionales, como email2, email3, etc.

Si bien este es un enfoque que funcionará, no escala muy bien y puede causar muchos cambios. Es mucho más simple tratar con las direcciones de correo electrónico como grupo o "colección". Cassandra hereda los tipos de Java por lo tanto tenemos Listas, conjuntos y mapas.  Echemos un vistazo a cada uno de ellos:

set : El tipo de datos de conjunto almacena una colección de elementos. Los elementos no están ordenados, pero cqlsh devuelve los elementos en orden ordenado. Por ejemplo, los valores de texto se devuelven en orden alfabético. Los conjuntos pueden contener los tipos simples que revisamos en el post anterior, así como los tipos definidos por el usuario e incluso otras colecciones. Una de las ventajas de usar set es la capacidad de insertar elementos adicionales sin tener que leer el contenido primero.

Veamos un ejemplo de agregar un set de emails a la tabla usuario :

cqlsh:my_keyspace> ALTER TABLE user ADD emails set<text>;

Luego agregaremos una dirección de correo electrónico para Mary y verificaremos que se haya agregado con éxito:

cqlsh:my_keyspace> UPDATE user SET emails = {'mary@example.com' } WHERE first_name = 'Mary';

cqlsh:my_keyspace> SELECT emails FROM user WHERE first_name ='Mary';

emails
----------------------
{'mary@example.com'}

(1 rows)

Tenga en cuenta que al agregar esa primera dirección de correo electrónico, reemplazamos el contenido anterior del conjunto, que en este caso era nulo. Podemos agregar otra dirección de correo electrónico más tarde sin reemplazar todo el conjunto mediante concatenación:

cqlsh:my_keyspace> UPDATE user SET emails = emails + { 'mary.mcdonald.AZ@gmail.com' } WHERE first_name = 'Mary';

cqlsh:my_keyspace> SELECT emails FROM user WHERE first_name = 'Mary';

emails
---------------------------------------------------
{'mary.mcdonald.AZ@gmail.com', 'mary@example.com'}

(1 rows)

list : El tipo de datos de lista contiene una lista ordenada de elementos. Por defecto, los valores se almacenan en orden de inserción (es decir por un indice). Modifiquemos nuestra tabla de usuarios para agregar una lista de números de teléfono:

cqlsh:my_keyspace> ALTER TABLE user ADD phone_numbers list<text>;

Luego agregaremos un número de teléfono para Mary y verificaremos que se haya agregado correctamente:

cqlsh:my_keyspace> UPDATE user SET phone_numbers = ['1-800-999-9999' ] WHERE first_name = 'Mary';

cqlsh:my_keyspace> SELECT phone_numbers FROM user WHEREfirst_name = 'Mary';

phone_numbers
--------------------
['1-800-999-9999']

(1 rows)

Agreguemos un segundo número añadiéndolo:

cqlsh:my_keyspace> UPDATE user SET phone_numbers = phone_numbers + [ '480-111-1111' ] WHERE first_name = 'Mary';

cqlsh:my_keyspace> SELECT phone_numbers FROM user WHERE first_name = 'Mary';

phone_numbers
------------------------------------
['1-800-999-9999', '480-111-1111']

(1 rows)

El segundo número que agregamos ahora aparece al final de la lista.

Podemos reemplazar un elemento individual en la lista cuando lo referenciamos por su índice:

cqlsh:my_keyspace> UPDATE user SET phone_numbers[1] = '480-111-1111' WHERE first_name = 'Mary';

Al igual que con los conjuntos, también podemos usar el operador de resta para eliminar elementos que coincidan con un valor específico:

cqlsh:my_keyspace> UPDATE user SET phone_numbers =phone_numbers - [ '480-111-1111' ] WHERE first_name = 'Mary';

Finalmente, podemos eliminar un elemento específico directamente usando su índice:

cqlsh:my_keyspace> DELETE phone_numbers[0] from user WHERE first_name = 'Mary';

map : El tipo de datos mapa contiene una colección de pares clave/valor. Las claves y los valores pueden ser de cualquier tipo excepto contador. Probemos esto utilizando un mapa para almacenar información sobre los inicios de sesión de los usuarios. Crearemos una columna para rastrear el tiempo de inicio de sesión en segundos, con un timeuuid como clave:

cqlsh:my_keyspace> ALTER TABLE user ADD login_sessions map<timeuuid, int>;

Luego agregaremos un par de sesiones de inicio de sesión para Mary y veremos los resultados:

cqlsh:my_keyspace> UPDATE user SET login_sessions = { now(): 13, now(): 18} WHERE first_name = 'Mary';

cqlsh:my_keyspace> SELECT login_sessions FROM user WHERE first_name = 'Mary';

login_sessions
-----------------------------------------------
{6061b850-14f8-11e5-899a-a9fac1d00bce: 13,
6061b851-14f8-11e5-899a-a9fac1d00bce: 18}

(1 rows)

También podemos hacer referencia a un elemento individual en el mapa usando su clave.

Los tipos de colección son muy útiles en los casos en que necesitamos almacenar un número variable de elementos dentro de una sola columna.


domingo, 14 de julio de 2019

restQL V3 fue liberado!!

Un momento cerebrito, que es RestQL?

RestQL es un lenguaje de consultas de microservicio que facilita la obtención de información de múltiples servicios de la manera más eficiente. Parecido a GraphQL. Para mayor detalle leete este post:
https://emanuelpeg.blogspot.com/2018/01/consultar-apis-rest-con-restql.html

Se ha lanzado la última versión de restQL que ofrece nuevas características notables que incluyen agregación de contenido, soporte para métodos HTTP adicionales, funcionalidad de recuperación automática y una versión para las aplicaciones node.js. Mejoras de rendimiento integrales que han hecho que la última versión sea dos veces más rápida que su predecesora. La versión 3 es compatible con la versión 2, por lo que los usuarios pueden actualizar de forma segura. El código para el proyecto de código abierto está disponible bajo una licencia MIT.

RestQL está destinado a simplificar el código de usuario que necesita consultar múltiples microservicios. Si bien una arquitectura de microservicios puede hacer que los sistemas de back-end sean más fáciles de soportar y mantener, una consecuencia común y no intencional es la complejidad adicional que se está introduciendo en la capa de aplicaciones de front-end. RestQL reduce la complejidad de la organización de llamadas a múltiples microservicios y aprovecha la funcionalidad de almacenamiento en caché del navegador nativo debido a su uso de llamadas HTTP estándar.

Una de las características definitorias de restQL ha sido las llamadas paralelas automáticas a recursos separados. Sin embargo, las respuestas individuales también se separarán, lo que requerirá que el cliente consolide los objetos relacionados, como un cliente con varios pedidos. En la última versión, el nuevo operador "in" permite al desarrollador especificar la estructura de agregación por adelantado en la consulta, lo que da como resultado un resultado único y combinado.

La última versión ofrece una mayor capacidad de recuperación del servidor restQL, que se encuentra entre los clientes y las API de microservicio. Cuando el sistema detecta que se está sobrecargando, introduce una forma de contrapresión. Un ajuste de configuración define el umbral para una sobrecarga de tiempo de procesamiento aceptable. Si se alcanza ese umbral, el sistema comenzará a devolver las respuestas HTTP 507 (almacenamiento insuficiente) para algunas solicitudes, mientras permite que una parte de las solicitudes continúe ejecutándose con éxito.

Las versiones anteriores de restQL solo admitían datos de consulta mediante el uso de la palabra clave from, que se traducía a una solicitud HTTP GET. V3 agrega el conjunto estándar de verbos HTTP para las operaciones CRUD, incluyendo POST, PUT y DELETE, a través de las palabras clave to, into y delete, respectivamente.

Dejo link: 

sábado, 13 de julio de 2019

Por qué deberías aprender Kotlin ?


Kotlin reventará tu productividad como desarrollador de Android.

Puedo entender que, si nunca has usado Kotlin antes, todavía puedes ser un poco reacio a creerlo. Pero pregúntale a cualquiera que haya comenzado a usarlo.

Es sorprendente la cantidad de código que ahorrarás y la simplicidad que aportará a tu vida. Te cuento algunas de las características:


  • Los tipos de Nullable, que te ayudarán a reducir la cantidad de errores en tu aplicación.
  • Las data classes, que reducen drásticamente el boilerplate requerido para las clases de entidades.
  • Extension functions, que te ayudarán a evitar la creación de subclases y crear nuevas formas de escribir tus aplicaciones a través de DSL
  • El uso de lambdas como tipos válidos también reduce el número de interfaces que necesitas escribir
  • La expresión when hace que las condiciones sean más simples y fáciles de leer
  • Sus increíbles colecciones y todos sus poderosos operadores funcionales.
  • La promoción de la inmutabilidad.

Y podría seguir todo el día. Puede reducir tu código base hasta en un 40%.

Pero reducir la cantidad de LoC significa algo más importante: menos líneas significa menos código para mantener, menos código para testear y menos errores posibles.

Dejo link: https://kotlinlang.org/

jueves, 11 de julio de 2019

Libro Java Code Geeks


Download IT Guides!

 
Apache Hadoop is an open-source software framework written in Java for distributed storage and distributed processing of very large data sets on computer clusters built from commodity hardware. In this eBook, we provide a compilation of Hadoop based examples that will help you kick-start your own web projects. We cover a wide range of topics, from installation and configuration, to distributed caching and streaming. With our straightforward tutorials, you will be able to get your own projects up and running in minimum time. With this free eBook you will also receive weekly news, tips and special offers delivered to your inbox courtesy of Java Code Geeks.
 
 
Delve into the world of Selenium Programming with this compact cookbook that introduces common recipes for the Selenium framework! Selenium is a portable software testing framework for web applications. Selenium provides a record/playback tool for authoring tests without learning a test scripting language (Selenium IDE). It also provides a test domain-specific language (Selenese) to write tests in a number of popular programming languages, including Java, C#, Groovy, Perl, PHP, Python and Ruby. In this ebook, we provide a compilation of Selenium programming examples that will help you kick-start your own projects. 
 
 
Delve into the world of Spring Data Programming with this compact cookbook that introduces common recipes for the Spring Data framework! Spring Data's mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store. It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services. In this eBook, we provide a compilation of Spring Data examples that will help you kick-start your own projects. We cover a wide range of topics, from setting up the environment and creating a basic project, to handling the various modules (e.g. JPA, MongoDB, Redis etc.). 
 
 
Android is a mobile operating system developed by Google, based on the Linux kernel and designed primarily for touchscreen mobile devices such as smartphones and tablets. Android's user interface is mainly based on direct manipulation, using touch gestures that loosely correspond to real-world actions, such as swiping, tapping and pinching, to manipulate on-screen objects, along with a virtual keyboard for text input. In this ebook, we provide a compilation of Android programming examples that will help you kick-start your own web projects. We cover a wide range of topics, from Services and Views, to Google Maps and Bluetooth functionality. With our straightforward tutorials, you will be able to get your own projects up and running in minimum time.