Importar archivos CSV en tablas SQL

Dado que mi experiencia con Firebird ha sido bastante decepcionante (ver post anterior), he tenido que buscar maneras de pasar los datos desde Firebird hasta MySQ. Aunque en el pasado ya había utilizado la importación desde archivos .SQL que contenían sentencias INSERT, el proceso completo puede ser bastante tedioso, porque hay tipos de campos no soportados entre Firebird y MySQL, lo que implica que tenía que editar manualmente, en muchas ocasiones, los .SQL exportados desde Firebird.

Dado que de todas las tablas sólo precisaba de cuatro, y que de esos datos sólo precisaba algunos campos, preferí ahorrar recursos y exportar únicamente los datos que fuera a necesitar.

Continuar leyendo “Importar archivos CSV en tablas SQL”

Firebird y Flamerobin en Debian Stretch

Me he visto obligado recientemente a trabajar con Firebird. Es un motor de base de datos relacional, como MySQL o MariaDB, vamos, pero aseguran que el rendimiento es más alto. Dado que lo utilizaré únicamente para poder extraer los datos que necesito para la tesis, no podré comprobar si su rendimiento es mayor o no. Lo que sí he comprobado es que es muy árido, sin interfaces sencilas, y muy exquisito con los los parámetros de conexión.

En las próximas líneas, no sólo comentaré los pasos para instalar tanto Firebird como Flamerobin, una interfaz gráfica para gestionar el servidor, sino que plantearé los problemas que he tenido para dejarlos plenamente funcionales. Espero que a alguien le sirva, o si yo mismo tengo que reinstalarlos, que me sirva como chuleta. Allá vamos.

La instalación

La instalación en Debian es trivial, ya sabemos:

sudo apt-get install flamerobin firebird3.0-server

Uno podría esperar, como pasa con MySQL o MariaDB, que el servidor se iniciara solo, que todo estuviese perfectamente funcional y que el acceso de administrador ya estuviera configurado. Pues no.

Usuario y contraseña

El siguiente paso es intentar conectar con la base de datos. La consola de SQL se invoca mediante el comando:

isql-fb
SQL> connect "localhost:/home/rafa/Documentos/historias.gbd" user 'SYSDBA' password 'masterkey';

Mientras instalamos el servidor Firebird, nos comenta que el usuario administrador es SYSDBA (el usuario por defecto) y que debemos suministrar una contraseña. En mi caso, porque estoy «heredando» una base de datos que tenía el usuario (SYSDBA) y la contraseña (masterkey) por defecto, decidí mantenerlos igual, así que puse masterkey de contraseña. Pero por una razón no bien explicada, este paso no se registra en la configuración de Firebird en Debian.

He intentado modificar o corregir este comportamiento de estas tres maneras:

Método 1

Edité el archivo de configuración /etc/firebird/3.0/SYSDBA.password y lo dejé así:

ISC_USER=sysdba
ISC_PASSWORD="masterkey"
#ISC_PASSWORD="3399ebea"

Método 2

Reconfiguré el paquete:

dpkg-reconfigure firebird3.0-server

Método 3

Intenté añadir el usuario y contraseña mediante el comando que trae Firebird:

gsec -add SYSDBA -pass masterkey

Realmente, lo que le pasa es que, como menciona Marcoci Dorin, el usuario administraodr y su contraseña se configuran a través de la base de datos de seguridad security.db, y que para añadir SYSDBA hay que hacer lo siguiente:

isql-fb -user sysdba security.db
 
SQL> create or alter user SYSDBA password 'masterkey';
SQL> commit;
SQL> quit;

Ahora reiniciamos el servidor:

sudo /etc/init.d/firebird3.0 force-reload

Acceso a los datos

En Windows, Firebird permite el acceso al archivo de datos allá donde éste se encuentre. En Debian GNU/Linux no es así, hemos de configurarlo. Hemos de editar el archivo firebird.conf y dejarlo así:

# DatabaseAccess = Restrict C:\DataBase
# DatabaseAccess = Restrict C:\DataBase;D:\Mirror
# DatabaseAccess = Restrict /db
# DatabaseAccess = Restrict /db;/mnt/mirrordb
# DatabaseAccess = Full
#
# UNCONTROLLED DATABASE ACCESS MAY COMPROMISE YOUR SYSTEM!
# IT IS STRONGLY RECOMMENDED THAT THIS SETTING BE USED TO LIMIT
# DATABASE LOCATIONS!
#
# Type: string (special format)
#
DatabaseAccess = Full

El propio archivo de configuración nos da ejemplos de cómo podemos configurar el acceso a los datos. En mi caso, he preferido tener el archivo de datos en el mismo sitio siempre, para poder exportarlo cuando acabe con él. Es importante tener en cuenta que el archivo tiene que tener los permisos de lectura-escritura apropiados. Para ahorrarme problemas, hice:

chmod 777 historias.gdb

En algunos sitios he leído también que hay que cambiar el propietario, o incluso añadir nuestro usuario al grupo firebird, aunque a mí no me ha hecho falta:

chown firebird:firebird historias.gdb
usermod -aG firebird rafa

Problemas de versiones

Finalmente, cuando ya pensaba que lo tenía apañado:

isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect "localhost:/home/rafa/Documentos/HISTORIAS.GDB" user 'SYSDBA' password 'masterkey';
Statement failed, SQLSTATE = 08004
unsupported on-disk structure for file /home/rafa/Documentos/historias.gdb; found 10.1, support 12.0
-IProvider::attachDatabase failed when loading mapping cache

Esto viene a significar que estoy utilizando una base de datos creada con Firebird 1.5, pero estoy intentado conectar con el motro 3.0. En otras based de datos, esto no supondría problemas, pero en Firebird sí.

En el blog FirebirdSQL se explica muy bien: Firebird utiliza un número interno llamado ODS (On Disk Structure) para saber con cual versión de Firebird fue creada una base de datos. Cada versión del Firebird tiene un número único de ODS. Si no coincide la ODS de una base de datos con la versión del servidor del Firebird, entonces no podremos conectarnos a esa base de datos.

Lo que debemos hacer es crear una versión transportable del archivo original, aunque eso supone volver a la máquina que tiene instalada la versión Firebird 2.5 para hacer una copia de seguridad transportable:

gbak -b -t -user SYSDBA -password masterkey historias.gdb historias.fbk

Y luego volver a la máquina con la versión 3.0:

gbak -r -p 8192 -v -user sysdba -password masterkey historias.fbk historias.fdb

Así que el achivo de datos definitivo es historias.fdb, ya formateada de manera correcta para Firebird 3.0:

isql-fb
Use CONNECT or CREATE DATABASE to specify a database
SQL> connect "localhost:/home/rafa/Documentos/historias.fdb" user 'SYSDBA' password 'masterkey';
Database: "localhost:/home/rafa/Documentos/historias.fdb", User: SYSDBA
SQL>

Y por fin conecta, aunque me ha dado muchos dolores de cabeza.

 

Ratón bluetooth en Debian Stretch

El ratón con el que había estado trabajando en los últimos meses era malo. Pero malo con ganas. Era un ratón Trust, que en teoría no debería dar (muchos) problemas, pero el caso es que sí, los daba. Y constantemente. Más tarde comencé a leer pésimas críticas en Internet de los usuarios: sobre todo que fallaban los botones principales del dispositivo, con lo que no era posible hacer click izquierdo (ni derecho) para las tareas habituales. Por eso decidí ayer comprar un ratón mejor, con el que poder trabajar a gusto sin que me dé problemas.

El ratón que me daba problemas

Continuar leyendo “Ratón bluetooth en Debian Stretch”

Máximos y mínimos en R, cómo y dónde encontrarlos

Creo que es una buena práctica que mientras estemos realizando el análisis de datos, justo antes de meternos en faena y dar por válido un archivo de datos (en mi caso, un .CSV), exploremos los datos, para ver qué es lo que tenemos entre manos. Después del tedioso y poco reconocido trabajo de depurar una sentencia SQL que me incluya y seleccione los datos que quiero, tengo que asegurarme de que estos datos son de calidad: que no haya demasiados valores vacíos, y lo peor de todo, que no haya valores outlier.

Un valor outlier, o los outliers, son valores extremos y atípicos, numéricamente distantes del resto de los datos. Los valores estadísticos que calculemos serán erróneos, y no reflejarán la realidad. Como ejemplo, mi propia experiencia. Tras mucho esfuerzo he conseguido el fichero .CSV, así que lo primero que hago en R es:

patients <- read.table("research.csv", header=TRUE, sep=",")
attach(pacients)
sumary(patients)

Lo que me encuentro es lo siguiente:

Veo algunas variables que son claramente valores anómalos, como por ejemplo, peso, Hbglic y glucemia. Evidentemente, es difícil que nadie pese 670 Kg, o que alguien tenga un valor de Hbglic de 104.  El primer abordaje que hice fue identificar la línea donde estaba el valor anómalo:

max(peso)  # me da el valor máximo de esa variable, pero no me dice dónde está
[1]670
which.max(peso)  # me indica el 'index', para que pueda encontrarlo
[] 12

El problema es que sólo me da eso, el valor máximo (o el mínimo, en caso de usar la función which.min()). Debería ir uno a uno, y eso es bastante tedioso. Sin tener que recurrir a funciones creadas por el usuario, utilizaré lo siguiente:

which(peso>150)
[1]  12   219  386   688   1209   1729   2254

Sé ahora que en la líneas 12, 219, etc, tengo valores extremos, con el criterio que he indicado, que el peso sea mayor de 150.

Tras hallar las líneas con valores extremos, dependerá de mí si deseo eliminar toda la línea o corregir el valor. En casi todos los casos he corregido el valor, tras comprobar que se trataba de un error de escritura (por ejemplo, escribir 104 en lugar de 10,4), pero antes de modificar el valor tenía que asegurarme. En investigación, una de las cosas más importantes es ser honesto. No se puede realizar un análisis con datos falsos.

Conectar con una base de datos MySQL desde Python (I)

