Otro tip rápido: si deseas mantener un dump de tu base de datos en algún sistema de control de versiones con mysqldump, siempre utiliza la opción --skip-extended-insert.

¿Por qué? De modo predeterminado, mysqldump utiliza “extended inserts”, en los que una sola gran línea se ocupa de agregar múltiples registros a la base de datos. El problema es que estas sentencias por lo general van en una sola línea, por lo que si cambia cualquier dato en los muchos registros que se insertan en alguna de las tablas, el control de versiones identificará la diferencia de la línea y las diferencias entre cada versión serán muy grandes.

En comparación, al utilizar --skip-extended-insert cada INSERT usa una línea, por lo que sólo se registrarán las diferencias de las filas que tengan cambios. El dump será más grande, pero las diferencias entre cada versión son menores, y se almacenarán de modo más eficiente en tu control de versiones.

Por cierto, si tus tablas son de tipo InnoDB, recuerda también usar la opcion --no-autocommit para mejorar la velocidad de importación del dump.

Un tip rápido: si notas que al importar dumps de bases de datos que utilizan InnoDB la carga es mucho más lenta que en bases de datos con MyISAM, puedes mejorar bastante la velocidad de carga con algunas opciones de mysqldump:

  • En primer lugar, está la opción --opt, que habilita una serie de alternativas que hacen que la importación sea bastante rápida…
  • … pero si por alguna razón debes utilizar alguna opción no predeterminada al crear el dump (en mi caso, era --skip-extended-insert), puedes utilizar --no-autocommit, que hace que la importación sea tan rápida como utilizando MyISAM

¿La explicación?

Como InnoDB es transaccional, lleva un registro de cada operación.

Con la primera alternativa, sólo se ejecuta un INSERT por tabla, por lo que no necesita realizar muchas operaciones de registro.

Con la segunda alternativa, a pesar que se indican muchos INSERT, sólo se confirman los cambios una vez por tabla ya que los bloques de INSERT van rodeados con set autocommit=0; y un único COMMIT al final.

PHP ha cambiado profundamente durante su existencia, lo que nos motiva a actualizar nuestros hábitos al escribirlo y aprovechar sus nuevas funcionalidades en la implementación de buenas prácticas. PHP: The Right Way es una referencia rápida de buenas prácticas, estándares de código y enlaces a tutoriales actualizados en el manejo de este lenguaje… si desarrollas sobre WordPress, márcalo como lectura obligatoria.

Recientemente he comenzado a utilizar cada vez más la gestión de excepciones en PHP, lo que (al menos en teoría) permite escribir un código sencillo y fácil de mantener.

En un proyecto reciente, uno de los desafíos más importantes consistía en actualizar una base de código bastante antigua, en la que abundan ejemplos de funciones que, simplemente, deben dejar de existir. Dado que es un proyecto considerablemente grande y complejo, quise experimentar con un método que me permitiera registrar dónde se utilizan esas funciones para analizar cuidadosamente su reemplazo.

De este modo, el método propuesto se compone de tres partes: una clase para la creación de Excepciones; un manejador de excepciones y finalmente la reescritura de las funciones obsoletas para utilizar este método.

La clase para la creación de este tipo de excepciones es bastante básica, pero cumple con lo necesario:

Extiende la clase base de excepciones con pocas modificaciones:

  • El constructor recibe dos parámetros: el primer parámetro es el nombre de la función (que puede ser pasado como __FUNCTION__ para mayor facilidad) y el segundo es una propuesta para reemplazar la función original
  • Sobreescribo el método __toString() para generar un mensaje de error automáticamente

En segundo lugar, el manejador de excepciones default:

Adaptado para funcionar en el entorno de WordPress: si está activa la constante para permitir el registro de errores, va a escribir el error en el log llamando al método __toString() de la excepción junto con el stack trace para ubicar desde dónde se invoca a la función.

Finalmente, toca reescribir la función obsoleta:

En general, la idea es crear un bloque try...catch donde se genere la excepción y se ejecute el código obsoleto en el catch.

Un poco más complejo que simplemente buscar dónde se usa la función, pero mucho más útil para entender el funcionamiento del sistema.

A todos nos ha pasado: una idea que por un momento suena brillante, pero que al pensarlo más detenidamente empieza a revelar que no es simplemente inadecuada, sino simplemente mala… eso sucede con la idea de que un organismo de la ONU se haga cargo del gobierno de Internet, la que ya ha sido criticada por Vinton Cerf (uno de los padres de la red) y hasta ironizada… aunque lamentablemente, tampoco hay nadie que de una alternativa seria al control que EEUU mantiene sobre la red.

Sigmund Freud’s couch

99% invisible tells the story of how Sigmund Freud’s couch came to be the symbol of psychoanalysis… even if it ceased to be as widely used as one might think based on movies and cartoons.

It’s time to dispel the myths about nuclear power

It’s time to dispel the myths about nuclear power lists some of the actual facts on the incidents on Chernobyl and Fukushima nuclear plants. Something to really consider if you’re really interested in diminishing the participation of fossil fuels on electric energy production.

What happens when shit happens

There’s a very entertaining and educational thread going on Hacker News about data loss and disaster recovery that came about an actual, ongoing, massive system outage at Gliffy… I’m sure everyone has a similar story to share.

How Mickey Mouse Evades the Public Domain

How Mickey Mouse Evades the Public Domain tells the story of how every time the cartoon it’s about to enter the public domain, corporate lobbying it’s able to bend existing legislation to protect private interests.