Translate
domingo, 13 de abril de 2014
Pattern matching
Pattern Matching nace del paradigma funcional aunque hoy en día lenguaje multiparadigma lo implementan como Scala o Kotlin. Pattern Matching permite definir funciones por medio de macheo de parámetros y resultados. Veamos un ejemplo en Haskell de definición de factorial:
factorial 0 = 1
factorial n = n * factorial (n - 1)
Para ver la diferencia entre la forma de resolver el problema sin Pattern Matching, voy a resolver lo mismo en C++
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n-1);
}
}
Si comparamos nos ahorramos 5 lineas; pero el tema no es solo escribir menos código. Además debemos pensar: ¿Cuál les parece más legible? ¿Cuál es más simple?
Muchos lenguajes implementan Pattern Matching, al venir del paradigma funcional normalmente los lenguajes funcionales como Erlang lo implementan; vamos a hacer la función de factorial en Erlang.
fac(0) -> 1;
fac(N) when N > 0, is_integer(N) -> N * fac(N-1).
Se puede ver que en este caso se indica que debe ser positivo el número; si se ingresa un valor negativo lanza un error. Ojo estas restricciones también la podíamos hacer en Haskell.
Factorial con ML se vería de la siguiente manera:
fun fac 0 = 1
| fac n = n * fac (n - 1)
Otros lenguajes multiparadigma nos permiten jugar con Patter Matching como Scala:
def fact(n: Int): Int = n match {
case 0 => 1
case n => n * fact(n - 1)
}
En este caso se define fact que devolverá un entero, y que el parámetro n debe coincidir con 0 y devuelve 1 o con cualquier otro valor y devolverá n * fact(n - 1).
Por ejemplo Kotlin permite hacer Pattern Maching por el tipo de la siguiente manera:
when (x) {
is Int -> print(x)
is List<Int> -> print(x.sum())
!is Number -> print("No es un número")
else -> print("No puedo hacer nada")
}
Para citar otro ejemplo, veamos desarrollar una función que indique el número que se encuentra en una posición indicada por parámetro de la secuencia de Fibonacci, y lo desarrollaremos con F# :
let rec fib n =
match n with
| 0 -> 0
| 1 -> 1
| 2 -> 1
| _ -> fib (n - 1) + fib (n - 2)
Si lo comparamos con Mathematica:
fib[0]:=0
fib[1|2]:=1
fib[n_]:= fib[n-1] + fib[n-2]
En Mathematica podemos utilizar el | para decir esto o aquello y el _ para indicar cualquier otro valor.
Pattern Matching es una técnica muy simple, pero muy potente. Por ejemplo necesitamos el primer elemento de una lista podemos definirla de la siguiente manera, vamos a implementarlo en Haskell:
primero :: [a] -> a
primero [] = error "¡No puedes utilizar la función primero con una lista vacía!"
primero (x:_) = x
Con (x:_) estamos diciendo que puede llegar una lista por parámetro que está conformada por un elemento y el resto. Implementemos la función cantidadDeElementos que nos indique cuantos elementos tiene una lista:
cantidadDeElementos :: (Num b) => [a] -> b
cantidadDeElementos [] = 0
cantidadDeElementos (_:xs) = 1 + cantidadDeElementos xs
Una desventaja del uso de Pattern Matching es que nuestro código se verá muy afectado ante un cambio en las estructuras. Pero la ventajas son muchísimas, para citar algunas: legibilidad de código, simplicidad, menos lineas de código, etc...
sábado, 12 de abril de 2014
Netrunner, mi próximo linux!!
No sé que voy a hacer mañana, pero sé que quiero instalar Netrunner, cuanto antes.
Por qué? Porque por lo que vi es una muy buena opción. Un entorno KDE muy elegante, y no soy fan de KDE pero en Netrunner se ve su potencia, un entorno muy cuidado.
Además que es una distro basada en Ubuntu, por lo tanto basada en Debian. Y me encanta usar Debian. Y eso no es todo, hace poco anunciaron que sera una Rolling Release. Para el que no sabe Rolling Release es que para cambiar de versión debemos esperar un periodo de tiempo, sino que se va actualizando periódicamente.
Netrunner es una distro muy buena para los amantes de KDE, Debian y Rolling Release.
La voy a probar y les cuento!!
Dejo link:
http://www.netrunner-os.com/
http://en.wikipedia.org/wiki/Netrunner_(operating_system)
lunes, 7 de abril de 2014
Oracle Massive Open Online Course: Develop Java Embedded Applications Using a Raspberry Pi May 2014
Oracle ofrecerá un curso de programación de Raspberry Pi con Java.
Yo no estaba enterado que Raspberry Pi soportaba Java. La verdad es que me saco el sombrero. Raspberry Pi pinta como una gran plataforma que va a acercar el mundo de la rebotica a muchos programadores.
Y esta rebueno que Oracle ofrezca estas capacitaciones.
Dejo el link:
https://apex.oracle.com/pls/apex/f?p=44785:145:0::::P145_EVENT_ID,P145_PREV_PAGE:1841,143
domingo, 6 de abril de 2014
Show Off. Get Proof. Convince Your Boss.
No soy asiduo de hacer publicidad a empresas pero quiero recomendarles la pagina de Typesafe.
Go Typesafe es un conjunto de recursos para ayudar a convencer a sus compañeros para utilizar la plataforma reactive de Typesafe: Play Framework, Akka y Scala.
Dejo link:
http://go.typesafe.com/
viernes, 4 de abril de 2014
Roslyn el compilador Open Source de C# y Visual Basic
Microsoft ha publicado el compilador Roslyn, bajo la licencia Apache.
Roslyn representa una importante inversión de Microsoft. Microsoft ha reescrito su compilador C# y VB. NET desde cero y lo publico con licencia Open source.
Esto es un gran salto para Microsoft dado que abrió el proceso de compilación de sus lenguajes. El lanzamiento de hoy de la tecnología . ET marca un cambio importante en el pensamiento de Microsoft. La visibilidad del codigo del compilador debería conducir a mejores beneficios para todos, independientemente de su plataforma.
Dejo link: http://msdn.microsoft.com/en-us/vstudio/roslyn.aspx
miércoles, 2 de abril de 2014
Reactive Design Patterns
Reactive Design Patterns es un libro que acaba de publicar la editorial Manning. Lo interesante es que regala el primer capitulo, y es una buena idea leerlo para ver de que se trata.
Dejo el link:
http://www.manning.com/kuhn/
Try Flux Today!
Codescholl lanzo la pagina try flux que la verdad no entiendo bien. Alguien me lo puede explicar??
Dejo link:
https://www.codeschool.com/try-flux
lunes, 31 de marzo de 2014
jueves, 27 de marzo de 2014
miércoles, 26 de marzo de 2014
lunes, 24 de marzo de 2014
Mixin, Mixin y más Mixin...
El mixin es una técnica para la reutilización de código. El objetivo es que una función pueda estar en diferentes clases, aunque las clases no tengan ninguna relación.
Los mixin fueron utilizados por primera vez en Flavors que era un enfoque a la orientación a objetos utilizado en Lisp Machine Lisp. La ventaja de los mixin es que fomentan la reutilización de código y evitan problemas típicos asociados con la herencia múltiple.
¿Cómo funciona? Existen diferentes formas de implementarlo dependiendo del lenguaje.
Scala
En scala existen entidades llamadas traits. Los traits son características, similares a las interfaces de java, pero pueden contener código. Código que va a ser reutilizados por las clases que utilicen esta característica. Por supuesto una clase puede utilizar varias características.
Voy a tomar el ejemplo del libro programming in scala. Supongamos que queremos modelar la amistad entonces vamos hace un trait llamado Friend.
trait Friend {
val name : String
def listen() = println("Your friend " + name + "is listening")
}
Como se puede ver se declaro el val name, el cual debe ser proveído por la clase que vamos a mixiar. Ahora tenemos que utilizar a Friend, si la clase que utiliza este trait no extiende de ninguna clase podemos utilizar extends, por ejemplo:
class Human(val name: String) extends Friend
Human podría reescribir los métodos de Friend, por ejemplo si extendemos a Human en Man y Woman, estos también pueden reescribir estos métodos.
Cuando una clase extiende de otra clase se debe utilizar la palabra clave with. Con with podemos utilizar varios trait. Veamos la clase Dog:
class Dog(val name:String) extends Animal with Friend {
override def listen = println(name + "'s listening quietly")
}
En el ejemplo reescribimos el método sólo para mostrar que se puede reescribir, pero si no es necesario no se debe reescribir.
Ahora podemos utilizar el trait heredado y es más podemos tipar por ese trait como lo hacemos en java con las interfaces:
val john = new Man("John" )
val sara = new Woman("Sara" )
val comet = new Dog("Comet" )
john.listen
sara.listen
comet.listen
val mansBestFriend : Friend = comet
mansBestFriend.listen
También podemos utilizar el mixin en instancias no solo en clases por ejemplo una clase gato, el gato por naturaleza no es muy amistoso:
class Cat(val name: String) extends Animal
Pero existe un gato llamado snowy que es muy amigable, entonces podemos hacer lo siguiente:
val snowy = new Cat("Snowy" ) with Friend
val friend : Friend = snowy
friend.listen
Mixin es una técnica de reutilización de código que nos provee gran flexibilidad en Scala. Veamos como se implementa en Ruby.
Ruby
En Ruby definimos módulos y podemos importar estos módulos en nuestras clases.
module Debug
def who_am_i?
"#{self.class.name} (\##{self.id}): #{self.to_s}"
end
end
class Phonograph
include Debug
# ...
end
class EightTrack
include Debug
# ...
end
ph = Phonograph.new("West End Blues")
et = EightTrack.new("Surrealistic Pillow")
ph.who_am_i? #Phonograph (#935520): West End Blues
et.who_am_i? #EightTrack (#935500): Surrealistic Pillow
Groovy
El caso de Groovy resuelve el mixin con anotaciones o con el método mixin, es como una fusión de Java y Ruby.
Pero como Ruby tiene la ventaja de ser un lenguaje de tipado dinámico, lo que nos da ciertas libertades.
Usemos anotaciones:
class Dog {
def talk() {
"Woof, woof"
}
}
@Mixin(Dog)
class Talk {
// other stuff here
}
Y listo! Pero a la vez groovy permite hacer mixin con instancias no solo con clases de la siguiente manera:
someoneElsesClass.mixin(Dog)
Como es dinámicamente tipado, no hay problema si hacemos:
someoneElsesClass.talk()
En Scala si queríamos hacer esto usábamos with en el constructor tipando de esta manera al objeto:
val snowy = new Cat("Snowy" ) with Friend
val friend : Friend = snowy
friend.listen
El método mixin de Groovy tiene la ventaja que se puede utilizar en cualquier momento, no como la palabra reservada de Scala with que sólo se puede utilizar en el constructor.
Dart
Dart implementa el mixin muy similar a scala, es decir tiene trait que pueden ser agregados a las instancias o a las clases. Pero además tiene interfaces, veamos un ejemplo:
interface Shape {
num perimeter();
}
trait Rectangle implements Shape {
final num height, width;
Rectangle(num this.height, num this.width); // Compact constructor syntax.
num perimeter() => 2*height + 2*width; // Short function syntax.
}
class Square extends Rectangle {
Square(num size) : super(size, size);
}
Dart usa las interfaces como Java, pero tiene trait como Scala y estas características se pueden combinar.
Ceylon
En Ceylon existen las interfaces que al igual que Scala pueden contener código; es decir una interfase de Ceylon es similar a un trait de Scala:
shared interface Writer {
shared formal Formatter formatter;
shared formal void write(String string);
shared void writeLine(String string) {
write(string);
write(process.newLine);
}
shared void writeFormattedLine(String formatString, Object... args) {
writeLine( formatter.format(formatString, args) );
}
}
shared class ConsoleWriter()
satisfies Writer {
formatter = StringFormatter();
shared actual void write(String string) {
writeLine(string);
}
}
Hay una diferencia sutil pero importante entre los traits de Scala y las interfaces en Ceylon: en Ceylon no puedes guardar estado en las interfaces; es decir, no puedes tener atributos concretos (ni mutables ni inmutables). Solamente puedes definir atributos como "formal", para que los implemente la clase que satisfaga dicha interfaz. La única manera de tener atributos concretos en una interfaz es definirlos con getter y opcionalmente con setter, pero atributos simples no lo permite.
Como podemos ver en todos los lenguajes la idea la similar, cambia un poco la forma de implementarla.
Mixin es una característica de los lenguajes modernos, que nos brinda una forma práctica de reutilización de código.
Que implementación les gusto más?
domingo, 23 de marzo de 2014
Correr scripts sql con Hibernate
Esto no es una gran novedad pero bueno; Hibernate permite configurar un script que se ejecute cuando crea las tablas por lo tanto, deben imaginar que Hibernate debe estar configurado en hibernate.hbm2ddl.auto en create o create-drop.
Simplemente en el persistence.xml debes configurar el parámetro hibernate.hbm2ddl.import_files con los archivos sql que vas a correr separados por comas, como por ejemplo /1.sql, /2.sql, /etc.sql
Y listo, cuando Hibernate arranque va a crear las tablas y luego va a correr estos scripts. Si queres que logee tenes que agregar a la configuración de log4j los siguiente:
log4j.logger.org.hibernate.tool.hbm2ddl=DEBUG
Espero que les sirva.
Simplemente en el persistence.xml debes configurar el parámetro hibernate.hbm2ddl.import_files con los archivos sql que vas a correr separados por comas, como por ejemplo /1.sql, /2.sql, /etc.sql
com.ejemplo.model.Clase1 com.ejemplo.model.Clase2 com.ejemplo.model.Clase3 com.ejemplo.model.Clase4
Y listo, cuando Hibernate arranque va a crear las tablas y luego va a correr estos scripts. Si queres que logee tenes que agregar a la configuración de log4j los siguiente:
log4j.logger.org.hibernate.tool.hbm2ddl=DEBUG
Espero que les sirva.
Influencia de los lenguajes de programación
Una infografía de los lenguajes y sus influencias, la idea de la infografía no es saber que lenguaje influyo a otro, simplemente porque no se ve pero nos sirve para saber que lenguajes son los más influyentes, a simple vista se puede ver:
Lisp, scheme, Logo, Forth, Dylan, Smalltalk, Ruby, Python, Lua, Java, Object-C, ML, Pascal, Haskell, etc
Y que lenguaje sabes? y cual vas a aprender?
Lisp, scheme, Logo, Forth, Dylan, Smalltalk, Ruby, Python, Lua, Java, Object-C, ML, Pascal, Haskell, etc
Y que lenguaje sabes? y cual vas a aprender?
Suscribirse a:
Entradas (Atom)