Translate

lunes, 28 de noviembre de 2016

First Class Functions



El concepto de First Class Functions, nos indica que una función no difiere de otro tipo de datos usados en un programa. Esto indica que se puede utilizar como parámetros de una función o ser  retornado por una función. Esto permite escribir código altamente reutilizable y a la vez nos permite componer funciones, es decir obtener una función a raíz de otras.

Supongamos que tenemos una función incEven que toma un número n si es par lo incrementa, de lo contrario devuelve el número sin cambios.

ifEvenInc n = if even n
               then n + 1
               else n                    

Más tarde descubrimos que necesitamos dos funciones más: doubleEven y squareEven, ese doble y cuadrado números pares, respectivamente. Estas serían funciones fáciles de escribir dado que sabemos cómo escribir incEven:

 ifEvenDouble n = if even n
                  then n * 2
                  else n
 
 
 ifEvenSquare n = if even n
                      then n^2
                      else n

Aunque estas funciones eran fáciles de escribir, las tres son casi idénticas. La única diferencia es el comportamiento de incrementar, duplicar y elevar al cuadrado. Lo que hemos descubierto aquí es un patrón general de cálculo que podemos abstraer. Para hacer esto necesitamos la capacidad de pasar una función como un argumento para realizar el comportamiento deseado.

Vamos a demostrar esto con la función ifEven que toma una función y un número como argumentos. Si ese número es par aplica la función a ese número:

ifEven myFunction x = if even x
                       then myFunction x
                       else x

También podemos abstraer nuestro comportamiento de incrementar, duplicar y elevar al cuadrado en tres funciones separadas:

inc n = n + 1
double n = n*2
square n = n^2

Vamos a recrear nuestras definiciones anteriores usando el poder de las funciones de primera clase:

 ifEvenInc n = ifEven inc n
 ifEvenDouble n = ifEven double n
 ifEvenSquare n = ifEven square n

Ahora podemos agregar nuevas funciones muy fácilmente como ifEvenCube, ifEvenNegate, etc.

Dejo link: http://freecontent.manning.com/learning-haskell-first-class-functions/


Javaslang 3.0, haciendo funcional a Java !



Javaslang, es una librería open source que provee estructuras de control y estructuras de datos diseñados con una mentalidad funcional para Java 8. Hace muy poco libero su versión 3.0

Con la introducción de lambdas (λ) en Java 8, las posibilidades son muchísimas, una muy clara es utilizar estructuras como listas o arboles, como se realiza en la programación funcional, a la vez tener estructuras inmutables y por que no emular estructuras de control como pattern matching.

Creo que se entiende la idea, sin más veamos ejemplos:

Pattern matching:

Number num = Match(personOption).of(
    Case(Some(Person($())), person -> 1.0d),
    Case(None(), 0)
);

Immutable:

List<String> list = Collections.unmodifiableList(otherList);

// Boom!
list.add("why not?");

Linked List:

// = List(1, 2, 3)
List<Integer> list1 = List.of(1, 2, 3);

// = List(0, 2, 3)
List<Integer> list2 = list1.tail().prepend(0);

Queue:

Queue<Integer> queue = Queue.of(1, 2, 3)
                            .enqueue(4)
                            .enqueue(5);

Resultados Opcionales:

// = Queue(1)
Queue<Integer> queue = Queue.of(1);

// = Some((1, Queue()))
Option<Tuple2<Integer, Queue<Integer>>> dequeued =
        queue.dequeueOption();

// = Some(1)
Option<Integer> element = dequeued.map(Tuple2::_1);

// = Some(Queue())
Option<Queue<Integer>> remaining =
        dequeued.map(Tuple2::_2);

Iterar con Clausuras:

List.of("Java", "Advent").forEach(s -> {
    // side effects and mutation
});

Y puedo seguir!!

Solo debemos agregar la siguiente entrada en mi pom.xml, si uso maven:

<dependencies>
    <dependency>
        <groupId>io.javaslang</groupId>
        <artifactId>javaslang</artifactId>
        <version>2.0.5</version>
    </dependency>
</dependencies>

Que más decir? Solo que en un futuro podríamos esperar que esta funcionalidad este en la jdk.

Dejo link: http://www.javaslang.io/

sábado, 26 de noviembre de 2016

Inyección de dependencia en lenguaje funciónal

Antes que me maten, sepan que sé que son ideas contradictorias. Es decir, definamos programación funcional en pocas palabras, es un paradigma que se basa en el concepto de función matemática, es decir dado un conjunto dominio va a ver un conjunto resultado, el cual se llega por medio de esta función, y para cada valor del conjunto dominio va a haber un resultado. No existen conceptos que estamos acostumbrados como estados o flujo de ejecución, etc.

La inyección de dependencia por el contrario es un concepto que nace en el paradigma de objetos, los cuales posen estado.

Por lo tanto parecen conceptos inconciliables. Es más eso creía, pero lei un articulo bastante interesante que no me convenció, pero me genero dudas y me hizo ver como una posibilidad.

Si bien sabemos que las funciones siempre tienen que devolver el mismo resultado, la inyección de dependencia puede ser útil para demarcar el contexto de la función, lo cual no sería inyección de dependencia sino delimitación o definición de contexto.

Pero en el caso de la composición de funciones, en este caso podríamos ver una utilidad. Supongamos que tenemos una función que es compuesta de 3 funciones y por x motivo en un entorno debe sumar y en otro restar, en este caso sería bueno tenerlo definido de con inyección de dependencias.

Para ser honesto ete articulo me dejo más dudas que certezas, pero dada esta situación me entusiasmo para investigar. Me ayudan? desde su experiencia creen útil el uso id en programación funcional? existe algo para inyectar contexto?

Help me!!!

lunes, 21 de noviembre de 2016

Reactivity con Elm


Escribir aplicaciones reactivas para un programador javascript puede ser complejo, pero que tal si utilizamos un lenguaje que sea construido bajo estos principios? Este es ELM.

Elm fue creada no para responder a la pregunta "¿cómo puede JavaScript ser mejor?", Sino para responder a la pregunta "¿como puedo mejorar experiencia general para desarrolladores de interfaces de usuario Web?"

En la búsqueda de este objetivo, Elm abraza varias ideas que JavaScript no:

Reactive programing como el único sistema para responder a la interacción
Una forma consistente de gestionar los efectos
Un compilador útil que elimina muchos errores antes
El resultado es un lenguaje que compila JavaScript, pero tiene una reputación radicalmente diferente. Es común escuchar que el código de Elm de producción de alguien nunca ha lanzado una excepción de tiempo de ejecución, ni siquiera el temido indefinido no es una función.

Dejo link: https://www.infoq.com/articles/language-reactivity-with-elm?utm_source=linkedin&utm_campaign=calendar&utm_medium=link
http://elm-lang.org/
https://evancz.gitbooks.io/an-introduction-to-elm/content/architecture/index.html

domingo, 20 de noviembre de 2016

Scala for the Impatient



Estoy leyendo el libro "Scala for the Impatient" y lo quiero recomendar. Por varias razones, entre otras cosas:

  • Fácil lectura
  • Muy rápido y directo
  • Ejemplos claros


No es recomendable para gente que comienza a programar, pero los que saben de programación esta muy bueno.


jueves, 17 de noviembre de 2016

Accelerating Through Angular 2

La gente de codescholl, no se detienen y ahora nos regalan un curso de Angular 2.

Dejo más detalle:

Accelerating Through Angular 2

Create the future of web applications by learning the latest in Angular 2.
Start Course for Free

