sábado, 19 de julio de 2014

Las mejores librería, recursos y herramientas de Android

Hola a todos, les quería compartir este pequeño proyecto, la idea del mismo fue realizada en la lista de correo de Desarrolladores Android donde participo activamente desde hace un buen tiempo.

Este es el proyecto:

La idea del mismo, es que entre todos podamos armar una lista de las librerías más importantes, herramientas que podemos utilizar, recursos como lecturas, personas a seguir en redes sociales, etc, etc. Todo lo que nos pueda ayudar en el desarrollo de aplicaciones para la plataforma Android.

Esta es una guía donde nos explica como podemos colaborar aquí.

Espero que el proyecto les sea de utilidad, y que compartan los enlaces que crean que puedan ayudar a otros.

Saludos a todos, Gabriel

lunes, 16 de junio de 2014

Como colaboro con la Wiki en español sobre el framework LibGDX?


Hola a todos, en este nuevo post, solo les quería anunciar, que ya tenemos una guía sencilla para que cualquier persona pueda colaborar con la traducción de la Wiki del framework LibGdx.



Con esta guía se pretende incentivar la colaboración de personas que no sepan usar Git, que nunca hayan utilizado Github y que provablemente no tengan grandes conocimientos de programación pero que si deseen aprender y que puedan colaborar con la comunidad de alguna manera.

En este caso ayudando a traducir la documentación, para que otras personas puedan utilizar esta gran herramienta, y ademas esto los va a ayudar a que aprendan a utilizar el framework y a poder armar sus propios videos juegos.

Para mas detalles vea esto


Saludos a todos, Gabriel

domingo, 8 de junio de 2014

Wiki en español sobre el framework LibGDX



En este post les quería hablar sobre un proyecto, que presente en una charla que di en la facultad UTN regional Rosario el 04/06/2014, sobre la traducción de la wiki de una herramienta libre llamada Libgdx para el desarrollo de video juegos múlti-plataformas.


Esta herramientas tiene una gran variedad de ventajas, algunas de ellas se encuentran explicadas en la presentación que armé para la charla:

Presentación Libgdx

Les dejo un enlace a la wiki que estoy armando:

Wiki LibGDX en español

La misma no esta terminada aun, cualquier ayuda, ya sea compartiendo este enlace, puntuar con una estrella el repositorio o mejor aun enviando un pull request ;) será bienvenido.

Estas son algunas de las imágenes de la charla en la UTN:






Espero que les sirva, personalmente creo que es de gran ayuda tener documentación en nuestro idioma, sobre todo para las personas que recién se inician en el mundo de la programación.

Saludos a todos, Gabriel

martes, 29 de abril de 2014

The Original Hacker quinta edición !!!

En este post, volvemos a presentar material escrito por Eugenia, en este caso la quinta edición de la revista The Original Hackers :D


Temas de esta edición:

INGENIERÍA DE SOFTWARE: MANIPULACIÓN DE WEB
FORMS Y CARGA DE ARCHIVOS CON PYTHON Y WSGI
SOBRE APACHE

En un principio creo que comenta algo muy cierto, la gran mayoría de los programadores Django (sin ofender ;) ) no saben de Python. Solo saben utilizar el framework, pero se olvidan de lo importante que es conocer con que están trabajando realmente. Lo que les va a dar la posibilidad de realmente elegir más adelante con que desean trabajar ;) y nos da varios enlaces interesantes sobre el tema.
Creo que el artículo te va a hacer comprender como manejan ese tipo de acciones los framework web's de Python en general, lo que lo hace muy importante y recomendable.

EUROPIO ENGINE LAB: DICT OBJECT, UN NUEVO
CONCEPTO EN OBJETOS PARA LAS VISTAS EN PHP

Realmente no conozco PHP, pero esta serie de artículos sobre Europio creo que son muy útiles para abrirnos la mente y ayudarnos a pensar en como implementar la arquitectura que deseemos utilizar en un framework o engine que deseemos desarrollar. Sin importancia del lenguaje que utilicemos, del objetivo del mismo e ir mirando como se nos puede plantear un problema y la forma de pensar que necesitamos para poder resolverlo.

