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: 


Introducción a la programación (javaScript)

Miriada X ha publicado un curso de programación en javascript.

Les dejo más info:

Logo
CURSO RECOMENDADO

Introducción a la

programación (javaScript)

Aprende fácilmente JavaScript con el curso mejor valorado en nuestra comunidad y fórmate en un área de gran demanda profesional. Empieza el 30 de octubre y tienes dos semanas para apuntarte. ¡Recomiéndalo!
APÚNTATE
header-image
image10
"He conseguido aprender a programar. Entre los videos y las respuestas de los compañeros he resuelto mis dudas"
image11
"Quería refrescar conocimientos de Javascript. Se ha cumplido a la perfección"

image12
"Para ser introducción y poderlo realizar sin conocimientos previos está muy bien diseñado"
image13
"Quiero agradecer a los profesores por su buena disposición para contestar las preguntas que surgieron... buen curso"
image1

Con el Nuevo certificado de Superación ¡GRATIS!
Sólo al completar este curso
APÚNTATE AHORA

miércoles, 26 de octubre de 2016

De F# a Javascript con Fable



Un lector del blog se le ocurrió la genial idea de compartir el link de Fable en un post de ELM. Y estuve leyendo y me intereso bastante.

A todo el mundo al parecer le interesa compilar lenguajes a javascript, y claro, si se esta volviendo muy famoso y omnipresente. Y F# no quiere ser menos, tomando la idea de ELM nace Fable que es un compilador de F# a html y javascript.



Dejo un video:



Dejo link: https://fable.io/

domingo, 23 de octubre de 2016

Colecciones en smalltalk


Como verán sigo leyendo sobre Smalltalk, ahora nos toca ver las colecciones:

Smalltalk cuenta con un framework de colecciones muy poderoso.  No es de extrañar ya que lleva más de 20 años de depuración.

Contamos con numerosos tipos de colecciones (Bag, Set, OrderedCollection, Dictionary, Array, etc) y, a su vez, con un rico y extenso protocolo de mensajes.

A continuación enumero algunos de los mensajes que se les puede enviar a todas las colecciones.

#add: Agrega un objeto (dado como argumento) a la colección.

#addAll: Agrega todos los elementos de la colección dada como argumento a la colección receptora del mensaje.

#remove: Remueve un determinado objeto de la colección. Genera un error si el elemento no es parte de la colección.

#remove:ifAbsent: Remueve un determinado elemento de la colección. Evalúa el bloque dado si el elemento no es parte de la colección.

#removeAll: Remueve todos los elementos del receptor que están contenidos en la colección dada en el argumento.

#do: Evalúa el bloque dado como argumento por cada elemento contenido en la colección.  Este es el principal mensaje de las colecciones y prácticamente todo el resto de mensajes están implementados usando el #do: de alguna forma.  Es interesante ver la implementación de, por ejemplo, los mensajes #select:, #collect:, #anyOne, #detect:ifNone:, #do:separatedBy:, etc.

#do:separatedBy: Evalúa el primer bloque dado como argumento por cada elemento contenido en la colección y evalúa el segundo bloque entre elementos.

#select: Evalúa el bloque dado por cada elemento del receptor como argumento.  Colecciona los elementos en los cuales el bloque evalúa a true (verdadero) en una colección del tipo del receptor. Responde esa colección nueva como resultado.

#reject: Similar a #select: pero colecciona los elementos para los cuales el bloque evalúa a false.

#collect: Evalúa el bloque dado por cada elemento del receptor como argumento.  Colecciona los resultados en una colección del tipo del receptor. Responde esa colección nueva como resultado.

#size Responde el tamaño de la colección.

#anyOne Responde algún elemento de la colección.

#atRandom Responde uno de los elementos del receptor de forma aleatoria.

#detect: Evalúa el bloque dado con cada elemento del receptor. Devuelve el primer elemento donde el bloque evalúa a true. Genera un error si ningún elemento es encontrado.

