Translate
martes, 15 de octubre de 2019
Proba Rust con Play.rust-lang.org
Rust se esta perfilando como el nuevo C y es excelente lenguaje de bajo nivel. Centrado en el paralelismo y buenas prácticas de programación, esta ganando mucho mercado.
A nivel personal, creo que es mejor que Go, pero eso es para otro post ...
Si quieren probar un poco Rust, tienen play.rust-lang.org un sitio donde podemos escribir codigo, compilarlo y correrlo. Ideal para ir probando código a medida que leemos unos posts o un libro.
Dejo link : https://play.rust-lang.org/
R para Ciencia de Datos
Me encontré esta super traducción de “R para Ciencia de Datos” y la quiero compartir. Como ellos han escrito una introducción, que mejor que citarla aquí :
La traducción de “R para Ciencia de Datos” es un proyecto colaborativo de la comunidad de R de Latinoamérica, que tiene por objetivo hacer R más accesible en la región.
En la traducción del libro participaron las siguientes personas (en orden alfabético): Marcela Alfaro, Mónica Alonso, Fernando Álvarez, Zulemma Bazurto, Yanina Bellini, Juliana Benítez, María Paula Caldas, Elio Campitelli, Florencia D’Andrea, Rocío Espada, Joshua Kunst, Patricia Loto, Pamela Matías, Lina Moreno, Paola Prieto, Riva Quiroga, Lucía Rodríguez, Mauricio “Pachá” Vargas, Daniela Vázquez, Melina Vidoni, Roxana N. Villafañe. ¡Muchas gracias por su trabajo! La administración del repositorio con la traducción ha estado cargo de Mauricio “Pachá” Vargas. La coordinación general y la edición, a cargo de Riva Quiroga.
Agradecemos a todas las personas que han ayudado revisando las traducciones y haciendo sugerencias de mejora. Puedes revisar la documentación del proyecto para ver los créditos de participación. Gracias también a Marcela Alfaro por el tuit que hizo visible la necesidad de la versión en español, y a Laura Ación y Edgar Ruiz, que pusieron en contacto a las personas del equipo.
Este proyecto no solo implica la traducción del texto, sino también de los sets de datos que se utilizan a lo largo de él. Para ello, se creó el paquete datos, que contiene las versiones traducidas de estos. Puedes revisar su documentación acá. El paquete fue desarrollado por Edgar Ruiz, Riva Quiroga, Mauricio “Pachá” Vargas y Mauro Lepore. Para su creación se utilizaron funciones del paquete datalang de Edgar Ruiz y las sabias sugerencias de Hadley Wickham.
Si quieres conocer más sobre los principios que han orientado nuestro trabajo puedes leer [la documentación del proyecto] (https://github.com/cienciadedatos/documentacion-traduccion-r4ds). Para estar al tanto de novedades sobre el paquete {datos} y nuevas iniciativas del equipo, sigue nuestra cuenta en Twitter.
Dejo link: https://es.r4ds.hadley.nz/?fbclid=IwAR0-hYNZ5oIKmt_tgmDGgaSuwEIi6T6kj1gnLHnQr8DwdnNDHoKgFDHcJGg
Y algo muy importante la versión original :se distribuye bajo los términos y condiciones de la licencia Creative Commons Atribución-No Comercial-Sin Derivados 3.0 vigente en los Estados Unidos de América.
lunes, 14 de octubre de 2019
Achieving Real Business Outcomes from AI can help
O’Reilly nos regala un libro de inteligencia artificial y me mandaron este mail que comparto :
| ||
Hi Emanuel,
Working on an AI initiative can be demanding, whether you’re in the middle of the process or just getting started. Achieving Real Business Outcomes from AI can help. You’ll learn ways to deal with common AI challenges that arise when creating a strategy, dealing with technical issues, or productizing an AI initiative.
If you’re working in AI, this short ebook is just the beginning. You should also check out the AI Resource Center on the O’Reilly learning platform. The resource center will point you to the best videos, books, and more for each stage of AI expertise.
In the meantime, this short ebook is free, our gift to you.
Enjoy!
| ||
| ||
The O’Reilly Team
PS Interested in AI? Check out the O’Reilly AI Conferences in San Jose, New York, and London. Previous attendees have called these events inspirational, excellent, eye-opening, and awesome.
| ||
domingo, 13 de octubre de 2019
HackerRank Women in Tech Report
Hackerrank es una pagina que hace encuestas y las publica, estan muy buenas las conclusiones.
Quiero compartir : HackerRank Women in Tech Report 2019.
Dejo link : https://research.hackerrank.com/women-in-tech/2019/
sábado, 12 de octubre de 2019
Funciones con funciones como parámetros en Scala parte 2
Seguimos con scala : https://emanuelpeg.blogspot.com/2019/09/funciones-con-funciones-como-parametros.html
Cuando pasamos un función por parámetro Scala infiere el tipo de la función y lo chequea con el tipo esperado, esto no es más que el chequeo por tipo que realiza cualquier lenguaje de tipado estático.
Veamos un ejemplo:
valueAtOneQuarter((x: Double) => 3 * x) // 0.75
Dado que la función valeAtOneQuarter espera un (Doble) => Doble por lo tanto Scala puede inferir que es un double y de esta manera podemos escribir :
valueAtOneQuarter((x) => 3 * x)
También podemos quitar los paréntesis :
valueAtOneQuarter(x => 3 * x)
También podemos utilizar azúcar sintáctica, dado que la variable x no representa algo en particular y no hay muchas lógica aquí :
valueAtOneQuarter(3 * _)
De esta manera, como la función tiene el tipo declarado Scala lo puede inferir pero si nosotros hacemos :
val fun = 3 * _
Vamos a tener un error dado que no se puede inferir el tipo, pero esto se puede soluciónar así :
val fun = 3 * (_: Double)
o
val fun: (Double) => Double = 3 * _
Especificar el tipo de _ es útil para convertir los métodos en funciones. Por ejemplo, (_: String) .length es una función String => Int, y (_: String) .substring (_: Int, _: Int) es una función (String, Int, Int) => String.
Cuando pasamos un función por parámetro Scala infiere el tipo de la función y lo chequea con el tipo esperado, esto no es más que el chequeo por tipo que realiza cualquier lenguaje de tipado estático.
Veamos un ejemplo:
valueAtOneQuarter((x: Double) => 3 * x) // 0.75
Dado que la función valeAtOneQuarter espera un (Doble) => Doble por lo tanto Scala puede inferir que es un double y de esta manera podemos escribir :
valueAtOneQuarter((x) => 3 * x)
También podemos quitar los paréntesis :
valueAtOneQuarter(x => 3 * x)
También podemos utilizar azúcar sintáctica, dado que la variable x no representa algo en particular y no hay muchas lógica aquí :
valueAtOneQuarter(3 * _)
De esta manera, como la función tiene el tipo declarado Scala lo puede inferir pero si nosotros hacemos :
val fun = 3 * _
Vamos a tener un error dado que no se puede inferir el tipo, pero esto se puede soluciónar así :
val fun = 3 * (_: Double)
o
val fun: (Double) => Double = 3 * _
Especificar el tipo de _ es útil para convertir los métodos en funciones. Por ejemplo, (_: String) .length es una función String => Int, y (_: String) .substring (_: Int, _: Int) es una función (String, Int, Int) => String.
jueves, 10 de octubre de 2019
Libros de Java geek
martes, 8 de octubre de 2019
Design Patterns in Go
Quiero compartir esta gran pagina que muestra implementaciones de los patrones de diseño GOF en Go. Sería GOF en Go. Esta bueno como nombre de la página "Gof in Go" , bueno...
Ustedes pensarán igual que yo, como van implementar patrones Gof si Go no es orientado a objetos, pero si, con su polimorfismo en las estructuras, puede.
La verdad es que me cautiva porque en tantas cosas no estoy de acuerdo con esta pagina, pero a la vez me parece un genial ejercicio para aprender. Por ejemplo cuando afirma que Go es orientado a objetos pero no tiene ni clases, ni objetos. No sé, por algun lado no me cierra.
En fin, esta en castellano, así que aprovechen.
Dejo link: https://www.designpatternsingo.com/
Hacer diagramas de secuencia súper fáciles con sequencediagram.org
Cada tanto te encontras con una herramienta que vale la pena compartir y este es el caso.
sequencediagram.org es un editor de diagramas de secuencia, súper fácil que se basa en texto para generar nuestros diagramas.
Tenes un lenguaje generador de diagramas que es muy fácil de utilizar y a medida que escribimos nuestro código se va generando el diagrama. Este código tiene instrucciones básicas y no ten básicas que permiten generar y embellecer nuestros diagramas.
Generado nuestro diagrama, podemos exportarlo a imagen (png), guardar le texto, compartirlo, guardarlo en un google drive, etc.
Sin más dejo el link: https://sequencediagram.org/
Cómo dividir cadenas separadas por comas y usarlas en una cláusula IN en un select en oracle
Veamos dijo Stevie Wonder, en el trabajo por x motivos guardamos un campo con ids separados por comas.
Más allá de si esto esta bien o mal, necesitaba cortarlo y buscar por estos datos, como lo hice? :
select regexp_substr(columnasConIdsSeparadosPorComa,'[^,]+', 1, level) from tabla;
y bueno, esta query puede estar en un in :
select * from OtraTabla ot
where ot.id in ( select regexp_substr(columnasConIdsSeparadosPorComa,'[^,]+', 1, level) from tabla )
Y eso es todo amigos!
domingo, 6 de octubre de 2019
Channels en Go
Continuamos con en go
Los channels o canales son las tuberías que conectan las goroutinas concurrentes. Puede enviar valores a canales desde una goroutine y recibir esos valores en otra goroutine.
Se puede crear un nuevo channel con make (chan val-type). Los channels o canales están tipificados por los valores que transmiten.
Veamos un ejemplo:
package main
import "fmt"
func main() {
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
$ go run channels.go
ping
Como se puede ver en el ejemplo, se crea un chanel y luego envía valor a este chanel utilizando la sintaxis <-. En el ejemplo enviamos "ping" al canal messages que hicimos arriba, desde una nueva rutina.
La sintaxis <- permite recibir un valor del canal. Aquí recibiremos el mensaje de "ping" que enviamos arriba y lo imprimimos.
Cuando ejecutamos el programa, el mensaje "ping" se pasa con éxito de una rutina a otra a través de nuestro canal.
Por defecto se envían y reciben datos hasta que el emisor como el receptor estén listos. Esta propiedad nos permite esperar al final de nuestro programa el mensaje "ping" sin tener que usar ninguna otra sincronización.
Dejo link: https://gobyexample.com/channels
Los channels o canales son las tuberías que conectan las goroutinas concurrentes. Puede enviar valores a canales desde una goroutine y recibir esos valores en otra goroutine.
Se puede crear un nuevo channel con make (chan val-type). Los channels o canales están tipificados por los valores que transmiten.
Veamos un ejemplo:
package main
import "fmt"
func main() {
messages := make(chan string)
go func() { messages <- "ping" }()
msg := <-messages
fmt.Println(msg)
}
$ go run channels.go
ping
Como se puede ver en el ejemplo, se crea un chanel y luego envía valor a este chanel utilizando la sintaxis <-. En el ejemplo enviamos "ping" al canal messages que hicimos arriba, desde una nueva rutina.
La sintaxis <- permite recibir un valor del canal. Aquí recibiremos el mensaje de "ping" que enviamos arriba y lo imprimimos.
Cuando ejecutamos el programa, el mensaje "ping" se pasa con éxito de una rutina a otra a través de nuestro canal.
Por defecto se envían y reciben datos hasta que el emisor como el receptor estén listos. Esta propiedad nos permite esperar al final de nuestro programa el mensaje "ping" sin tener que usar ninguna otra sincronización.
Dejo link: https://gobyexample.com/channels
sábado, 5 de octubre de 2019
Goroutines
Continuamos con en go
Supongamos que tenemos que llamar una función de forma asíncrona en Go, para eso son las goroutines, veamos un ejemplo :
package main
import (
"fmt"
"time"
)
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
f("direct")
go f("goroutine")
go func(msg string) {
fmt.Println(msg)
}("going")
time.Sleep(time.Second)
fmt.Println("done")
}
Como se ve, llamamos una función de forma directa sincrona, y otras 2 con goroutines. El resultado va ser :
$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done
Si venimos de lenguajes como C podemos decir que Go con las goroutines crea un hilo por geroutin.
Si venimos de lenguajes como C podemos decir que Go con las goroutines crea un hilo por geroutin.
Dejo link: https://gobyexample.com/goroutines
jueves, 3 de octubre de 2019
Microsoft anuncia la disponibilidad de .NET Core 3
Microsoft anuncia la disponibilidad de .NET Core 3 en linux, windows y Mac.
Primero empiezo con lo que no me gusto, Windows Presentation Foundation (WPF), no esta soportado en Linux. Y no me gusto porque tengo muchas ganas de jugar con ventanas en linux, si bien hoy todo tiende a la web, todavía se utiliza el escritorio y sobre todo en las aplicaciones base. Y me gustaría que se implemente el concepto de look and feel similar a java (pero esto ya soñando)
Cosas que vienen bien:
- incluir una notable mejora del rendimiento frente a versiones anteriores,
- nuevas API de JSON
- soporte para los lenguajes de programación C# 8 y F# 4.7.
- aumenta el conjunto de tipos que se puede usar en el código tanto en .NET Core como Xamarin
- un recolector de basura que ahora usa menos memoria
- la inclusión por defecto de ejecutables en las aplicaciones de .NET Core, soporte para Raspberry Pi y otros chips ARM, además de haberse mejorado el desempeño del framework en los contenedores Docker.
.NET Core 3.0, al igual que las versiones anteriores, es Open Source (licencia MIT) y multipltaforma, pudiendo ser descargado para Linux (Ubuntu, RHEL, Fedora, openSUSE, Debian, CentOS y SLES), Windows, Mac y como contenedor Docker.
Dejo link: https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0/
miércoles, 2 de octubre de 2019
Anonymous fields en Go
Continuamos con en go
Como podemos aplicar composiciones a un lenguaje no orientado a objeto y que no se vea forzado? Y la respuesta la tiene Go con Anonymous fields. En Go solo tenemos estructuras y funciones que trabajan con dichas estructuras. Si bien Go tiene una forma de escribir estas estructuras y su interacción con las funciones que hace imaginar a objetos, esto no es así.
Pero Go utiliza composiciones, como lo hace? componiendo estructuras: Go permite definir una estructura que tiene campos pero sin nombres de variables. Estos campos se llaman campos anónimos. Hagamos algunos ejemplos para descubrir cuáles son y cómo serán útiles.
En el siguiente ejemplo, hemos definido una estructura de Cocina, que solo contiene el número de platos como un campo. Definimos otro campo llamado House, que contiene una instancia de Kitchen como campo, pero es un campo anónimo, porque no le hemos dado un nombre de variable.
Los campos anónimos en las estructuras Go nos permiten atajar la notación de puntos, así como también nos permiten usar composiciones para agregar métodos a un tipo. Veamos un ejemplo :
La estructura C contiene a la estructura A, por lo tanto la estructura C esta compuesta. Y podemos llamar a campos de C por medio de los campos descriptos en A o B :
c := C {}
c.AValue.X = 1
Podemos pasar a C de modo anónimo por lo tanto queda así :
type C struct {
A
B
}
nos permite reducir el uso de la notación de puntos y acceder a X en A como si fuera un campo dentro de la estructura C en sí, es decir
c := C {}
c.X = 1
De acuerdo, pero ¿qué pasaría si B struct ahora reemplazara el nombre del campo Z con X?
type A struct {
X int
Y int
}
type B struct {
X int
}
Ahora tenemos una situación en la que tanto A como B tienen el mismo nombre de campo, bueno, aún podemos usar campos anónimos, pero volvemos a usar más notación de puntos nuevamente para evitar el conflicto obvio de nombre de campo, es decir:
c := C {}
c.A.X = 1
c.B.X = 2
Los inicializadores no admiten accesos directos, es decir :
c := C{ A : A{2, 4}, B : B { 12 }}
// or
c := C{ A : A{X : 2, Y : 4}, B : B { Z: 12 }}
Más poderoso que el azúcar sináptico de los campos anónimos, es que también podemos usar la composición para aumentar los métodos disponibles en la estructura C. Por ejemplo, ahora agreguemos un método al tipo A que nos permite mover nuestro punto X, Y
func (a *A) Move(amount int) {
a.X += amount
a.Y += amount
}
Ahora podemos llamar al método con C :
c.Move(10)
También podemos crear más métodos a través de un patrón de composición en el tipo C si queremos usar tipos vacíos, supongamos que tenemos el tipo D y amplia la composición del tipo C, bueno podemos :
type D struct {}
type C struct {
A
B
D
}
ahora podemos agregar métodos a D y, por supuesto, estarán disponibles como parte de C. Entonces, por ejemplo, tal vez D actúa como un receptor para los métodos que serializan datos a JSON, ahora nuestro tipo C también parecerá tener esos métodos.
martes, 1 de octubre de 2019
Diagramas de Chebotko
Con frecuencia es útil presentar diseños de modelos de datos lógicos y físicos visualmente. Para lograr esto en Cassandra, podemos utilizar Diagrama de Chebotko, que presenta un diseño de esquema de base de datos como una combinación de esquemas de tabla individuales y transiciones de flujo de trabajo de aplicaciones basadas en consultas. Algunas de las ventajas de los Diagramas de Chebotko, en comparación con los scripts de definición de esquemas de CQL regulares, incluyen una legibilidad general mejorada, una inteligibilidad superior para modelos de datos complejos y una mejor expresividad con esquemas de tabla y sus consultas de aplicaciones compatibles. Los diagramas de nivel físico contienen información suficiente para generar un script CQL que instancia un esquema de base de datos y puede servir como documentos de referencia para desarrolladores y arquitectos que diseñan y mantienen una solución basada en datos.
Dentro de la comunidad de Cassandra han propuesto anotaciones para capturar modelos de datos en forma de diagrama. Y se popularizo el diagrama creado por Artem Chebotko que proporciona una forma simple e informativa de visualizar las relaciones entre consultas y tablas en nuestros diseños.
Cada tabla se muestra con su título y una lista de columnas. Las columnas de clave principal se identifican mediante símbolos como K para columnas de clave de partición y C ↑ o C ↓ para representar columnas de agrupamiento. Las líneas se muestran entrando en tablas o entre tablas para indicar las consultas que cada tabla está diseñada para admitir.
Modelado de datos en Cassandra
Nosotros en casandra podemos guradar algun id y verlo como una foreign key pero este concepto no existe en realidad, el motor de base de datos no realiza ningun checkeo.
En el diseño de bases de datos relacionales, a menudo se nos enseña la importancia de la normalización. Esto no es una ventaja cuando se trabaja con Cassandra porque funciona mejor cuando el modelo de datos está desnormalizado. A menudo ocurre que las empresas también terminan desnormalizando datos en bases de datos relacionales.
Hay dos razones comunes para esto:
Uno es el rendimiento. Las empresas simplemente no pueden obtener el rendimiento que necesitan cuando tienen que hacer tantas uniones en datos, por lo que desnormalizar puede ser una solución para la performance. Esto termina funcionando, pero va en contra de la forma en que se pretende diseñar las bases de datos relacionales por lo tanto no tiene sentido usar base de datos relacionales.
Una segunda razón es conservar un historial. El ejemplo común aquí es con las facturas. Ya tiene tablas de clientes y productos, y pensaría que podría hacer una factura que referencie esas tablas. Pero esto nunca debe hacerse en la práctica. La información del cliente o del precio podría cambiar, y luego perdería la integridad del documento tal como estaba en la fecha de la factura, lo que podría violar auditorías, informes o leyes, y causar otros problemas.
En el mundo relacional, la desnormalización viola las formas normales de Codd y tratamos de evitarla. Pero en Cassandra, la desnormalización es, bueno, perfectamente normal.
En cassandra existen una tecnicas para modelar nuestros datos :
Query-first design o diseño orientado a consultas: En cassandra podemos comenzar modelando de los datos desde las consultas, la información se debe organizar según las consultas que necesitamos. De esta manera vamos a tener un monton de datos repetidos pero esto no es significativo, dado que con cassandra el hardware es relativamente barato y la escritura muy rapida.
En las base de datos relacionales muchas veces es transparente como se organiza la base a como se guardan los datos en disco. En cambio en cassandra cada tabla es guardada en un archivo diferente en el disco. Por lo tanto es importante mantener columnas relacionadas en la misma tabla. Un objetivo de cassandra es minimizar el numero de particiones donde hay que buscar con el objetivo de satisfacer una query. Pensemos que buscar los datos en una partición puede ser sumamente más performate que buscarlo en nodos separados.
En las base de datos relacionales es muy facil cambiar el orden en una consulta con la instrucción ORDER BY. Y no se puede especificar el orden con los que se guardan los datos y por defecto los datos son recuperados según fueron grabados. En cassandra esto cambia un poco dado que esta es una decisión de diseño. El order es fijo y esta determinado por las clustering columns. Es decir el select permite utilizar el order by pero solo en las clustering columns.
En el diseño de bases de datos relacionales, a menudo se nos enseña la importancia de la normalización. Esto no es una ventaja cuando se trabaja con Cassandra porque funciona mejor cuando el modelo de datos está desnormalizado. A menudo ocurre que las empresas también terminan desnormalizando datos en bases de datos relacionales.
Hay dos razones comunes para esto:
Uno es el rendimiento. Las empresas simplemente no pueden obtener el rendimiento que necesitan cuando tienen que hacer tantas uniones en datos, por lo que desnormalizar puede ser una solución para la performance. Esto termina funcionando, pero va en contra de la forma en que se pretende diseñar las bases de datos relacionales por lo tanto no tiene sentido usar base de datos relacionales.
Una segunda razón es conservar un historial. El ejemplo común aquí es con las facturas. Ya tiene tablas de clientes y productos, y pensaría que podría hacer una factura que referencie esas tablas. Pero esto nunca debe hacerse en la práctica. La información del cliente o del precio podría cambiar, y luego perdería la integridad del documento tal como estaba en la fecha de la factura, lo que podría violar auditorías, informes o leyes, y causar otros problemas.
En el mundo relacional, la desnormalización viola las formas normales de Codd y tratamos de evitarla. Pero en Cassandra, la desnormalización es, bueno, perfectamente normal.
En cassandra existen una tecnicas para modelar nuestros datos :
Query-first design o diseño orientado a consultas: En cassandra podemos comenzar modelando de los datos desde las consultas, la información se debe organizar según las consultas que necesitamos. De esta manera vamos a tener un monton de datos repetidos pero esto no es significativo, dado que con cassandra el hardware es relativamente barato y la escritura muy rapida.
En las base de datos relacionales muchas veces es transparente como se organiza la base a como se guardan los datos en disco. En cambio en cassandra cada tabla es guardada en un archivo diferente en el disco. Por lo tanto es importante mantener columnas relacionadas en la misma tabla. Un objetivo de cassandra es minimizar el numero de particiones donde hay que buscar con el objetivo de satisfacer una query. Pensemos que buscar los datos en una partición puede ser sumamente más performate que buscarlo en nodos separados.
En las base de datos relacionales es muy facil cambiar el orden en una consulta con la instrucción ORDER BY. Y no se puede especificar el orden con los que se guardan los datos y por defecto los datos son recuperados según fueron grabados. En cassandra esto cambia un poco dado que esta es una decisión de diseño. El order es fijo y esta determinado por las clustering columns. Es decir el select permite utilizar el order by pero solo en las clustering columns.
Suscribirse a:
Entradas (Atom)