SEGURIDAD INFORMÁTICA: MODELOS DE SEGURIDAD
PERMISIVOS COMO MECANISMOS DE PREVENCIÓN DE
VULNERABILIDADES

Nos habla de una forma en la que lo puede comprender la mayoría sobre lo que es un modelo de seguridad permisiva, y como nos puede beneficiar en nuestra búsqueda de seguridad, para nuestras aplicaciones. En resumen un artículo interesante sobre seguridad informática.

BASH SCRIPTING AVANZADO: DIVERSAS FORMAS DE
IMPLEMENTACIÓN DE MENÚS DINÁMICOS

Este último artículo para mi es simplemente excelente, como crear Menúes con Bash :D la verdad que es muy bueno ;)

Esta es la web de The Original hackers: http://originalhacker.org

Y pueden descargarla directamente desde aquí: Enlace

Saludos a todos, Gabriel

miércoles, 23 de abril de 2014

Como instalo algo en Slackware cuando no tengo un paquete .txz o un .tgz?

El otro día necesitaba instalar particularmente un programa llamado PgAdmin en un Slackware 14, y me encontré con que la ultima versión de descarga en la web oficial PgAdmin web oficial no funcionaba correctamente con la versión de base de datos PostgresSql que estamos usando. Así que necesitaba instalar una versión más nueva de la misma herramienta, pero por supuesto como me suele suceder en esta distribución Linux no encuentro un paquete armado que me solucione el problema :D



Así que tuve que recurrir a la ayuda de Slackbuilds.org :D en este post voy a explicar  los pasos para poder utilizar los muchos script de instalación que  gente a aportado a esa web, y nos salvan de tener que configurar por completo la compilación a nosotros y así no equivocarnos en la configuración para el compilador e instalar el programa que necesitemos.

Acá voy a dejar el paso a paso, para el PgAdmin, pero esto se debe repetir para el programa que necesitemos ;)

  1. Primero nos dirigimos a Slackbuilds.org
  2. En la barra de búsqueda escribimos el nombre del programa que deseamos instalar, y antes de iniciar la búsqueda en el botón de al lado especificamos para que versión de Slackware deseamos realizar la instalación.
  3. En este caso el resultado de la búsqueda fue PgAdmin en Slackbuilds.org
  4. De allí debemos descargar dos enlaces, el primero que contiene el código fuente y el segundo que contiene el script de instalación.

Esto lo podemos hacer desde la terminal copiando los enlaces de la web.
~$ wget http://ftp.postgresql.org/pub/pgadmin3/release/v1.12.3/src/pgadmin3-1.12.3.tar.gz
~$ wget http://slackbuilds.org/slackbuilds/14.0/system/pgadmin3.tar.gz

Ahora lo que debemos hacer, es descomprimir el archivo donde se encuentra el slackbuild, desde la terminal.
~$ tar xvf pgadmin3.tar.gz

Movemos el comprimido del código fuente dentro de la carpeta que se creo:
~$ mv pgadmin3-1.12.3.tar.gz pgadmin3

Y nos movemos dentro de la misma carpeta, nos logueamos como root, para compilar y ejecutar el archivo creado para la instalación.
~#./pgadmin2.SlackBuild

Normalmente si todo salio correctamente nos va a mostrar la ruta de donde creo el archivo (en la carpeta /tmp) y que necesitamos usar para instalar el programa, por ejemplo en mi caso fue algo así:
Slackware package /tmp/pgadmin3-1.12.3-x86_64-1_SBo.tgz created.

Una vez hecho eso procedemos a instalar el programa:
~#installpkg /tmp/pgadmin3-1.12.3-x86_64-1_SBo.tgz

