viernes, 18 de noviembre de 2016

Eliminar ramas antiguas de repositorio GIT local

Al trabajar durante un tiempo con GIT utilizando un modelo de ramificación que implique la creación de varias ramas, como por ejemplo GitFlow, las ramas antiguas se van acumulando en nuestro repositorio local, aunque ya hayan sido eliminadas del repositorio remoto, debido a que las herramientas de GIT no hacen este proceso de forma automática, y no existe un comando de GIT que lo haga por nosotros.

Sin embargo, con ayuda de algunos útiles comandos, es posible crear una instrucción que nos permita eliminar las ramas locales que hacen referencia a ramas remotas que ya han sido eliminadas:

git fetch -p && git branch -d `git branch -vv | grep ': gone]' | awk '{print $1}' | xargs`

A continuación se explica paso a paso lo que hace este conjunto de comandos:

PasoComandoDescripción
1 git fetch -p Obtiene los cambios más recientes desde el repositorio remoto, y elimina ("corta") las referencias a las ramas remotas que ya no existen.
2 git branch -vv Lista las ramas de forma detallada, lo cual incluye información el vínculo entre las ramas locales y las referencias a las ramas remotas, así como el estado de las ramas remotas.
3 grep ': gone]' Del listado anterior de ramas, filtra aquellas que contengan el texto ': gone]', es decir, aquellas ramas cuyas ramas remotas vinculadas ya fueron eliminadas. Estas ramas eliminadas poseen el estado gone.
4 awk '{print $1} De la lista filtrada, obtiene la primera columna, la cual contiene el nombre de la rama local.
5 xargs Convierte las filas de nombres de ramas en una cadena de una sola línea, separando el contenido de cada fila mediante un espacio en blanco.
6 git branch -d Elimina las ramas listadas en el paso anterior. Al utilizar la d minuscula, se indica que no se forzará la eliminación de ramas, lo que previene que se eliminen ramas locales que no hayan sido combinadas (merged) a otras ramas.

Esta serie de comandos trabaja solamente con el repositorio local, por lo que no hay peligro de afectar el repositorio remoto. Sin embargo, se recomienda asegurarse de haber subido (push) los cambios de todas las ramas, para prevenir la eliminación de ramas locales que aún tengan cambios no incluidos en el repositorio remoto.

martes, 11 de octubre de 2016

Fondo de escritorio rotativo en Elementary OS

Saludos. Despues de un par de semanas de esfuerzo, finalmente pude instala la ultima version de Elementary OS, Loki (v0.4), en mi laptop. Y para embellecer un poco mi entorno, decidi buscar alguna aplicacion con la que pudiera cambiar la imagen de fondo de mi escritorio de forma periodica y aleatoria (wallpaper slideshow). Despues de una rapida busqueda en Google, me tope con Variety.


Características

Variety ha sido creado por Peter Levi, y es un cambiador de fondos de pantalla de código abierto, como se describe en su página. Sin embargo, esta definición se queda corta, ya que incluye una gran cantidad de funcionalidades:
  • Descarga periódica y automática de imágenes desde sitios de internet como Flickr, Wallhaven, entre otros. Esto realmente te quitará el aburrimiento, ya que tendrás nuevas imágenes cada vez que veas tu escritorio. Además tú puedes configurar cuánto espacio de disco dedicar a las imágenes descargadas, y cada cuánto tiempo descargarlas.
  • Puedes escoger los directorios locales o sitios web desde los cuáles Variety toma las imágenes.
  • Puedes habilitar el selector de fondos de pantalla (wallpaper selector), que te muestra en la parte de abajo de la pantalla las las imágenes que tienes disponibles, y te permite escoger la que más te guste para mostrarla en tu escritorio.
  • Puedes indicar las imágenes que más te gustan, y guardarlas en una carpeta especial. Si te suscribes a VRTY.ORG, puedes compartir tus imágenes con otros usuarios de Variety, y además copiar tus imágenes favoritas en todas tus computadoras. Cabe advertir que el sitio web VRTY.ORG puede contener imágenes obscenas o para mayores de edad.
  • Teniendo en cuenta la advertencia previa, es importante mencionar que a última versión de Variety hasta este momento (0.6.2) incluye un "modo seguro", que sirve para evitar imágenes no aptas para menores de edad. Este modo seguro se basa en los ratings de Wallhaven, así como en las clasificaciones provistas por la comunidad de Variety. Esto no significa que Variety pondrá cualquier cosa en tu escritorio, ya que por defecto solamente tiene habilitadas las fuentes de imágenes más seguras.
  • No podía faltar además un conveniente reloj digital, que puedes personalizar y mostrar en tu escritorio con la fuente y tamaño que tú elijas.