#detect:ifNone: Evalúa el bloque dado con cada elemento del receptor. Devuelve el primer elemento donde el bloque evalúa a true. Evalúa el otro bloque dado si ningún elemento es encontrado y devuelve el resultado de esa evaluación.

#isEmpty Responde si el receptor está vacío y no contiene elementos.

#includes: Responde si el objeto dado es un elemento del receptor.

#includesAllOf: Responde si todos los elementos de la colección dada están incluidos en la colección receptora.

#includesAnyOf: Responde si algunos de los elementos de la colección dada está incluido en la colección receptora.

#allSatisfy: Responde true si el bloque dado se evalúa a true por todos los elementos de la colección receptora.

#anySatisfy: Responde true si el bloque dado se evalúa a true por algunos de los elementos de la colección receptora.

#noneSatisfy: Responde true si el bloque dado se evalúa a false por todos los elementos de la colección receptora.

#occurrencesOf: Responde cuantas veces está incluido el objeto dado en la colección receptora.

Veamos los Conjuntos: El Set es un tipo de colección que no mantiene ningún orden sobre sus elementos y que no permite que un objeto esté contenido más de una vez.

Un Set representa el concepto matemático de conjunto, donde no tiene sentido decir que un elemento está más de una vez ni tiene sentido hablar de orden.

Ejemplos:
| set |
set := Set new.
set add: 'un string'.
set add: 'otro string'.
set add: 'un string'.
set add: 'otro string'.
set add: 'un string'.
set explore.

"convertir colecciones de diferente tipo a Set para remover los duplicados"
#(5 4 1 2 2 2 1 2 1 2 3 4 3 2 3 4 5) asSet.
'un string que tiene muchos caracteres' asSet.

"Los 2 sets contienen sólo un elemento"
(Set with: 1) = (Set with:1 with:1).

"El orden no importa"
(Set with: 1 with: 2) = (Set with:2 with:1).

sábado, 22 de octubre de 2016

Browser de Clases en Pharo o smalltalk que es casi lo mismo


Como veran sigo leyendo sobre smalltalk. Ahora vamos a analizar Browser de Clases

Esta herramienta nos permite ver y modificar todas las clases que tenemos en nuestro ambiente. Podemos también crear o eliminar categorías de clases, clases, categorías de métodos y métodos.
Como Pharo está escrito en si mismo, esta herramienta nos permite ver absolutamente todo el funcionamiento de Pharo.  Desde el Compilador hasta las Ventanas, desde los Números Enteros hasta los tipos Booleanos, todo visible y todo modificable.

El browser está compuesto principalmente por 4 paneles superiores y un panel inferior. En los paneles superiores encontraremos - de izquierda a derecha - las Categorías de Clases, las Clases, las Categorías de Métodos y los Métodos.

Categorías de Clase y Métodos: Tanto las categorías de clases como las categorías de métodos no tienen una semántica para el Smalltalk en si mismo, sino que sirven para documentar el diseño agrupando clases y métodos por funcionalidad apuntando a mejorar el entendimiento del sistema por las personas.

En Smalltalk se lee mucho más código del que se escribe, así que todo el entorno promueve la escritura de código limpio y documentado y todo el tiempo que usemos en escribir código limpio es recompensado.

Si seleccionamos una de las opciones del panel, en los paneles subsiguientes veremos la información correspondiente a la selección. Por ejemplo, si seleccionamos en el primer panel la categoría de clases 'Kernel-Objects', veremos en el segundo panel las clases dentro de esa categoría (como Boolean, DependentsArray, False, MessageSend, etc).  De la misma forma, si ahora seleccionamos la clase Boolean en el segundo panel, veremos en el tercer panel las categorías de métodos de esa clase; y si seleccionamos una categoría de métodos como 'controlling' veremos en el último panel los métodos.  Por último, si seleccionamos uno de los métodos, veremos en el panel inferior el código de dicho método.

Programar con Smalltalk es enviar mensajes a objetos que viven en un ambiente. Programar, con Smalltalk, no es más que modificar un ambiente de objetos y adaptarlo a nuestra necesidad.


miércoles, 19 de octubre de 2016

