Conexión con base de datos SQLite en el lenguaje R

El lenguaje de programación R es tremendamente popular entre los matemáticos por estar desarrollado enfocado al análisis estadístico y por ser software libre (licencia GNU/GPL). Y siendo un lenguaje orientado a la estadística la lógica nos dicta que tiene que ser posible conectar con una base de datos.

Por suerte se han desarrollado librerías que sirven como interfaz para trabajar con la mayoría de los sistemas gestores de bases de datos más populares del mercado: SQL-Server, MySQL, PosgreSQL, Oracle y el caso que hoy nos ocupa, SQLite. Principalmente dispones de tres librerías para estas conexiones: ODBC (un standar desarrollado por Microsoft), DBI (basado en DBI de Perl y adaptado de forma nativa para R) y dplyr (otra aproximación nativa profundamente integrada). En este artículo vamos a ver cómo hacerlo con DBI, puesto que es la solución que me han recomendado más programadores de R veteranos.

El primer paso, claro, será instalar los paquetes de la librerías necesarias:

install.packages(c("DBI", "RSQLite"))

Y una vez instalados lo siguiente simplemente es añadir las librerías a nuestro código y configurar una conexión:

library(DBI)
library(RSQLite)

# Definimos el driver
driver <- dbDriver("SQLite")

#realizamos la conexión con dbConnect()
#Esta función recibe como primer parámetro el driver o un objeto
#de conexión ya existente, y como segundo parámetro todos los
#parámetros de conexión que requiere nuestra base de datos.
#SQLite solo necesita la ruta al fichero de la base de datos
#Otros SGBD necesitarán más
archivo_sqlite <- system.file("home/database.sqlite")

conexion <- dbConnect(driver, archivo_sqlite)

#Pdemos ejecutar consultas con dbSendQuery()
#la función recibe el objeto conexión y una consulta SQL.
resultado <- dbSendQuery(conexion, "SELECT * FROM baseDatosEjemplo")

#Para cerrar la conexión con la base de datos
dbDisconnect(conexion)

El Bandcamp de la Quincena: Castle – Deal Thy Fate

Esta semana en El Bandcamp de la Quincena nos vamos sacudimos la lluvia y nos vamos a la siempre soleada California, a tomarnos una buena ración de heavy metal con los Castle.

Ya hace 9 años de su primera demo, 7 de su primer disco (In Witch Order) y 6 de su espectacular segundo disco, Blacklands: Castle no son unos desconocidos que vengan a subirse a la ola del rock de temática ocultista ahora que Ghost lo han puesto de moda, son una banda con una carrera sólida que, el pasado mes de octubre, nos entregaban su quinto álbum, Deal Th Fate, para encarar un próximo 2019 que marcará el décimo aniversario de la banda.

Castle

Oscilando entre el doom metal, el heavy clásico y el hard rock más oscuro Castle en este Deal Thy Fate no ocultan haber escuchado más de un disco de Black Sabbath, Pentagram o Danzig, incluso con alguna nota macarruzo-motera de Orange Goblin o algún deje más melódico en las guitarras que recuerda al Ozzy de los dos trabajos de Randy Rhoads. Podríamos emparentarlos también con el sonido de bandas actuales como Duel u Orchid, y por la voz femenina es imposible no añadir también a Christian Misstress.


La dupla formada por el guitarrista Mat Davis y la bajista, vocalista y alma líder de la banda Elizabeth Blackwell funciona con precisión de reloj nuclear: él construye unos riffs tremendamente pegadizos y ella añade una voz melódica, agresiva y muy de la vieja escuela del heavy metal, elaborando una suculenta ración de nueve himnos de metal oscuro, poderoso y de la vieja escuela. No he encontrado información sobre si Al McCartney, que había sido su batería por muchos años, ha sido el encargado de los parches en este trabajo. Un disco redondo hecho con las cosas muy claras, donde desde la portada firmada por Patrick Zoller sabemos perfectamente qué nos encontraremos: heavy metal oscuro.


Probando Bat en Ubuntu: una versión «vitaminada» de Cat

Hoy vamos a hablar de Bat, un clon «vitaminado» del comando Cat de Linux.

¿Por qué usar Bat teniendo ya Cat?

Pues porque, como ya he dicho arriba, se trata de un clon «vitaminado» ¿Qué quiere decir esto? Que aunque funciona igual presenta una serie de añadidos que lo hacen más atractivo o funcional:

  • Tiene resaltado de sintaxis para varios lenguajes de programación.
  • Puedes elegir varios temas de colores para dicho resaltado.
  • Incluye integración con Git para ver los cambios en el fichero.
  • Hace el paginado de forma automática.
  • Permite añadir nuevos temas y sintaxis para otros lenguajes no incluidos.

Aquí puedes ver una captura de cómo va lo del resaltado de sintaxis:

Bat sintaxis

Y aquí podéis ver parte de la lista de temas disponibles:

Listado de temas

Para elegir el lenguaje de programación que queremos resaltar basta con invocar el comando seguido de la opción -l y el nombre del lenguaje:

bat -l Python ejemploPython.py

También tenemos la opción de elegir que en lugar de mostrarnos todo el fichero nos muestre solo un rango de líneas:

bat –line-range 5:53 bin/scripts/isaiah/stryper.sh

¿Cómo instalo Bat?

El código está disponible en GitHub, así que tienes la opción de descargarlo desde la página del proyecto. También puedes ejecutar el comando wget desde la consola en Ubuntu:

wget https://github.com/sharkdp/bat/releases/download/v0.8.0/bat_0.8.0_amd64.deb

sudo dpkg -i bat_0.8.0_amd64.deb

O descargarlo desde los repositorios oficiales en Arch-Linux.

sudo pacman -S bat

Hacer un reseteo a parámetros de fábrica (hard reset) de un router Technicolor TG582n

No hace mucho tiempo se popularizaron unos mensajes humorísticos en cadena en las redes sociales sobre padres que ponían tareas a sus hijos para adivinar la contraseña del wifi. Comenté que si tuviera un hijo adolescente al que no le da la cabeza para buscar cómo resetear un router ya ni me esforzaría en que intente estudiar. Esta chanza me hizo descubrir que hay mucha gente (supuestamente «nativa digital«) que no sabe la diferencia entre reiniciar un router y resetearlo, e incluso que ni conoce la posibilidad de resetear.

El Technicolor TG582n es uno de los modelos más populares de la actualidad, un modelo de gama económica que muchos proveedores de internet instalan a sus clientes.

¿En qué consiste el reseteo?

Cuando ejecutamos un reseteo devolvemos determinados ajustes del router a los parámetros de fábrica por defecto. Esto no implica, por ejemplo, eliminar actualizaciones del firmware sino reinicializar algunos parámetros, entre ellos:

  • Usuario y contraseña del router
  • Nombre y contraseña de la wifi
  • Servidor DNS predeterminado
  • Excepciones y configuración del firewall
  • Redirección de puertos

¿Cómo ejecutamos el resteo?

Es muy simple. Si te fijas en la foto de abajo verás que señalamos un agujero que está al lado del botón de encendido, bajo el cual está grabada la palabra reset:

Technicolor TG582n
Fig 1: Botón de reset

Para ejecutar el reseteo basta con coger un clip, aguja, alambre… un objeto que pueda entrar por el agujero y empujar hasta que notemos que el botón que hay dentro cede y llega a su tope. Una vez llegue aguantamos unos 15-20 segundos y soltamos. El router se reiniciará solo tras esto. Una vez veamos que la luz de WLAN deja de parpadear el router estará reinciado.

¿Cuales son los parámetros de fábrica?

Esta cuestión es compleja, porque cada distribuidor puede haber alterado los suyos. Generalmente la IP por defecto suele ser la 192.168.0.1 o la 192.168.1.1, aunque he visto alguna compañía que lo traía en otro rango. El usuario por defecto suele ser admin o administrator y la contraseña admin. En cuanto al usuario y contraseña de la wifi por defecto, generalmente están impresas en una pegatina en la parte inferior del router. Seguramente en el manual de instrucciones que acompaña al router vengan todos estos datos.

Operador ternario en Python

Hace un tiempo hablamos del operador ternario en Java, una forma de hacer operaciones condicionales en una sola línea con tres parámetros. Pero ¿existe algo similar en Python? Pues sí, existe:

No se trata de un operador, como el ? de Java, sino de una condición if-else un poco distinta a la clásica. La sintaxis sería algo así:

opción1 if condición else opción2

Veamos un ejemplo práctico:

#Declaramos una variable, le llamamos var
#Para el ejemplo le damos valor 1
var = 1
#Aplicamos la operación
resultado="Mayor que cero" if var>0 else "Menor o igual que cero"
#La variable resutado en este caso almacenaría "Mayor que cero"

¿Cómo ver todas tus búsquedas de voz en Google? ¿Cómo gestionar la privacidad de las grabaciones?

Vamos con un tip rápido sobre privacidad ¿sabes que puedes ver todas las búsquedas por voz que has hecho con tu cuenta de Google?

Ya sea desde un dispositivo Google Home o desde un teléfono Android, la empresa de la gran G graba y conserva todo lo que le preguntamos. Puedes ver ese registro a través de este enlace. Si tu cuenta de Google tiene una sesión abierta ya te llevará directamente a esos datos.

¿Y cómo puedo gestionar esto?

Puedes borrar estos datos y puedes configurar tu cuenta para que no se almacenen a través de este enlace. Desde ahí puedes ver las instrucciones para eliminar todas las grabaciones, para eliminar solo algunas y también puedes activar o desactivar la grabación de tus búsquedas de voz.

Comando cmatrix: haciendo un poco el tonto en Linux.

Vamos con una de esas tonterías que a veces publico sobre Linux, que no son muy prácticas pero sí divertidas, como cuando hicimos que la consola nos insultara. Vamos a ver cómo convertir nuestro terminal en la consola de la popular película The Matrix.

Empezamos por instalar cmatrix desde nuestra consola de comandos tal que así:

sudo apt-get update
sudo apt-get install cmatrix

Una vez instalado solo tenemos que invocar el comando cmatrix en la consola para conseguir este bonito efecto:

ejecución cmatrix


MySQL: Formateando fechas con DATE_FORMAT()

La función DATE_FORMAT() de MySQL, que fue incorporada en la versió 4.0 del conocido SGBD, nos permite dentro de un select definir el formato de salida de una fecha. La función recibe dos parámetros: una fecha o campo de fecha y una cadena de texto con el formato.

Los siguientes valores pueden ser usados en el formateo de fecha:

%aNombre del día abreviado (Sun a Sat)
%bNombre de mes abreviado (Jan a Dec)
%cMes en formato número (0 a 12)
%DDía del mes en formato numérico seguido de sufijo numeral (1st, 2nd, 3rd, …)
%dDía del mes en formato numérico, forzando dos dígitos  siempre ( de 01 a 31)
%eDía del mes en formato numérico, sin forzar dos dígitos (1 a 31)
%fMicrosegundos (000000 to 999999)
%HHora en formato 24 horas, con dos dígitos
%hHora en formato 12 horas, dos dígitos
%IHora en formato 12 horas, dos dígitos
%iMinutos
%jDía del año (001 a 366)
%kHora en formato 24 horas, sin forzar los dos dígitos
%lHora en formato 12 horas, sin forzar los dos dígitos
%MNombre del mes (January a December)
%mMes en formato numérico, forzando dos dígitos.
%pAM o PM
%rHora en formato 12 horas AM o PM (hh:mm:ss AM/PM)
%SSegundos (00 a 59)
%sSegundos (00 a 59)
%THora en formato 24 horas (hh:mm:ss)
%USemana, tomando el domingo como primer día (00 a 53)
%uSemana, tomando el lunes como primer día (00 to 53)
%VSemana, tomando el domingo como primer día (01 a 53). Usado con %X
%vSemana, tomando el lunes como primer día (01 a 53). Usado con %X
%WNombre del día completo (Sunday to Saturday)
%wNúmero del día en la semana, siendo el domindo 0 y el sábado 6.
%XAño para la semana, tomando el domingo como primer día. Usado con %V
%xAño para la semana, tomando el lunes como primer día. Usado con %V
%YAño en formato de cuatro dígitos
%yAño en formato de dos dígitos

Veamos unos ejemplos si quieres probarlo en casa:

Select DATE_FORMAT("2018-11-20", "%d/%m/%Y"); 
#Pintaría 20/11/2018, el formato europeo
Select DATE_FORMAT("2018-11-20", "%V %X"); 
#Pintaría 46 2018
Select DATE_FORMAT("2018-11-20", "%j-%y"); 
#Pintaría 324-2018
Select DATE_FORMAT("2018-11-20", "%W %d %M"); 
#Pintaría Tuesday 20 November

En el ejemplo le hemos pasado una cadena con una fecha como primer parámetro, pero puedes probar una consulta sobre un campo de una tabla que almacena alguna fecha.

El Bandcamp de la Quincena: Marijannah – Till Marijannah

Esta semana en El Bandcamp de la Quincena nos vamos de cabeza a por una ración de Stoner Doom a Asia, a Singapur, de la mano de Marijannah.

No tengo un máster en metal y rock asiático, pero por lo que leo estos Marijannah no son unos novatos a pesar de que este sea su disco debut, puesto que algunos de sus miembros han militado en bandas con una trayectoria sólida como los grindcoretas Wormrot, donde toca el guitarrista Rasyid Juraimi o la banda de sludge Abolition AD del bajista Muhd Azri.

Marijannah

En este Till Marijannah nos traen cuatro temas largos del palo stoner/doom donde la influencia de bandas como Sleep o Electric Wizard en las guitarras se dan la mano con algunas melodías más catchy y pop que les emparentan con Uncle Acid & The Deadbeats o Blood Ceremony. El primer tema, 1974, que habla del intento de asesinato contra Ronald Reagan a manos de un perturbado obsesionado con Jodie Foster en Taxi Driver, bien podría resultar una rendición a la temática de Church of Misery. Snakecharmer, el single del que han sacado vídeo, tira por los derroteros más estandarizados del género con algún guiño a Melvins y Black Sabbath, mientras que la más larga Bride of Mine tiene ese rollo tan «fiesta de los 60 con extra de ácido y Satán» que te lleva a pensar en los antes citados Uncle Acid. Para cierre del disco seguramente se dejen la pieza más pesada y atmosférica, una All Hollows’ Eve que seguramente sea el corte más limpio y oscuro, con unos coros sesenteros a lo Ghost de fondo.

Como primer acercamiento a la escena stoner de Singapur puedo decir que estos Marijannah me han dejado una impresión positiva y un gran sabor de boca. Queda por saber si podremos degustar su música a corto plazo en Europa.

Just Imagine… Cuando Stan Lee reescribió el universo DC

Tras la muerte de Stan Lee no han parado de sucederse los homenajes, algo esperable pues se trata de una auténtica leyenda de los cómics (aunque tenga un oscuro historial que muchos decidan ignorar). Como editor y empresario el nombre de Stan Lee siempre será sinónimo de Marvel Comics. Pero ¿Qué habría pasado si el viejo Stan en lugar de tener su propia editorial hubiera trabajado para otra? ¿Podría ser esto un argumento de uno de aquellos What if…? de la Marvel? Podría, pero realmente fue algo que ocurrió a principios de los dosmiles.

Just Imagine… fue una serie de 13 números autoconclusivos e independientes publicada por DC entre 2001 y 2002. De hecho posteriormente se publicaría en 3 tomos titulados más explícitamente Just Imagine Stan Lee Creating the DC Universe. La idea era juntar a varios dibujantes estrella de la casa como Joe Kubert, Bachalo, Walt Simonson o Jim Lee con Stan Lee para reescribir los orígenes de varios personajes principales del universo DC.

Batman Stan Lee

De esta forma Batman se reconvertía en un ex militar afroamericano que amasó su fortuna con una fugaz carrera en la lucha libre, Wonder Woman aparecía como una mujer latinoamericana que obtenía los poderes de una diosa inca, Superman se convertía en un policía kriptoniano que en su planeta natal no era excepcionalmente poderoso pero que ve amplificado su poder en la Tierra, Robin se tornaba un esbirro de un villano cuyo objetivo era matar a Batman, Flash era una mujer que obtenía sus poderes por un tratamiento médico experimental para una extraña enfermedad y Sandman un astronauta que fue traicionado y dado por muerto por un compañero durante un paseo espacial.

JLA Stan Lee

¿Eran evidentes los guiños a los orígenes de otros personajes del Universo Marvel? Lo eran. Siendo sinceros, no se trataba de una serie de tebeos especialmente buenos, y se nutrían más del morbo de Stan Lee trabajando para DC que de ser historias realmente brillantes. Desde luego no está ni entre lo mejor de la producción de DC, ni entre los trabajos más brillantes de Stan Lee ni entre las obras esenciales de la historia del cómic. Pero siempre estarán ahí como una de esas grandes anécdotas del tebeo americano: Cuando el fundador de Marvel hizo una serie para su tradicional y más grande rival.