//barrabarra

JAVIER ROMERO
Programación web y escritorio
 

Error al indexar documentos en Elastic Search: MapperParsingException

julio 9, 2013 at 7:30 pm | Blog, Django, ElasticSearch, Programación | No comment

 

Hace unos minutos que he terminado de pelearme con ElasticSearch en el proyecto en el que trabajo así que vamos a dejar por aquí un apunte para que en el futuro pueda servir de referencia.

La situación es tener una instancia de un la clase JobOffer, la cual serializo, trato de antemano y envío a ES con el uso de la genial biblioteca de Python requests. El problema llega cuando el documento no se indexa y en su lugar recibo el siguiente error:

{"error":"MapperParsingException[object mapping for [joboffer] tried to parse as object, but got EOF, has a concrete value been provided to it?]","status":400}

Cuando esto -o algo similar a esto- ocurra tendrás que detenerte y examinar lado a lado la estructura en JSON que estás enviándole al índice y el mapping de dicho índice.

Cuando lo hagas, seguramente te encontrarás con que en alguna de las propiedades definidas en el mapping tiene algún atributo y que tu JSON no tiene esa atributo en esa propiedad, se ve más claro en el siguiente ejemplo, en el que primero muestro el mapping de la propiedad language (que es la que me estaba dando problemas) y a continuación el contenido del diccionario que estaba enviando:

language: {
    dynamic: "true",
    properties: {
        name: {
            type: "string"
        },
        pk: {
            type: "long",
            ignore_malformed: false
        },
    }
},

print data_dict["language"]
>> "es_ES"

Como se aprecia, en la propiedad language el mapeo esperaba recibir dos campos, pk y name, pero recibía directamente un valor “es_ES” y de ahí el error.


 

Instalar impresora Brother MFC-J4410DW en Archlinux

julio 3, 2013 at 6:49 pm | Blog, Sistemas | 2 comments

 

ACTUALIZADO (18/04/2016): Añadidas instrucciones para que CUPS pueda comunicarse con la impresora

Partimos de que la impresora Brother MFC-J4410DW ya está conectada por wifi al router. El manual lo explica con suficiente claridad.

Paquetes necesarios
Instala rpmextract, ghostscript, gsfonts, foomatic-filters y a2ps desde los repositorios. Si usas x86_64 instala también lib32-libcups.

Paquetes opcionales
Si usas KDE, instala kdeutils-print-manager.

Drivers
Descarga desde la web oficial de Brother los drivers para linux en paquetes RPM
Descarga tanto LPR driver como Cupswrapper driver.

Preparativos
Por el formato del sistema de archivos de Arch hay que hacer algunas modificaciones.
Extraemos los archivos desde el paquete RPM con:
$ rpmextract.sh mfcj4410dwlpr-3.0.0-1.i386.rpm
$ rpmextract.sh mfcj4410dwcupswrapper-3.0.0-1.i386.rpm

Nos creará dos carpetas, opt y usr
Modificaremos un script de la carpeta opt para sustituir la ruta “/etc/init.d” por “/etc/rc.d” con
$ sed -i 's|/etc/init.d|/etc/rc.d|' opt/brother/Printers/mfcj4410dw/cupswrapper/cupswrappermfcj4410dw

Instalación de los drivers
Simplemente copiamos los contenidos de las carpetas a su situación final como superusuarios:
# cp -r opt/* /opt
# cp -r usr/* /usr

Y por fin instalamos el wraper de cups (como root una vez más)
# /opt/brother/Printers/mfcj4410dw/cupswrapper/cupswrappermfcj4410dw
La salida de ese comando será algo similar a:
lpadmin -p MFCJ4410DW -E -v usb:/dev/usb/lp0 -P /usr/share/cups/model/Brother/brother_mfcj4410dw_printer_en.ppd

Añadir la impresora al sistema.
Y ahora para KDE, lanzamos las Preferencias del Sistema y buscamos el apartado de Impresoras, al entrar introducimos nuestra clave de root y elegimos añadir una impresora.
mfc-j4410dw-0

En el diálogo que se abre introducimos nuevamente nuestra clave de root, esperamos unos segundos y cuando detecte las impresoras conectadas a la red Brother elegimos la primera de ellas, pulsamos continuar.

mfc-j4410dw-1
mfc-j4410dw-2

En la siguiente pantalla veremos que nos pide qué driver usar, en la izquierda pinchamos sobre el fabricante Brother y en la derecha sobre el primer driver CUPS

mfc-j4410dw-3

A continuación nos pide que le demos un nombre, descripción y ubicación a la impresora. Una vez hecho, pulsamos en finalizar y ya estará lista para usarse.

mfc-j4410dw-4

mfc-j4410dw-5

ACTUALIZADO:

Es posible que hayas seguido todos estos pasos, la herramienta encuentre la impresora pero aún así no seas capaz de imprimir nada. Puede que el error venga porque CUPS intenta acceder a la impresora mediante el nombre que resuelve Avahi pero no es capaz. Para asegurarnos de que esto es lo que pasa podemos ejecutar:

avahi-browse -arl

que nos dará un listado de todos los dispositivos descubiertos, su IP y su nombre asignado. La impresora debe ser uno de los resultados con algo como:


...
= enp2s0 IPv4 Brother MFC-J4410DW PDL Printer local
hostname = [BRWF4B7E2071BCA.local]
address = [192.168.1.135]
port = [9100]
...

