Super Tux 2: Versión 0.6 liberada hoy.

El popular juego de plataformas libre para Linux, de inspiración clonada a Super Mario, Super Tux 2 ha visto como, tras dos años de intenso trabajo, su versión 0.6 era por fin liberada para Linux, Mac y Windows.

SuperTux 2

Entre las novedades de la nueva versión encontramos:

  • Soporte para la librería OpenGL 3.3, y también para OpenGL ES 2.0. Este soporte para GLES2 debe permitir que SuperTux pueda ejecutarse en varios dispositivos móviles o sistemas embebidos de gama baja. Además permitirá trabajar en un futuro soporte para WebGL en tanto tenga relación con EmScripten;
  • Rediseño completo de los niveles del Mundo Helado y del Bosque.
  • Soporte para idiomas con escritura de derecha a izquierda.
  • Nuevas animaciones, efectos de sonido y gráficos.
  • Optimización del rendimiento del código.

Puedes descargar el juego, o el código, desde este enlace o desde el centro de software de Ubuntu

Guías y documentación de LibreOffice

En este blog hemos hablado de LibreOffice más de una vez en la sección de ofimática. Esta vez no vamos a hablar de nada en concreto, simplemente dejo por aquí este enlace. Se trata de un acceso directo a la documentación de LibreOffice en castellano.

Por desgracia de momento no está todo traducido y apenas está disponible al momento de escribir esto la guía de introducción. En caso de necesitar una guía más avanzada puedes recurrir a la documentación en inglés:

Borrar un trigger solo si este existe, en SQL-Server

El otro día vimos cómo hacerlo con una tabla, hoy vamos a ver cómo borrar un trigger de una base de datos, pero solo en caso de que exista (para evitar mensajes de error en nuestros scripts).

De nuevo, como en el ejemplo anterior, antes de SQL-Server 2016 se hacía de una forma y a partir de esa versión tenemos un sintaxis simplificada:

Versiones anteriores a SQL-Server 2016:

Tendríamos que hacer una consulta para ver si existe el trigger y luego lo eliminaríamos:

IF EXISTS (SELECT * FROM sys.triggers WHERE name = 'trelTriggerQueBorraremos')  DROP TRIGGER trelTriggerQueBorraremos

De SQL-Server 2016 en adelante:

DROP TRIGGER IF EXISTS trelTriggerQueBorraremos

Borrar una tabla solo si esta existe, en SQL-Server

El caso que vamos a tratar es el siguiente. Estamos creando un script para SQL-Server y queremos que si existe una tabla esta se borre. ¿Cómo lo hacemos? Dependiendo de la versión de nuestro SGBD lo haremos de una forma u otra:

SQL-Server anterior a la versión 2016:

Si trabajamos con una versión de SQL-Server anterior a 2016 (yo normalmente trabajo con SQL-Server 2008 R2 en la mayoría de los clientes de mi empresa) la sintaxis más correcta sería la siguiente:

IF OBJECT_ID('dbo.TablaQueQueremosBorrar', 'U') IS NOT NULL 
  DROP TABLE dbo.TablaQueQueremosBorrar; 

Como puedes ver, comprobamos si existe el nombre de la tabla a borrar y si la consulta devuelve algo distinto de NULL ejecutamos el borrado.

De SQL-Server 2016 en adelante:

Para SQL-Server 2016 se simplificó este paso con una nueva instrucción, que podríamos resumir como DIE (Drop If Exists)

DROP TABLE IF EXISTS dbo.TablaQueQueremosBorrar


Escribir un fichero Excel desde Python

Hace ya unos años, cuando hablábamos mucho de PHP por aquí (mi vida laboral me llevó a tener que centrarme en el SQL y el javascript principalmente) vimos cómo importar y exportar ficheros de Excel con PHP. Pero ¿cómo podemos escribir un fichero de Excel usando Python?

Hay muchas librerías para realizar esta tarea, yo en mi caso he elegido XslxWriter, que podéis descargar desde este enlace. También es muy popular xlrd/xlwt, aunque creo que solo permite exportar en formato xls, pero tiene la parte positiva de permitir importar datos.

Veamos entonces paso a paso, con ejemplos de código, cómo escribir un fichero simple xlsx con Python. Los primeros pasos en nuestro código serán importar la librería, crear un nuevo libro de trabajo y crear una nueva hoja. Lo haríamos así:

import xlsxwriter

libro = xlsxwriter.Workbook('Presupuesto1.xlsx')
hoja = libro.add_worksheet()

El constructor Workbook() nos permite crear un nuevo objeto que representaría un libro de Excel. Es importante destacar que XlsxWriter no nos permite modificar ni leer ficheros de Excel, solo podemos crearlos.

La función add_worksheet() del objeto Workbook nos permite crear nuevas hojas en nuestro libro. Si invocamos esta función sin parámetros creará las hojas con un nombre numerado de forma consecutiva (Sheet1, Sheet2, Sheet3…) pero si le pasamos una cadena esta será el nombre de la hoja.

Ahora, para continuar con el ejemplo, vamos a escribir los datos que queremos mostrar en nuestra hoja de cálculo.

# El presupuesto que pintaremos en la hoja de cálculo
presupuesto = (
    ['Equipos',     4000],
    ['Cable',        100],
    ['Armario',      200],
    ['Switch',        99],
    ['AP',            50],
    ['Router',       150],
    ['Mano de Obra', 350],
)

Ok, tenemos los datos a pintar. Tenemos la librería importada y los objetos creados. ¿Qué nos queda? Unos simples pasos: primero nos posicionamos al inicio del documento, después iteramos sobre la colección de datos pintando cada columna con el método write(), que recibirá la fila, la columna y el valor. Finalmente añadiremos una fila con los totales, calculados ya con una fórmula de sumatorio, y cerraremos el objeto Workbook().

# Nos posicionamos en la primera columna de la primera fila
row = 0
col = 0

# Iteramos los datos para ir pintando fila a fila
for concepto, precio in (presupuesto):
    hoja.write(row, col,     concepto)
    hoja.write(row, col + 1, precio)
    row += 1

#Pintamos la fila de totales
hoja.write(row, 0, 'Total:')
hoja.write(row, 1, '=SUM(B1:B7)')

#Cerramos el libro
libro.close()


Cómo ver tu historial de actividad en Netflix y cómo mejorar las sugerencias

¿Quieres saber qué has visto en Netflix? Pues puedes hacerlo. Basta con visitar este enlace con tu sesión abierta y podrás consultar todo lo que has visto en la plataforma.

Tienes dos opciones. Por un lado puedes ver el historial de visionado:

Historial de visionado de Netflix
Historial de visionado. El botón a la derecha te permita eliminar de tu lista de visionado esa entrada.

Por otro lado puedes ver el historial de votaciones:

Historial de votaciones

Si notas que en los últimos tiempos las sugerencias de Netflix no te convencen puede que sea porque has visto una serie de películas o programas que no «encajan» en tu patrón de gustos. Desde aquí puedes solucionarlo:

En el historial de votaciones puedes cambiar tu voto o eliminarlo para que no cuente, y en el historial de visionado el botón de la derecha te permita quitar esa serie o película de tu lista. De esta forma ese material ya no se tendrá en cuenta a la hora de realizar sugerencias.

Crontab Generator: Generador web de tareas programas para Linux

Si eres de los que ve muy práctico el disponer de un programador de tareas pero no te acabas de sentir cómodo o no acabas de entender cómo se escribe un comando para que cron programe una tarea tienes la suerte de tener un buen montón de herramientas on-line para generar tareas programas en Linux.

Crontab Generator es una de ella, una web donde de forma muy simple elegimos la periodicidad de una tarea, insertamos la ruta del script que la ejecuta y él nos genera el comando. Por ejemplo, supongamos que queremos ejecutar un script que se llama backup.sh,situado en la carpeta home, todos los días de lunes a viernes a las 3 de la madrugada. El comando sería el siguiente:

* 3 * * 1-5 /home/backup.sh

Pero con Crontab Generator tienes un panel donde puedes seleccionar gráficamente estos parámetros:

crontab generator

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)

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.