Twitter, Snowflake, Números grandes y PHP

Desde que los ID’s de los estados en Twitter son mayores que la representación de enteros usando 32bits, había estado usando el tipo float para filtrar rápidamente esos valores, digamos:

$statusid = isset($_GET['statusid']) ? (float)$_GET['statusid'] : 0;

Con float se pueden tener hasta 14 dígitos sin pasar a la representación exponencial (1.xxxxxxE+NN), y como Twitter solo estaba generando ID’s de 11 dígitos, me pareció que había bastante tiempo antes de que se pasara el límite de float. Además me sirve que tenga la representación como número para comparaciones ($lastid > $firstdbid ) o para hacer cálculos sobre estos (etags).

Ahora que Twitter anda generando los ID’s con Snowflake (más información al respecto en el blog de Twitter), cada ID requiere 15 dígitos o más (53bits por ahora).

Esto no es problema si se tiene PHP a 64bits, ya que se pueden tener hasta 19 dígitos antes de alcanzar el límite. Si se tiene PHP compilado a 32bits, no queda de otra más que usar strings. Un forma rápida para filtrar los IDs tanto para 64bit y 32bit sería:

function safelongint($strint)
{
	$intval = intval($strint);
	if ( $intval == PHP_INT_MAX)
	{
		return preg_replace('/[^0-9]/','',$strint); //eliminar cualquier cosa que no sea dígito
	}
		
	return $intval;
}

Aún si los ID’s pasan el límite de los 64bits, debería usar strings automáticamente. Ya solo queda que la base de datos no tenga problemas con números tan grandes 😉 .

Actualización: Al 10 de Noviembre, Twitter ya llegó a los 17 dígitos en los ID’s… a ese paso el límite de los 64bit durará menos de lo que imaginé.

Como mostrar el número de revisión SVN en un sitio

Estás trabajando en un proyecto (web), usas Subversion para el Control de Versiones y te interesa que en alguna parte del sitio se muestre el número de revisión al que está actualizado. Se asume que el “desarrollo” se hace en una copia aparte y el en sitio web solo se sincronizan los cambios respecto al repositorio (svn up).

La mejor forma de hacer esto es crear un archivo que contenga el número de revisión y que este se actualice cada vez que cambie la copia en el servidor, por ejemplo un script así:

cd /home/user/public_html/
svn up 
rm version.php
svnversion > version.php

Este script se puede llamar incluso desde un hook en post-commit, el único requisito es que version.php no esté en el repositorio para que no de problemas con futuras actualizaciones.

Ahora que version.php ya tiene la revisión en la cual se está trabajando, solo falta incluirla desde el sitio web. Un simple include debería bastar:

<?php include 'version.php'; ?>

Este método debería funcionar mejor que usar svn:keywords ya que este solo se actualizaría cuando el archivo (ej. version.php) se modificado. Y aún mucho mejor que examinar el contenido del directorio .svn o modificar el archivo a mano 😉

Subversion desde la linea de comandos en Windows

Usualmente cuando trabajo con Subversion no necesito más que algunos comandos (commit, update, status, log), por lo que no me gustar abrir un cliente Subversion, si lo puedo hacer desde la consola. Uso un cliente gráfico cuando necesito hacer un diff entre diferentes revisiones o algo más complicado que me de pereza 😉

En Windows para tener Subversion desde la consola uso SilkSVN. Lo que si recomiendo usen una versión anterior (1.5.6) por si usan otro cliente y este no es compatible con Subversion 1.6.x

Una mejor forma de seleccionar un fila al azar en MySQL

Uno podría pensar que al ejecutar un query tan simple como elegir una fila al azar de una tabla pequeña (cerca de 500 registros) no debería tener importancia, que es el query ejecutado en los botones de Blogs Chapines:

SELECT * FROM bc_blogs ORDER BY RAND() LIMIT 1;
(1 total, Query took 0.0128 sec)

Un tiempo bastante pequeño y razonable. Pero cuando este query se ejecuta 7,000 veces al día, ya empieza a tener mayor importancia. Buscando por una opción mucho que me diera un query mucho rápido, encontré en Selecting random record from MySQL database table, otra forma de seleccionar un registro al azar ejecutando:

SELECT FLOOR( RAND() * COUNT(*) ) AS `offset`FROM `bc_blogs`
(1 total, Query took 0.0005 sec)

Un query que en mi PC se ejecuta 25 veces más rápido que el que el anterior, sweet!. Luego de ejecutarlo sabemos que fila debemos obtener, ejecutando un simple:

SELECT * FROM `bc_blogs` LIMIT $offset, 1 

Que toma solo una fracción de segundo ejecutar. Muchas veces nos pasa que por comodidad no nos fijamos en el rendimiento de las cosas, es algo que estoy aprendiendo ahora que he estado reescribiendo el código detrás de Blogs Chapines.

El código original fue hecho sobre la marcha, ahora que ya se mucho más de lo que hay que hacer, viene bien replantear la estructura del código. Pero ese es tema para otro post 😉

Etiquetas: programación, blogschapines, mysql

dBug, var_dump() con estilo

Hace unos poco días encontré un pequeño script php para poder mostrar el contenido e información de alguna variables que indiques, muy similar al funcionamiento de var_dump(), pero con la gran diferencia que despliega la información dentro de tablas HTML y estilos CSS. El script se llama dBug y está disponible bajo licencia GNU GPL.

Por ejemplo, me ha servido para curiosear dentro de las variables de WP-Cache mientras le hago algunas modificaciónes. Usando var_dump() resulta un poco incomodo ya que firefox presenta los datos mal agrupados:

salida de var_dump() vista en firefox

Usando dBug, la información de las variables las presenta así:

PHP dBug

Facilita mucho la lectura e interpretación de las variables. Incluso al hacer clic sobre las filas, estas se encojen para ocultar contenidos que no necesitamos o son muy amplios. Pueden ver algunos ejemplos de dbug y los datos que presenta.

Para usar dBug es tan sencillo como primero tener:

include_once("dBug.php"); 

En alguna parte de nuestro script (como dentro de wp-config.php) y luego hacer la llamada pasando la variable de la cual deseamos obtener más información usando dBug:

new dBug($variable); 

A mi me parece muy útil para enfocarse en depurar o curiosear las variables, sin tener que perder tiempo en presentar los datos en forma leíble.

Etiquetas de búsqueda: , , , , debug

Agrega tu comentario

Fin del ciclo de vida para PHP4

Hoy PHP.net anuncia el fin del ciclo de vida para PHP4, luego de tres largos años desde la liberación de PHP5. Los desarrolladores anunciaron de despues de 31 de diciembre de este año ya no habrán más versiones de php4 y que seguirán lanzado exclusivamente versiones de parches de seguridad hasta el 8 de Agostso de 2008.

Este anuncio sumado a la campaña de GO PHP5, son claros indicios de que es hora de moverse definitivamente a php5 y empezar a aprovechar sus bondades.

Etiquetas de búsqueda: , ,