donde vemos la IP asignada en la red local (192.168.1.135) y el nombre (BRWF4B7E2071BCA.local). Lo que vamos a hacer es un ping a este último.

ping BRWF4B7E2071BCA.local

Si el ping funciona correctamente, la comunicación con la impresora es correcta y tu problema para imprimir es otro. Pero si no funciona, lo que tienes que hacer es instalar el paquete:

# pacman -S libnss-mdns

y editar el fichero etc/nsswitch.conf con:

hosts: files wins mdns4_minimal dns [NOTFOUND=return] mdns4[1]

Tras eso prueba de nuevo a ejecutar el ping y deberías poder imprimir finalmente.

[1] Info sacada de http://askubuntu.com/questions/460371/trouble-using-ssh-and-avahi


 

Buscando documentos con valores nulos en Elastic Search

junio 25, 2013 at 1:03 pm | Blog, Programación | No comment

 

En algunas ocasiones surgirá la necesidad de buscar documentos en un índice de Elastic Search de los que nos interesará que bien sean o no sean nulos.

Para eso podemos utilizar la consulta [* TO *], por ejemplo, para buscar todos los tweets del índice con un campo message no nulo buscaríamos:
http://localhost:9200/twitter/tweets-latest/_search?q=message:[* TO *]

Y por el contrario, para buscar los tweets del índice que tuvieran el campo message nulo buscaríamos:
http://localhost:9200/twitter/tweets-latest/_search?q=-message:[* TO *]

Atención al signo - delante del campo message.

Para más detalles, ver el hilo en el que encontré la consulta original


 

Capturando imágenes desde un DVD y eliminando bordes

abril 28, 2013 at 1:04 pm | Blog | No comment

 

Hoy que me encuentro con un poco de tiempo he decido pasar algunos dvds premontados con presentaciones de fotos a las carpetas de fotos.
Como los dvds vienen montados como videos hay que extraer las fotos haciendo capturas y posteriormente tendremos que eliminar las bandas.

Para esto vamos a utilizar dos herramientas, ffmpeg e ImageMagick.

Primero extraemos las fotos haciendo capturas cada x segundos con:
ffmpeg -i [input file] -r .05 -y [output name]%%03d.jpg

Cuando hemos extraído las capturas les damos un repaso y quitamos las que se hayan tomado en mitad de transiciones, cabeceras y similares y una vez limpias vamos a eliminar los bordes.

Con ImageMagick podemos utilizar la opción -trim, pero veremos que por el propio ruido del archivo de video no elimina correctamente todos los bordes y nos deja unas barras bien grandes a los lados, así que vamos a incluir un paso intermedio que “suavice” las fotos para que los bordes queden homogéneos y poder eliminarlos posteriormente con más precisión.

La orden es tan simple como:
for i in `ls *.jpg`; do convert $i -crop `convert $i -virtual-pixel edge -fuzz 25% -trim -format '%wx%h%O' info:` +repage noborder-`basename $i .jpg`.jpg; done


 

Ejecutar Selenium WebDriver con Firefox en un servidor remoto sin interfaz gráfica

abril 12, 2013 at 10:05 am | Blog, Sistemas | 1 comment

 

Si queremos aprovechar nuestro hosting en una máquina remota para ejecutar pruebas mediante Selenium WebDriver nos encontraremos con el inconveniente de que estas máquinas por lo general carecen de un entorno gráfico, necesario para que se lance el navegador y se puedan realizar los tests. Esto puede resolverse con la ayuda de Xvfb, un servidor gráfico “de pega” que nos va a permitir lanzar nuestro navegador sin necesidad de ejecutar todo el entorno X.

Para ello, instalaremos los paquetes necesarios, en Ubuntu esto será con:

apt-get install xvfb firefox firefox-locale-es

Cuando instalemos los paquetes y sus correspondientes dependencias podemos ejecutar:

startx -- `which Xvfb` :1 -screen 0 1024x768x24 &

lo que nos lanzará un servidor gráfico utilizando Xvfb y lo dejara ejecutándose de fondo. Para continuar sólo tenemos que lanzar una instancia de Firefox y comprobar que efectivamente se ejecuta. El único detalle a tener en cuenta es que hay que indicarle qué display utilizar, lo haremos de la siguiente forma:

DISPLAY=:1 firefox &

Si quieres asegurarte de que se está ejecutando y tienes instalado el paquete imagemagick puedes hacer una captura de pantalla :D, lo haríamos con:

DISPLAY=:1 import -window root capturafirefox.png

Para evitar tener que ejecutar estas líneas cada vez que el servidor arranque y se detenga, y por comodidad para gestionarlo, podemos crear un script de Upstart, primero con un archivo de configuración en /etc/init/xvfb.conf con el contenido:


description "XVFB fake x server instance"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec startx -- `which Xvfb` :1 -screen 0 1024x768x24

con lo que podremos lanzar el servicio con service xvfb start, aunque para que se lance automáticamente al inicio del sistema haremos:

ln -s /lib/init/upstart-job /etc/init.d/xvfb

Una última cosa, igual que al lanzar nuestra instancia de Firefox había que indicarle el display a utilizar, cuando se vaya a lanzar algún comando que tenga que hacer uso del servidor gráfico habrá que indicarlo, podemos poner la variable en el entorno mediante nuestro archivo de configuración del intérprete de órdenes, o simplemente poner delante de cada tarea de cron, script y similar la línea DISPLAY=:1 antes de la orden.


 

Página siguiente »

Categorias:

Archivo: