Archivo para Agosto 2007
BlogDay 2007
Se dice, se comenta, que hoy es del día del blog o BlogDay 2007. Nunca fui muy propenso a participar de estas ocasiones, pero viendo que con motivo de este día tan “especial” se propone la recomendación de los 5 blogs que consideres más útiles e interesantes, aquí quedan los míos:
- SigT
- aNieto2k
- Malaprensa
- Think Wasabi (por desgracia recién cerrado aunque sigue online)
Y como no tengo un quinto blog claro, pues recomiendo varios: No puedo creer que lo hayan inventado, Maestros del web y Emezeta.
Unas buenas lecturas para el fin de semana
Diferencia entre los operadores “==” y “===”
Algunas funciones en PHP pueden devolver, además de un valor booleano, un valor que se evalúe a false. Por ejemplo, la función strpos:
[php]
$string = “cadena de texto”;
$buscar = “cad”;
$posicion = strpos($string, $buscar);
if ($posicion == false)
echo “No se ha encontrado”;
[/php]
En este caso la variable posicion contendrá el valor 0, pues la primera ocurrencia de la cadena buscada se produce en la primera posición; es decir, algo totalmente diferente a false pero que en la condición siguiente se evaluaría como si se tratase de esto último.
Para evitar estas situaciones PHP nos proporciona otro operador de igualdad, ===. Así, == evalúa el valor de las variables y los compara, a diferencia del operador === que comprueba que ambas variables comparadas sean del mismo tipo (y tengan el mismo valor, por supuesto).
Si sustituimos en el ejemplo anterior el operador, no se mostraría ningún mensaje por pantalla.
Enviar un formulario con JavaScript
Un truco muy útil y sencillo para enviar datos por POST a través de un simple enlace es “camuflar” un formulario oculto que se envíe al pinchar sobre el link. Por ejemplo, éste sería el formulario:
[html]
[/html]
Como vemos no hay botón de envío, ¿cómo lo hacemos entonces? Utilizando la función submit que nos proporciona JavaScript para los formularios:
[html]
Enviar
[/html]
Esta solución a mí no me ha funcionado en Firefox 2, así que otra posibilidad muy similar es:
[html]
Enviar
[/html]
Insertar datos de una tabla en otra
En ocasiones puede resultarnos útil insertar datos de una tabla en otra, por ejemplo para testear una aplicación con un subconjunto de datos reales pero en una tabla diferente para no afectar al funcionamiento normal.
Para hacerlo hay varias formas, la primera es válida tanto para MySQL como para SQL Server:
[sql]
INSERT INTO tabla2
SELECT *
FROM tabla
[/sql]
Por supuesto podemos añadir cláusulas WHERE de modo que sólo insertemos datos específicos, como si fuera una consulta normal (de hecho es una consulta normal).
La segunda técnica, parecida a ésta, es propia de SQL Server:
[sql]
SELECT *
INTO tabla2
FROM tabla
[/sql]
La diferencia estriba en que este último caso se utiliza cuando no existe la tabla a la que volcaremos los datos, la cual es creada con la sentencia.
jQuery 1.1.4, rumbo a la 1.2
Hoy ha sido liberada una nueva versión de esta librería JavaScript (sin duda mi preferida), la 1.1.4, la cual será por cierto la última de la rama 1.1.X. La siguiente será la esperada versión 1.2, que verá la luz allá por el mes de septiembre.
Como en cada actualización, jQuery mejora el rendimiento, en esta ocasión en los selectores por “id” (¡hasta un 5000% en Firefox 2!) y por etiqueta “name”, además de los bucles each. Todo ello sin aumentar su reducido tamaño, que se queda en los 21Kb una vez comprimido el js.
Por supuesto también se han corregido errores e incorporado novedades, entre las que destaca la posibilidad de renombrar el namespace (gracias a .noConflict()) y el atajo “$”:
[javascript]
// Give jQuery a custom name:
var jq = jQuery.noConflict(true);
jq(“#id div”).hide();
// Both Fail – $ and jQuery have been renamed:
$(“#id div”).hide();
jQuery(“#id div”).hide();
[/javascript]
Técnicas CSS3 que estoy deseando que lleguen a mis manos
Técnicas CSS3 que estoy deseando que lleguen a mis manos. Andrés Nieto nos hace una pequeña introducción a varias técnicas nuevas que vendrán en CSS3, algunas de las cuales ya están disponibles en Firefox 1.5 y superiores.
Inserción de datos eficiente en MySQL
De vez en cuando hacemos inserciones que implican cientos (e incluso miles) de filas en un corto espacio de tiempo, por ejemplo al importar datos de una fuente externa. Cuando esto ocurre el rendimiento puede verse muy mermado, y para evitarlo enumero a continuación algunas posibles optimizaciones a tener en cuenta.
Si insertamos los datos de una sola vez:
- Si es posible, usar LOAD DATA INFILE. Esto proporciona beneficios en cuanto al rendimiento reduciendo la cantidad de trabajo a realizar por cliente y servidor al preparar los datos para su inserción en la tabla.
- Desactivar temporalmente la creación de índices al insertar grandes cantidades de datos. Esto permite la creación de los índices de la tabla de forma más eficiente después de que la información esté ya en la tabla. Para ello utilizaremos la sentencia ALTER TABLE:
[sql]
ALTER TABLE tabla DISABLE KEYS;
# Sentencias de insercion
ALTER TABLE tabla ENABLE KEYS;
[/sql] - Para las tablas MyISAM, bloquear la tabla mientras se insertan los datos para prevenir lecturas que puedan enlentecer las escrituras. Tal y como vemos a continuación:
[sql]
LOCK TABLES tabla WRITE;
# Sentencias de inserción
UNLOCK TABLES;
[/sql] - En el caso de InnoDB, realizaremos las inserciones dentro de una transacción:
[sql]
BEGIN;
# Sentencias de inserción
COMMIT;
[/sql] - Usar INSERTs multifila. Este tipo de sentencias reducen la cantidad de trabajo que tanto cliente como servidor deben hacer para procesar una consulta antes de que los datos sean escritos en la tabla. Así:
[sql]
INSERT INTO tabla (a,b,c) VALUES (1,2,3), (4,5,6), (7,8,9);
[/sql] -
Si la tabla en la que insertamos no está vacía, podemos modificar la variable de sistema
bulk_insert_buffer_size.
En el caso de que entre las inserciones se produzcan lecturas, podemos llevar a cabo las siguientes optimizaciones:
- En MyISAM, activar la opción DELAY_KEY_WRITE. Esto reduce las escrituras a disco que MySQL hace cuando crea nuevas entradas en el índice de la tabla. Se realiza con una sentencia ALTER TABLE:
[sql]
ALTER TABLE tabla DELAY_KEY_WRITE = 1;
[/sql]Ojo: si el servidor cae, las tablas que tengan la opción DELAY_KEY_WRITE activada pueden tener índices incompletos. Para asegurarnos de que los índices estén completos, cuando volvamos a lanzar el servidor lo haremos con la coletilla
--myisam-recover=BACKUP,FORCE. - Usar InnoDB. Este tipo de tablas manejan mucho mejor que MyISAM las lecturas y escrituras concurrentes.
- No escribir desde la tabla de la que se está leyendo. Es mejor crear una tabla adicional para manejar las escrituras y después fusionar las filas desde la tabla de escrituras en la tabla de lectura a intervalos regulares.
Ciclo de vida de una página ASP.NET
Cuando se carga una página ASP.NET, ésta recorre durante su ejecución un ciclo de vida que pasa por distintas fases de procesamiento. Es muy importante conocerlas para escribir el código en el sitio adecuado para conseguir lo que deseamos. Esto lo conseguimos gracias a los eventos que se disparan en dichas fases, que son:
- PreInit
- Init
- InitComplete
- PreLoad
- Load
- Eventos de control
- LoadComplete
- PreRender
- SaveStateComplete
- Render
- Unload
Así, por ejemplo, podemos usar Page_Load para hacer procesamientos previos a la visualización de la página, como la conexión a la base de datos o establecer las propiedades de los controles.
Un tema tan importante es mejor conocerlo a fondo.
Backups con mysqldump
Una herramienta muy interesante en el lado cliente de MySQL es mysqldump, la cual nos servirá para realizar backups de nuestras bases de datos pudiendo exportarlas, por ejemplo, a un fichero de texto. Este archivo contendrá la estructura de las tablas y su contenido en sentencias sql listas para ser ejecutadas.
El primer paso es el logueo. En nuestro caso lo haremos a través de un script por lo que tendremos que indicar el password:
$ mysqldump -u usuario -ppassword [OTROS COMANDOS]
Nota: entre la opción -p y el password no hay ningún espacio.
Para hacer el volcado de una base de datos, simplemente indicamos su nombre. A nosotros nos interesará además guardarlo en un fichero.
$ mysqldump basededatos > fichero
También podemos indicar unas tablas concretas si no queremos hacer un volcado completo:
$ mysqldump basededatos tabla1 tabla2 tabla3
Puede resultar interesante añadir directivas DROP TABLE, para facilitar la recuperación desde el backup. Esto significa que el fichero resultante al ser ejecutado en el servidor MySQL borrará las tablas a crear si ya existen. Si no hacemos esto, tendremos que borrarlas nosotros mismos a mano.
$ mysqldump –add-drop-table
Más cómodo es utilizar grupos de opciones, como puede ser:
$ mysqldump –opt
que sería equivalente a:
$ mysqldump –add-drop-table –add-locks –create-options –disable-keys –extended-insert –lock-tables –quick –set-charset
Por cierto, --opt viene activado por defecto.
El script final
Una vez vistas las opciones más comunes de mysqldump, ¿qué pasa con nuestro script?
#!/bin/bash
suffix = $(date +%y%m%d)
mkdir /home/aotero/backups/$suffix
mkdir mysql
mysqldump --opt -uusuario -ppassword -h host basededatos > mysql/basededatos.$suffix.sql
tar -zcf /home/aotero/backups/$suffix/basededatos.$suffix.tar.gz mysql/*
rm -rf mysql
Sólo nos resta añadirlo como trabajo al cron y diariamente (por ejemplo) tendremos un nuevo directorio con el backup de nuestra base de datos. Podemos repetir los 4 últimos comandos por cada base de datos que queramos volcar, de forma que tengamos toda nuestra información a salvo.
Migrar de Perl a PHP y viceversa
Migrar de Perl a PHP y viceversa: una pequeña chuleta muy útil para un desarrollador experto en Perl que esté programando en PHP… o viceversa.


