PHP 5.4.0 Liberado

Según el equipo de desarrollo, esta nueva versión supone un importante paso adelante en la serie 5.x e incluye numerosas y nuevas características y solución de bugs.

En la guía de migración de 5.3 a 5.4 se detallan los cambios entre las versiones.

Éstas son las características más destacadas:

  • Servidor Web incluido
  • Sintaxis corta para arrays ([1,2,3])
  • Mejoras al rendimiento y la memoria
  • Exponer estado de la sesión a través de la nueva función, session_status
  • Soporte para Traits

PHP en su nueva versión incorpora un nuevo método para mejorar la reutilización de código, decidieron llamarlo Traits. Los Traits nos permiten mejorar el flujo de trabajo en cuanto a las clásicas limitaciones de los lenguajes de herencia simple. En definitiva nos ayuda a reducir la complejidad cuando trabajamos con objetos permitiendo realizar asociaciones de herencia múltiple.

Obviamente hay más correcciones que se pueden ver en el changelog.

Fuente php.net

Confirmar acciones con jQuery

Éste plugin muestra un mensaje de confirmación antes de hacer alguna acción. No requiere ningún código extra en los enlaces, simplemente se llama al plugin indicando el id o clase de los botones y listo.

Cómo funciona

Es simple, se guarda una copia de todos los controladores de eventos unidos al elemento, desvinculándolos y uniéndose el mismo en su lugar. Un diálogo de confirmación aparece cuando el usuario activa la acción. Si el usuario decide seguir adelante con la acción, se vuelve a enlazar los controladores de nuevo y activa el evento. Si el usuario decide cancelar la acción, el diálogo desaparece.

Ejemplo

// The action.
$('input[type=button]').click(function() {
  $(this).remove();
});

$('input[type=button]').confirm({
  msg:'Do you really want to delete this button?',
  timeout:3000
});

Ver documentación

Cómo optimizar el tiempo de carga de tu sitio utilizando Sprites CSS – Parte II

En el post anterior hablé sobre ésta vieja técnica y compartí algunas herramientas para su uso.

Ventajas
La utilización de la técnica de los CSS Sprites tiene principalmente dos ventajas:

  1. Por un lado tendremos más velocidad en la descarga y renderizado de nuestro sitio web por parte de los navegadores.
  2. Por otro lado tendremos una significativa reducción de consumo de recursos del servidor.
Ejemplo
En este caso (sin css sprites), si tenemos una imagen distinta por cada icono y a su vez otras 4 más por cada hover, tendríamos un total de 8 peticiones al servidor:
Pero si aplicamos la técnica, generaríamos un solo archivo con las 8 imágenes. Para esto podemos usar varias herramientas: css sprites generator o Sprite Box.

a.home {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: left 0;
display: block;
}
a.home:hover {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: right 0;
}
a.rss {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: left -53px;
display: block;
}
a.rss:hover {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: right -53px;
}
a.tools {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: left -106px;
display: block;
}
a.tools:hover {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: right -106px;
}
a.comments {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: left -160px;
display: block;
}
a.comments:hover {
width: 53px;
height: 53px;
background-image: url(icons/icons-sprites.jpg);
background-repeat: no-repeat;
background-position: right -160px;
}
Una sola petición al servidor y menos de la mitad del tiempo :)

Denegación de servicio en Apache a través de Range header

El día 19 de agosto, viernes, Kingcope hizo público un sencillo exploit en Perl que permitía provocar una denegación de servicio en Apache desde un solo sistema. Cuando menos, el rendimiento del servidor atacado se reducían considerablemente. Hacía mucho tiempo que no se publicaba un exploit que permitiese “echar abajo” un servidor entero desde un solo ordenador. Lo curioso es que Michal Zalewski descubrió algo muy parecido en enero de 2007. Usando un mismo vector de ataque, se conseguía un efecto diferente: Zalewski agotaba el ancho de banda, mientras que Kingcope consigue agotar los recursos físicos del servidor. Al no publicarse exploit entonces, sino simplemente explicar un comportamiento “extraño”, no recibió demasiada atención.

No es la primera vez que Kingcope publica sin previo aviso. En septiembre de 2009 hizo público un fallo en IIS 5. En noviembre, una elevación de privilegios en FreeBSD y en julio, un grave problema en OpenSSH de FreeBSD. Siempre lleva hasta sus últimas consecuencias el “full disclosure” y suele enviar sin más a las listas de seguridad todos los detalles del problema. Con Apache no ha hecho una excepción.

La vulnerabilidad se encuentra en el módulo mod_deflate. Consiste en el agotamiento de recursos al crear múltiples peticiones con la cabecera Range manipulada. Según el exploit publicado se envía esta cabecera con la siguiente secuencia 0-,5-0,5-1,5-2…5-1299. Esto provoca que el servidor genere múltiples respuestas que son fragmentos de un mismo recurso, en definitiva, se trata de peticiones manipuladas de rangos de bytes de un mismo archivo o recurso a descargar. Además la petición se realiza con la cabecera “Accept-Enconding: gzip” que hace que el servidor vulnerable intente comprimir cada fragmento solicitado, consumiendo memoria y tiempo de procesador hasta que el proceso deja de responder.

“mod_deflate” es un módulo empleado por Apache para comprimir contenido antes de ser devuelto al cliente. Este módulo es instalado y habilitado por defecto en la instalación base de Apache.

No existe parche oficial por parte de Apache aunque sí que se han hecho públicos diferentes métodos para mitigar el ataque y la promesa de un parche en 48 horas (lo que acumularía una semana tras el aviso).

Más información aquí

via Hispasec Sistemas

Cómo optimizar el tiempo de carga de tu sitio utilizando Sprites CSS

Una vieja técnica que se utilizaba en la construcción de juegos, se emplea hoy en día para optimizar el tiempo de carga de los sitios webs.

Esta antigua técnica se sigue usando en la actualidad, y la vemos en la técnica Sprites CSS, que consiste en utilizar una sola imagen para albergar allí todas las imágenes que se necesitarán en el sitio. Por ejemplo el fondo, iconos, etc.

Así cada vez que se acceda a nuestro sitio, sólo se descargará un archivo de imagen, evitando varias peticiones al servidor.

Para implementarlo existe SmartSprites, una aplicación que les permitirá crear, implementar y mantener Sprites CSS de manera muy fácil.

SmartSprites es una aplicación open source y está construida en Java. Puedes utilizarla en Windows o Linux, pero antes deberás instalar JDK 6.

Existen otras herramientas para generar Sprites CSS como por ejemplo Spritebox, una aplicación web totalmente gráfica que nos ayudará a generar nuestros sprites css.

El tiempo de carga de una página es un factor muy importante en el posicionamiento web, y más ahora que Google lo ha reconocido expresamente.

Ver implementación con ejemplo

Hubo un error HTTP inesperado durante la petición API

Ayer en mi trabajo quise subir un plugin en el blog de la empresa, que está hecho en WordPress, y me tiró un error inesperado:

Hubo un error HTTP inesperado durante la petición API

Googleando encontré la solución y quiero compartirla:

Hay que editar http.php en wp-includes en las versión anteriores a la 3.0, y en class-http.php en versiones superiores a la 3.0, en la línea donde dice

'timeout' => apply_filters( 'http_request_timeout', 5);

hay que poner

'timeout' => apply_filters( 'http_request_timeout', 30);

Solo hay que cambiar el valor “5″ por “30″, pero al parecer solo sirve para las versiones anteriores a 3.0.

La solución concluye en editar el archivo plugin-install.php que se encuentra en wp-admin/includes y cambiar el valor 15 por 60 en la siguiente línea:

$request = wp_remote_post('http://api.wordpress.org/plugins/info/1.0/', array( 'timeout' => <strong><span style="color: #ff0000;">15</span></strong>, 'body' => array('action' => $action, 'request' => serialize($args))) );

Doy fe que funciona !! :)

via Sarpanet.net

Detectar Bot con PHP

En mi trabajo estoy desarrollando una versión nueva del sitio y la semana que viene voy a realizar un pre-lanzamiento en la que van a convivir los dos sitios, el actual y la nueva versión, redireccionando a los usuarios a un sitio o al otro.

Hablando con expertos de SEO, me dijeron que la redirección tiene que ser del tipo Redirect 302 porque sino Google podría detectar contenido duplicado, además también hacer que los bots no vean el otro sitio.

Se me ocurrió esto:

<?php
$SEARCH_ENGINES_UA = "Googlebot|Yahoo|msnbot";
if (preg_match("/$SEARCH_ENGINES_UA/", $_SERVER['HTTP_USER_AGENT']) > 0)
{
 	// Bot
 	header('HTTP/1.1 302 Found');
 	header("Location: http://www.othersite.com/");
 	exit();
}
else
{
 	// Human Being
 	echo 'You are Human!';
}
?>

Para probar que esto realmente funciona, si lo prueba uno, siempre vas a ver el mensaje “You are Human!”, pero si querés ver lo que sucede si fueras un Bot, tendrías que instalarte un Plugin de Firefox para poder simular ser un Bot.

Isaac Asimov hablando de Internet… En 1988

La entrevista que está al final del post de Isaac Asimov es casi contemporánea al surgimiento de la web. Si no es anticipatoria en un sentido estricto, sí lo es conceptualmente. Estremece el calado de su visión. En su charla con Bill Moyers, Asimov prepara al telespectador para un futuro donde habrá “bibliotecas colgadas a computadoras en cada hogar”, las cuales permitirán “librarse de la tutela de un profesor”.

Vía Factor 302.4

[C] – Recursividad

En mi primer día de clases en Programación 2 estuvimos viendo recursividad. ¿Qué es recursividad? Es la forma en la que se especifica un proceso basado en su propia definición. Para entenderlo, voy a citar el ejemplo de mi profesor:

Para ir de un punto A a un punto B puedo ir caminando de a un paso, entonces teniendo la función “ir_al_punto_B” puedo escribir la primer acción que es “dar_un_paso”, en pseudocódigo sería:

ir_al_punto_B()
{
   dar_un_paso;
   return ir_al_punto_B();
}

Ahora, ¿qué pasa cuando llego al punto B? Si no hay un corte, mi función se convierte en un bucle infinito provocando un excesivo uso de memoria provocando el cierre de mi programa. Para solucionar esto, se hace:

ir_al_punto_B()
{
   dar_un_paso;
   si no llegué al punto B
      ir_al_punto_B();
}

Por ejemplo, el factorial.

3! = 3 · (3-1)!
   = 3 · 2!
   = 3 · 2 · (2-1)!
   = 3 · 2 · 1!
   = 3 · 2 · 1 · (1-1)!
   = 3 · 2 · 1 · 0!
   = 3 · 2 · 1 · 1
   = 6
unsigned int factorial(unsigned int n)
{
    if (n > 1)
    {
        return n * factorial(n - 1);
    }
    else
    {
        return 1;
    }
}

Función recursiva para la Multiplicación:

unsigned int multiplicacion(unsigned int a, unsigned int b)
{
    if (b == 0)
    {
        return 0;
    }
    else
    {
        return a + multiplicacion(a, b - 1);
    }
}

¿Cuál es su funcionamiento interno?

¡Tener en cuenta la función de arriba para el seguimiento!

1- Al no ser 0(cero) el valor de b, se analiza la parte falsa del IF y se hace un return llamandose a si misma.

2- Cuando se procesa otra vez la función, el valor de b sigue siendo diferente a 0(cero), se hace un return llamandose a si misma.

3- Luego de este último return, el valor de b pasa a valer 0(cero) y se termina la función quedando pendiente todas las llamadas a la función volviendo hacia atrás devolviendo los resultados. En esta instancia, el return devuelve la suma de 2 + 0 (el resultado de multiplicacion(2, 0) es 0) retornandosela a la instancia anterior.

4- En esta instancia, el valor que devuelve el return es 2 + 2. El resultado de multiplicación(2, 1) es 2). Luego, el valor 4 de este return pasa a la siguiente instancia: 2 + multiplicacion(2, 2) => 2 + 4 = 6 => 2 x 3 = 6

Esto es una introducción básica a recursividad, la semana próxima estaré posteando más cosas. ¡Espero que les sirva!