Eso simplemente fue todo, puede suceder que mientras compila les diga que les falta instalar algo y no termine de armar el paquete. En ese caso con solo ver el error, en la misma web de slackbuild pueden ver la dependencias del programa que necesitan instalar, por ejemplo en mi caso fue wxPython :D
Espero que a alguno les sirva.

P.D: Puede suceder que no encuentren el script exacto para la instalación de alguna versión en particular del programa o de Slackware, yo les recomiendo buscar el que más se acerca a su búsqueda y modificarlo ;)

Saludos a todos, Gabriel

sábado, 19 de abril de 2014

Como instalo un paquete RPM en Arch y como armo mi propio paquete para Arch Linux?

El otro día me paso que quería hacer una video conferencia por Google Hangout y me encuentro con que para hacerlo necesitaba actualizar el plugin Google Talk  :P
Bueno pensé que no iba a tener problema ya que lo había instalado por yaourt (para el que no lo conoce, es otro repositorio de aplicaciones para Arch que es mantenido por la comunidad y donde tenes muchas otras aplicaciones ;)) Así que intente ver si tenía alguna actualización para instalarlo y me di cuenta que ya tenía la última versión del plugin que estaba en el repositorio.
Por este motivo me dirigí a descargar la última versión del plugin desde la web oficial, pero me encontré con que solo tenían las versiones de paquetes deb y rpm para 32 o 64 bits :P

Entonces me decidí a buscar como instalar alguno de estos paquetes, la verdad que no resulto complicado por lo menos en este caso, pero si un poco molesto :D

Estos son los pasos:

1- Con nuestro gestor de paquetes pacman instalamos el programa rpmextract, que lo podemos hacer con el siguiente comando:
sudo pacman -S rpmextract
2- Descargamos el paquete rpm para la arquitectura que le corresponda a tu SO, en mi caso la versión de 64 bits.
3- Creamos una carpeta y movemos el paquete que descargamos dentro de ella.
4- Corremos el programa rpmextract, de la siguiente forma dentro de la carpeta: rpmextract.sh google-talkplugin_current_x86_64.rpm
5- Como podrán ver nos deja los archivos en la misma estructura de directorios, una forma podría ser directamente copiar los archivos en el lugar que corresponda.

Con eso ya podría tener el plugin corriendo sin problemas, ahora tiene algunas desventajas instalarlo de esa forma. Al instalar las cosas así, no va a tener una desinstalación sencilla, ni va a verificar que no se remueva alguna dependencia. Es por eso que lo mejor sería crear nuestro paquete para Arch.
Para esto básicamente lo único que necesitaríamos hacer es crear un archivo PKGBUILD que contenga toda la información acerca del mismo.
Instrucciones para crear un paquete en Arch
Instrucciones sobre los PKGBUILD

Ejemplo con mi archivo PKGBUILD:

# Maintainer: Gabriel Pozo <jackgris2@gmail.com>
pkgname=google-talkplugin
pkgver=5.2.4.0
pkgrel=4
pkgdesc="Video chat browser plug-in for Google Talk"
arch=('i686' 'x86_64')
url="http://www.google.com/chat/video"
license=('custom:google')
depends=('gtk2>=2.12.0' 'alsa-lib' 'mesa' 'lsb-release')
optdepends=('libnotify' 'pulseaudio')
source=(license.html::http://www.google.com/intl/en/policies/terms/index.html)
sha1sums=('SKIP')

if [ "$CARCH" == x86_64 ]; then
    source+=(https://dl.google.com/linux/talkplugin/rpm/stable/x86_64/${pkgname}-${pkgver}-1.x86_64.rpm)
    sha1sums+=('0570cfc38717e2bdf7779b632813ee5081dd5945')
elif [ "$CARCH" == i686 ]; then
    source+=(https://dl.google.com/linux/talkplugin/rpm/stable/i386/${pkgname}-${pkgver}-1.i386.rpm)
    sha1sums+=('990d199365e8b87234bce54747c00c8311cdcf67')
fi

package() {
    cp -R ${srcdir}/opt ${pkgdir}
    install -d "${pkgdir}/usr/lib"
    cp -R ${srcdir}/usr/lib*/* ${pkgdir}/usr/lib
    # change /usr/lib/chromium-browser to /usr/lib/chromium
    cp -R ${pkgdir}/usr/lib/chromium-browser ${pkgdir}/usr/lib/chromium
    cp -R ${pkgdir}/usr/lib/chromium-browser ${pkgdir}/usr/lib/chromium-dev
    # cleaning up cron update script
    rm -rf ${pkgdir}/opt/google/talkplugin/cron
    # install license file
    install -Dm644 "${srcdir}/license.html" "${pkgdir}/usr/share/licenses/${pkgname}/license.html"
}

Como se puede ver no es muy complicado:
  1. Nombre del programa, en minúsculas y sin espacios.
  2. Versión, como se ve en la descarga, Google le coloca current.
  3. Una versión interna que debería ser un numero que se incremente en uno con el cambio de versión.
  4. Una descripción breve, menos de 80 caracteres.
  5. La arquitectura, por ejemplo en este caso 64 bits.
  6. La URL del sitio oficial del paquete, esto es opcional.
  7. La licencia, GPS, BSD, unknown.
  8. Cualquier dependencia separada por espacios, no por comas.
  9. Las dependencias necesarias para construir el paquete 
  10. Cualquier opción, por ejemplo si se necesita un directorio que luego quedará vacío, para eso la opción 'emptydirs'
  11. Una lista de los archivos fuente, si colocamos URL's  los va a descargar (como en este caso), pero también le podemos colocar archivos de forma local en la misma carpeta que el archivo PKGBUILD
  12. Una suma de chequeo sha1 de los archivos (o MD5), esto lo podemos hacer con el comando 'makepkg -g' si lo ejecutamos en la misma carpeta donde se encuentran los archivos. (nos va a devolver el archivo que configuremos en el pkgbuild)
  13. Y si se fijan al final lo único que hace es copiar y pegar los archivos que se extrajo del paquete a donde corresponde.

Una vez que creamos el archivo PKGBUILD, corremos el comando makepkg en esa misma carpeta, y veremos que nos crea un archivo con extensión .pkg.tar.xz para poder usar con nuestro amado Pacman ;)
Ahora simplemente lo podemos instalar con el comando:
sudo pacman -U nombrepaquete.pkg.tar.xz

Lo bueno de esto, es que te va a advertir sobre las dependencias del mismo, y lo vas a poder desinstalar con pacman -R ;)

Enlaces:
Install rpm packages on Arch Linux
Paquete oficial en AUR

Espero que les allá servidor, por lo menos a mi me ayudo bastante :D 
En los enlaces esta el verdadero archivo PKGBUILD de donde saque el que termine usando, en este caso fue mucho mas sencillo todavía ya que no necesitaba crear un PKGBUILD de cero, solo con cambiar el número pkgrel a uno superior, podemos hacer que descargue el nuevo paquete de Google eh instale el nuevo plugin :D (si hice un poco de trampa, pero no es complicado para nada armar nuestro propio paquetes para Arch)

Saludos a todos, Gabriel

martes, 15 de abril de 2014

Como saber si dos figuras son similares y para que me puede servir?

Bueno para responder la primer parte de la pregunta, les comento que voy a hablar sobre Hausdorff. Seguramente se preguntaran porque, o por lo menos yo no tenia ningún conocimiento de su existencia.



Como primer medida vamos a ver la definición, tomada de Wikipedia:

"""
En matemáticas, la distancia de Hausdorff, o métrica de Hausdorff, también llamada distancia de Pompeiu-Hausdorff, mide cuan lejos se encuentran dos sub-conjuntos de medidas en el espacio el uno del otro.

Convierte el conjunto de subconjuntos compactos no vacíos de un espacio métrico en un espacio métrico en si mismo. Este lleva el nombre de Felix Hausdorff.
Informalmente, dos conjuntos están cerca de la distancia de Hausdorff si cada punto de alguno de los conjuntos está cerca de algún punto de la otra serie de puntos. La distancia de Hausdorff es la distancia más larga a la que puede ser obligado a viajar por un adversario que elige un punto en uno de los dos conjuntos, de donde luego debe viajar al otro conjunto. En otras palabras, es la mayor de todas las distancias de un punto en un juego hasta el punto más cercano en el otro conjunto.

Parece ser que esta distancia se introdujo por primera vez por Hausdorff en su libro Grundzüge der Mengenlehre, publicado por primera vez en 1914.

En computación, la distancia de Hausdorff se puede utilizar para encontrar una plantilla dada en una imagen de destino arbitrario. La plantilla y la imagen a menudo son pre-procesadas a través de un detector de bordes dando una imagen binaria.
A continuación, cada punto en la imagen binaria de la plantilla es tratado como un punto en un conjunto, la "forma" de la plantilla. Del mismo modo, un área de la imagen de destino binario se trata como un conjunto de puntos.
Un algoritmo, trata de encontrar la distancia de Hausdorff entre la plantilla y una cierta área de la imagen de destino. El área en la imagen de destino con la mínima distancia de Hausdorff a la plantilla, puede ser considerado el mejor candidato para la localización de la plantilla en el objetivo.

En gráficos generados por computadora la distancia de Hausdorff se utiliza para medir la diferencia entre dos representaciones diferentes del mismo objeto 3D, especialmente cuando se genera el nivel de detalle para la visualización eficiente de complejos modelos en 3D.

"""

En resumen la distancia de Hausdorff es la distancia máxima de un conjunto hasta el punto más cercano en el otro conjunto.

En mi caso tenia que verificar que dos objetos que eran posicionados por GPS estén realizando el mismo recorrido, ustedes dirán porque no ver si las posiciones que nos envían son iguales. Ahora este es el problema y el motivo de porque termino en la investigación de este algoritmo:

- Los GPS no son absolutamente precisos.
- Los objetos a los que se realiza el seguimiento utilizan diferentes tipos de GPS, por lo tanto las posiciones enviadas por mas que estén utilizando los mismos satélites, pueden enviar diferentes posiciones.
- Las posiciones no son enviadas necesariamente al mismo tiempo.

Al tener estos problemas en mente, no me sirve la simple comparación por ejemplo, si la posición que me enviá el GPS 1, es la misma que la del GPS 2, ya que si una fue enviada con 1 minuto de diferencia de la otra, mas la impresicion que pueden llegar a tener, obviamente que me pueden dar resultados muy diferentes, a pesar de que probablemente estén en el mismo lugar. Lo ideal es tener dos conjuntos de ubicaciones y verificar si estos son relativamente similares, lo que indicaría que están realizando el mismo recorrido, por lo tanto "viajan juntos". De ahí vino que fue necesario utilizar este algoritmo, que debo aclarar, me lo recomendó un ex-compañero del trabajo, Valentin ;)

En este enlace podrán encontrar el código fuente de la función que termine utilizando: Gist
En el código verán que trabajo con valores x e y, esto se debe a que realizó un traspaso, de latitud y longitud a un par de ejes de coordenadas para manejar las ubicaciones ;)

Enlaces de interés:
Hausdorff distance wikipedia
Hausdorff distance between convex polygons
Measuring difference between two meshes





Espero que a alguno le haya resultado de utilidad este post, en realidad puede tener muchas mas utilidades, y es un tema realmente interesante. Otro ejemplo de uso, es el encontrar figuras en imágenes, por ejemplo países como EEUU toman imágenes aéreas y con algoritmo similares a estos en las imágenes buscan por ejemplo aviones de combate u otro tipo de armamento escondido en diferentes lugares. Lo único que se tiene que tener es dos figuras a comparar y un poco de imaginación para lo que se lo pueda utilizar ;)

Saludos a todos, Gabriel