Entries for Linux
Testear WebServices Restful con curl
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
Exportar el código fuente de Eclipse a PDF
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
¿Cómo utilizar TCP_NODELAY?
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:
- mqtt_connect
- mqtt_subscribe
- mqtt_unsubscribe
- 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í?
Synaptic: No se pudieron analizar o abrir las listas de paquetes o el archivo de estado
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
Preparar un Alix para exposiciones: Gráficos y gestión de energía (Parte 3)
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.
Bindings Python para bibliotecas C: Módulos y compilación (Parte 2)
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.
Una implementación ligera de MQTT: libemqtt
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:
MQTT dissector for Wireshark
15 March 2012
Lanzar un script Lua con Wireshark
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.
Habilitar scripts Lua en Wireshark como root
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
Preparar un Alix para exposiciones: Automatizando (Parte 2)
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.
Autoarranque de aplicaciones en LXDE
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.
Montando particiones de una imagen de disco duro
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.
Copias de seguridad de CompactFlash
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
Flashear con Arduino IDE en Ubuntu
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
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é.
