Buscar
Social
Ofertas laborales ES

Entries by ecamacho (574)

lunes
jun062011

Clojure vs Scala ejemplos de una sola línea

Si bien que puedas programar una funcionalidad en una sola línea, no es demasiado importante para elegir un lenguaje de programación (incluso en lenguajes que tienden a necesitar más líneas, siempre puedes usar/hacer una librería para simplificarlos); me han gustado estos ejemplos usando Scala y Clojure como un acercamiento a ambos lenguajes.


Los ejemplos de Scala los publicó Marcus Kazmierczak en su blog, algunos no son los más eficientes, pero en los comentarios proponen mejores alternativas. Algunos son muy simples, como el ejemplo 7 que obtiene un xml de un servicio web y hace el parsing del mismo:

val results = XML.load("http://search.twitter.com/search.atom?&q=scala")

Donde se demuestra, entre otras cosas, que el XML es una estructura nativa en el lenguaje lo que reduce la complejidad de hacer parsing a mano. 

El ejemplo 9, por su parte, demuestra una nueva funcionalidad de Scala 2.9, las colecciones paralelas:

val result = dataList.par.map(line => processItem(line))

En este ejemplo dataList es una lista y a cada uno de sus elementos, le aplicamos la función "processItem". El resultado se va guardando en otra lista que es asignada a la variable inmutable result. Lo interesante es que por usar la palabra reservada "par", Scala automáticamente paralelizará este procesamiento sacando provecho de los múltiples cores que suelen tener los ordenadores hoy en día.

Ahora veamos los mismos ejemplo en Clojure, hechos por Baishampayan Ghose  y publicados en su blog.

(clojure.xml/parse "http://search.twitter.com/search.atom?&q=clojure")

En Clojure también se tiene una estructura nativa para el XML y también se puede recibir directamente una URL representada como un String.

Para el caso del ejemplo 9:(pmap process-line lines) ;

En este caso, el procesamiento en paralelo se indica con la letra p antes de map. En teoría funcionaría igual que en Scala, pero los desarrolladores de Clojure han dejado claro que solamente está pensada para casos en que la función a llamar (en este caso process-line) sea computacionalmente intensiva (referencia).

¿Qué opináis de estos ejemplos? ¿Son complicados de leer, os invitan a conocer más el lenguaje? ¿Cómo se harían en otros lenguajes?

miércoles
may252011

In The Box: ejecuta tus apps Android en iOS (iphone)

In the Box es un proyecto que está portando Dalvik, la Máquina Virtual donde se ejecutan las aplicaciones Android y las APIs de Android Gingerbread  a iOS: el sistema operativo del iphone/ipod y el ipad. La meta es que puedas ejecutar tus aplicaciones para Android en un dispositivo móvil de Apple.

Por ahora han portado Dalvik  por lo que como muestran en el vídeo en su sitio, ya es posible ejecutar código Java en el iphone. Al parecer todavía no es posible ejecutar algo sobre las APIs de Android, pero ya es un paso importante.

El proyecto es open source con licencia Apache 2, puedes empezar a probarlo si lo descargas de google code.

Si bien suena interesante poder tener la misma aplicación con la misma base de código ejecutándose en Android y en iOS. el principal problema que tiene in-the-box actualmente es que Apple no permite subir aplicaciones al appStore que usen un RunTime distinto al RunTime de Objective-c; por lo que veo complicado que aprueben aplicaciones corriendo sobre Dalvik.

Así que si deseas tener una aplicación en varias plataformas, hay otras alternativas como Rhodes que usa ruby, appcelerator que usa javascript o Adobe Flex.  

miércoles
may112011

Google I/O: Google Music, Android Open Accesory y GAE sale del beta

Ayer inició el Google I/O 2011 en San Francisco. En este primer día Android ha sido el rey del evento, se ve que Google apuesta mucho por los usuarios móviles. En el keynote se dieron unas cifras que hablan de la importancia actual de la plataforma:

 

  • 100 millones de dispositivos Android activados
  • 400,000 nuevos dispositivos Android activados cada día
  • 200,000 aplicaciones gratuitas y de pago en el Android Market
  • 4.5 mil millones de aplicaciones instaladas a través del Android Market
  • 310 modelos diferentes de dispositivos Android

 

La keynote, que pudo ser seguida en vivo en el sitio, tuvo como momento más impresionante las demostraciones del nuevo API de Android: Android Open Accesory, la inbtegración de Android con Arduino que facilita integrar hardware con los móviles mediante USB. Entre los demos, hubo uno donde el usuario usando una bicicleta fija, controlaba un juego en su Android y otro donde los acelerómetros del móvil servían para controlar un juego real. 

Esta iniciativa se inscribe dentro de Android@Home el esfuerzo de Google para llevar Android a la domótica: controlar todos los dispositivos que se tienen en casa a través del móvil.

Además de Android, se anunciaron otros proyectos interesantes. El primero de ellos es que Google AppEngine saldrá de Preview este mismo año y dentro de los próximos meses. Para ello, se ha agregado soporte a Google Go, el lenguaje de programación creado por la empresa. Por lo que ahora GAE soporta java, python y Go.

Además se anunciaron cambios en las condiciones de uso de GAE, no se han dado cifras oficiales pero ya se anunció que las cuotas para la versión gratuita disminuirán. Además se anunciaron 3 esquemas de precios:

 

  • Gratuito, como el de ahora pero con menores cuotas.
  • Pagado. Se paga USD $9 al mes por aplicación más las cuotas usadas.
  • Premium. Se paga por empresa y no por aplicación.

 

