Archivos de la categoría Python

pygifme un simple comando para generar gif animados

Generar GIFs fácilmente en Python
pygifme = generar GIFs fácilmente via Python

pygifme es un script en python que he portado como desarrollo en base al script original gifme escrito en ruby de Zach Holman (GitHub).

El script de ruby es bastante antiguo, pero al utilizarlo y ver su código para ver como funcionaba se me ocurrió portarlo a python como simple práctica y prueba al tratarse de algo sencillo y sin demasiadas dependencias.

La funcionalidad es exactamente la misma, añadiendo un par de pequeños cambios y realizando comprobaciones más exhaustivas internamente. Por respetar el nombre antiguo del script y que no fuera muy largo de escribir lo he llamado “pygifme”. Es bastante útil para generar un .gif desde varias imágenes y evitarse complicaciones con editores gráficos de imágenes.

Esta disponible desde pypi (Python Package Index) y desde mi repositorio de código github.

Agradecería las pruebas que se realicen con el script, propuestas de mejoras y reporte de sugerencias si lo deseas.

Instalación

Puede instalarse fácilmente desde pypi con:

$ pip3 install pygifme

También puede instalarse vía el archivo setup.py:

$ python3 setup.py install

También es necesario instalar ImageMagick.

En sistemas GNU/LINUX Debian:

$ sudo apt-get install imagemagick

En OS X, es fácil usando Homebrew:

$ brew install imagemagick

Este script es para Python >= 3.0. También necesita del módulo de python argcomplete si deseas que el autompletado en línea de comandos de pygifme

Puedes instalarlo con:

$ sudo pip3 install argcomplete

O via el archivo requirements.txt:

$ sudo pip3 install -r requirements.txt --use-mirrors

Uso

$ pygifme ~/Desktop/1.png ~/Desktop/2.png
 You now have a handsome animation at ~/Desktop/animated.gif

Por supuesto también puedes agrupar archivos con glob:

$ pygifme ~/Desktop/*.jpg
 You now have a handsome animation at ~/Desktop/animated.gif

CloudApp

Una vez que tu animación haya finalizado, se intentará subir a CloudApp. Si tienes el script de cloudapp instalado, se usara, de lo contrario se omitirá este paso.

Usos super avanzados

En algunos gifs, es bonito tener un bucle suave, para que cuando termine no haya un salto hasta el último fotograma al primero otro vez. Usa la opción ‘–reverse’ o ‘-r’ para crear una animación normal y posteriormente revertir los fotogramas y que estos sean añadidos a la animación, de esta forma parecerá una transición suave.

$ pygifme --reverse ARCHIVOS

Si pasas una URL de un gif (archivo remoto) en lugar de ARCHIVOS, el programa descargará el gif, lo dividirá en fotogramas y te permitirá recrearlo. Por ejemplo, puede tomar un gif online y darle la vuelta con ‘–reverse':

$ pygifme --reverse http://tumblr.com/some-crazy.gif

También puedes redimensionarlos. Por defecto el tamaño es de 500 píxeles, pero puede cambiarse a lo que necesites.

$ pygifme --width 1000 http://tumblr.com/some-crazy.gif

Para otras muchas más opciones, comprueba la ayuda con:

$ pygifme -h

Ejecutando los test unitarios

Es un simple script, pero puede tener comportamientos inesperados cuando se hacen cosas extrañas con el backend de ImageMagick. Si deseas asegurarte de un comportamiento común, entonces puedes ejecutar la batería de pruebas unitarias con:

$ python3 -m unittest test

O también desde el archivo setup.py (recomendado):

$ sudo python3 setup.py test
state_of_packaging

Distutils2 el posible futuro del empaquetado de aplicaciones en Python

Distutils (Python Distribution Utilities) es un módulo estándar de la biblioteca de python con el propósito de distribuir aplicaciones Python de forma sencilla. Es el módulo estándar para empaquetado de aplicaciones en Python.

Si has utilizado distutils en pequeños proyectos puede que haya sido suficiente para tus necesidades. Sin embargo, a medida que es necesario personalizar con más detalles la instalación o realizar funciones avanzadas, distutils resulta ser un módulo carente de algunas funcionalidades y con muchos pequeños detalles por mejorar. Es simple, pero limitado y no extensible de forma trivial.

En mi opinión, hay dos principales problemas en la forma en la que se distribuye aplicaciones y módulos python:

  • 1) Existen muchas formas de realizar la instalación de una distribución de paquetes Python y crea un estado de interoperabilidad difícil.
  • 2) No existe una API para conseguir información de las distribuciones de paquetes instaladas.

Alternativas

Están disponibles otras alternativas como Setuptools. Este proyecto nació para rellenar pequeñas funcionalidades olvidadas en distutils y explorar nuevas direcciones. Para algunas subcomunidades Setuptools es un estándar de facto. Pero actualmente su desarrollo no esta siendo mantenido (por inactividad en 2 años) y su uso esta en decadencia desde que no tiene soporte para python 3.x.

Posteriormente surgió Distribute. Es un fork como reemplazo de Setuptools iniciado por los mismos desarrolladores que sentían que el proyecto no avanzaba lo suficiente y pensaban que no era posible una evolución.

De este último grupo ha surgido una nueva biblioteca, llamada Distutils2. Iniciada desde la base de distutils y tomando las buenas ideas de Setuptools (discutidas fuertemente en PEPs como PEP 376, PEP 386), además de inspirarse en un instalador básico similar a pip.

Integración

Distutils2 tenia como principal objetivo la integración como módulo nativo en la rama de Python 3.3 bajo el módulo packaging. Debido a problemas en su desarrollo esta semi-paralizado hasta Python 3.4 a la espera de acuerdos entre desarrolladores y fijación de objetivos aunque este cuenta con una buena cobertura de test y estabilidad.

Novedades

Compatibilidad con otros sistemas

Estado actual del empaquetado de aplicaciones Python
Estado actual del empaquetado de aplicaciones Python

Los módulos de Distutils2 están capacitados para funcionar con PyPI y los metadatos asociados en proyectos instalados. El objetivo a largo plazo es la coexistencia de proyectos escritos para Pip o Distribute puesto que usan los mismos estándares. Por ejemplo, esta iniciándose una remodelización de pip, llamada pip2 que debería comtemplar la coexistencia con distutils2.

Nuevos comandos de instalación

Distutils2 habilita nuevos comandos de instalación como:

  • test : un comando para ejecutar las pruebas del proyecto (idea inspirada en Setuptools).
  • upload_docs: un comando para subir la documentación a packages.python.org
  • check: previamente añadido, pero ha sido mejorado para que se realicen comprobaciones antes de liberar o subir un paquete. Comprueba los metadatos, cumplimiento de reglas reST en la descripción.
  • uninstall: es una función muy básica añadida en el módulo distutils2.util que permite desinstalar de forma sencilla la aplicación. Esta ha sido una petición muy demandada para python 3.3. Además se incluye una API para eliminar todos los archivos que no cambiaron o directorios vacíos. Por ejemplo, para listar una lista de todos los archivos posibles para desinstalar:
from distutils2.util import uninstall
uninstall('setuptools')

Grafico de dependencias

El módulo constructor de grafos de dependencias de paquetes analiza las dependencias entre varias distribuciones de paquetes y permite a través de una API de código crear un grafo representando las relaciones entre ellos. Se sirve de graphviz para realizar los gráficos desde lenguage DOT. Por ejemplo, este sería el aspecto más básico y sin personalizar de un paquete de dependencias con el nombre “bacon”.

Gráfico de dependencias generado
Gráfico de dependencias generado

Archivo de configuración

Distutils2 toma como primera opción el archivo distutils2.cfg además del setup.cfg para permitir la compatibilidad con antiguos archivos de configuración. Es posible por tanto configurar la instalación sin necesidad de setup.py y sólo usar setup.cfg. Por defecto, los archivos como README o README.txt además del setup.py no serán más incluidos en la opción de distribución de fuentes.

Generación del archivo de configuración

Editar los archivos de configuración desde cero puede resultar muy tedioso, por ello se ha ideado un script interactivo (mkcfg) que permite generar el archivo setup.cfg preguntando los datos esenciales.

Para ejecutarlo:

$ python -m distutils2.mkcfg

Hooks

Distutils2 permite ser extensible a través de comandos que se ejecutan antes y después de una opción (hooks). Los hooks son simples funciones python (u objetos invocables) que están especificados en el archivo de configuración usando los nombres completos.

Los hooks se ejecutan después de que las opciones sean leídas y antes y después del comando a ejecutar.  Un ejemplo de hook necesitaría inicialmente que el hook estuviera presente en la ruta de ejecución, es decir, en el directorio del setup.py. Se crea un archivo en python para el hook, por ejemplo myhoook.py para el comando de instalación:

def my_install_support_hook(install_cmd):
    print "Genial, acabas de instalar mi proyecto! Ahora visita mi web blablable.com para soporte."

Posteriormente se edita el archivo setup.cfg bajo la sección de comandos apropiadas para la instalación:

[install]
pre-hook.myproject = myhooks.my_install_support_hook

Nuevas keywords

En la función setup donde recibe todas las palabras claves como autor, email, version, etc se han añadido nuevas que faciliten un mayor control.

Sistema de logging mejorado

La primera versión de disutils incluye un modulo de depuración para mensajes de error e información que no utilizaba el módulo logging estándar de Python, es decir siguiendo el estilo del PEP 282. La nueva versión de distutils2 usa de forma nativa el módulo logging.

Instalación

Si te ha parecido interesante el módulo de Distutils2, probablemente estés muy interesado en probarlo e instalarlo.

Para instalarlo puedes seguir la guía de instalación o el tutorial que se ofrece desde la documentación

Para python 2.7 puedes probar a instalarlo desde pip:

$ sudo pip install distutils2

Para Python 3, necesitas instalar (en Ubuntu) pip con compatibilidad para python3 con el paquete python3-pip:

$ sudo apt-get install python3-pip

Y después instalarlo vía:

$ sudo pip install http://hg.python.org/distutils2/archive/python3.tar.bz2

Si estas interesado en ver el código, puedes clonar el repositorio Mercurial con:

$ hg clone http://hg.python.org/distutils2

Como contribuir

Los autores de Distutils2 animan a contribuir y realizar sprints para finalizar características pendientes y corregir fallos.

Fuentes

Adif POI on a train station

FreeStation: a little sneak peek

Several months have passed since I wrote about Freestation. I would like show some advances and write about my dissertation project that I hope to finish for the 2th June as last day for deadline on this course.

An introduction reminder

FreeStation is a program built for help to distribute easy and reliable software and information on point of interest (POI).

Basically, a POI is huge device that you can find on universities, libraries, hospitals, police stations, train stations, etc.

For example, this are a couple of images of POIs:

DNI POI on police station
DNI POI on police station

This is POI on a police station for perform changes with a DNI (National Idenfication Document on Spain). It shows a keyboard, trackball and DNI card reader for easy operations with credential authentication using DNI.

It has normal power connection but it also has internet connection for load data. On the following image:

Front detail of DNI POI on a police station
Front detail of DNI POI on a police station

As you can apreciate, it shows with more details a screen showing input boxes for the user and a simple interface with buttons. The height POI is adjusted to people in wheelchairs (a laudable feature for accessibility).

Another example of POI:

Adif POI on a train station
Adif POI on a train station

This image corresponds to another POI on a Adif’s train station. It has a different design, totally vertical with a big screen rotated. Unfortunaly when I take the photo it was turned off, but I think that it is a tactil screen model with internet connection too.

It incorporates a audio system maybe useful for blind people and as possible confirmation for using audio notification. Sadly, it is enough high for wheelchairs people, so maybe the only functions could be a information panel with low interaction. I can’t ensure this, because I never can see running this POI when I travel.

Finally another radical example of POI (three different examples should be enough for ilustrate my point):

SESCAM POI on a hospital
SESCAM POI on a hospital

This is another interesting POI that has a intercommunication phone for direct assistance, keyboard, tracball mouse and sanitary card reader. It also has a tray as printer for deliver useful data to the user. Sadly, when I take the photo the POI also is turned off.

So, this is only a reduced set of examples of a huge variety of POIs. Usually you can find the same model for each same hospital, train station, police station, university, etc. Each model runs practically the same model of software and hardware features. But, when the time past, it is highly probably that some POIs have breakdows, energy loss, software bugs, unconsistence of versions, etc.

So, FreeStation try to repair and unify this problems for offer a kindly solution, because it is important deploy same versions between POIs, recieve notifications when a POI it is offline for a breakdown, auto-restart the POI if some hard bug happens, etc.

Architecture

The Freestation architecture is mainly based on client-server model. Each component is easy to tweak or customize and it doesn’t require technical knowledge for diary use.

Architecture - Server and clients infrastructure
Architecture - Server and clients infrastructure

Let me introduce you the architecture with real screenshots of the application and some diagrams.

Server architecture

FreeStation server runs over a software stack consisting of several technologies and components. It handles all the communication with every client.

It has a friendly webserver GUI panel administration based on PHP + Javascript.

FreeStation Server Webserver GUI
FreeStation Server Webserver GUI

As you can see, you can start/stop/restart the server, see real status and different useful output logs for analyce and diagnose whatever event.

It allows easily make the common tasks for deploy and configure a high amount of clients with POIs.

Under the webserver GUI, it runs a daemon process as backend based on python. Each action and task is handled internally and dispatched on fast way.

The backend can make asynchronous communication with clients. For that the backend uses ICE (Internet Comunication Engine of ZeroIce).

This allows a reliable and robust way to transfer huge information datasets between a big amount of clients and the server.

For example, you also can see a list of current clients handled by the server with stats:

FreeStation Server GUI - List of clients
FreeStation Server GUI - List of clients

The list shows each client hostname, IP address, last connection, requests, status and some actions for each client. You can add/remove/edit clients and all the data associated with a clients would be updated.

Client architecture

A client run only on a POI and periodically poll to the server for updates or information. Clients need a specification for deploy widgets and the data associated for each widget.

A widget on Freestation terminology is a abstract element that performs a atomic operation and provides communication for the data handled inside the widget.

For complex operations a widget could associate with more widgets for perform a sofisticated task or simply commnicate data with other widgets. The widgets only run on clients, but all them are configured only from a server.

This describe a orchestra model where the server acts like a manager and clients with widgets acts like a choir.

That means that a client only can communicate with the server and it is not allowed the communication between clients. But this can be easily a SPOF (Single Point Of Failure) for server. So, it is planned on a future allow several masters servers as failover and syncronize and replicate data between masters.

In other hand, an a server, you have a list of widgets available to configure on a client.

FreeStation Server GUI - List of total widgets
FreeStation Server GUI - List of total widgets

For example, you can choose deploy and configure a USB Storage widget and a Mount Device widget on a client. That widgets could associate operations for list several files of books about medicine. When the user pick a set and choose save to a usb key, the Mount Device detect the usb key and usb storage widget write the data. The result it is a happy user that obtain the needed information quickly and without problems.

FreeStation Server - Associate widget to client
FreeStation Server - Associate widget to client

 

You can associate the needed widgets for a client and configure/edit each widget with custom params (for example, only allow 5 items for save on Mount Device):

FreeStation Server - Configure Widget for a client
FreeStation Server - Configure Widget for a client

Another example, you can choose a Video widget and display a video on POI for idle mode. When the user touch or interact with the POI, you can load a Browser Widget with a concrete webpage. Additionally as some institution you can choose a simple logo widget for display your institution logo on screen.

When a client is totally configured, then can be deployed on POI (normal desktop computer customized). A simple example of client screen deployed:

 

FreeStation Client - Welcome wigdets configured
FreeStation Client - Welcome wigdets configured

There are not limit defining or using new widgets. So in theory, the widget model scale for each custom need for a institution.

Free & easy to scale to your needs

With FreeStation some basic widgets are offered, but on the future, it could has repository widgets associated, widget patners and offer a rich market for developers that they are interested on develop custom widgets for companies, institutions, hospitals.

Soon, I plan to release the code as AGPLv3 on Github. Still I need polish some widgets, finish a real demo case for my dissertation and literally write a boring book with approximattelly 200 pages (currently, I have around 80 bad structure pages written).

So, the project is nearly to finish and with lucky I can finish before to 2th june deadline (and 15 th june official presentation) and finally has a big engineer diploma on my wall, yay!

Meanwhile, there are nearly two months of hard work, But shhh … I found a secret weapon ;)

 

Secret hard work weapon
Secret hard work weapon