Archivo etiqueta Programación

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

,

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

2 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

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

Empaquetenado código Python para Symbian

PyS60

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.

,

2 Comentarios

Octave: una alternativa a MATLAB

sombrero

Siempre me había preguntado si existía una alternativa Software Libre a MATLAB para hacer algunas prácticas de laboratorio de la universidad, al estilo de las que puedes encontrarte en materias como procesamiento de señales y comunicaciones. Buscando en Internet me encontré con Octave, así que decidí probarlo y darle una oportunidad. Veamos cómo instalarlo, cómo luce y mis comentarios al respecto…

Instalando Octave

En Debian basta con instalar el siguiente paquete:

aptitude install qtoctave

Esto instala Octave como intérprete de órdenes, algunos de sus componentes y una interfaz gráfica Qt para usar Octave como haríamos con MATLAB. Si se requiere de otros componentes de Octave se pueden instalar de acuerdo a las necesidades de cada quien. En mi caso yo tuve que instalar el componente decominicaciones:

aptitude install octave-communications

Interfaz QtOctave

La interfaz gráfica permite, entre otras cosas, trabajar con el interprete de órdenes de Octave, ver el listado de variables, editar un archivo .m, y ver el histórico de órdenes; muy similar a como haríamos en MATLAB.

QtOctave

Edición de un archivo.m

En la imagen de arriba vemos un script hecho para la práctica de Comunicaciones II (Universidad Simón Bolívar, Caracas – Venezuela), en el cual se generan algunos códigos de línea para ver cómo lucen en tiempo, sus densidades espectral de potencia, cuán inmune son al ruido y sus patrones de ojo; usando las funciones proporcionadas por la profesora de la materia las cuales fueron hechas en MATLAB. Veamos las imágenes que pude generar:

Tiempo Frecuencia

Subplot Patron del Ojo

Compatibilidad con MATLAB

Aunque muchas de las órdenes y funciones de MATLAB son reconocidas, no todo está implementado igual o de hecho puede que no esté presente en Octave. Por ejemplo, tuve que editar el archivo scope.m para comentar la orden cla (clear current axes) y la declaración de las variables globales no funcionaron para las funciones en los cripts del Toolbox que me proporcionaron para la práctica. Si tienes algún problema con una orden o función de MATLAB puedes consultar el listado de compatibilidad Octave <-> MATLAB

Comentarios finales

A mí parecer Octave es una alternativa real a MATLAB. Pueden decir que no es tan completo como MATLAB…si, es cierto, pero quién usa MATLAB al 100%?  Por otro lado, creo que esta sería una opción para erradicar las malas costumbres de otros sistemas operativos y malos hábitos como comprar licencias privativas que, aunque me consta que en los laboratorios de la universidad tienen sus licencias 100% legales, al final los estudiantes siempre terminan adquiriendo el software pirata para poder hacer sus prácticas en casa.

¿Se pueden adaptar estos laboratorios a Octave? Yo creo que si. Incluso los estudiantes de post-grado podrían crear código (ejemplo fft6) para contribuir con el proyecto Octave aumentando las librerías de funciones…Por mi parte, voy a comunicarle mis hallazgos a mi profesora a ver qué opina!

,

6 Comentarios

Clases y Objetos en PHP

blocksAntes de comenzar a trabajar con clases y objetos, debemos conocer primero la diferencia entre la programación tradicional y la programación orientada a objetos (POO). En la programación tradicional los problemas son resueltos ejecutando una acción tras otra, en otras palabras, escribes un programa donde las acciones son ejecutadas una por una para resolver un problema.

Por ejemplo, si deseas sumar dos números en PHP, basta con el siguiente código:

<?
// Define dos numeros
$a = 2;
$b = 3;
// Suma ambos numeros
$c = $a + $b;
echo "a+b=".$c;
?>

Leer el resto de la entrada »

,

4 Comentarios

Respaldo completo en cPanel

logo_cpanelAyer tuve algunos problemas con la actualización de WordPress 2.8 y, supuestamente, qtranslate (un plugin para soportar varios lenguajes). El asunto es que pude restablecer WordPress 2.7.1 de un respaldo antiguo, pero me di cuenta que databa de hace un mes…malo, malo. Decidí investigar sobre respaldos automáticos con cPanel y me encontré con la entrada Automatic cPanel backup (domain & MySQL) with cron & PHP de Justin Cook. Allí hay un script para ejecutar la petición de respaldos completos de cPanel con redirección a un servidor ftp en una máquina remota. Debido a que no tengo un servidor ftp, cambié unas líneas para hacer respaldos localmente, de forma que pueda obtener esos respaldos desde la herramienta de respaldos completos de cPanel. Aquí está lo que hice:

PHP Script

<?php
// Info required for cPanel access
$cpuser = "username";
$cppass = "password";
$domain = "example.com";
$skin = "x3";

// Notification information
$notifyemail = "[email protected]";

// Secure or non-secure mode
$secure = 1;

// Set to 1 to have web page result appear in your cron log
$debug = 0;

// ** NO EDIT BELOW THIS LINE ***

if ($secure) {
   $url = "ssl://".$domain;
   $port = 2083;
} else {
   $url = $domain;
   $port = 2082;
}

$socket = fsockopen($url,$port);

if (!$socket) {
   echo "Failed to open socket connection… Bailing out!\n"; exit;
}

// Encode authentication string
$authstr = $cpuser.":".$cppass;
$pass = base64_encode($authstr);

$params = \
"dest=homedir&email=$notifyemail&server=&user=&pass=&port=&rdir=";

// Make POST to cPanel
fputs($socket,\
"POST /frontend/".$skin."/backup/dofullbackup.html?".$params." HTTP/1.0\r\n");
fputs($socket,"Host: $domain\r\n");
fputs($socket,"Authorization: Basic $pass\r\n");
fputs($socket,"Connection: Close\r\n");
fputs($socket,"\r\n");

// Grab response even if we don't do anything with it.
while (!feof($socket)) {

$response = fgets($socket,4096);

if ($debug) echo $response;
}
fclose($socket);
?>

Puedes descargar este ejemplo aquí

Cron jobs

Para tener un respaldo cada 15 días guarda el script de arriba como fullbackup.php y configura el cron en la herramienta de administración de cPanel como se muestra a continuación:

cron-cpanel-web

Referencias

,

12 Comentarios

Curso de programación HP48

HP-Program

Hace un tiempo subí un curso de programación para las calculadoras HP-48g / HP 48gx. El asunto es que perdí la contraseña en ese servidor (angelfire) y no lo pude actualizar más. Así que es tiempo de recuperar lo que es mio: voy a poner el curso completo aquí con más ejemplos y, de ser posible, mejor explicado.

Vamos a comenzar de nuevo…

¿Qué es un programa?

Todo lo que esté entre los caracteres << >> es tomado como un programa. Por ejemplo, puedes escribir esto en la calculadora:

<< 1 2 + >>

Este programa pone en la pila de la HP los números 1 y 2, y finalmente los suma. Para editar cualquier programa en el modo USER-RPL solo colóquelo en la pila y pulse “EDIT”. Para guardarlo colóquelo en la pila, luego coloque un nombre y presione el botón “STO” (también puede escribirlo). Aquí está el ejemplo:

3: << 1 2 + >>
2: ‘Nombre’
1: STO

Esto por ahora. En la próxima entrega cubriré la definición de variables…

,

7 Comentarios

Agregando subtítulos a archivos avi

Subtítulos

En artículos anteriores vimos formas de convertir videos ogv en archivos de  formato avi desde la consola, y luego nos concentramos en ver  cómo integrar esta conversión con Nautilus, el navegador de archivos de Gnome. Ahora veremos cómo agregar subtítulos a los archivos de video .avi a partir de archivos de texto .srt. Para ello usaremos el comando mencoder con la opción -sub, como vemos en el ejemplo siguiente:

mencoder archivo.avi \
-ovc lavc -oac mp3lame \
-sub archivo.srt \
-font “/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf” -subfont-autoscale 2 \
-o archivo-sub.avi

En este ejemplo mencoder toma como entrada el “archivo.avi”, codifica el video con lavc (mpeg4) y el audio con mp3lame (mp3), le pega los subtítulos contenidos en “archivo.srt”, usa el estilo de fuentes DejaVuSans, escala los subtítulos al ancho del video, y finalmente lo guarda en “archivo-sub.avi”.

Leer el resto de la entrada »

,

4 Comentarios