Archivo categoría Programación

Cómo excluir archivos en respaldos de cPanel

cPanel Backups

Con la caída de Megaupload, todos los archivos que tenía alojados allí (todos legales, por cierto) tuve que empezarlos a servir desde mi hosting. Esto me acarreó un problema extra, ya que los respaldos de mi blog pasaron de 60 MB a 3 GB. Como tengo automatizado el respaldo con cPanel, y dado que no veía ninguna opción para excluir archivos y carpetas, me disponía a hacer yo todo el trabajo del respaldo, es decir, usar el cliente MySQL para las base de datos, generar el comprimido por mi cuenta con los archivos importantes, crear la tarea programa, etc…pero viendo en los archivos de mi directorio home me encuentro con uno de nombre cpbackup-exclude.conf. Investigando un poco, efectivamente este archivo permite excluir archivos y directorios al momento de hacer respaldos completo en cPanel. Basta con crear el archivo en el directorio del usuario y especificar las rutas de los archivos y directorios a excluir. Pero su formato es algo truculento, así que veamos el que yo edité para mi blog:

public_html/wp-content/uploads/*
backup-*
tmp/*

La primera línea indica que no respalde los archivos que están en el directorio  public_html/wp-content/uploads, relativos a mi cuenta de usuario. Noten que finaliza con el comodín *, el cual debe colocarse o de lo contrario no se interpreta correctamente, aun y cuando se coloque la ruta del directorio. Luego la segunda línea indica que todos los archivos que comiencen en “backup-” no deben respaldarse, es decir, no quiero hacer un respaldo de los respaldos. Para finalizar, la última línea indica que no se respalden los archivos temporales alojados en el directorio tmp de mi cuenta de usuario.

Luego de hacer esto, el respaldo pasó de 3 GB a 20 MB de espacio…mucho más manejable!


2 Comentarios

Reparar tablas de MySQL

MySQL fix

Si por alguna razón se llegan a encontrar con un mensaje como el siguiente al consultar una tabla:

mysql> select * from data_values_queued;
ERROR 1194 (HY000): Table 'data_values_queued' is marked as crashed and should be repaired

La forma de ver y reparar el problema es la siguiente.

CHECK TABLE

Primero se procede a verificar la tabla, para determinar el problema:

mysql> check table data_values_queued;
+----------------------------+-------+----------+----------------------------------------------------------+
| Table                      | Op    | Msg_type | Msg_text                                                 |
+----------------------------+-------+----------+----------------------------------------------------------+
| datbas1.data_values_queued | check | warning  | 4 clients are using or haven't closed the table properly |
| datbas1.data_values_queued | check | error    | Size of datafile is: 4200         Should be: 4220        |
| datbas1.data_values_queued | check | error    | Corrupt                                                  |
+----------------------------+-------+----------+----------------------------------------------------------+
3 rows in set (0.05 sec)

Aquí vemos que la tabla no fue cerrada adecuadamente, por ejemplo producto de un apagón. En mi caso descarto el primer mensaje porque el motor que uso es InnoDB, el cual permite concurrencia en las tablas.

REPAIR TABLE

Ahora para reparar la tabla se puede usar la siguiente sentencia:

mysql> repair table data_values_queued ;
+----------------------------+--------+----------+----------------------------------------+
| Table                      | Op     | Msg_type | Msg_text                               |
+----------------------------+--------+----------+----------------------------------------+
| datbas1.data_values_queued | repair | warning  | Number of rows changed from 144 to 143 |
| datbas1.data_values_queued | repair | status   | OK                                     |
+----------------------------+--------+----------+----------------------------------------+
2 rows in set (0.00 sec)

 

Ya con esto habremos reparado la tabla. Veamos si es así:

mysql> select * from data_values_queued;
+---------+--------+----------+---------------------+
| id      | iodbId | value    | timestamp           |
+---------+--------+----------+---------------------+
| 1476194 |    170 | 297      | 2012-01-11 08:40:45 |
| 1476193 |    170 | 296      | 2012-01-11 08:40:17 |
| 1476176 |     71 | 11692    | 2012-01-11 05:06:46 |
| 1476177 |     72 | 12061    | 2012-01-11 05:06:46 |
| 1476178 |     73 | 11820    | 2012-01-11 05:06:46 |
| 1476179 |    107 | 11703    | 2012-01-11 05:06:46 |
...
| 1476258 |    170 | 282      | 2012-01-11 11:07:43 |
+---------+--------+----------+---------------------+
143 rows in set (0.00 sec)

Referencias

,

4 Comentarios

Conector MySql para OpenWrt (MIPS)


Si estás interesado en desarrollar aplicaciones en C usando MySQL en OpenWrt bajo MIPS, necesitarás el conector respectivo para poder comunicarte con la base de datos. En la página de MySQL solo encontrarás los conectores compilados para x86 y las fuentes por si deseas compilarlo por tu cuenta para x86 y otras arquitecturas. Este es el que usaremos para poder compilar para MIPS el conector de MySQL. Veamos como hacerlo:

  1. Descarga el conector MySql para C (en este ejemplo uso la versión 6.0.2).
  2. Descomprimir el archivo descargado y entrar en el directorio mysql-connector-c-6.0.2:
    tar xvzf mysql-connector-c-6.0.2.tar.gz
    cd mysql-connector-c-6.0.2
  3. Instalar cmake. Si estás en Debian (o derivados) basta con hacer:
     aptitude install cmake
  4. Configurar el ambiente para cross-compilar para MIPS, exportando las siguientes variables:
    export CHROOT=/home/lgallard/backfire
    export TOOLCHAIN_PATH=$CHROOT/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1
    export PATH=$PATH:$TOOLCHAIN_PATH/usr/bin/
    export AR=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ar
    export AS=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-as
    export LD=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ld
    export NM=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-nm
    export CC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CPP=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-cpp
    export GCC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CXX=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-g++
    export RANLIB=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ranlib
  5. Generar el archivo Makefile:
    cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/ruta_de_instalacion
  6. Compilar el conector:
    make
  7. Instalar los archivos binarios:
    make install
  8. Verificar que se haya compilado correctamente para MIPS:
    file /ruta_de_instalacion/lib/libmysql.so.16.0.0
    
    /ruta_de_instalacion/lib/libmysql.so.16.0.0: ELF 32-bit MSB shared object, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, with unknown capability 0x41000000 = 0xf676e75, with unknown capability 0x10000 = 0x70403, not stripped

Uso del conector

Ahora ya podrás usar el conector en tus proyectos de C y  Mysql en OpenWrt para MIPS, solo basta agregar las rutas de los includes y la librerías de la siguiente forma:

gcc cliente.c -o cliente  -I/ruta_de_instalacion/include -L/ruta_de_instalacion/lib -lmysqlclient -lz -ldl

Aprender el API

Si estás interesado en aprender el API, te recomiendo el libro de MySQL Developer’s Library de Paul DuBois el cual tiene un ejemplo muy bueno de cómo hacer sentencias preparadas usando el conector de C para MySQL en el capítulo 7.

Recursos

,

2 Comentarios

Sentencias preparadas de MySQL en C (ejemplo completo)

MySql logo

En el trabajo me tocó hacer una interfaz a una base de datos MySQL desde C puro, y buscando en Internet di con el libro de MySQL Developer’s Library de Paul DuBois el cual tiene un ejemplo muy bueno de cómo hacer sentencias preparadas usando el conector de C de MySQL en el capítulo 7. Y aunque en el libro explica como ejecutar una sentencia SQL teniendo parámetros preparados (preapared statements) para luego explicar como obtener los datos de la consulta, al final no se ve todo en conjunto por lo que me dispuse a colocar un ejemplo completo:

void iodb_getNumAddresses(int id, int *numAddresses){

 MYSQL *conn;
 MYSQL_STMT *stmt;
 char *sql;

 // Bind variables
 MYSQL_BIND param[1], result[1];

 int myId, myNumAddresses;
 my_bool is_null[1];

 sql = "select count(*) from addresses where id = ?";

 // Open Database
 openDB(&conn);

 // Allocate statement handler
 stmt = mysql_stmt_init(conn);

 if (stmt == NULL) {
  print_error(conn, "Could not initialize statement handler");
  return;
 }

 // Prepare the statement
 if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) {
  print_stmt_error(stmt, "Could not prepare statement");
  return;
 }

 // Initialize the result column structures
 memset (param, 0, sizeof (param)); /* zero the structures */
 memset (result, 0, sizeof (result)); /* zero the structures */

 // Init param structure
 // Select
 param[0].buffer_type     = MYSQL_TYPE_LONG;
 param[0].buffer         = (void *) &myId;
 param[0].is_unsigned    = 0;
 param[0].is_null         = 0;
 param[0].length         = 0;

 // Result
 result[0].buffer_type     = MYSQL_TYPE_LONG;
 result[0].buffer         = (void *) &myNumAddresses;
 result[0].is_unsigned    = 0;
 result[0].is_null         = &is_null[0];
 result[0].length         = 0;

 // Bind param structure to statement
 if (mysql_stmt_bind_param(stmt, param) != 0) {
  print_stmt_error(stmt, "Could not bind parameters");
  return;
 }

 // Bind result
 if (mysql_stmt_bind_result(stmt, result) != 0) {
  print_stmt_error(stmt, "Could not bind results");
  return;
 }

 // Set bind parameters
 myId            = id;

 // Execute!!
 if (mysql_stmt_execute(stmt) != 0) {
  print_stmt_error(stmt, "Could not execute statement");
  return;
 }

 if (mysql_stmt_store_result(stmt) != 0) {
  print_stmt_error(stmt, "Could not buffer result set");
  return;
 }

 // Init data
 (*numAddresses) = 0;

 // Fetch
 if(mysql_stmt_fetch (stmt) == 0){
  (*numAddresses) = myNumAddresses;
 }

 // Deallocate result set
 mysql_stmt_free_result(stmt); /* deallocate result set */

 // Close the statement
 mysql_stmt_close(stmt);

 // Close Database
 closeDB(conn);

}

Aquí lo importante a resaltar es que se tiene dos estructuras especiales del API MySQL, param y result, las cuales configuran los parámetros que usará la sentencia preparada así como el sitio donde se guardarán los resultados, respectivamente. En este ejemplo, al hacer la consulta se tendrá el valor en la variable numAddresses.

Referencias

4 Comentarios

Compilación-cruzada (cross-compiling) de MIPS para OpenWrt

MIPS-OpenWrt

Si por alguna razón necesitas cross-compilar alguna aplicación para la arquitectura MIPS que correrá en OpenWrt sin usar la herramienta de compilación proporcionada por el proyecto, puedes seguir estos pasos:

  1. Ubica la el toolchain para MIPS de OpenWrt. Desde el directorio donde descargaste OpenWrt ejecuta:
  2. find -name *toolchain-mips*
    ./staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1

    Nota: Se debió haber compilado algo previamente bajo esta arquitectura para poder disponer del toolchain.

  3. Exporta las siguientes variables, teniendo en cuenta la ruta absoluta del toolchain (coloco el ejemplo de mi máquina):
  4. export TOOLCHAIN_PATH=/home/lgallard/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1
    export PATH=$PATH:$TOOLCHAIN_PATH/usr/bin/
    export AR=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ar
    export AS=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-as
    export LD=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ld
    export NM=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-nm
    export CC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CPP=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-cpp
    export GCC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc
    export CXX=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-g++
    export RANLIB=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ranlib
  5. Luego para compilar proyectos con Makefile y autotools puedes ejecutar en el directorio de las fuentes de la aplicación:
  6. ./configure --target=mips-openwrt-linux --host=mips-openwrt-linux

Referencia: Cross-compile for WRT

,

12 Comentarios

Instalación de Subclipse en Debian (y derivados)

 


Enlace al video

Si estás interesado en instalar Subclipse como cliente SVN para Eclipse, puedes seguir de forma general los pasos explicados a continuación, los cuales son independiente del sistema operativo y serán válidos para Windows, Mac o Linux, salvo el procedimiento de cómo instalar y configurar la librería JavaHL en Debian (y derivados como Ubuntu).

Instalación de Subclipse:

De forma general, estos son los pasos para instalar Subclipse en Eclipse:

  1. Abrir Eclipse, e ir a Help > Install New Software.
  2. Agregar el url de Subclipse para la versión de Eclipse que se tenga. Por ejemplo, para Galileo se debe agregar http://subclipse.tigris.org/update_1.6.x
  3. Seleccionar todos los componentes mostrados: Core SVNkit Library, Optional JNA Library (recommended) y Subclipse.
  4. Aceptar el acuerdo de licencia para iniciar la instalación. Casi finalizando la instalación nos aparecerá un mensaje advirtiendo que se instalará software no firmado, aquí aceptamos.
  5. Al finalizar nos pedirá reiniciar Eclipse.

Librería JavaHL en Debian

Sino quieres usar la librería SVNKit sino JavaHL entonces debes instalar el siguiente paquete:

 aptitude install libsvn-java

Luego se tienen dos alternativas para indicarle a Eclipse la existencia de dicha librería:

  1. Lo correcto es tratar de hacer que Eclipse lea el archivo de configuración con la ruta a la librería JavaHL. Yo la verdad no he logrado dar con el archivo eclipse.ini para el usuario, solo el archivo general /etc/eclipse.ini. Allí como root se puede puede agregar la línea mostrada en negritas, quedando algo como esto:
  2. -startup
    plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
    --launcher.library
    plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.0.200.v20090520
    -showsplash
    org.eclipse.platform
    --launcher.XXMaxPermSize
    256m
    -vmargs
    -Djava.library.path=/usr/lib/jni
    -Xms128m
    -Xmx512m
  3. La otra solución es hacer un enlace simbólico a la librería, esto es:
  4. ln -s /usr/lib/jni/libsvnjavahl-1.so /usr/lib/
  5. Reiniciar Eclipse y verificar yendo a Preferences > Team > SVN, donde debe aparecer la versión de la librería.

Librería SVNKit

Con la instalación al principio se descargó la librería SVNKit, la cual puede usarse en sustitución de JavaHL, sin necesidad de configurar ningún archivo adicional de inicialización y con la ventaja de ser multiplataforma, es decir, que en Windows y Mac también servirá. Para esto solo hay que ir a Window> Preferences > Team > SVN y seleccionar en la interfaz SVN a usar la opción que diga SVNKit:

SVNKit

Ya con esto podrás usar este cliente SVN en Eclipse!!

, ,

6 Comentarios

El Blog de Luis ahora con soporte a Smartphones (Android, Apple, y otros)

WPTouch OK

En vista de que he estado escribiendo artículos relacionados con Android y viendo algunos sitios en Internet, decidí investigar y actualizar el blog para ofrecer la versión mobile para smartphones. Basta con instalar el plugin WPtouch desde el administrador de plugins y ya tendremos el soporte.

WPTouch y qTranslate

Si tu sitio soporta más de un idioma y usas qTranslate, desde la versión 1.9.10 WPTouch se integra con este plugin en en su forma muy básica, es decir solo los enlaces a los artículos. Si se tiene configurado otros aspectos del sitio, entonces toca modificar el código.

WPTouch mal

Por ejemplo, yo tengo configurado el título del blog en dos idiomas, y para que reconozca el título correctamente tuve que editar el archivo ../wptouch/themes/core/core-functions.php, en la línea 122 de la siguiente forma:

function wptouch_core_body_sitetitle() {
 $str = bnc_get_header_title();
 echo __(stripslashes($str));

 }

Es decir, agregar la llamada __( ) como explican en el foro de qTranslate

Referencias

,

2 Comentarios

Herramientas de desarrollo de C/C++ para Eclipse en Debian

C/C++ for Eclipse on Debian

Si te gusta Eclipse y quieres programar en C o en C++ en Linux tienes la opción de descargar desde la página del proyecto las herramientas de desarrollo de C/C++,  o si eres como yo que me gusta tener todo (o casi todo) instalado desde los repositorios de Debian, puedes hacer lo siguiente:

  1. Agrega los repositorios de Sid en el archivo /etc/apt/sources.list, por ejemplo:
  2. deb ftp.us.debian.org/debian sid main contrib non-free
  3. Actualiza el listado paquetes e instala el componente C/C++:
  4. aptitude update
    aptitude install eclipse-cdt
  5. Una vez que hayas terminado de instalar el componente, y para que no instales más nada de Sid (hay que recordar que es la rama inestable de Debian),  deshaz el cambio del archivo /etc/apt/sources.list:
  6. #deb ftp.us.debian.org/debian sid main contrib non-free
  7. Acuatiza el listado paquetes una vez más:
  8. aptitude update

Ahora podrás escribir  código C/C++ desde Eclipse desde Debian como puedes apreciar en la imagen.

, ,

No hay Comentarios

ps3split: script para picar archivos mayores a 4GB

Si al momento de respaldar tus juegos  de PS3, (por ejemplo en una PS3 con Linux o con alguna lectora de Bluray externa,) e intentas copiarlos a un disco externo o directamente a la PS3 vía FTP, no podrás hacerlo por la limitante del sistema de archivos FAT32 (la PS3 no reconoce NTFS). Una solución es volverlos a rippear con Open Manager, pero si aun quieres aprovechar ese respaldo puedes usar este script que hice especial para Open Manager:

#!/bin/sh
find $1 -size +4G -execdir sh -c 'echo "Spliting file: $@";\
 split -b 4000m -d -a 2 "$@" "$@.666";\
 rm "$@"' ps3-split {} +
echo "Finished!!"

Copia este script en un archivo de nombre ps3split, o descargalo directamente aquí. Recuerda que debes darle los permisos adecuados para que se ejecute:

chmod +x ps3split

Modo de uso

  1. Indica la ruta del juego. Ejemplo:
  2. ./ps3split /home/lgallard/PS3/respaldos/BLUS30036
  3. Esperar un rato (recuerda que son más de 4 GB lo que se está picando).
  4. Copia el directorio del juego en tu disco externo o pendrive USB y conéctalo a la PS3.
  5. En la PS3 ejecuta Open Manager y copia el juego en el disco duro de la PS3. Open Manager automágicamente corregirá el juego en cuestión.

Referencias

,

12 Comentarios

Plugin Sociable hackeado para bit.ly

Sociable WordPress Plugin

Estuve probando varios plugins para que los usuarios del blog puedan compartir las entradas en las redes sociales como Twitter o Facebook y el que más me gustó fue Sociable. Pero al probar con Twitter y con Identi.ca me di cuenta que utiliza awe.sw como herramienta para acortar el URL, pero el servicio está colapsado y no están dando invitaciones. De esta forma me puse a investigar maneras de hacerlo funcionar con Bit.ly y me encontré con un artículo que describe exactamente lo que quería, sin embargo el código usa la función file_get_contents, la cual arroja el siguiente error en mi servidor:

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in /home/g/gallardo/web/wp-content/plugins/sociable/sociable.php on line 813

Que es el resultado de no tener activa la variable allow_url_fopen habilitada en PHP. Después de consultar con mi proveedor de hosting, me aconsejaron que usará cURL en vez de file_get_contents, por lo que tuve que hacer algunas modificaciones al archivo sociable.php, y agregar el archivo sociable-bitly.php que es donde se acorta los URLs con cURL.

Ambos archivos los coloqué en un zip sociable.3.5.2-hacked.zip por si alguien necesita usarlo. Pero ojo,  que no es el plugin completo sino son únicamente estos archivos para copiar en la carpeta /sociable del plugin oficial. Otro detalle es que se debe editar el archivo sociable-bitly.php para colocar el login y el API Key de Bit.ly en las siguientes líneas:

$bitlylogin = 'yourbitlylogin';
$bitlyapikey= 'yourbitlyapikey';

Se podría hacer más cosas con este plugin, como por ejemplo quitar por completo el código de awe.sw, crear los campos de entrada para Bit.ly en el panel de administración, o integrarlo con tinyurl. Esperemos que la próxima versión oficial tenga algunos de estos cambios.

Referencias:

,

2 Comentarios