Entries for Linux

Testear WebServices Restful con curl

written by uve

29 October 2012

Para un proyecto que estoy desarrollando ahora mismo, he necesitado montar unos WebServices con Rest, usando JSON. La forma más rápida de testearlo es utilizando curl. Para ello podemos utilizar el siguiente comando para simular una petición GET. Esto nos mostrará algo parecido a lo siguiente:

$ curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X GET  http://localhost:8888
* About to connect() to localhost port 8888 (#0)
*   Trying 127.0.0.1... connected
> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8888
> Content-Type: application/json
> Accept: application/json
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Mon, 29 Oct 2012 21:48:49 GMT
< Server: WSGIServer/0.2 Python/3.2.3
< Content-Type: application/json; charset=utf-8
< Content-Length: 159
<
* Closing connection #0
{"respuesta": "en json"}

Ahora vamos a suponer un WebService que cree un usuario. Para ello, recibe 'username', 'password' y 'email'. Para la creación se va a utilizar el método POST. Y esto debe mostrarnos algo similar:

$ curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X POST -d '{"username":"myuser", "password":"mypwd", "email":"myemail@mytest.com"}' http://localhost:8888
* About to connect() to localhost port 8888 (#0)
*   Trying 127.0.0.1... connected
> POST / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8888
> Content-Type: application/json
> Accept: application/json
> Content-Length: 69
>
* upload completely sent off: 69out of 69 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Mon, 29 Oct 2012 21:52:47 GMT
< Server: WSGIServer/0.2 Python/3.2.3
< Content-Type: application/json; charset=utf-8
< Content-Length: 43
<
* Closing connection #0
{"respuesta": "en json"}

Además, podemos aprovechar para testear métodos HTTP que no estén implementados. Supongamos que PUT no está implementado, entonces el resultado deberá ser 'Method not allowed':

$ curl -v -H "Content-Type: application/json" -H "Accept: application/json" -X PUT -d '{"...":"..."}' http://localhost:8888
* About to connect() to localhost port 8888 (#0)
*   Trying 127.0.0.1... connected
> PUT / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8888
> Content-Type: application/json
> Accept: application/json
> Content-Length: 69
>
* upload completely sent off: 69out of 69 bytes
* HTTP 1.0, assume close after body
< HTTP/1.0 405 METHOD NOT ALLOWED
< Date: Mon, 29 Oct 2012 21:55:36 GMT
< Server: WSGIServer/0.2 Python/3.2.3
< Content-Type: text/html; charset=utf-8
< Allow: GET, POST
< Content-Length: 0
<
* Closing connection #0

Por otro lado, también podemos probar que no se soporta una respuesta en algo que no sea json, por ejemplo text/html. Y como resultado obtendremos un 'Unsoported media type':

$ curl -v -H "Content-Type: application/json" -H "Accept: text/html" -X GET  http://localhost:8888
* About to connect() to localhost port 8888 (#0)
* Trying 127.0.0.1... connected
> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:8888
> Content-Type: application/json
> Accept: text/html
>
* HTTP 1.0, assume close after body
< HTTP/1.0 415 UNSUPPORTED MEDIA TYPE
< Date: Mon, 29 Oct 2012 22:00:34 GMT
< Server: WSGIServer/0.2 Python/3.2.3
< Content-Type: text/html; charset=utf-8
< Content-Length: 0
<
* Closing connection #0

 

Full entry >>

Exportar el código fuente de Eclipse a PDF

written by uve

17 October 2012

Hoy me ha llamado un cliente que quiere exportar todo el código fuente de una aplicación Android, desarrollada con Eclipse, a un fichero PDF.

La primera opción que puede venir a la cabeza es imprimir cada uno de los archivos fuente y después concatenarlos todos, pero comprenderéis el proceso es demasiado repetitivo.

Así que me he puesto manos a la obra y de forma breve podemos hacer todo el proceso. Lo primero que necesitamos es instalar la utilidad enscript:

$ sudo apt-get install enscript

Una vez tenemos el comando listo, vamos a exportar todos los ficheros .java:

$ cd /directorio/del/proyecto/eclipse/
$ enscript -r -2 --file-align=2 --highlight --line-numbers -o - `find . -name '*.java'` | ps2pdf - files.java.pdf

Además, para proyectos Android es importante exportar las interfaces y los permisos (el manifiesto):

$ enscript -r -2 --file-align=2 --highlight --line-numbers -o - `find . -name '*.xml'` | ps2pdf - files.xml.pdf

De este modo tenemos dos ficheros con los fuentes java, files.java.pdf, y otro con los archivos xml, files.xml.java. Podemos unirlos de la siguiente forma:

$ gs -q -dNOPAUSE -sDEVICE=pdfwrite  -dBATCH -sOutputFile=files.pdf files.java.pdf files.xml.pdf

Full entry >>

¿Cómo utilizar TCP_NODELAY?

written by uve

2 April 2012

Llevaba cerca de dos días con un problema implementando el subscriptor MQTT. Aún no está hecho el diagrama de flujo ya que de momento estoy probando que las llamadas de la biblioteca funcionan. El escenario es el siguiente:

  1. mqtt_connect
  2. mqtt_subscribe
  3. mqtt_unsubscribe
  4. mqtt_disconnect

Conectamos el cliente, nos subscribimos a un topic, nos desubscribimos y desconectamos el cliente. Algo que a priori es sencillamente elemental.

Para comprobar que todo esto funciona he hecho uso del script para Wireshark que ya comenté. Pero el caso es que estaba encontrando errores en Wireshark que no eran lógicos. Yo mandaba un paquete de 17bytes y Wireshark decía que el paquete tenía 19bytes. ¿Qué estaba pasando aquí?

Full entry >>

Synaptic: No se pudieron analizar o abrir las listas de paquetes o el archivo de estado

written by uve

1 April 2012

Al abrir Synaptic me he encontrado con el siguiete error:

E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise-security_main_binary-i386_Packages
E: No se pudieron analizar o abrir las listas de paquetes o el archivo de estado.
E: _cache->open() failed, please report.

La solución:

$ sudo rm /var/lib/apt/lists/archive.ubuntu.com_ubuntu_dists_precise-security_main_binary-i386_Packages

Full entry >>

Preparar un Alix para exposiciones: Gráficos y gestión de energía (Parte 3)

written by uve

26 March 2012

Una vez que tenemos listo todo el tema de gráficos . y automatizado el proceso de arranque, toca empezar con detalles estéticos. Para ello, debemos evitar situaciones cómo un salvapantallas o que el monitor se apague.

Recordad que estamos en un entorno en el que no tenemos teclado ni ratón, por lo que en seguida, el sistema operativo pensará que no hay actividad en el equipo.

Full entry >>

Bindings Python para bibliotecas C: Módulos y compilación (Parte 2)

written by uve

26 March 2012

La semana pasada empecé ha hablar sobre los Bindings en Python. Hoy vamos a ver cómo es una estructura muy básica, cómo compilar y probar que todo funciona.

Un problema que me estoy encontrando, es que el API C de Python ha ido cambiando con las versiones. Entonces, muchos ejemplos que he encontrado no compilan y hay código muy diferente por ahí.

Inicialmente voy a centrarme en Python 2.7 (última versión de la rama 2.x) y si encuentro tiempo, haré lo mismo para Python 3.

Ejemplo en GitHub: mema_bare.

Full entry >>

Una implementación ligera de MQTT: libemqtt

written by uve

23 March 2012

Hace unas semanas empecé a trabajar en una librería MQTT, con dispositivos empotrados en mente. La idea es que esta librería provea de las funciones de MQTT y así los clientes puedan encargarse de la gestión de la red. Con esto se puede reutilizar este código para distintas plataformas, cómo pueden ser Arduino ó LPC1768, pero también desde Linux.

Todo empezó cuando estaba evaluando distintas alternativas. Por casualidad me encontré con liblwmqtt en Google Code, desarrollada por Filipe Varela. Tras hablar con él, decidí hacer un fork y así nace libemqtt.

El código está disponible en Github:

https://github.com/menudoproblema/libemqtt

Full entry >>

MQTT dissector for Wireshark

written by uve

15 March 2012

Acabo de terminar una primera versión del script que parsea MQTT para mostrar la información sobre este protocolo en Wireshark.

Lo he dejado colgado de Github, por si alguien está interesado en el tema.

Full entry >>

Lanzar un script Lua con Wireshark

written by uve

15 March 2012

Wireshark incluye el parseo de la inmensa mayoría de protocolos de red que existen, pero cómo es evidente, no todos. Estas semanas estoy trabajando con MQTT y para este protocolo hay un soporte muy muy básico.

Para lanzar el script, basta con ejecutar lo siguiente:

$ wireshark -X lua_script:mqtt.lua

donde mqtt.lua es el nombre de mi script.

Full entry >>

Habilitar scripts Lua en Wireshark como root

written by uve

14 March 2012

Ahora mismo estoy trabajando en un script escrito en Lua para parsear información de un protocolo en en Wireshark. Necestio hacer unas pruebas como superusuario, pero por defecto, los scripts están deshabilitados para root.

Para habilitar el soporte a Lua, necesitamos editar el siguiente script:

sudo nano /usr/share/wireshark/init.lua

y comentar la siguiente función:

-- disable potentialy harmful lua functions when running superuser
--if running_superuser then
    --local disabled_lib = {}
    --setmetatable(disabled_lib,{ __index = function() error("this package has been disabled") end } );

    --dofile = function() error("dofile has been disabled") end
    --loadfile = function() error("loadfile has been disabled") end
    --loadlib = function() error("loadlib has been disabled") end
    --require = function() error("require has been disabled") end
    --os = disabled_lib
    --io = disabled_lib
    --file = disabled_lib
--end

Full entry >>

Preparar un Alix para exposiciones: Automatizando (Parte 2)

written by uve

29 February 2012

Vamos a seguir preparando nuestra Alix. En la última entrega explicamos cómo instalar un servidor gráfico y un escritorio.

Ahora, lo siguiente es ver cómo automatizar ciertas tareas. Recordad que el objetivo es tener este dispositivo de cara al público, por lo que es muy importante que todo esté automatizado. La mayor restricción es que no habrá teclado ni ratón disponible, sólo una pantalla.

Full entry >>

Autoarranque de aplicaciones en LXDE

written by uve

29 February 2012

Hace unos días escribía sobre cómo instalar LXDE sobre Debian e iniciar sesión de forma automática. Ahora voy a tratar de explicar cómo podemos automatizar el arranque de aplicaciones a la hora de cargar el escritorio.

Full entry >>

Montando particiones de una imagen de disco duro

written by uve

26 February 2012

Hace un rato escribía cómo realizar copias de seguridad en una CompactFlash en un fichero de imagen. En alguna ocasión puede ser interesante montar esta imagen para extraer o copiar información. Al no tratarse de una imagen de una partición (es decir, no contiene directamente un sistema de ficheros), es necesario hacer alguna filigrana para poder montar la partición.

Full entry >>

Copias de seguridad de CompactFlash

written by uve

26 February 2012

Estos días he estado trabajando bastante con Alix y conté cómo hacer una instalación de Debian en una CompactFlash. Evidentemente, una vez que la imagen esté lista, el paso lógico es hacer una copia por si es necesario restaurarla en otra tarjeta de memoria.

Para ello, he utilizado dd. Esta herramienta viene en todas las distribuciones de Linux y nos permite hacer lecturas raw sobre dispositivos de bloques. Para ello, sólo hay que decirle de dónde tiene que leer (if - input file) y dónde tiene que escribir (of - output file).

Si no se especifica el número de bloques que se quieren copiar (count), por defecto se copia el fichero completo (tened en cuenta que el Linux, los dispositivos se tratan como ficheros). Además, se puede indicar el tamaño del bloque (bs - block size), para optimizar la velocidad de copia.

Volviendo al tema, para realizar una copia bastará con ejecutar lo siguiente:

$ sudo dd if=/dev/sdc of=Alix.1D.Debian-20120226.img bs=4096

Esto realiza la copia de todo el contenido del dispositivo sdc (en mi caso es el de la CompactFlash) en el fichero Alix.1D.Debian-20120226.img, usando un tamaño de bloque de 4KB.

Para restaurar la copia de la imagen en la tarjeta, es tan sencillo como intercambiar if y of:

$ sudo dd of=/dev/sdc if=Alix.1D.Debian-20120226.img bs=4096

Full entry >>

Flashear con Arduino IDE en Ubuntu

written by uve

17 February 2012

Si intentamos programar con Arduino en Ubuntu y nos encontramos con un error similar a este "Serial port COM1 not found. Did you select the right one from the Tools>Serial Port menu ?". Lo más posible es que no tengamos permisos para acceder al USB como usuario normal. Para solucionar esto podemos crear una regla udev:

$ sudo gedit /etc/udev/rules.d/98-ftdi.rules

y añadimos la siguiente linea:

SUBSYSTEMS=="usb", ATTRS{product}=="FT232R USB UART", ATTRS{idProduct}=="6001", ATTRS{idVendor}=="0403", SYMLINK+="ttyUSB%n"

Y por último, recargamos las reglas de udev:

$ sudo udevadm control --reload-rules

Full entry >>

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.