1480896754_pythonCuando programaba (aún lo hago) aplicaciones web, utlizaba las utilidades PHP para conectar con bases de datos y poder tener la interacción con los datos que me hiciera falta en ese momento. Nunca había pensado que MySQL se pudiera utilizar fuera de las aplicaciones web. Pues resulta que gracias a mi nueva tarea de doctorando, estoy obligado a extraer datos de un servidor MySQL, pero no desde el gestor PHPMyAdmin que uso habitualmente, sino desde consola. Ya he experimentado con la conexión vía bash, pero necesito algo más versátil, así que hoy pensé en Python.

Existen varias maneras de conectar Python con un servidor MySQL, como vemos en los comentarios de los usuarios de StackOverflow. Después de haber investigado algo más, y de probar yo mismo desde la consola con Python, me decantaré por las dos maneras más usuales: MySQLdb y mysql connector.

Continuar leyendo “Conectar con una base de datos MySQL desde Python (I)”

La Abadía del Crimen Extensum en GNU/Linux

1459205260_appliances_device_electronics-67Este fin de semana me despertaba con la agradable noticia de que al fin ha sido liberada la primera y esperada versión de La abadía del crimen Extensum, un remake del juego clásico de los años 80 (del año 87, para ser más precisos), La abadía del crimen.  Recuerdo haber jugado al original cientos de veces, si bien nunca llegué hasta el final. El laberinto se me resistió una y otra vez. Conocía todas las pantallas, y todos los recovecos, menos el laberinto. Más tarde mi Amstrad CPC 6128 fue sustituido por un PC 486DX2 y el juego pasó al olvido.

Amstrad CPC 6128. CPU y teclado y disquetera, todo en uno
Amstrad CPC 6128. CPU y teclado y disquetera, todo en uno

Continuar leyendo “La Abadía del Crimen Extensum en GNU/Linux”

Mi Raspberry Pi 2 (III): servidor de streaming

1456084125_CassetteAunque no haya sido una gran inversión, sí es cierto que es un juguete con el que hacer muchas más cosas y mucho más divertidas que con otros juguetes más caros. Dejando aparte la ironía, a lo que me quería referir es que, aprovechando que tengo mi flamante Raspberry Pi, quiero sacarle provecho de la mejor manera que sé: mediante el software libre.

Planear y sacar adelante cualquier proyecto con nuestra Raspberry Pi nos hace ser poco menos que Jedi ante nuestros conocidos: ¿Copias de seguridad de nuestras máquinas? ¿Servidor web? ¿Nuestra Nube privada? ¿Un media center barato?

Pues en esta línea sigo. Ahora le toca el turno a la puesta en marcha de un media server para escuchar música en streaming.

Continuar leyendo “Mi Raspberry Pi 2 (III): servidor de streaming”

Mi Raspberry Pi 2 (II): media center con Kodi

1456084125_CassetteComo ya comenté en el anterior post, mi intención es utilizar mi Raspberry Pi en todos los proyecto que se me ocurran (y que pueda soportar el dispositivo). Aparte del de hacer copias de seguridad, está el de convertirlo en un media center mejor que el que ya tengo. Para ello recurrí a los múltiples manuales que hay en Internet, y encontré en Malagueños originales y libres que en lugar de optar por Raspbian o OpenELEC (es decir, una distro multipropósito versus una distro dirigida a tener un media center), podríamos tener nuestra Raspberry Pi funcionando con una distro Raspbian, y sobre ella instalar Kodi. Kodi es como se conoce al antiguo Xbox Media Center” o XBMC, un centro multimedia (media center) de entretenimiento multiplataforma bajo la licencia GNU/GPL.

Continuar leyendo “Mi Raspberry Pi 2 (II): media center con Kodi”

Mi Raspberry Pi 2 (I): configuración básica

1456084196_raspberryPor fin me ha llegado mi Raspberry Pi 2. Aunque la configuración y puesta en marcha se hace muy rápidamente (aproximadamente un tarde, y sin tener que buscar mucho: hay multitud de manuales, tutoriales y vídeos circulando por ahí), no quiero dejar pasar la oportunidad de escribir los pasos que me han llevado a dejarla a mi gusto. Supongo que en los próximos días ampliaré este tema y escribiré más posts acerca de ello, ya que tengo pensamiento de darle más usos a mi Raspberry Pi, aparte de ser el Media Center que siempre he querido tener.

Continuar leyendo “Mi Raspberry Pi 2 (I): configuración básica”

Un netbook como servidor (IV)

1454291621_12-lan-connected-512x512La configuración wake on lan del ASUS EeePC 701 es un poco complicada, pero no imposible. Me ha costado un poco, sobre todo porque la única web que encontré al respecto estaba en francés. A continuación pondré los pasos que seguí para poder activar esta característica en mi netbook/servidor.

Activar la opción Wake On LAN en la BIOS

El notebook ASUS EeePC 701 no tiene esta opción en la BIOS, con lo que aparentemente es imposible activarla. Sin embargo, está escondida, por lo que sí se puede activar. Al iniciar el netbook, pulsamos F2 para entrar en la BIOS

IMG_8698

 

Continuar leyendo “Un netbook como servidor (IV)”