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.

The Donnie Rock Radio Show 49: Defuntiños do Rock and Roll

Un tema tópico el de muertos del rock (o defuntiños, que es un término más cariñoso que usamos en Galicia) pero tenía que caer algún día, como el de “ocultismo y satanismo en el rock and roll” que caerá también un día de estos.

Como siempre el programa estará disponible para descarga directa en Mega y para streaming en Podomatic. La lista de temas es la siguiente:

  • Thin Lizzy – Are you Ready
  • Deep Purple – Gettin’ Tighter
  • Rainbow – The Gates of Babylon
  • Lynyrd Skynyrd – Tuesday’s Gone
  • The Allman Brothers Band – It’s not my Cross to Bear
  • The Doors – Waiting for the Sun
  • Jimi Hendrix – Purple Haze
  • The Beatles – I am the Walrus
  • The Who – Mama’s Got a Squeezebox
  • Led Zeppelin – Living Loving Maid (She’s Just a Woman)
  • Rory Gallagher – Shin Kicker
  • Stevie Ray Vaughan – Scuttle Buttin’
  • Gary Moore - Rockin’ Everynight
  • Riff – La Espada Sagrada
  • Savatage – Tonight He Grins Again
  • Ozzy – Over the Mountain
  • AC/DC – Bad Boy Boogie
  • Queen – Show Must go On