Instalación

Variety se encuentra disponible ya en los repositorios oficiales de Ubuntu Xenial (16.04), que es el sistema operativo en el que se basa Elementary OS Loki, por lo que para instalarlo solo basta ejecutar el siguiente comando:

sudo apt-get install variety

Sin embargo esta es la versión 0.6.0 de Variety, y la versión más reciente disponible hasta el momento de esta entrada es la 0.6.2, por lo que si quieres instalar la versión más reciente, debes añadir el repositorio oficial de variety, e instalar los paquetes variety y variety-slideshow, así:

sudo add-apt-repository ppa:peterlevi/ppa
sudo apt-get update
sudo apt-get install variety variety-slideshow

Variety también puede ser instalado en otros sistemas operativos. Las instrucciones más detalladas las puedes encontrar aquí.

Contribuye

Y si te ha gustado mucho esta aplicación, puedes contribuir a su creador a través de una donación, a la comunidad compartiendo imágenes en VRTY.ORG, o contribuyendo directamente al desarrollo del software de las distintas formas que se listan aquí. El código fuente, así como reportes de bugs, los puedes encontrar en Launchpad.

lunes, 20 de junio de 2016

Instalar Lightbend Activator en Windows

Estaba intentando preparar las herramientas para probar hacer una aplicación usando Scala y Play Framework en mi computadora, solo que en esta ocasión en Windows 10. Sin embargo, intentando "instalar" el Lightbend Activator, me topé con algunos problemas inesperados particulares para Windows, y que tristemente parecen existir desde hace ya algunos años. A continuación comparto los pasos que pude seguir para preparar el Activator en Windows, en caso de quee alguien más tenga problemas, y también para recordarle al yo del futuro como hacer esto, en caso de que tenga que hacerlo en otra máquina.
 

1. Descargar e instalar el Java JDK 1.8

Para poder usar el Lightbend Activator necesitamos instalar el Java JDK 1.8 (al fin y al cabo Scala compila a bytecode de Java, y corre sobre la JVM). Podemos descargar el instalador de la última actualización de la versión 1.8 para Windows desde la página de Oracle, para la arquitectura de nuestra computadora (i586 - 32 bits - o x64 - 64 bits).

Una vez descargado el instalador, procedemos a ejecutarlo, para realizar la instalación, siguiendo los pasos indicados (a.k.a. presionar Next hasta finalizar).
 

2. Crear la variable de entorno JAVA_HOME

Es necesario crear la variable de entorno de Windows llamada JAVA_HOME, para que haga referencia al directorio donde se instaló el JDK. El script del Lightbend Activator hará uso de esta variable para encontrar el JDK, que necesita para ejecutarse. Acá hay un tutorial que muestra cómo hacer este paso.
 

3. Descargar el Lightbend (Typesafe) Activator

Para descargar el Lightbend (antes Typesafe) activator, hay que visitar el sitio web de Lightbend. En la parte de abajo hay un listado de enlaces, entre los cuales está uno que dice Download Activator (créanme que me costó encontrar el enlace).

Luego, en la página de descarga, basta con presionar el botón Download, que descargará la versión completa (entre 600 y 700 Mb) y más reciente disponible (v1.3.10 al momento de escribir esta entrada). Lo que se descarga es un archivo ZIP, por lo que podemos guardarlo en cualquier parte.


 4. Descomprimir el Lightbend Activator

