28 Alternativas a Rapidshare

octubre 20, 2008

Encontre en Smashing Downloads una lista de hostings de archivos gratuitos alternativos.

PHPQuery, jQuery para PHP

octubre 2, 2008

Encontré en PHPClasses una clase que implementa los metodos de jQuery, pero en php.

En la pagina de Google Code nos dan este ejemplo, donde crea un documento, busca los «li» y le agrega una clase (class de estilos, no de PHP):

phpQuery::newDocument('<div>mydiv<ul><li>1</li><li>2</li><li>3</li></ul></div>')
	->find('ul > li')
		->addClass('my-new-class')
		->filter(':last')
			->addClass('last-li');

Implementa practicamente todas las funciones de jQuey, a excepción obviamente de las animaciones.

No probe demasiado, pero se ve muy prometedor.
Ver sitio phpQuery

Paginación optimizada en PHP

septiembre 26, 2008

Leo en SentidoWeb un artículo sobre optimización de paginadores. Mi opinion es que este artículo es un poco exagerado, al decir que el paginado de una busqueda puede consumir más recursos que el resto del sitio. En mi experiencia, un buen paginador no es problema para nada. De hecho, un sitio que mantengo en mi trabajo, cuenta con 2.5 millones de usuarios, tiene millones de mensajes, y la paginación anda perfecto. No es problema de rendimiento.

El problema con los paginadores es que suelen estar mal implementados. En mis comienzos como programador yo hacia algo así:
<?php
mysql_connect('localhost', 'user', 'pass');
mysql_select_db('midb');
function paginar($sql, $res_por_pag, $pag_actual){
// ejecuto el query original, para ver cuantos resultados tengo en total.
// en base a este numero puedo saber la cantidad de paginas.
$rs = mysql_query($sql);
$tot_rows = mysql_num_rows($rs);
// Calculo la cantidad de paginas. Lo hago dividiendo la cantidad de resultados por la cantidad
// de resultados que quiero mostrar por pagina. la funcion ceil redondea hacia arriba
$paginas = ceil($tot_rows/$res_por_pag);
// Calculo los limits. A la pagina actual le resto uno para que cuando se muestre
// en la URL la primera pagina sea la 1 y no la 0.
$inicio = ($pag_actual - 1)*$res_por_pag;
$final = $res_por_pag;
$sql .= " LIMIT $inicio, $final";
return array('sql' => $sql, 'totalPages' => $paginas);
}

// Este ejemplo sería un listado de noticias.

$sql = «SELECT * FROM Noticias»;
// Me fijo que la varibale pag sea un numero valido. sino la pagina actual es la primera
$pag_actual = (isset($_GET[‘pag’]) && is_numeric($_GET[‘pag’]) && $_GET[‘pag’] > 0) ? $_GET[‘pag’]: 1;
// le paso el sql a mi funcion paginadora, le pido que me muestre 20 resultados por pagina,
// y le digo en que pagina estamos ahora
$paginacion = paginar($sql, 20, $pag_actual);

// ahora teniendo esta informacion y el sql con limits, puedo traer solo los que quiero
$rs = mysql_query($paginacion[‘sql’]);
while ($row = mysql_fetch_assoc($rs)){
//muestro las noticias
}
?>

En este caso estoy desperdiciando recursos. ¿Cómo?:

«SELECT * FROM Noticias»

Al hacer ese query le estaría pidiendo a la base de datos (mysql en este ejemplo) que me traiga absolutamente todos los campos de todos los registros de la tabla Noticias. En la función Paginar, pueden ver que lo primero que hago es ejecutar esa consulta para saber la cantidad de registros, y de esa forma saber cuantas paginas voy a tener.

En un sitio que tenga menos de 5.000 noticias no sería problema. Ahora, si Google, que tiene una base de datos con TeraBytes de información, podria tardar días en hacer esa consulta. Esto claramente es un desperdicio de recursos. En este caso si estoy de acuerdo con lo que dice el artículo que menciono arriba. No tendría sentido gastar tantos recursos para mostrar las páginas, cuando podría simplemente poner links de Proximo y Anterior.