Otra noticia importante, la disponibilidad de Backends. Hasta ahora las aplicaciones GAE corren sobre instancias dinámicas controladas por Google, con Backends se le asignará al usuario un Backend: un servidor con los recursos que haya especificado (memoria, cpu, disco, etc) con una ip que no cambia. 

Por último, se anunció un nuevo servicio de Google:  Google Music. Un servicio que permite subir a la nube tu música para poder escucharla por streaming en cualquier ordenador o en tu móvil android.  Por ahora el servicio está en Beta solamente en Estados Unidos. 

Todas las sesiones se han grabado y las puedes ver en el canal de YouTube.  

miércoles
abr272011

Groovy 1.8 publicado al fin

Ha sido publicada la nueva versión del lenguaje Groovy, la 1.8, que es una versión que los comitters del proyecto han estado trabajando por varios meses. En esta versión se incluyen importantes mejoras, que puedes leer en las Release Notes, entre ellas  destacan:

Cadenas de comando para mejores DSL.

En Groovy, se pueden omitir los paréntesis para invocar a un método; lo que facilita la creación de DSLs. Sin embargo, no se podía hacer si se encadenaban invocaciones a métodos. En la 1.8 ya es posible, así podemos pasar de esto:

 check(that: margarita).tastes(good)

a un DSL mucho más legible:

 check that: margarita tastes good 

Un ejemplo completo de las Release Notes:

show = { println it }

square_root = { Math.sqrt(it) }

def please(action) {

  [the: { what ->

    [of: { n -> action(what(n)) }]

  }]

}

please show the square_root of 100 

Mejor performance

La desventaja que la mayoría señalan de Groovy es sin duda el performance, lento en comparación a Java. En esta versión se ha mejorado el soporte a Integers. Las operaciones con este tipo de datos es tan rápida como en Java y se ha mejorado la parte de invocación directa a métodos. Además se ha creado un branch en el proyecto donde se irán incorporando poco a poco otras mejoras, como el uso de primitivos donde sea posible.

Soporte a JSON nativo

Ahora tenemos un JSONBuilde y un JSONSluper que nos ayudan a generar y leer documentos en ese formato

GPars es parte de la distribución oficial

El proyecto de Paul King: GPars, ahora vendrá en la distribución oficial. Este proyecto permite construir aplicaciones concurrentes, asíncronas y distribuidas con Groovy. Para ello tiene soporte para ejecutar closures de forma asíncrona, trabajar con colecciones de forma paralela y Actores para procesamiento concurrente.

Transformaciones AST.

Para mi, lo que más he esperado de Groovy 1.8. Los que pudistéis asistir al Spring I/O, Andrés Almiray dio una charla donde explicaba el gran número de transformaciones AST que se han agregado a esta versión. Estas transformaciones permiten mediante anotaciones indicarle al compilador de Groovy que haga modificaciones en el Abstract Syntax Tree para agregar comportamiento a una clase que antes no tenía. Por lo que tienen mejor performance que usar el antiguo método de modificar la meta clase y además este comportamiento vendrá en el bytecode logrando que desde otros lenguajes de la JVM puedan "verlo".

Entre las más interesantes:

@Log, @Log4j, @Commons, @SLF4J -> agrega un logger a tu clase  con la implementación que hayas puesto.

@EqualsAndHashCode -> construye el método equals y el hashcode basado en los atributos de tu clase

@ToString -> autoexplicativo

@WithReadLock, @WithWriteLock -> simplica el uso de java.util.concurrent.locks.ReentrantReadWriteLock para construir el típico mapa para cache thread safe:

 

class ResourceProvider {

    private final Map data = new HashMap<>()

    @WithReadLock

    String getResource(String key) {

        return data.get(key)

    }

 

    @WithWriteLock

    void refresh() {

        //reload the resources into memory

    }

Enhorabuena al equipo de Groovy que han seguido trabajando en mejorar uno de los lenguajes más populares de la JVM. 

 

Los que estáis interesados en aprender Groovy aquí podéis acceder a dos videos- tutoriales introductorios (en español). Y los que cree saber más sobre DSL en Groovy podéis ver estos otros dos videos (también en español). 

 

 

martes
abr262011

Ratpack: un framework ligero para Groovy basado en Sinatra

Sinatra es un framework para desarrollar aplicaciones web con Ruby muy ligero y sencillo. Tan sencillo que su creador lo considera un DSL para crear aplicaciones web. Surgió por la necesidad de desarrollar de forma rápida y ágil, sobre todo aquellos proyectos que no necesitaban cosas tan completas como las proporcionadas por Rails.

El éxito de este paradigma ha sido muy importante y ya hay frameworks parecidos en otros lenguajes  como Flask para python y Scalatra para Scala. Ahora es el turno de Groovy con Ratpack.

Ratpack permite construir aplicaciones web usando la idea de Sinatra: mediante pequeños métodos que se mapean a una ruta:

get("/") {

    "Hello, World!"

}

Así que de esa forma tan sencilla y unido a la sintaxis de Groovy enfocada a la simpleza y a mejorar la velocidad de desarrollo, tenemos una opción muy buena para crear proyectos rápidamente e ideal para prototipos.

Ratpack es desarrollado por Justin Voss y es open source bajo la licencia Apache 2. Puedes mirar más ejemplos de su funcionamiento en el github del proyecto.