jueves, 30 de noviembre de 2017

Llega Linux Mint 18.3

Como saben soy fanático de linux Mint y ya está disponible su versión 18.3 en sus dos ediciones: Linux Mint Cinnamon y Linux Mint MATE. Se trata de una versión de soporte extendido que será mantenida hasta el año 2021, así que es un excelente momento para actualizar.

Linux Mint 18.3 Sylvia viene con muchas novedades, entre las que podemos nombrar un nuevo centro de software con muchas aplicaciones populares como Spotify y WhatsApp al alcance de un click, soporte para Flatpak, y nuevas herramientas de respaldo.

El centro de software  ha sido remodelado por completo, ahora es más moderno, rápido y ofrece una mejor experiencia de uso. Mira:



A mi entender la novedad más importante es que Linux Mint ahora soporta Flatpak, pero que es Flatpak? es una herramienta para que podamos instalar aplicaciones incluso si sus dependencias no son compatibles con Linux Mint. Es decir todo el software del mundo libre!!!

Más adelante tendremos su versión kde y Xfce.

Dejo link: https://www.linuxmint.com/release.php?id=31
https://linuxmint.com/rel_sylvia_cinnamon.php


Ebook Gratuitos


Quiero compartir una pagina donde orelly publica todos sus e-books gratuitos. Se puede encontrar libros de cualquier variedad.

Un archivo de todos los libros electrónicos de O'Reilly para su descarga gratuita. Sumérgete en lo último en ciencia de datos y big data, compilado por editores, autores y ponentes de O'Reilly.

Dejo el link :
http://www.oreilly.com/data/free/archive.html

domingo, 26 de noviembre de 2017

Inferencia de tipos


Leyendo en infoQ sobre las nuevas características que podría tener Java 10, me entere que estan pensando agregar inferencia de tipos. Básicamente esto se esta discutiendo en el marco de la JEP 286.  Hasta hay una posible síntaxis: 

var list = new ArrayList<String>();  // infers ArrayList<String>

var stream = list.stream();          // infers Stream<String>

Pero, que es la inferencia de tipos? Porque puede ser beneficiosa? 

Primero, las inferencia de tipos es una característica predominante de los lenguajes de programación funcionales tales como ML, Haskell y Ocaml. También lo tiene C# y scala. 

Si vamos a la wikipedia: "La inferencia de tipos asigna automáticamente un tipo de datos a una función sin necesidad de que el programador lo escriba. El tipo de las funciones es reconstruido a partir de un análisis estático del programa realizado por el compilador o intérprete del lenguaje, a partir de las definiciones previas y del uso de las variables en el cuerpo de las funciones." 

Por lo tanto si escribimos :

int i = 5;

Estamos diciendo 2 veces que i es de tipo entero, uno en su declaración y otra en la asignación de 5 que es entero. Por lo que el compilador podria inferir que si le asignamos un entero, la variable debería ser entera.

De esta manera, por ejemplo en scala podemos hacer lo siguiente:

var i = 5;

Y i va ser de tipo entero.

Tanto lio para solo no escribir el tipo, no? En realidad con compiladores más inteligentes la inferencia de tipos puede ser de gran ayuda. Por ejemplo en scala, si hacemos :

1 to 20

Esto retornara un rango, entre 1 y 20. Si vemos bien to es un método de 1 peroo, de que tipo es 1? En este caso 1 no es Int porque Int no tiene el método to, sino que es de tipo RichInt que si lo tiene. Como podemos ver el compilador tomo el tipo no solo porque se parece a un Int sino que tuvo en cuenta que metodo llamábamos. Haciéndonos más fácil la vida.



jueves, 23 de noviembre de 2017

Clase Fracción en scala


Supongamos que debemos representar valores en forma de fracciones, es scala.

Veamos como podemos diseñarlo. Primero podemos utilizar el patrón ValueObject,  que describe Martin Fowler.

Estas estructuras deben devolver una copia de ellos mismos si desean devolver un resultado pero nunca deben cambiar su valor interno.

Dado que es ilogico pensar que un valor determinado cambie su valor. Estas son estructuras inmutables.

En java y scala hay muchas estructuras inmutables podemos pensar en los String, Integer, BigDecimal or BigInteger.

Estas estructuras representan datos que sería impensable que cambie su estado interno. Es decir son objetos que representan un valor. Estas estructuras deben devolver una copia de ellos mismos si desean devolver un resultado pero nunca deben cambiar su valor interno.