Esto es muy eficiente cuando hacemos un sitio para nosotros. Pero la realidad es que la mayoría de los sitios que hacemos son para los clientes. Y a los clientes les gusta que diga cuantas páginas de resultados hay. Personalmente estoy de acuerdo, pero tambien coincido en que no se pueden tirar los recursos. Entonces, ¿qué solución nos queda?

Bueno, esto, como todos los problemas de programación, puede tener varias soluciones, algunas más simples, otras más complejas, con mayor o menor rendimiento. La solución que encontre yo fue la siguiente:

function paginar($sql, $res_por_pag, $pag_actual){
$sqlCount = preg_replace(‘/(^SELECT [\’\»\.\w\d\*\ \,\-\(\)]* FROM)/ims’, ‘SELECT COUNT(*) as total FROM’, $sql);
$sqlCount = preg_replace(‘/(ORDER BY [\’\»\.\w\d\*\s\,\`\-\(\)]* [DESC|ASC]*)/ims’, », $sqlCount);
$rs = mysql_query($sqlCount);
$tot_rows = mysql_result($rs, 0, ‘total’);
$pages = ceil($tot_rows / $res_por_pag);
$inicio = ($pag_actual -1)* $res_por_pag;
$final = $res_por_pag;
$sql .= » LIMIT $inicio, $final»;
return array(‘sql’ => $sql, ‘totalPages’ => $pages);
}

Este reemplazo de la funcion paginar es mucho más eficiente, ya que en vez de traer todos los resultados, solamente traigo el count. En una tabla con una clave primaria, como puede ser un ID, al estar indexado, la función count puede devolver la cantidad de filas en un instante. Ademas, al no traer los resultados, se ahorra tiempo de red y memoria, ya que en el primer ejemplo, al traer todos los datos, estos quedaban guardados en memoria, aunque no los usaba.

Paso a explicar como funciona esto. Lo que hago ees basicamente sacar cualquier campo que se trate de seleccionar, y lo reemplazo por COUNT(*). Tambien saco el ORDER BY, porque podria referirse a alguna función, por ejemplo:

«SELECT ID, CONCAT(Name, LastName) as FullName FROM User ORDER BY FullName»

Despues del primer preg_replace, quedaría asi:

«SELECT COUNT(*) as total FROM User ORDER BY FullName»

FullName, en este caso no es un campo de la tabla, sino que es un campo generado dinámicamente en la consulta. Si dejase este ORDER BY, el servidor devolvería un error diciendo que estoy tratando de ordenar por un campo que no existe. Y ya que el orden no nos importa en este momento (porque esta consulta devuelve un solo registro con un solo campo), lo más simple es sacarlo.

Ese cambio que parece tan simple, duplico el rendimiento del buscador de mensajes.

Sienanse libres de usar este script, distribuirlo y modificarlo a gusto. Agradezco sugerencias para mejorarlo

Buscaminas real

septiembre 24, 2008

Webeando un poco encontre esta imagen

Gracias a SerGeek

TripTracker Slideshow: una galería de imágenes instantanea

septiembre 23, 2008

En esta profesión, donde los clientes nos contratan porque no tienen idea de como hacer las aplicaciones o sitios que necesitan, es muy facil sorprenderlos con muy poco. Un claro ejemplo de esto es el TripTracker Slideshow, una libreria Javascript para crear galerias de imagenes muy vistosas, amigables, y personalizables. Cuenta con dos versiones: una gratuita, que viene con un pequeño link al sitio de TripTracker, y una paga para sitios comerciales. Ofrecen una licencia de 25 U$D y 500 U$D.

Con este simple código podrán insertar una galería de imagenes en cualquier sitio. No depende de ningún framework, como jQuery o Prototype, lo que lo hace muy liviano, no requiere scripts del lado del servidor, como PHP.

Ejemplo:

<script type=»text/javascript» src=»http://slideshow.triptracker.net/slide.js»></script>
<script type=»text/javascript»>
var viewer = new PhotoViewer();
viewer.add(‘/photos/my-photo-1.jpg’);
viewer.add(‘/photos/my-photo-2.jpg’);
viewer.add(‘/photos/my-photo-3.jpg’);
</script>
<a href=»javascript:viewer.show(0)»>Slideshow</a>

Pueden ver el ejemplo funcionando en la pagina de TripTracker Slideshow, y la documentación.

FFMPEG: Conversior de formatos de video

septiembre 20, 2008

FFMPEG es un software libre para conversion de formatos de video. Es muy usado en los clones de YouTube, ya que se puede intergrar con PHP mediante la clase FFMPEG-PHP, dando la posibilidad de que el usuario suba videos en cualquier formato soportado y convertirlo a FLV para poder ser usado por algun reproductor hecho en flash, como el FlowPlayer. En un proximo post voy a hablar sobre como utilizar la mezcla de FFMPEG/FFMPEG-PHP + FlowPlayer para crear sitios clones de YouTube.

El problema con todo esto es que necesitas un Hosting que ya tenga instalado este soft, o bien alguno que nos de acceso de root al shell, y ademas suele traer muchos problemas instalarlo, sumado a la falta de documetación de instalación.

Por suerte existe este script, con licenca GPL v2, que nos permite instalar el FFMPEG + FFMPEG-PHP + Codecs con todas sus dependencias con correr solamente un comando de consola en cualquier entorno Linux/Unix/POSIX. Obviamente se necesita un hosting que de acceso al shell, y acceso de root.

Con este otro script se puede instalar en hostings compartidos. Es necesario el acceso a shell, aunque no necesariamente tiene que ser como root.

Para ambos scripts es necesario tener instalado automake, autoconf y libtools.

A continuación muestro los comandos que se deben correr una vez que entraron al shell:

wget http://ufpr.dl.sourceforge.net/sourceforge/ffmpeginstall/ffmpeginstall.3.2.1.tar.gz
tar zxf ffmpeginstall.3.2.1.tar.gz
cd ffmpeginstall.3.2.1
./install

Para instalar la version de hosting compartido:

wget http://ufpr.dl.sourceforge.net/sourceforge/shf/sharedhostffmpeg.1.0.2.tar.gz
tar zxf sharedhostffmpeg.1.0.2.tar.gz
cd sharedhostffmpeg.1.0.2
./install

Una vez que termina la instalacion:

cp -af $HOME/bin/php-cgi $HOME/www/cgi-bin/
#este comando copia el php-cgi de la carpeta bin en tu home a la carpeta cgi-bin
cp -f $HOME/etc/htaccess.conf $HOME/www/.htaccess
#copia el archivo htaccess.conf como .htaccess en el document root de tu servidor

Eso es todo. El script pregunta un par de cosas, como el TMP DIR, pero usando los defaults anda.

Agradezco a Sherin por este script.

Blog personal de Sergey Brin

septiembre 20, 2008

Sergei Brin, co-fundador de Google, Inc. ha publicado su blog personal, donde, segun dice, hablará de su vida no-laboral.

Este es su primer post, en donde explica el porque del nombre del blog (Too):

Welcome to my personal blog. While Google is a play on googol, too is a play on the much smaller number – two. It also means «in addition», as this blog reflects my life outside of work.

Traducción:

Bienvenidos a mi blog personal. Mientras que Google es un juego de palabras de googol, too es un juego de palabras con un numero mucho menor – 2 (en ingles two, se pronuncia igual que too).  También significa «Además», ya que este blog refleja mi vida afurea del trabajo.

Ver el blog

Fuente:Matt Cutts: Gadgets, Google, and SEO