AOWS

Just another adrian’s weblog

Archivo para Agosto 2007

BlogDay 2007

sin comentarios

BlogDaySe 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:

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 ;)

Escrito por adrian

31 Agosto, 2007 a 17:39

Escrito en Posts

Etiquetado con ,

Diferencia entre los operadores “==” y “===”

sin comentarios

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.

Escrito por adrian

30 Agosto, 2007 a 22:12

Escrito en Posts

Etiquetado con

Enviar un formulario con JavaScript

con 2 comentarios

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]

Escrito por adrian

28 Agosto, 2007 a 10:36

Escrito en Posts

Etiquetado con , ,

Insertar datos de una tabla en otra

con un comentario

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.

Escrito por adrian

27 Agosto, 2007 a 09:30

Escrito en Posts

Etiquetado con ,

jQuery 1.1.4, rumbo a la 1.2

sin comentarios

Nueva versión de jQueryHoy 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]

[Descargar]

Escrito por adrian

24 Agosto, 2007 a 20:55

Escrito en Posts

Etiquetado con ,

Técnicas CSS3 que estoy deseando que lleguen a mis manos

sin comentarios

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.

Escrito por adrian

23 Agosto, 2007 a 22:56

Escrito en Enlaces

Etiquetado con

Inserción de datos eficiente en MySQL

con 4 comentarios

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:

  1. 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.
  2. 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]

  3. 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]

  4. En el caso de InnoDB, realizaremos las inserciones dentro de una transacción:

    [sql]
    BEGIN;
    # Sentencias de inserción
    COMMIT;
    [/sql]

  5. 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]

  6. 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:

  1. 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.

  2. Usar InnoDB. Este tipo de tablas manejan mucho mejor que MyISAM las lecturas y escrituras concurrentes.
  3. 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.
Basado en un artículo de MySQL Phrasebook y en Speed of INSERT Statements.

Escrito por adrian

23 Agosto, 2007 a 22:44

Escrito en Posts

Etiquetado con

Ciclo de vida de una página ASP.NET

sin comentarios

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:

  1. PreInit
  2. Init
  3. InitComplete
  4. PreLoad
  5. Load
  6. Eventos de control
  7. LoadComplete
  8. PreRender
  9. SaveStateComplete
  10. Render
  11. 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.

Escrito por adrian

23 Agosto, 2007 a 22:32

Escrito en Posts

Etiquetado con ,

Backups con mysqldump

con un comentario

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.

Basado en el artículo Making backups using mysqldump. Mucha más información en el manual de referencia.

Escrito por adrian

22 Agosto, 2007 a 17:46

Escrito en Posts

Etiquetado con , ,

Migrar de Perl a PHP y viceversa

sin comentarios

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.

Escrito por adrian

21 Agosto, 2007 a 11:20

Escrito en Enlaces

Etiquetado con ,