Course Overview

  1. Level 1 on Accelerating Through Angular 2

    LEVEL 1 FREE LEVEL 1 Video | 5 Challenges
    Angular 2 Ignition

    Get an introduction to Angular 2 and create your first module and component with a template.
  2. Level 2 on Accelerating Through Angular 2

    LEVEL 2 2 Videos | 7 Challenges
    Template Traction

    Start with a few structural directives and then transform your view with pipes.
  3. Level 3 on Accelerating Through Angular 2

    LEVEL 3 3 Videos | 5 Challenges
    Tuning It Up

    Make your code more maintainable by organizing it into multiple components, separating your HTML and CSS, creating a data model, and splitting your data into a mock file.
  4. Level 4 on Accelerating Through Angular 2

    LEVEL 4 3 Videos | 5 Challenges
    Data Binding Boost

    Explore how to send data from JavaScript to HTML and HTML to JavaScript using one-way data binding, and then learn how to do both at the same time with two-way binding.
  5. Level 5 on Accelerating Through Angular 2

    LEVEL 5 2 Videos | 3 Challenges
    Service Fuel Injection

    Learn how to create your own services and then how to use the HTTP library to call out to the internet.
Accelerating Through Angular 2
COMPLETE THESE LEVELS TO UNLOCK

Course Completion Badge

Create the future of web applications by learning the latest in Angular 2.

Microsoft se une a la Linux Foundation


Ya hemos hablado de la iniciativa de microsoft de participar en Linux Foundation. Pero ahora es real. Sí, Microsoft se une a Linux Foundation. Lo hace, además, como miembro de platino, por lo que compartirá el lugar más privilegiado de la tabla con otras compañías como Cisco, Fujitsu, HPE, Huawei, IBM, Intel o Samsung.

Dejo link: https://www.linuxfoundation.org/members/corporate



lunes, 14 de noviembre de 2016

Dictionary en smalltalk

El Dictionary (Diccionario) es una colección que puede verse desde 2 puntos de vista:

Como un Set de asociaciones clave->valor

Como un contenedor donde los elementos son nombrados desde el exterior, donde el nombre puede ser cualquier objeto que responda al mensaje #=.

Ejemplos:

"instanciar, y llenar, un diccionario"
| diccionario |

diccionario := Dictionary new.

diccionario at: 'hoy' put: Date today.
diccionario at: 'ahora' put: Time now.
diccionario at: false put: 'es false'.

"algunas formas de acceder al diccionario"
diccionario at: 'hoy'.
diccionario at: 'mañana' ifAbsent:[nil].
diccionario at: 'mañana'.
diccionario at: 'mañana' ifAbsentPut:[Date tomorrow].
diccionario at: 'mañana'.

"otras formas de acceso"
diccionario keys.
diccionario values.

"algunas iteraciones"
Transcript clear.
Transcript cr; show: '#do:'; cr.
diccionario do: [:each |
   Transcript show: ' ' , each asString; cr.
].

Transcript cr; show: '#associationsDo:'; cr.
diccionario associationsDo: [:each |
   Transcript show: ' ' , each asString; cr.
].

Transcript cr; show: '#keysAndValuesDo:'; cr.
diccionario keysAndValuesDo:[:eachKey :eachValue |
   Transcript show: ' ' , eachKey asString , ' - ' , eachValue asString; cr.
].

domingo, 13 de noviembre de 2016

Estudiar Smalltalk


Sin duda lo más importante para aprender Smalltalk es meter mano en un Smalltalk.  No vale de nada leer cientos de libros si no nos metemos de lleno en un ambiente de Smalltalk y comenzamos a hacer cosas.

Pero también es cierto que la experiencia puede ser más fácil si logramos percibir algo de la filosofía del desarrollo con Smalltalk desde algunos libros. Por lo tanto quiero recomendarles:

Libros

  • Smalltalk-80 - The Language: En este libro se puede entender, de personas que participaron en el desarrollo de Smalltalk, la filosofía del lenguaje y las motivaciones que lo hicieron posible.
  • Smalltalk-80 - Bits of  History, Words of Advice: Este libro me impactó por lo actual de los comentarios hechos por personas que probaron Smalltalk a principios de los años 80.
  • Smalltalk Best Practice Patterns: Este libro me enseño que una de las cosas más importantes, para ser un buen programador Smalltalk, es prestar muchísima atención a la claridad del código.
  • Smalltalk with Style: Este libro me mostró la mayoría de las convenciones que se utilizan a la hora de escribir código Smalltalk.
  • Design Patterns - Elements of Reusable Object Oriented Software: No es posible decir hoy en día que se sabe programar con objetos si no se ha leído este libro. Este libro es el culpable de que hoy esté escribiendo un libro de Smalltalk y no uno de Java o .NET.  Me enteré de la existencia de Smalltalk, y de su impacto sobre la tecnología de objetos, a través de las explicaciones de algunos patrones.  Este es el libro que despertó mi curiosidad por aprender Smalltalk.
  • The Dessign Patterns Smalltalk Companion: Este libro me enseñó mucho Smalltalk por comparación con la implementación de los patrones en el libro anterior.


Papers o artículos

  • Design Principles Behind Smalltalk: Excelente descripción de las motivaciones que rigen el desarrollo del proyecto Smalltalk.  Parece ciencia ficción si consideramos que la nota fue publicada en la revista Byte de agosto de 1981.
  • Personal Dynamic Media: Excelente explicación de las motivaciones detrás del desarrollo de Smalltalk escrita por Alan Kay en el año 1976.
  • The Early History of Smalltalk: Esta es una historia de Smalltalk, escrita por Alan Kay, en el año 1993 (antes de que comenzara el proyecto Squeak allá por el 1995) donde cuenta de donde vienen las ideas principales.  Termina con una frase que también me marcó especialmente: “¿Donde están los Dan (Ingalls) y las Adele (Goldberg) de los 80s y los 90s que nos lleven al próximo nivel de desarrollo?”.



Test Driven Development



El objetivo de todo programador debería ser el de generar Código Limpio que Funciona.

Existen numerosas razones para escribir Código Limpio que Funciona (CLQF), algunas de ellas son:

  • Generar CLQF es una forma predecible de desarrollar. Se puede saber cuando se termina el desarrollo y no nos preocupamos por un largo ciclo de depuración.
  • El CLQF nos da la oportunidad de aprender todas las lecciones que el código tiene que decirnos.
  • El CLQF brinda mejores oportunidades a los usuarios de nuestro software.
  • El CLQF permite que nosotros confiemos en nuestros compañeros y que ellos confíen en nosotros.
  • Cuando escribimos CLQF, nos sentimos mejor con nosotros mismos.


Hay muchas fuerzas que nos dificultan escribir CLQF, entonces ¿cómo podemos generar CLQF?.

Esta metodología (Test Driven Development - TDD) consiste en hacer que los tests automáticos sean los que rigen el desarrollo.  Para eso seguimos la siguiente reglas:
Escribir nuevo código sólo si tenemos un test automático que falla.
Eliminar la duplicación.

Aplicar esas 2 reglas imprimen el siguiente ritmo al proceso de desarrollo:
Rojo: Escribir un test que falle.
Verde: Hacer que el test funcione lo más rápidamente posible.  Podemos cometer cuantos pecados queramos en esta etapa ya que el objetivo es salirse del rojo cuanto antes.

Refactorizar: Eliminar toda la duplicación creada en el paso anterior.

Dejo link:
http://es.wikipedia.org/wiki/Tdd
http://en.wikipedia.org/wiki/Test_driven_development

miércoles, 9 de noviembre de 2016

Libros de programación gratuitos


La gente de o'reilly están regalando unos buenos libros. Tenemos diferentes temas java, python, open source, reactive, microservice, etc. 

Solo se debe ingresar el nombre y el email. 

