Translate
sábado, 5 de julio de 2014
The Eclipse Memory Analyze, una excelente herramienta para buscar memory leak
Si no sabes que es un memory leak siéntete un afortunado, dado que estos nos hacen la vida imposible cuando suceden. Como sabrán java tiene un Garbage collector o recolector de basura que se encarga de eliminar los objetos que no utilizamos y liberar la memoria.
Pero cómo sabe cuándo no usamos más un objeto? Una posibilidad es cuando nadie lo referencia. En el heap de la Máquina Virtual Java (JVM) guarda todos los objetos creados por la aplicación Java, por ejemplo, utilizando el operador "new". El recolector de basura de Java puede separar lógicamente el heap en diferentes áreas, por lo que el garbage collector puede rápidamente identificar los objetos que pueden quedar eliminados.
La memoria para los nuevos objetos se asigna en el heap en tiempo de ejecución. Las variables de instancia viven en el interior del objeto en el que se han declarado. Por lo tanto, si referenciamos siempre a un objeto por más que no lo usemos el garbage collector no lo va a poder eliminar. Si creamos objetos y no los liberamos nunca vamos a consumir cada vez más memoria y este es un recurso limitado por lo que tarde o temprano vamos a tener un OutOfMemoryError. Es decir nos, quedamos sin memoria.
Algo horrendo en la vida de un programador, es buscar este tipo de errores. Son muy difíciles de rastrear y muchas veces ocurren cuando la aplicación tiene tiempo corriendo.
Para ayudarnos a luchar contra los memory leak, eclipse creo MAT o The Eclipse Memory Analyze que es un rápido y seguro analizador de memoria java. Que necesitamos para utilizarlo? Solamente un dump de memoria cuando ocurra el error. Si, si claro y como obtengo esto?
Es muy fácil, para obtener un dump de memoria cuando ocurre un OutOfMemoryError debemos configurar la jvm con unos parámetros como lo indica la documentación de oracle:
-XX:-HeapDumpOnOutOfMemoryError que indica a la Jvm que haga un dump cuando ocurra un OutOfMemoryError
-XX:HeapDumpPath=./java_pid<pid>.hprof que indica donde va a guardarse el dump, no es obligatorio pero es aconsejable configurar el path para estar seguros donde se va a guardar.
Por ejemplo con:
Java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/emanuelpeg/logs/
Le estoy diciendo a la jvm que guarde el dump de memoria en /home/emanuelpeg/logs/ cuando ocurra un OutOfMemoryError.
Luego de esto es todo muy fácil, solo tenemos que importar el dump a MAT y esta herramienta nos preguntará si queremos hacer un reporte con los memory leaks y simplemente tenemos que presionar finish para obtener un completo reporte interactivo de la memoria de la jvm.
A la vez nos brinda gráficos con los posibles errores, y contiene un histograma el cual muestra el número de instancias de una clase en particular y la cantidad de memoria que cada uno utiliza. Además, se puede agrupar por cargador de clase o paquete. Esto le permitirá centrarnos en nuestros objetos.
Como conclusión podemos asegurar que MAT es una herramienta indispensable para la búsqueda de memory leaks.
Dejo link: http://www.eclipse.org/mat/
viernes, 4 de julio de 2014
jueves, 3 de julio de 2014
Scala.js
Scala.js es un compilador scala a javascript. Con este compilador podemos escribir nuestras paginas en Scala y ejecutarlas en nuestro browser preferido. Entre las características más importantes podemos nombrar:
- Soporte total de scala (hasta macros)
- Muy buena interoperabilidad con javascript.
- Integración con Sbt
- Puede utilizar la IDE que prefiera para programar en Scala
Dejo link:
lunes, 30 de junio de 2014
Flume, Kafka, Spark y Storm, ¿un nuevo ejército Apache?
Quiero compartir un excelente articulo sobre Flume, Kafka, Spark y Storm que encontré gracias a javahispano.
Dejo el link:
http://blog.gfi.es/flume-kafka-spark-y-storm-un-nuevo-ejercito-apache/
http://www.javahispano.org/portada/2014/6/28/articulo-en-espaol-explicando-los-framework-flume-kafka-spar.html
Dejo el link:
http://blog.gfi.es/flume-kafka-spark-y-storm-un-nuevo-ejercito-apache/
http://www.javahispano.org/portada/2014/6/28/articulo-en-espaol-explicando-los-framework-flume-kafka-spar.html
domingo, 29 de junio de 2014
Pliegues
Es muy común que trabajemos con listas y también es muy común que tengamos que recorrerlas para obtener un valor. Por ejemplo si queremos el promedio de una lista de números, debemos sumar todos los números para luego dividirlos por la cantidad.
Este es un patrón muy común y por lo tanto en Haskell nos brinda unas cuantas funciones muy útiles para encapsular este comportamiento. Estas funciones son llamadas pliegues (o folds en ingles).
Un pliegue toma una función binaria, un valor inicial (llamémoslo acumulador) y una lista que plegar. La función binaria toma dos parámetros por si misma. La función binaria es llamada con el acumulador y el primer (o último) elemento y produce un nuevo acumulador. Luego, la función binaria se vuelve a llamar junto al nuevo acumulador y al nuevo primer (o último) elemento de la lista, y así sucesivamente. Cuando se ha recorrido la lista completa, solo permanece un acumulador, que es el valor al que se ha reducido la lista.
La función foldl, también llamada pliegue por la izquierda. Esta pliega la lista empezando desde la izquierda. La función binaria es aplicada junto a el valor inicial y la cabeza de la lista. Esto produce un nuevo acumulador y la función binaria es vuelta a llamar con ese nuevo valor y el siguiente elemento, etc.
Vamos a implementar una función “sumarLista”:
sumaLista :: (Num a) => [a] -> a
sumaLista xs = foldl (\acc x -> acc + x) 0 xs
Probamos:
ghci> sumaLista [1,2,3,4]
10
Vamos a analizar un poco este pliegue. \acc x -> acc + x es la función binaria donde suma sus parámetros. 0 es el valor inicial y xs es la lista que debe ser plegada. Al inicio acc es igual a 0 (dado que esto lo indicamos en el segundo parámetro) y x toma el primer elemento de la lista 1, el resultado de la suma es 1 y va a ser el valor del acumulador para la segunda iteración.
Si tenemos en cuenta que las funciones están currificadas, podemos escribir esta implementación de forma más bonita como:
sumaLista :: (Num a) => [a] -> a
sumaLista = foldl (+) 0
La función lambda (\acc x -> acc + x) es lo mismo que (+). Podemos omitir el parámetro xs ya que al llamar a foldl (+) 0 nos devuelve una función que toma una lista. Generalmente, si tienes una función del tipo foo a = bar b a la puedes escribir como foo = bar b gracias a la currificación.
Ahora los pliegues por la derecha funcionan igual que los pliegues por la izquierda, solo que el acumulador consume elemento por la derecha. La función binaria de los pliegues por la izquierda como primer parámetro el acumulador y el valor actual como segundo parámetro, la función binaria de los pliegues por la derecha tiene el valor actual como primer parámetro y el acumulador después. Tiene sentido ya que el pliegue por la derecha tiene el acumulador a la derecha.
Las funciones foldl1 y foldr1 son muy parecidas a foldl y foldr, solo que en lugar que no necesitas indicar un valor de inicio. Asumen que el primer (o el último) elemento de la lista es valor de inicio, luego empiezan a plegar la lista por el elemento siguiente. Por lo tanto la función sumaLista puede ser implementada como: sumaLista = foldl1 (+)
Los pliegues no son una característica únicamente de Haskell, están presentes en varios lenguajes como Ruby, Java 8, Scala, Swift, Python, C#, Clojure, Erlang, Groovy, javascript, PHP, Smalltalk, etc.
Veamos nuestro ejemplo de sumaLista en otros lenguajes:
Ruby
> (1..4).inject(&:+)
=> 10
>(1..4).reduce(&:+)
=> 10
Groovy
[1, 2, 3, 4].inject(0, { sum, value -> sum + value })
Javascript
[1, 2, 3,4].reduce(function(x,y){return x+y})
10
[1, 2, 3,4].reduceRight(function(x,y){return x+y})
10
Clojure
(reduce + [1 2 3 4])
10
Scala
List(1,2,3,4).foldLeft(0)((x, sum) => sum + x) //> res0: Int = 10
Erlang
lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1, 2, 3, 4]).
10
Los pliegues nos permiten recorrer listas escribiendo muy poco código, ayudando a la legibilidad y a que los programadores perezosos escribamos menos.
Dejo links:
http://en.wikipedia.org/wiki/Fold_(higher-order_function)
http://aprendehaskell.es/content/OrdenSuperior.html#pliegues
miércoles, 25 de junio de 2014
Documetando APIs Rest con Swagger
Te imaginas un javadoc de tus servicios REST? Swagger es eso y mucho más dado que es una herramienta extremadamente útil para describir, producir, consumir y visualizar APIs RESTful. El principal objetivo de este framework es enganchar el sistema de documentación con el código del servidor para que esté sincronizado a cada cambio. Casi documentamos al mismo tiempo que creamos la implementación.
Swagger está desarrollado de tal modo que podemos usar Scala, Java, Javascript, Ruby, PHP o ActionScript para generar toda la documentación y su sandbox correspondiente. Además, existen distintos módulos para enganchar a nuestros proyecto Node.js, Grails, Scala Play, Spring MVC, Symfony o Ruby, entre otros muchos.
Los usuarios de las APIS también son beneficiados ya que proporciona una interfaz visual a modo de sandbox donde podemos testear la llamadas del API, además de consultar su documentación. Podéis echar un vistazo a un ejemplo de la web que genera Swagger a partir del código de nuestra API con los métodos, parámetros y modelos de JSON que devuelve.
Swagger es perfecto para tener la documentación de nuestras APIs a punto y brindarle un servicio más a los clientes con ejemplos.
The Swagger™ Specification: https://github.com/wordnik/swagger-spec
Swagger™ Demo: http://petstore.swagger.wordnik.com/
Downloads: https://github.com/wordnik/swagger-core/wiki/Downloads
martes, 24 de junio de 2014
Breaking the Code: Biografía de Alan Turing
Seguramente conocen a Alan Turing y sino en resumen, fue el matemático que concibió, una maquina programable y probo que se podía construir. Por lo que le debemos el trabajo. Breaking the Code es la biografía de Alan Turing y esta libre y gratuita en youtube:
Dejo link:
http://es.wikipedia.org/wiki/Alan_Turing
Dejo link:
http://es.wikipedia.org/wiki/Alan_Turing
Dba PostgreSQL desde básico a avanzado
Quiero compartir esta excelente info sobre la base de datos Postgres:
viernes, 20 de junio de 2014
The Arnold Schwarzenegger Programming Language
ArnoldC es un lenguaje de programación basado en frases de ... y de quien? de Arnold Schwarzenegger. Si señores parece un chiste y lo es, pero un chiste que se puede utilizar para hacer programas.
Entre las instrucciones más graciosas tenemos:
False
I LIED
True
NO PROBLEMO
If
BECAUSE I'M GOING TO SAY PLEASE
Else
BULLSHIT
EndIf
YOU HAVE NO RESPECT FOR LOGIC
While
STICK AROUND
EndWhile
CHILL
PlusOperator
GET UP
MinusOperator
GET DOWN
MultiplicationOperator
YOU'RE FIRED
DivisionOperator
HE HAD TO SPLIT
ModuloOperator
I LET HIM GO
EqualTo
YOU ARE NOT YOU YOU ARE ME
GreaterThan
LET OFF SOME STEAM BENNET
Or
CONSIDER THAT A DIVORCE
And
KNOCK KNOCK
DeclareMethod
LISTEN TO ME VERY CAREFULLY
NonVoidMethod
GIVE THESE PEOPLE AIR
MethodArguments
I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE
Return
I'LL BE BACK
EndMethodDeclaration
HASTA LA VISTA, BABY
CallMethod
DO IT NOW
AssignVariableFromMethodCall
GET YOUR ASS TO MARS
DeclareInt
HEY CHRISTMAS TREE
SetInitialValue
YOU SET US UP
BeginMain
IT'S SHOWTIME
EndMain
YOU HAVE BEEN TERMINATED
Print
TALK TO THE HAND
ReadInteger
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
AssignVariable
GET TO THE CHOPPER
SetValue
HERE IS MY INVITATION
EndAssignVariable
ENOUGH TALK
ParseError
WHAT THE FUCK DID I DO WRONG
Entre otras características ArnoldC corre sobre la plataforma Java, veamos un "hola mundo" con este lenguaje:
IT'S SHOWTIME
TALK TO THE HAND "hello world"
YOU HAVE BEEN TERMINATED
Veamos un ejemplo de un condicional:
if(a) print "a is true"
else print "a is not true"
BECAUSE I'M GOING TO SAY PLEASE a
TALK TO THE HAND "a is true"
BULLSHIT
TALK TO THE HAND "a is not true"
YOU HAVE NO RESPECT FOR LOGIC
La verdad muy gracioso,
Dejo links:
https://github.com/lhartikk/ArnoldC
https://github.com/lhartikk/ArnoldC/wiki/ArnoldC
Se busca Sponsors!!!
Si queres invertir en este humilde blog ahora lo podes hacer. Como viene la mano? Se trata de Coobis. Un producto el cual permite invertir en blogs.
Coobis es un plataforma que ofrece a los blogs dos vías principales para acceder a nuevos sponsors:
- Widgets: Los blogs pueden instalar diferentes tipos de widgets ofrecidos por Coobis para mostrar las campañas de los sponsors de forma automática, como si de una red de afiliación se tratará, pero con una capa de sencillez añadida respecto a las dificultades habituales de este tipo de redes.
- Marketplace: Los sponsors pueden comprar patrocinios exclusivos a los blogs desde el marketplace de Coobis, así como post patrocinados o menciones en Twitter.
Como me gusta predicar con el ejemplo, ya estoy usando Coobis. Aquí pueden ver la ficha:
http://coobis.com/blog/emanuelpeg.blogspot.com.ar
La pregunta obvia, quiere invertir en el blog?
jueves, 19 de junio de 2014
Collections.js
Quien no soñó tener todas las colecciones más comunes en Javascript? Collections.js cumple ese sueño. Con esta librería podes tener todas las estructuras de datos más comunes en Javascript.
Estas colecciones ofrecen alternativas especializadas de arrays y objetos planos. Incluye la capacidad de observar todos los cambios además todas las colecciones tienen un interfaz común y se puede utilizar tanto para aplicaciones Node.js o aplicaciones que se ejecutan en el navegador.
Algunas estructuras de datos son más adecuados para problemas específicos por lo tanto podemos armar la librería como mejor nos convenga y descargarla.
Dejo link: http://www.collectionsjs.com/
Además les dejo una referencia a los objetos de esta la librería:
lunes, 16 de junio de 2014
La historia de Lisp
Para conocer un lenguaje es necesario conocer su historia y más que eso conocer porque se tomaron tal o cual decisión. Lisp es un lenguaje muy particular que nos provee muchos dolores de cabeza con sus paréntesis. Pero antes de leventarse en armas contra este lenguaje, es bueno conoser su historia y porque fue pensado de esta manera.
Dejo link de la historia de Lisp:
http://www-formal.stanford.edu/jmc/history/lisp/lisp.html
Dejo link de la historia de Lisp:
http://www-formal.stanford.edu/jmc/history/lisp/lisp.html
75 libros de #Python
Solo quiero hacerme eco de un post sobre libros de python: http://blog.segu-info.com.ar/2014/06/75-libros-de-python.html
Python se ha transformado sin dudas en el lenguaje base de cualquier profesional de seguridad debido a su formato sencillo, potente y totalmente extensible. Python, un lenguaje multiplataforma,
permite que trabajas rápidamente y eficientemente, permitiéndo concentrarse en el objetivo a lograr en lugar del lenguaje en sí mismo.
A continuación una lista de más de 70 libros sobre diferentes formas de aprovecharlo al máximo
Python se ha transformado sin dudas en el lenguaje base de cualquier profesional de seguridad debido a su formato sencillo, potente y totalmente extensible. Python, un lenguaje multiplataforma,
permite que trabajas rápidamente y eficientemente, permitiéndo concentrarse en el objetivo a lograr en lugar del lenguaje en sí mismo.
A continuación una lista de más de 70 libros sobre diferentes formas de aprovecharlo al máximo
- 51 libros gratuitos sobre cómo programar en este lenguaje.
- 21 libros gratuitos hosteados en Google Docs
- Hacking Secret Ciphers with Python
- BlackHat Library
- The Hacker's Guide to Python
Suscribirse a:
Entradas (Atom)