Spring 5: Functional Web Framework


Leo un post en spring.io titulado: Spring 5: Functional Web Framework. Que de funcional funcional, no tiene mucho. Pero si es una forma declarativa de crear web gracias a las clausuras que vienen en java 8.

Puff, con la primera linea resumí todo.

Bueno, volvamos. Spring 5 viene con novedades entre las cuales esta un nuevo framework declarativo. En verdad me hace recordar a Sinatra. Pero como esta de moda lo funcional, llamemos funcional a cualquier cosa.

Por lo tanto, salvo el nombre que ya lo critique, el framework y el post están  muy interesante. Veamos un ejemplo (del framework)

 public interface PersonRepository {
  Mono<Person> getPerson(int id);
  Flux<Person> allPeople();
  Mono<Void> savePerson(Mono<Person> person);
}

RouterFunction<?> route = route(GET("/person/{id}"),
  request -> {
    Mono<Person> person = Mono.justOrEmpty(request.pathVariable("id"))
      .map(Integer::valueOf)
      .then(repository::getPerson);
    return Response.ok().body(fromPublisher(person, Person.class));
  })
  .and(route(GET("/person"),
    request -> {
      Flux<Person> people = repository.allPeople();
      return Response.ok().body(fromPublisher(people, Person.class));
    }))
  .and(route(POST("/person"),
    request -> {
      Mono<Person> person = request.body(toMono(Person.class));
      return Response.ok().build(repository.savePerson(person));
    }));

Como ven usa un estilo monads.

HttpHandler httpHandler = RouterFunctions.toHttpHandler(route);
ReactorHttpHandlerAdapter adapter =
  new ReactorHttpHandlerAdapter(httpHandler);
HttpServer server = HttpServer.create("localhost", 8080);
server.startAndAwait(adapter);

Y listo!

Para mayor info: https://spring.io/blog/2016/09/22/new-in-spring-5-functional-web-framework


lunes, 17 de octubre de 2016

Academia.edu: la red social para investigadores


Academia.edu es una red social gratuita que tiene como objetivo conectar científicos, ofrecerles una plataforma para compartir sus trabajos de investigación y  facilitarles el seguimiento de los artículos que son relevantes para sus campos de estudio.

Esta red social temática está formada por más de 18 millones de usuarios y cuenta con más de 5 millones de publicaciones científicas de todo el mundo.

Academia.edu apuesta por el acceso abierto de la ciencia y pretende revolucionar el proceso editorial tradicional de la revisión por pares, por lo que permite publicar el texto completo de los libros, artículos, borradores y diversos materiales para acelerar la visibilidad las investigaciones realizadas.


Dejo link:
https://www.academia.edu/

jueves, 13 de octubre de 2016

Flexbox en un nuevo curso de code school

Code school nos regala un nuevo curso, esta ves sobre Flexbox.
Code School
Cracking the Case With Flexbox
Learn how the different properties in Flexbox can help you easily build popular layout styles that are flexible across various screen sizes.
View the Course
What You'll Learn

Level 1
Learn how to analyze the new display property, containers, lines, and items.

Level 2
Explore how to align items, distribute space, and change order along the master axis.

Level 3
Straighten out the facts and learn how to align items and distribute space along the cross axis.

Level 4
Shape up by growing, shrinking, and declaring sizes of items.

Level 5
Discover how to align content in edge cases and group multiple properties.
Why Learn Flexbox?
Course Instructor Dan Denney explains two of the main benefits to learning and using Flexbox.
TwitterTweet This
Does your email client support flexbox?
If it does, the flexbox boxes will fill up all of the width that this text does.
F l e x b o x
Twitter IconFacebook IconYoutube IconGoogle+ Icon

lunes, 10 de octubre de 2016

A desarrollar con Smalltalk!! 4


Vamos a hacer más flexible nuestro Saludador, vamos a permitir saludar con cualquier saludo, por lo tanto vamos a agregar un atributo:


Este atributo necesitar métodos para acceder a estos atributos. Por lo tanto hacemos menú contextual en la clase, refactoring->class refactoring->generate accesor. Y con esto nos va a generar los métodos para acceder a la variable de instancia.


Ahora podemos cambiar el método "saludar" para que pueda utilizar el saludo:

saludar
  ^ saludo.

Ahora vamos a probar nuestra nueva clase:

s := Saludador new.
s saludo: 'Hola!!'.
s saludar.

Esto retornara 'Hola!!'

Vamos a hacer un metodo que pida un parámetro y salude al nombre pasado por parámetro : 

saludarA: nombre
  ^ saludo , ' ' , nombre.  

Ahora podemos saludar a Pepe !! 

s := Saludador new. 
s saludo: 'Hola!!'.
s saludarA: 'Pepe'.

Por este post hemos hecho demasiado. 



domingo, 9 de octubre de 2016

Microsoft liberó la versión 2 de typescript




Para las gente que no sabe que es typescript: TypeScript es un lenguaje que corre sobre javascript; muy similar a javascript pero con la salvedad de que TypeScript es un lenguaje fuertemente tipado. Es decir esta librería nos da un sistema de tipado para el lenguaje Javascript, además nos da clases; para poder utilizar la orientación a objetos por medio de clases como estamos más acostumbrados, no por prototipado.

Poco he hablado de typescript, dado que realmente a mi gusto no me cierra que haya tantos frameworks que busquen agregar o modificar javascript. No quiero decir que javascript sea malo, pero tal vez estamos queriendo usar un lenguaje para algo que no fue hecho y por eso tenemos que agregarle tantas cosas.

Luego de mi pequeña opinión y de una introducción, vamos a lo que concierne este post. Microsoft libero la versión 2 de typescript. Que trae como novedad?
Declaración Simplificada del archivo de dependencias,
Tipos no nuleables
Modificadores de solo lectura.

El tema de los tipos no nulos me encanta veamos un ejemplo:

// Compiled with --strictNullChecks
let x: number;
let y: number | undefined;
let z: number | null | undefined;
x = 1;  // Ok
y = 1;  // Ok
z = 1;  // Ok
x = undefined;  // Error
y = undefined;  // Ok
z = undefined;  // Ok
x = null;  // Error
y = null;  // Error
z = null;  // Ok
x = y;  // Error
x = z;  // Error
y = x;  // Ok
y = z;  // Error
z = x;  // Ok
z = y;  // Ok

Podemos declarar un método de la siguiente manera:

// Compiled with --strictNullChecks
function sum(a: number | null, b: number | null) {
    return a + b;  // Produces value of type number
}

Y el readonly en las propiedades tambien esta bueno, va un ejemplo:

class Person {
    readonly name: string;

    constructor(name: string) {
        if (name.length < 1) {
            throw new Error("Empty name!");
        }

        this.name = name;
    }
}

// Error! 'name' is read-only.
new Person("Daniel").name = "Dan";

Creo que son muy buenas, mejoras.

Dejo link:
https://www.typescriptlang.org/docs/release-notes/typescript-2.0.html

viernes, 7 de octubre de 2016

Oracle MySQL Cloud Service

Me llego este mail de oracle, sobre un nuevo servicio de cloud para mysql:

View this message in a Web browser
Oracle
eBook
Oracle MySQL Cloud Service
Propel Innovation and Time-to-Market
Oracle MySQL Cloud Service
Read Your eBookcta-arrow
How can you rapidly, securely and cost-effectively deliver modern applications powered by the world’s most popular open source database? 

The new Oracle MySQL Cloud Service is simple, automated, integrated and enterprise-ready, allowing you to deploy production applications globally at scale.
Oracle MySQL Cloud Service enables you to
slap-hr
bulletIncrease Business Agility: Focusing resources on innovation and quickly delivering modern applications to drive digital transformation. 
bulletEnsure Security, Performance & Uptime: relying on the most comprehensive MySQL cloud platform – straight from the source.
bulletReduce Total Cost of Ownership: Saving on infrastructure and database management costs while improving uptime.
Read Your eBookcta-arrow