Son muy buenos!!! 

domingo, 6 de noviembre de 2016

Canales de youtube para aprender a programar


Nunca use un canal para aprender programación y la verdad me arrepiento, les paso un grupo de canales que están muy buenos.

Dejo link:
https://www.youtube.com/channel/UC9fAeSPVw7mAAbexCS7gPqw
https://www.youtube.com/channel/UCQufRmIMRTLdRxTsXCh4-5w

Estados Unidos legalizo el hackeo de autos y televisores inteligentes


Leyendo clarin, me encontré con una grata noticia. Porque grata? Porque si es legal que pueda ver el codigo de mi auto, las empresas van a tener que compartirlo. Esto es un gran paso.

Si bien esto debería ser así, no lo es. Alguien puede vender autos que transmitan la posición del auto y sin informarnos esto,  si no se puede ver el código nunca me enteraré.

Si lo llevamos a otros ámbitos, podríamos comprar un auto y no poder saber como funciona, de esta forma si gasta más combustible solo para beneficiar a las petroleras. No me enteraría, ni podría enterarme.

Por esta razón es una buena noticia.

Dejo el link:
http://next.clarin.com/Unidos-legalizo-hackeo-televisores-inteligentes_0_1681031923.html



jueves, 3 de noviembre de 2016

Scala on Android




Si, se pueden desarrollar aplicaciones en Scala con Android. Y quiero compartir un link el cual tiene toda la información de como empezar.



Dejo link: http://macroid.github.io/ScalaOnAndroid.html

domingo, 30 de octubre de 2016

Generics en Java

Creo que este tema esta más que entendido por los seguidores, pero siempre hay gente nueva dispuesta a aprender.

Cualquier lenguaje de tipado estático tiene un problema y es que dada una estructura de datos generica, debemos programarla n veces como n sea el tipo de datos que queramos usarla.

Una posible solución es tipar esta estructura a object, esto trae con sigo ciertos problemas.

  • Se pierde la seguridad por tipo.
  • Debemos castear al tipo de la estructura cada vez que consultemos un elemento:

List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0);

A partir de java 5 se introduce el concepto de clases genéricas. Permiten utilizar y programar estructuras genéricas, las cuales  se les indica el tipo:

List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0);   // no cast

Entre las ventajas podemos nombrar:

  • Chequeo de tipos
  • Se elimina la necesidad de casteos.
  • Posibilidades  de utilizar y programar algoritmos y estructuras genéricas 
  • Es muy utilizado en Framework de colecciones de java. 

Podemos generar clases genericas: 

public class Box<T> {
    // T stands for "Type"
    private T t;
    public void set(T t) { this.t = t; }
    public T get() { return t; }
}

Donde T es el tipo de nuestra clase genérica. Si queremos utilizar esta clase para un tipo determinado:

Box<Integer> integerBox = new Box<Integer>();
integerBox.set(45);
Integer nro = integerBox.get();

Y con el operador diamante: 

Box<Integer> integerBox = new Box<>();
integerBox.set(45);
Integer nro = integerBox.get();

Como ven el operador diamante, no es más que no decirle el tipo cuando instancio la clase, porque el compilador lo puede inferir de la declaración. Es eso y un poco de marketing. 

Veamos otro ejemplo: 

public interface Pair<K, V> {
    public K getKey();
    public V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V> {
    private K key;
    private V value;
    public OrderedPair(K key, V value) {
          this.key = key;
          this.value = value;
    }

    public K getKey() { return key; }
    public V getValue() { return value; }
}

Pair<String, Integer> p1 = new OrderedPair<String, Integer>("Even", 8);
Pair<String, String>  p2 = new OrderedPair<String, String>("hello", "world");
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));

Y podemos tener métodos genéricos: 

public class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
               p1.getValue().equals(p2.getValue());
    }
}

Por ahora eso es todo de generics. 

Dejo link: