The Donnie Rock Radio Show 51: La música de la Bestia

Olor a azufre, infernales llamaradas. En las calderas de Pedro Botero el hedor a alcrebite, según dicen algunos, se mezcla con rock and roll. Hasta el emérito Papa (y en este caso hablo del “filósofo” también emérito de las juventudes Hitlerianas, no del de los Ghost) redactó en su día, cuando dirigía a los sucesores de la inquisición, una lista de grupos “blasfemos” (una lista muy mainstream, se dejó fuera a Mercyful Fate) algunos de los cuales sonarán a continuación. El podcast de este semana va de apariciones del infierno y su gobernante en temas de rock and roll, combinando varios puntos de vista: desde la socarrona y humorística visión de unos, a los que lo usan como elemento provocativo o a los que sienten verdadera devoción por los rabos y los cuernos, pasando por los que hacen una mera mención.

Por no perder la costumbre el programa estará alojado en Podomatic para streaming durante una semanas y en Mega para descarga directa forever and ever.

El listado de temas es el siguiente:

  • Venom – Welcome to Hell
  • Robert Johnson – Me and the Devil Blues
  • Rolling Stones – Sympathy for the Devil
  • Coven – Pact With Lucifer
  • Diamanda Galas – Let My People Go
  • Rory Gallagher – The Devil Made Me Do It
  • AC/DC – Hell ain’t a Bad Place to Be
  • Judas Priest – Saints in Hell
  • Black Sabbath – God is Dead
  • Mercyful Fate – Come to the Sabbath
  • Dantesco – I came from Hell
  • Iron Maiden – The Number of the Beast
  • Danzig – Left Hand Black
  • Reverend Bizarre – The Devil Ride’s Out
  • Halford – Made in Hell
  • Lordi – The Devil Is a Looser
  • Ghost – Year Zero

Clonar un disco duro .vdi de Virtual Box

Si bien cuando estudiaba hacíamos los clonados de disco en VirtualBox tal como se harían en una máquina real, tirando del Clonezilla, existe una forma más práctica de lograrlo.

En Windows la cosa es lanzar una consola de comandos (cmd) y situarnos en la carpeta en la que hubiéramos instalado VirtualBox. Una vez allí basta con usar el siguiente comando:

VBoxManage.exe clonehd ../rutadeldisclonar.vdi ../rutadelresultado.vdi 

Obviamente tenéis que cambiar ../rutadeldisclonar.vdi por la ruta real del disco .vdi que queréis clonar, y tres cuartos de lo mismo con ../rutadelresultado.vdi que es donde se creará el nuevo archivo.

En el caso de Linux la cosa es prácticamente igual: lanzáis el terminal, os ubicáis en la carpeta donde se instaló el VirtualBox y desde allí lanzáis

sudo VBoxManage clonehd ../rutadeldisclonar.vdi ../rutadelresultado.vdi 

Como antes, cambiando las rutas fictias por las que correspondan. Y listo, disco virtual clonado por si se os corrompe el que está en uso.

The Donnie Rock Radio Show 50: Especial veraniego/vacacional

Ante la previsible falta de tiempo mañana, que me pasaré el día entre autobuses tocará adelantar el podcast al sábado sin previo aviso (porque no lo había pensado antes, básicamente). Este Especial veraniego/vacacional es de esos programas de temática “etérea” basada en que estas canciones me sugieren tomarme una cervecita de terraceo, y na más (eche o que hai, Misae).

Como siempre el podcast estará disponible para descarga desde Mega y para streaming durante unas semanas en Podomatic.

El listado de temas es el siguiente:

  • Joe Cocker – Summer in the City
  • Sam Cooke – Win your love for Me
  • Maceo Parker – Funky Women
  • The Seatbelts – Tank!
  • Taj Mahal – Chevrolet
  • Ry Cooder – Vigilante Man
  • Seasick Steve – My Donny
  • Johnny Cash - Out Among The Stars
  • Pentangle – Play the Game
  • Mike Oldfield – To France
  • Steeleye Span – All Around My Hat
  • Flogging Molly – Seven Deadly Sins
  • Turbonegro – Monkey on my Back
  • Carburetors – Rock and Roll Forever
  • Supagroup – Hot Times
  • Lee Rocker – Rock this Town
  • Adam Bomb – Rock Like Fuck
  • Sam Bush and Bela Fleck – Stingray

Esteganografía en Linux sin instalar software adicional

Ya en el pasado hablamos de software para ocultar archivos dentro de otros (la llamada esteganografía) en Linux, como SilentEye o Outguess. Pero realmente es posible ocultar un archivo dentro de una imagen sin necesidad de software extra, valiéndonos sólo de la consola.

Lo primero es comprimir el archivo que queremos ocultar, mismamente con la herramienta nativa de compresión de Ubuntu lo transformamos en un archivo .zip (y si queréis un extra de seguridad podéis añadirle una contraseña). Para el ejemplo lo llamaremos secreto.zip mismamente.

Ahora necesitamos un archivo de imagen, para el ejemplo tendremos una que se llamará base.png, y lanzamos un terminal.

La idea es simple: concatenamos el archivo zip a continuación de la imagen generando un nuevo archivo que tendrá la misma extensión que la imagen base (si la extensión de la imagen fuera distinta no se verá, por ejemplo si usamos un png de base pero de salida lo llamamos .jpg). Rápidamente lo entenderéis con un ejemplo de la operación:

cat base.png secreto.zip > resultado.png

A primera vista el archivo resultado.png es la misma imagen que base.png, si bien si miráis sus propiedades veréis que tamaño del nuevo archivo es más grande (porque lleva concatenado el archivo comprimido, lógicamente).

¿Cómo accedemos al archivo oculto? Pues simplemente renombrando el archivo resultado.png y cambiando la extensión de la imagen por la del archivo comprimido que usáramos (en este caso pasaría a ser resultado.zip). Tras este cambio si la abrís con el gestor de archivos comprimidos podréis acceder al archivo que habéis ocultado.

Tal vez ofrezca menos seguridad y optimización que el software específico para esteganografía, pero para un apuro puede ser una solución válida.

Vídeo

Hasta la vista, señor Winter

Seguimos con las noticias y las tristes efemérides. Si ayer recordábamos el genio de Jon Lord, la clase del señor Purple, hoy nos toca decirle adiós a una de las leyendas de la guitarra bluesera. Hoy nos deja el gran Johnny Winter a la edad de 70 años. Hace unos años pude disfrutar de su música en un concierto en Pontevedra y ya se veía que su estado de salud era bastante precario. A pesar de eso se mantenía activo y girando constantemente, este mismo año se había pateado media Europa y tenía un disco en el horno. Pero esta mañana en Zurich decía adiós, sucumbiendo ante las dolencias que llevaba años combatiendo. Despidámonos con un recuerdo de su música.

Vídeo

Jon Lord: La clase del señor Purple.

Hace dos años el cáncer nos dejaba sin el enorme Jon Lord, uno de los superclase del rock and roll, pura elegancia tras su órgano Hammond. El mejor teclista que haya visto el rock and roll (apreciación totalmente personal pero que considero un axioma) como demostró con Deep Purple, Whitesnake y en sus diversos proyectos en solitario. Como decía un amigo mío, “el señor Purple”

Llamar a procedimientos almacenados en PHP

Una entrada que llevaba mucho tiempo en el TODO list, sobre trabajar con procedimientos almacenados con PHP.

Para empezar vamos a plantear un escenario en el que tenemos tres procedimientos almacenados en MySQL (dos selects y un insert) contra una tabla llamada productos, que tiene tres campos (id como clave primaria, descripcion con una descripción del producto, precio con un valor numérico decimal).

El SP de la primera select, que nos devuelve la descripción y el precio del producto según su id, sería este:

CREATE PROCEDURE getProducto(IN id_val INT) 
  BEGIN 
    SELECT descripcion, precio from productos WHERE id = id_val; 
  END;

El SP de la segunda select, que nos devuelve la descripción y el precio todos los productos, por lo que no recibe parámetros:

CREATE PROCEDURE getAllProductos() 
  BEGIN 
    SELECT descripcion, precio from productos ; 
  END;

Y el sp del insert sería este, al que le pasamos los tres valores a meter:

CREATE PROCEDURE addProducto(IN id_val INT,descripcion_in varchar(50), precio_in float) 
  BEGIN 
    INSERT INTO productos VALUES (id_val, descripcion_in, precio_in);
  END;

Bueno, ya tenemos nuestro escenario, entonces ¿cómo hacemos para llamar a estos procedimientos desde nuestro código php? Pues simplemente lanzamos una consulta en la que llamamos a la instrucción CALL de MySQL para que ejecute el procedimiento almacenado que le digamos con los parámetros que tocan.

/*Empezamos con el procedimiento de inserción*/
/*Lo primero es crear un objeto mysqli*/
$mysqli = new mysqli("servidor", "usuario", "pass", "db");

/*Y llamamos al procedimiento para hacer la inserción*/
/*Si falla imprimimos el error*/
if (!$mysqli->query("CALL addProducto(1001, 'Nueces de Macadamia', 12.23)")) {
    echo "Falló la llamada: (" . $mysqli->errno . ") " . $mysqli->error;
}

La propia función query del objeto mysqli nos devolverá TRUE si no viene con errores y FALSE si pasa algo inesperado.

¿Y qué pasa con la recuperación de datos? Ahí nos vamos a un terreno más pantanoso. Para una consulta con un solo resultado no es problema:

/*Empezamos con el procedimiento de recuperación de una fila*/
/*Lo primero es crear un objeto mysqli*/
$mysqli = new mysqli("servidor", "usuario", "pass", "db");

/*Y llamamos al procedimiento para recoger los datos*/
/*Si falla imprimimos el error*/
if (!($res = $mysqli->query("CALL getProducto(1001)"))) {
    echo "Falló la llamada: (" . $mysqli->errno . ") " . $mysqli->error;
}

/*E imprimimos el resultado para ver que el ejemplo ha funcionado*/
var_dump($res->fetch_assoc());

Pero claro, en este caso podemos hacerlo así porque esperamos un solo resultado, pero si esperamos varias filas la cosa es distinta ya que mysqli->query() devuelve sólo el primer conjunto de resultados. Tenemos dos alternativas para esta situación: mysqli_real_query() o mysqli_multi_query(). En el ejemplo usaremos la segunda, y veremos también la forma de recorrer este resultado:

/*Empezamos con el procedimiento de recuperación de una fila*/
/*Lo primero es crear un objeto mysqli*/
$mysqli = new mysqli("servidor", "usuario", "pass", "db");

/*Y llamamos al procedimiento para recoger los datos*/
/*Si falla imprimimos el error*/
if (!$mysqli->multi_query("CALL getAllProductos()")) {
    echo "Falló la llamada: (" . $mysqli->errno . ") " . $mysqli->error;
}

/*Ahora con este bucle recogemos los resultados y los recorremos*/
do {
    /*En el if recogemos una fila de la tabla*/
    if ($res = $mysqli->store_result()) { 
        /*Imprimimos el resultado de la fila y debajo un salto de línea*/
        var_dump($res->fetch_all());
        printf("\n");
        /*La llamada a free() no es obligatoria, pero si recomendable para aligerar memoria y para evitar problemas si después hacemos una llamada a otro procedimiento*/
        $res->free();
    } else {
        if ($mysqli->errno) {
            echo "Store failed: (" . $mysqli->errno . ") " . $mysqli->error;
        }
    }
} while ($mysqli->more_results() && $mysqli->next_result());
/*El bucle se ejecuta mientras haya más resultados y se pueda saltar al siguiente*/

Añadiré a esto que también es posible utilizar las llamadas a procedimientos almacenados usando sentencias preparadas, procediendo del modo habitual a la hora de pasar los parámetros.