Otra decisión que podemos tomar es que estando en Scala, podemos sobre escribir lo operadores, esto es muy fácil. Y otra decisión es trabajar con las fracciones siempre simplificadas:

package utils


/**
 * En matemáticas, una fracción, número fraccionario, (del vocablo latín frāctus,
 * fractĭo -ōnis, roto, o quebrado)1 es la expresión de una cantidad dividida
 * entre otra cantidad; es decir que representa un cociente no efectuado de
 * números. Por razones históricas también se les llama fracción común, fracción
 * vulgar o fracción decimal. El conjunto matemático que contiene a las fracciones
 * es el conjunto de los números racionales, denotado ℚ.
 */
class Fraccion(val numerador:Int, val denominador:Int) {
  require(denominador != 0, "El denominador no puede ser 0")

  def this(numerador:Int) = this(numerador, 1)

  /**
   * En matemáticas, se define el máximo común divisor(MCD) de dos o más números
   * enteros al mayor número entero que los divide sin dejar resto.
   * El algoritmo de Euclides, que utiliza el algoritmo de la división junto
   * al hecho que el MCD de dos números también divide al resto obtenido de
   * dividir el mayor entre el más pequeño.
   */
  def mcd () : Int =
  {
    if(this.abs().numerador>denominador)
    {
      if (this.abs().numerador%denominador==0) denominador
      else new Fraccion(denominador,this.abs().numerador%denominador).mcd()
    }
    else if (denominador%this.abs().numerador==0) numerador
    else (new Fraccion(this.abs().numerador,denominador%this.abs().numerador)).mcd()
 
  }

  def abs() : Fraccion=
    if(numerador<0) new Fraccion(numerador*(-1),denominador)
    else new Fraccion(numerador,denominador)

  def simplificar () : Fraccion =
  {
    if(this.mcd()!=1)new Fraccion(numerador/this.mcd(),denominador/this.mcd())
    else new Fraccion(numerador,denominador)
   
  }

  /*
   *
   *   a   +   c   =       ad + bc     (se multiplica cruzado y los productos de suman)
   *  --       --         --------
   *   b       d             bd        (se multiplican los denominadores)
   *
   */
  def + (otro : Fraccion) : Fraccion =
  {
    new Fraccion((otro.denominador*this.numerador+otro.numerador*this.denominador),otro.denominador*this.denominador).simplificar()
  }

  def - (otro : Fraccion) : Fraccion = new Fraccion((otro.denominador*this.numerador-otro.numerador*this.denominador),otro.denominador*this.denominador).simplificar()


  /*
   * Para multiplicar dos fracciones, el procedimiento es muy simple. Solo es necesario
   * hacerlo horizontalmente, es decir, multiplicar ambos numeradores y luego ambos denominadores.
   */
  def * (otro : Fraccion) : Fraccion = new Fraccion(this.numerador*otro.numerador, this.denominador*otro.denominador)

  def / (otro : Fraccion) : Fraccion = new Fraccion(this.numerador*otro.denominador,this.denominador*otro.numerador)

  def == (otro : Fraccion) : Boolean =
  {
    (otro.simplificar().numerador==this.simplificar().numerador && otro.simplificar().denominador==this.simplificar().denominador)
  }

  def < (otro : Fraccion) : Boolean = (numerador.toFloat/denominador.toFloat < otro.numerador.toFloat/otro.denominador.toFloat )

  def > (otro : Fraccion) : Boolean = (numerador.toFloat/denominador.toFloat > otro.numerador.toFloat/otro.denominador.toFloat )

  def unary_- : Fraccion = new Fraccion(numerador*(-1),denominador)

  override def toString() : String = numerador.toString()+"\n--\n"+denominador.toString()
}

sábado, 18 de noviembre de 2017

APIs for Modern Commerce

Libro gratuito de APIs for Modern Commerce.

Durante el siglo XVIII, las máquinas de vapor impulsaron la revolución industrial. Hoy, las interfaces de programación de aplicaciones (API) están en el centro de la revolución digital. A menudo descritos como moneda en el mundo digital, las API son especialmente valiosas para los minoristas y las marcas porque ofrecen la agilidad necesaria para crear rápidamente experiencias de clientes. Esta práctica guía muestra a los desarrolladores de comercio cómo habilitar las experiencias enriquecidas de los consumidores en cada dispositivo y canal utilizando API.

En este, su tercer libro O'Reilly, la autora Kelly Goetsch, directora general de productos de commerce tools, ofrece a los lectores una comprensión de alto nivel de las API, así como instrucciones detalladas sobre cómo modelar, compilar, implementar y exponer las API para beneficio máximo



Dejo link: http://go.commercetools.com/api-booklet?utm_source=Mail_DE&utm_medium=External_Oreilly_Mail1&utm_term=API_Booklet&utm_content=API_Booklet&utm_campaign=API_Booklet&imm_mid=0f84b7&cmp=em-prog-na-na-newsltr_20171118

APIs for Modern Commerce

Libros para comenzar con Haskell


Encontre un post sobre Libros para aprender Haskell desde cero. Nombra a varios :


  1. Real World Haskell : Esta puede ser la mejor guía para aprender Haskell. Publicado por primera vez en 2008, este libro todavía se mantiene hoy con más de 700 páginas de tutoriales introductorios y guías para principiantes.
  2. Learn Haskell for a great good! : muy bueno!! La verdad muy divertido y fácil de leer. 
  3. Haskell: The Functional Programming Profession : La programación funcional no es un tema fácil de entender. Y comenzar con Haskell puede ser aún más complejo, a menos que, por supuesto, tenga el material de estudio adecuado. Haskell: The Functional Programming Profession es una colección de 600 páginas actualmente en su 3ª edición. Creo que este es uno de los mejores iniciadores de la programación funcional. Recorre los principios básicos en temas más avanzados.
  4. Beginning Haskell: A Project-Oriented Approach : El estudio se basa en el trabajo que un proyecto le permite ver cómo se comporta Haskell en el mundo real. Beginning Haskell: A Project-Oriented Approach es un proceso de aprendizaje paso a paso que tiene perfecto sentido. Aún aprenderá todos los conceptos teóricos, como flechas y monoides. Pero aprendes pragmáticamente. Puede obtener este libro con cero experiencia Haskell y siempre caminar con una buena comprensión de la programación funcional.
  5. Thinking with Haskell Functionally : Think Functionally Haskell es otro libro que inicia a los estudiantes ansiosos de programación funcional en el mundo de Haskell. Aprenderá a escribir código funcional en el camino correcto, centrándose en modelos matemáticos.
  6. Web application development with Haskell and Yesod : Cuando piensas en desarrollar aplicaciones web, rara vez piensas en Haskell. Pero con el framework Yesod puede crear aplicaciones web RESTful Haskell desde cero.
  7. Haskell Design Standards : Las plantillas de desarrollo y diseño son una gran razón por la que muchos desarrolladores se unen en lenguajes funcionales como Haskell. Puede lograr mucho y el flujo de trabajo puede estudiarse y aplicarse de manera consistente en muchos modelos de diseño domínios. Haskell lo lleva más allá de la lógica funcional para ayudarlo a comprender cómo diseñar mejor sus proyectos Haskell. Este es un libro avanzado que cubre varias técnicas de desarrollo como Haskell Imperative, Lazy e Iteratee para I/O Channels

Dejo link:
https://www.freelancinggig.com/blog/2017/05/24/best-haskell-programming-books-beginners-2017/

jueves, 16 de noviembre de 2017

lunes, 13 de noviembre de 2017

Libro Gratuito de Reactive Microsystems


En este libro se discute estrategias y técnicas para construir microservicios escalables y resistentes, y te ayuda a refactorizar una aplicación monolítica paso a paso, que es cómo ayudamos a Walmart a descomponer su monolito de comercio electrónico para lograr una capacidad de recuperación sin precedentes; por primera vez en su historia, no hay tiempo de inactividad en Black Friday o Boxing Day.

Quiero compartir este libro gratuito con ustedes.

Dejo link: https://info.lightbend.com/ebook-reactive-microservices-the-evolution-of-microservices-at-scale-register.html?utm_source=email&utm_medium=email-3&utm_campaign=COLL-2017-Reactive-Microsystems-The-Evolution-of-Microservices-at-Scale&utm_term=none&utm_content=none&mkt_tok=eyJpIjoiT0RRMll6Y3lOVGt4TUdObCIsInQiOiJ1aGxFNno0dENOQUswOUtRcUpXTERvcUZvSUJCUEdNaEJQSnFrbmRDa25USlZlWEdrMXFDR1RIaVFadXZ4VGpsUkdHMElBcEtLako0b1Q4dDhlWk90TEpldmlqMDRFRXZyZkk5c1hqbWx3RmJHNVRjaU5mZ2F1QTVUVHkraE9qaCJ9

miércoles, 8 de noviembre de 2017

Los 5 libros para aprender diseño y modelado de bases de datos para programadores y DBAs

Hace rato que no hablamos de libros y este top me gusto así que hay va:

Database Design for Mere Mortals (Diseño de base de datos para simples mortales)

Este libro es la introducción perfecta al diseño de bases de datos relacionales para principiantes y para cualquier persona que necesite un repaso. Con sus muchos años de experiencia en el mundo real diseñando bases de datos relacionales, Michael J. Hernández, el autor del libro, le muestra cómo analizar y mejorar las bases de datos existentes, implementar claves, definir relaciones entre tablas y reglas comerciales, y crear vistas de datos.

Beginning Database Design Solutions (Soluciones iniciales de diseño de bases de datos)

Este es otro excelente y uno de los mejores libros para aprender a modelar datos y diseñar bases de datos. Este libro explica el diseño de la base de datos, que es muy importante porque una base de datos con problemas de  diseño puede ser un dolor de cabeza a largo plazo.

Explica cómo planificar la estructura de una base de datos para que la base de datos sea robusta, resistente a los errores y lo suficientemente flexible como para acomodar una cantidad razonable de cambios futuros.


También explica cómo descubrir los requisitos de la base de datos, crear modelos de datos y refinar esos modelos para mejorar la efectividad de la base de datos.

Este libro está lleno de ejemplos y ejercicios que no solo le enseñan cómo hacer las cosas, sino que también lo desafían a aplicar sus conocimientos y resolver problemas.

Los ejercicios lo empujarán a pensar en escenarios, que eventualmente lo ayudarán a mejorar en el diseño de la base de datos.

Este libro tienen los mejores consejos sobre normalización, patrones comunes de diseño de bases de datos y riesgos comunes de diseño que debe evitar.

El libro también cubre tanto MySQL como Microsoft Access, pero incluso si está utilizando una base de datos diferente, no debe preocuparse demasiado, los conceptos discutidos en este libro se aplican a todas las principales bases de datos.



Six-Step Relational Database Design (Diseño de base de datos relacional de seis pasos)

Como sugiere el nombre: un enfoque paso a paso para el diseño y desarrollo de bases de datos relacionales Segunda edición de Fidel A Captain), le enseña a pasar del requisito a una base de datos completamente funcional en solo 6 pasos.


SQL Antipatterns: Avoiding the Pitfalls of Database ProgrammingAntipatterns de SQL (evitar las trampas de la programación de bases de datos)

Este libro no solo es suficiente aprender las mejores prácticas, también es importante no repetir las "malas prácticas" o antipatrones que causan problemas.

Si no evita esas malas prácticas, terminará sin nada, incluso si lo está haciendo bien con otras cosas de diseño.

El libro contiene varios consejos prácticos sobre patrones comunes que muchos de nosotros usamos sin saber cuánto daño hacen.

No importa, sea cual sea la plataforma o el lenguaje de programación que utilice, ya sea un programador junior o un doctorado, The SQL Antipatterns: evitar las trampas de la programación de bases de datos por Bill Karwin le mostrará cómo diseñar y construir bases de datos, cómo escriba mejores consultas en la base de datos y cómo integrar la programación SQL con su aplicación como un experto.

El libro contiene varios consejos prácticos sobre patrones comunes que muchos de nosotros usamos sin saber cuánto daño hacen.


Pro SQL Server 2008 Relational Database Design and Implementation (Diseño e implementación de bases de datos relacionales Pro SQL Server 2008)

Uno de los libros más fantásticos para aprender a diseñar bases de datos. Este libro es una lectura obligada para cualquier desarrollador de SQL Server o cualquier persona que solo quiera aprender a diseñar bases de datos.

Cubre todos los temas importantes, incluida la normalización, la seguridad y la forma de proteger la integridad de los datos utilizando restricciones y factores desencadenantes.

También proporciona consejos y trucos para resolver muchos problemas de negocios y cada capítulo finaliza con un resumen de mejores prácticas.







Un buen diseño de la base de datos contribuye en gran medida a mantener los datos seguros y luego recuperarlos con facilidad. Si desea aprender cómo el diseño y modelado de bases de datos es importante, leer y no dejar de perfecionarnos. 

Dejo links: http://javarevisited.blogspot.com.ar/2017/11/top-5-books-to-learn-database-design.html

domingo, 5 de noviembre de 2017

sábado, 4 de noviembre de 2017

Aprende Haskell por amor a vos!!



Como ustedes sabrán estoy estudiando Scala, Elixir y otros lenguajes pero por un revés de la vida me ha llevado a retomar mis estudios de Haskell.

Porque es buena idea estudiar Haskell y no solo programación funcional? Bueno se me ocurren las siguientes razones:


  1. Es un lenguaje funcional puro, es como aprender objetos con Smalltalk, la mejor opción para aprender un paradigma es utilizar el lenguaje más puro que aplique este paradigma.
  2. Es de tipado estático: Cuando compilamos un programa, el compilador sabe que una función es entera, cuales son cadenas de texto, etc. Gracias a esto un montón de posibles errores son capturados en tiempo de compilación. Si intentamos sumar un número y una cadena de texto, el compilador lanzara un error. Haskell usa un fantástico sistema de tipos que posee inferencia de tipos. Esto significa que no tenemos que etiquetar cada trozo de código explícitamente con un tipo porque el sistema de tipos lo puede deducir de forma inteligente. La inferencia de tipos también permite que nuestro código sea más general, si hemos creado una función que toma dos números y los suma y no establecemos explícitamente sus tipos, la función aceptará cualquier par de parámetros que actúen como números.
  3. Haskell es elegante y conciso. Básicamente tenemos toda las ventajas de la programación funcional, por lo tanto los programas Haskell son normalmente más cortos que los equivalentes imperativos. Y los programas cortos son más fáciles de mantener que los largos, además de que poseen menos errores. 
  4. Haskell es un lenguaje codicioso, no el lenguaje, los que lo diseñaron. Ellos hicieron que haskell sea puro y que siempre tome el camino más puro para resolver los problemas. Haskell implementa un montón de conceptos lo cual trae con sigo que aprendamos mucho. Y esos conceptos sean interpolables a otros lenguajes. 
  5. Haskell fue creado por unos tipos muy inteligentes (todos ellos con sus respectivos doctorados). El proyecto de crear Haskell comenzó en 1987 cuando un comité de investigadores se pusieron de acuerdo para diseñar un lenguaje revolucionario. En el 2003 el informe Haskell fue publicado, definiendo así una versión estable del lenguaje.
  6. Es divertido! Si te gusta aprender y resolver problemas, este lenguaje es para vos!
Un lugar muy bueno para empezar es : http://aprendehaskell.es/

miércoles, 1 de noviembre de 2017

IntelliJ IDEA Handbook Gratis!!



Javacodegeeks regala el libro "IntelliJ IDEA Handbook " y aca te dejamos el link:

https://www.javacodegeeks.com/minibook/intellij-idea-handbook

Vala un lenguaje para programar con GTK+ 3


Vala un lenguaje para programar parecido a C# pero con reformas para programar con GTK+ 3, ideal para programar interfaces linux pero tambien se puede utilizar en Windows o Mac.

Es un lenguaje sumamente simple de tipado estático. Que hace muy fácil la programación de interfaces gráficas.

Veamos un ejemplo:

Primero instalar las librerías : sudo apt-get install valac libgtk-3-dev

luego programamos un Hola mundo:

class Aplication : GTK.Window{

public static int main(string[] args) {

# Inicializamos Gtk con argumentos
Gtk.init (ref args);

# Creamos la aplicación.
Application app = new Application ();

# Ponemos la aplicación al centro de la pantalla.
app.window_position = Gtk.WindowPosition.CENTER;

#  Al cerrar destruimos la app.
app.destroy.connect (Gtk.main_quit);

# Medimos la ventana
app.set_default_size (100, 50);

# Creamos un botón  y conectamos el evento clikear del botón y imprimimos un hola!
var button = new Gtk.Button.with_label ("Saluda");
button.clicked.connect (() => {
print("Hola!\n");
});

# Añadimos el botón a la app
app.add(button);

# Mostramos la App/Ventana
app.show_all ();

}
}

Luego lo guardamos y ahora debemos compilarlo y ejecutar:

$ valac -v lol.vala --pkg gtk+-3.0
$ ./lol

Y listo!!

Aplaudimos de pie que las herramientas obtén por dar soporte a lenguajes más modernos. GTK 3 se viene con todo!!

Dejo link: https://developer.gnome.org/gnome-devel-demos/stable/beginner.vala.html.en
https://wiki.gnome.org/Projects/Vala/GTKSample