Una vez descargado el Activator, es necesario descomprimirlo. Si solo lo vas a utilizar con tu usuario, puedes descomprimirlo en cualquier carpeta dentro de tu directorio de usuario. Si quieres que otros usuarios pueda utilizarlo, te recomendaría hacerlo en una ruta más pública, como por ejemplo C:\Development\Lightbend o algo así. Un punto importante es que la ruta donde coloquemos el Activator no debe tener espacios.

5. Agregar la ruta de los binarios del Activator a la variable PATH

Para poder utilizar el Activator desde la línea de comandos, sin necesidad de conocer el directorio de instalación de este, es necesario agregar la ruta de la carpeta de binarios (carpeta bin dentro del directorio del activator - por ejemplo activator-dist-1.3.10\bin) a la variable de entorno PATH. Nuevamente, si solo vamos a utilizar la aplicación con nuestro usuario, modificaremos la variable propia de nuestro usuario; y si la van a utilizar todos los usuarios, agregamos la ruta a la variable PATH de sistema. Este y este otro son algunos tutoriales que muestran como agregar valores a la variable PATH de Windows.

6. Corregir el archivo de activator.bat

Sí, triste pero cierto, hay que corregir un archivo. El archivo activator.bat se ubica en la carpeta de binarios (bin). Hay que abrir el archivo con cualquier editor de texto, buscar la línea que dice:

set SBT_HOME=%BIN_DIRECTORY


set SBT_HOME=%BIN_DIRECTORY%

Luego guardamos el archivo y continuamos con nuestra vida. O podríamos modificarlo para que se pueda colocar el Activator en rutas con espacios (recordar el punto No. 4... pero tal vez en otra ocasión).

7. Agregar el archivo sbtconfig.txt

¡No tan rápido! Si intentamos ejecutar el Activator desde la línea de comandos, nos mostrará el siguiente mensaje:

The system cannot find the file C:\ruta\al\lightbend\activator-dist-1.3.10\bin\..\conf\sbtconfig.txt.

Para corregir esto debemos agregar el archivo en la ruta especificada. El archivo lo podemos descargar desde el repositorio del SBT Launcher en GitHub, y lo guardamos en la ruta activator-dist-1.3.10\conf\

8. Ejecutar el Activator

¡Finalmente! Abrimos la línea de comandos, y ejecutamos el siguiente comando (valga la redundancia):

activator ui 

Esto abrirá una ventana en el navegador que tengamos por defecto, en donde se mostrará la interfaz de usuario del Activator, con los listados de tutoriales y proyectos base para poder empezar a trabajar con las herramientas de la plataforma reactiva de Lightbend (las que sean gratis, al menos).



lunes, 30 de mayo de 2016

Lecturas interesantes 1


Hola, en esta ocasión solo quería compartirles un par de lecturas interesantes que he encontrado de casualidad en el último año.

1. Desenredando la historia de Ada Lovelace (Untangling the Tale of Ada Lovelace)


Ada Lovelace

Augusta Ada King, Condesa de Lovelace, es considerada como la primera programadora de computadoras. Sin embargo, debido a que vivió durante la época Victoriana, su vida muchas veces se ha visto rodeada de muchos desacuerdos por parte de los historiadores.

En este artículo re-publicado en Medium por Backchannel, Stephen Wolfram (desarrollador del motor de conocimiento computacional Wolfram Alpha), describe su profunda y apasionada investigación de la vida y obra de Ada Lovelace. Parte desde su niñez, el desarrollo de su interés en las matemáticas en su juventud tras conocer el motor diferencial de Charles Babbage, su relación con la comunidad científica de esta época de desarrollo tecnológico (dominada por hombres), hasta su trágica muerte a una edad temprana. También desmiente los mitos que rodean su relación con el mismo Charles Babbage, con quien mantuvo una relación de amistad y casi de negocios alrededor de su motor diferencial. Tras un estudio profundizado de notas de esta máquina de cálculos y su sucesor, el motor analítico (el cual según parece quedó a nivel de concepto), fue capaz de desarrollar algoritmos, y se cree que fue la primera persona en vislumbrar el concepto de computación universal (conocido en la actualidad a través del concepto de la Máquina Universal de Turing). El artículo incluso muestra el desarrollo paso a paso de uno de sus algoritmos para el cálculo de los números de Bernoulli para el motor analítico de Babbage.

Si no hubiera muerto a una edad tan joven (tan sólo 36 años), quién sabe cuanto más hubiera avanzado la informática hasta la actualidad. Incluso se sabe que el mismo Alan Turing estudió sus notas para desarrollar su famosa prueba de Inteligencia Artificial de 1950 (conocida como Prueba de Turing).

Una lectura fascinante de la historia de la computación, y la vida de una mujer valiente e innovadora.

2. Planeadores de Schweizer (Sailplanes by Schweizer)

Schweizer2-32-02.JPG
Dos planeadores Schweizer 2-32 en Oahu, Hawaii. 1995. Imagen lanzada al dominio público por su autor a en English Wikipedia.

Este libro, que casualmente encontré en Scribd buscando el tema de planeadores (aviones sin motor), narra la historia de la compañía aeronáutica estadounidense Schweizer, a través de sus modelos de aviones, desde sus humildes inicios con los tres hermanos Schweizer en el cobertizo de la casa de la familia a principios del siglo 20, su época de crecimiento durante la segunda guerra mundial, una época díficil durante la posguerra, un crecimiento dorado de la aviación sin motor durante los años 60, hasta el inicio de su ocaso en la última parte del siglo 20.

Esta compañía la recuerdo por el planeador Schweizer SGS 2-32, que salía en el "trailer" (si se le puede llamar así) del Microsoft Flight Simulator 5.1 para Windows 95. Buscando en internet, tristemente me di cuenta que la compañía ya no fabrica planeadores, sino que fue adquirida en el 2004 por Sikorsky Aircraft Corporation, y cerrada en el 2012.

A pesar de ello, sus aeroplanos fueron tan bien diseñados y construidos, que aún hay muchos modelos que datan hasta de los años 40 y que todavía se encuentran en uso, como este modelo 2-12 (TG-3A):




domingo, 20 de marzo de 2016

ASP.NET Web API, paso a paso - 1 - ¿Qué es Web API?

¡Saludos! Con esta primera entrada, espero empezar una serie de mini tutoriales, para elaborar una aplicación web basada en un servicio REST elaborado con ASP.NET Web API. Y el primer paso es responder a la pregunta:

¿Qué es Web API?

 ASP.NET Web API es un framework para construir APIs (Application Programming Interfaces), construida sobre el .NET Framework. Es una especie de librería más liviana y simple que WCF (Windows Communication Foundation) orientada completamente al protocolo HTTP, que permite construir servicios web sin estar sujetos a un estilo o arquitectura definido (por ejemplo REST o RPC).

ASP.NET Web API es de código libre, y está disponible al público en general en un repositorio GIT en Codeplex, para ser consultado y también para realizar contribuciones. Esta publicado bajo la Apache License, Version 2.0.

Web API es considerada como el futuro de ASP.NET, pues refuerza el uso de estándares HTTP, y unifica las características esenciales para el desarrollo de servicios web que el MVC Framework y WCF proveen, de una forma más compleja.

¿Cuáles son las ventajas de Web API?

 ASP.NET Web API presenta las siguientes ventajas para el desarrollo de APIs sobre HTTP:
  • Se acopla a los estándares HTTP, siendo la mejor implementación por parte de Microsoft de las especificaciones del protocolo HTTP (RFC 2616).
  • Modelo de programación HTTP moderno, pues permite el acceso directo a las solicitudes y respuestas HTTP, a través de tipos de objetos especializados.
  • Soporte completo de rutas, lo que permite especificar las acciones a ejecutar, así como parámetros y restricciones, sin necesidad de modulos adicionales de sobreescritura de URL.
  • Soporta negociación de contenido y media types, para que el cliente y el servidor puedan establecer el formato de los datos que la API recibirá y enviará en respuesta. Por defecto, Web API provee soporte para JSON, XML y formularios codificados como URL (URL-encoded form data), pero permite agregar tipos de datos personalizados, a traves de media formatters.
  • Conversión automática de datos a objetos, ya que los datos recibidos en las solicitudes HTTP son transformados a objetos .NET, y viceversa, para ser manipulados en las acciones de la API.
  • Filtros que sirven para añadir una capa extra de funcionalidades a las acciones, y son manejados como atributos, para facilitar su integración en las clases y métodos.
  • Mejora el desarrollo de pruebas unitarias, ya que muchas partes del framework pueden ser personalizadas y simuladas, al basarse en interfaces y clases genéricas que pueden ser extendidas.
  • Inversión de control y resolución de dependencias integrada y extensible, a través del patrón de localización de servicios, implementado mediante el "resolvedor de dependencias" del MVC Framework.
  • Composición de consultas, basada en las convenciones de URL de OData, con solo implementarla interfaz IQueryable<T>.
  • Configuración a través de código, para evitar sobrecargar los archivos de configuración XML.
  • Asíncrono de pies a cabeza, para permitir recibir más solicitudes HTTP, mientras se espera que otras terminen de ser procesadas.
  • Puede ser auto-hospedado (self-hosted), por lo que no está atado al uso del servidor web IIS.
  •  
     

¿Cómo funciona Web API?

Web API se basa en un modelo de "muñeca rusa" para el procesamiento de los mensajes HTTP, que además permite añadir bloques de funcionalidad en cada uno de los distintos niveles de procesamiento.
Russian-Matroshka.jpg
Muñecas rusas "Matroshka" (Wikipedia CC BY-SA 3.0)

En este enlace puedes encontrar un diagrama bastante completo del ciclo de vida de los mensajes en ASP.NET Web API 2.

Próximos pasos

En la próxima entrada de esta serie, se desarrollará una API REST muy básica desde cero, en donde se mostrarán las funcionalidades principales del framework ASP.NET Web API.

viernes, 5 de febrero de 2016

Instalar Oracle Java 8 (JDK) en Ubuntu y derivados, desde repositorio PPA


Para instalar el Oracle JDK de Java 8 en Ubuntu y distros derivadas, esta disponible el repositorio WebUpd8 Oracle Java PPA. Para agregar este repositorio, ejecutamos los siguientes comandos en la consola de linux:

$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update

Luego, para instalar el JDK de Java 8, ejecutamos el siguiente comando:

$ sudo apt-get install oracle-java8-installer

Finalmente, para verificar la version instalada de Java, podemos ejecutar los siguientes comandos:

$ java -version
$ javac -version

El primer comando es para consultar la version del JRE, y el segundo es para consultar la version del compilador de JAVA. En ambos casos puede observarse que el numero de version es 1.8.0.


De acuerdo al articulo original publicado en el sitio web de WebUpd8, el repositorio PPA es soportado por Ubuntu 15.04, 14.10, 14.04 y 12.04, o superiores, asi como Linux Mint 17.1, 17 y 13, o superiores. Tambien es soportado por otras distros derivadas de estas versiones (en mi caso, por ejemplo, Elementary OS Freya).

domingo, 17 de enero de 2016

Configurar trabajo para ejecutar tareas programadas de Magento 1.9 en Ubuntu


Para que se puedan ejecutar todas las tareas programadas de Magento 1.9.1 Community Edition (entre ellas el envío de correos usando la cola), es necesario programar la ejecución del script Cron.php, ubicado en el directorio de instalación de Magento. Pero antes de programarlo, y para tratar de asegurar y verificar su correcta ejecución, es recomendable hacer los siguientes preparativos:

1. Instalar la extensión AOE Scheduler a través de Magento Connect. Esta extensión nos permitirá programar las tareas dentro de Magento, y observar su historial de ejecución. Aunque en la página web de la extensión dice que es compatible hasta la versión 1.7 de Magento Community Edition, funciona correctamente en Magento 1.9.1.

2. Luego, en el sitio web de administración (backend) de Magento, ingresamos a la opción del menú System > Scheduler > Timeline View.



En esta página podemos observar una línea de tiempo de las tareas programadas de Magento, en un formato de línea de tiempo. Es posible que esté vacía, si no hay ninguna tarea programada por el momento. Para generar un nuevo conjunto de tareas programadas a ejecutar, presionamos el botón Generate Schedule.




3. Después probamos la ejecución del script por sí solo. Para ello, podemos ejecutar el script cron.sh en la terminal de la máquina virtual. Considerando una instalación por defecto de una máquina virtual de Bitnami, este archivo se ubica en /opt/bitnami/apps/magento/htdocs, y podemos ejecutarlo con el usuario bitnami.

$ cd /opt/bitnami/apps/magento/htdocs
$ sh cron.sh

Luego, en el sitio web de administración de Magento, ingresamos nuevamente a la opción Timeline View. Si el script se ejecutó correctamente, se observará que algunas de las tareas programadas aparecen en verde, indicando que fueron ejecutadas correctamente. Nótese que la línea roja indica la hora en la que se cargó la página, por lo que cabe mencionar que si todas las marcas de tareas están después de la línea roja, estas no se habrán ejecutado, y habrá que esperar a que la línea roja alcance alguna de ellas, antes de ejecutar el script cron.sh.


Si no hay ninguna tarea en verde, es posible que el script no se haya podido ejecutar correctamente. En ese caso podemos probar ejecutar directamente el script de PHP, así:

$ php –f cron.php

Si a pesar de ello no se ejecutan las tareas programadas, habrá que revisar si el script no devolvió ningún error durante la ejecución, y si el usuario con el que lo estamos ejecutando es el propietario del archivo. En mi caso, por defecto el propietario del archivo es bitnami, y los permisos del archivo son -rw-r--r--.

4. Como paso intermedio, averiguamos donde se ubica el ejecutable de php que se usa por defecto. Para ello en la terminal ejecutamos el comando:

$ which php

Por defecto en la máquina virtual de Bitnami el ejecutable se ubica en /opt/bitnami/php/bin/php

5. Suponiendo que el script se ejecutó correctamente, procedemos a programar la ejecución del script usando crontab. Para ello, en la terminal de la máquina virtual ejecutamos el comando:

$ crontab –e

Esto nos abrirá (en algún editor de texto) el archivo de tareas programadas de Linux para el usuario actual. En este debemos ingresar la siguiente línea:

*/5 * * * * /opt/bitnami/php/bin/php –f /opt/bitnami/apps/magento/htdocs/cron.php

Con ello se estaría programando la ejecución del script cron.php cada 5 minutos, que es lo que recomiendan usualmente para esta tarea de Magento. Recomiendo dejar una línea en blanco al final del archivo, por si acaso.

En teoría debería ser posible ejecutar el archivo de bash cron.sh en lugar de cron.php, utilizando el ejecutable /bin/sh, así:

*/5 * * * * /bin/sh /opt/bitnami/apps/magento/htdocs/cron.sh

Pero en mi caso generaba un error de Permission Denied, al intentar ejecutar la tarea.

6. Luego, esperamos alrededor de 5 minutos (en realidad la tarea no se ejecuta cada 5 minutos desde que la creamos, sino en los minutos múltiplos de 5, como 4:00 PM, 4:05 PM, 4:10 PM, y así sucesivamente). Finalmente revisamos la ejecución de las tareas, nuevamente revisando la página System > Scheduler > Timeline View desde el sitio web de administrador de Magento. Si la tarea programada se ejecutó correctamente, deberíamos observar más barritas en verde a la derecha de las que se ejecutaron cuando el script se corrió manualmente, según el tiempo establecido.


Si la tarea programada no se está ejecutando, podemos hacer algunos ajustes al comando de crontab, para que nos imprima las salidas estándar y error de la ejecución de la tarea, a archivos de texto, así:

*/5 * * * * /opt/bitnami/php/bin/php –f /opt/bitnami/apps/magento/htdocs/cron.php 1>/tmp/magecronstd.txt 2>/tmp/magecronerr.txt

En este caso, cada vez que se intente ejecutar la tarea, se crearán o sobreescribirán los archivos magecronstd.txt y magecronerr.txt. El segundo es de particular interés, ya que es el que almacena los errores al intentar ejecutar la tarea.
Con la tecnología de Blogger.