Archivo categoría Programación
Cómo excluir archivos en respaldos de cPanel
Por Luis Gallardo - Off-Topic, Programación - 19/03/2012

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!
Reparar tablas de MySQL
Por Luis Gallardo - Programación - 12/01/2012
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
Conector MySql para OpenWrt (MIPS)
Por Luis Gallardo - Linux, Programación - 14/07/2011

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:
- Descarga el conector MySql para C (en este ejemplo uso la versión 6.0.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
- Instalar cmake. Si estás en Debian (o derivados) basta con hacer:
aptitude install cmake
- 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
- Generar el archivo Makefile:
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/ruta_de_instalacion
- Compilar el conector:
make
- Instalar los archivos binarios:
make install
- 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
Sentencias preparadas de MySQL en C (ejemplo completo)
Por Luis Gallardo - Programación - 23/06/2011
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
Compilación-cruzada (cross-compiling) de MIPS para OpenWrt
Por Luis Gallardo - Linux, Programación - 19/05/2011
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:
- Ubica la el toolchain para MIPS de OpenWrt. Desde el directorio donde descargaste OpenWrt ejecuta:
- Exporta las siguientes variables, teniendo en cuenta la ruta absoluta del toolchain (coloco el ejemplo de mi máquina):
- Luego para compilar proyectos con Makefile y autotools puedes ejecutar en el directorio de las fuentes de la aplicación:
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.
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
./configure --target=mips-openwrt-linux --host=mips-openwrt-linux
Referencia: Cross-compile for WRT
Instalación de Subclipse en Debian (y derivados)
Por Luis Gallardo - Linux, Programación - 27/02/2011
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:
- Abrir Eclipse, e ir a Help > Install New Software.
- 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
- Seleccionar todos los componentes mostrados: Core SVNkit Library, Optional JNA Library (recommended) y Subclipse.
- 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.
- 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:
- 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:
- La otra solución es hacer un enlace simbólico a la librería, esto es:
- Reiniciar Eclipse y verificar yendo a Preferences > Team > SVN, donde debe aparecer la versión de la librería.
-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
ln -s /usr/lib/jni/libsvnjavahl-1.so /usr/lib/
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:
Ya con esto podrás usar este cliente SVN en Eclipse!!
Herramientas de desarrollo de C/C++ para Eclipse en Debian
Por Luis Gallardo - Linux, Programación - 15/12/2010
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:
- Agrega los repositorios de Sid en el archivo /etc/apt/sources.list, por ejemplo:
- Actualiza el listado paquetes e instala el componente C/C++:
- 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:
- Acuatiza el listado paquetes una vez más:
deb ftp.us.debian.org/debian sid main contrib non-free
aptitude update aptitude install eclipse-cdt
#deb ftp.us.debian.org/debian sid main contrib non-free
aptitude update
Ahora podrás escribir código C/C++ desde Eclipse desde Debian como puedes apreciar en la imagen.
ps3split: script para picar archivos mayores a 4GB
Por Luis Gallardo - Linux, Programación, PS3 - 06/11/2010
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
- Indica la ruta del juego. Ejemplo:
- Esperar un rato (recuerda que son más de 4 GB lo que se está picando).
- Copia el directorio del juego en tu disco externo o pendrive USB y conéctalo a la PS3.
- 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.
./ps3split /home/lgallard/PS3/respaldos/BLUS30036
Referencias
Plugin Sociable hackeado para bit.ly
Por Luis Gallardo - Programación - 12/07/2010
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:
Empaquetenado código Python para Symbian
Por Luis Gallardo - Linux, Programación - 03/04/2010
Digamos que quieres empaquetar una aplicación Python para teléfonos Symbian de forma que puedas distribuir software en archivos de instalación .sis. ¿Cómo puedes hacerlo? Fácil, con ensymble.
Instalación de ensymble
En Debian puedes instalarlo desde los repositorios escribiendo:
aptitude install ensymble
Empaquetado de una aplicación
Si tienes un archivo llamado aplicacion.py y quieres convertirlo en un archivo de instalación .sis, solo escribe:
ensymble py2sis aplicacion.py
Empaquetado de directorios
Algunas veces necesitas empaquetar directorios para distribuir librerías. En este caso debes copiar la estructura de directorios que deseas en tu teléfono y copiar allí tus archivos. Por ejemplo, digamos que quieres hacer un archivo .sis para una librería Python que creaste, llamada milib donde los archivos configuraciones.py y red.py serán guardados:
mkdir MiLib/pyhon/lib/milib cp configuraciones.py MiLib/pyhon/lib/milib cp red.py MiLib/pyhon/lib/milib ensymble simplesis --caption="MiLib" --version=1.0.2 MiLib
Con la última orden terminarás con un archivo llamado MiLib_v1_0_2.sis. Este archivo instalará un directorio llamado E:\\Python\Lib\milib (o C:\\Python\Lib\milib dependiendo de donde lo instales) con tus dos archivos Python.







Planeta Linux
Sígueme