Listado de directorio HTTP mediante PHP

Cuando queremos que nuestro servidor web muestre los ficheros y directorios que hay en un directorio dado (algo que se debería evitar por defecto), nos encontramos con que el diseño o la estructura no es la que deseamos.
phplisting.png
Si queremos personalizar esta página mediante PHP podemos usar una librería que nos permite recrear la página por defecto, añadiendo otras características como lectura de zips, posiblidad de borrar ficheros y previews de imágenes y vídeos.
PHP Directory Listing Script
Vía / With Tech Eyes

Comet y el HTML5

Uno de los problemas con los que nos enfrentamos al intentar desarrollar una aplicación en Comet es que hay que simularlo, ya que los navegadores aún no admiten la posiblidad de recibir información directamente del servidor (push). En la especificación de HTML5 nos encontramos con los eventos enviados por el servidor (server sent events) y el elemento event-source, el cual representa el destino de los eventos producidos por el servidor.

El elemento event-source tiene el atributo src que indica la URL que se procesará, la cual se llamará una vez el elemento haya sido añadido al documento. Para poder recibir la información, el Content-type de la respuesta debe ser application/x-dom-event-stream, teniendo un formato parecido a:

Event: test
Target: p
data: data

Un ejemplo de código para el cliente sería el siguiente:

<p>It should say "PASS" below:</p>
<p id="p">FAIL (script did not run)</p>
<script>
document.addEventListener("click", update, false)
function update(e) {
pass = e.target.id == "x"
document.getElementById("p").firstChild.data = pass ? "PASS" : "FAIL"
}
</script>
<event-source src="support/sse-target.php?target=p&event=click" onclick="update(event)" id="x">

Por ahora solo está implementado en Opera, aunque otros navegadores ya están trabajando en ello. Esperemos que se vuelva un elemento común en todos los navegadores para poder desarrollar aplicaciones web mucho más interesantes.

Más información

links for 2008-03-23

Usar Skype mediante PHP

No lo he podido probar, y aún así las funcionalidades están un poco limitadas. Pero se puede usar Skype mediante PHP, aunque necesitaremos:

Un ejemplo sería el siguiente:

<?php
// Event sink:
class _ISkypeEvents {
function AttachmentStatus($status) {
echo ">Attachment status $status\n";
}
function CallStatus($call, $status) {
echo ">Call $call->id status $status\n";
}
}
// Create a Skype4COM object:
$skype = new COM("Skype4COM.Skype");
// Create a sink object:
$sink =& new _ISkypeEvents ();
$sink->convert = $skype->convert();
// Connect to the sink:
com_event_sink($skype, $sink, "_ISkypeEvents");
// Create a conversion object:
$convert = $skype->convert;
$convert->language = "en";
// Start the Skype client, minimized and with no splash screen:
if (!$skype->client()->isRunning()) {
$skype->client()->start(true, true);
}
// If the user status is not "online", change user status to "online":
if ($skype->currentUserStatus() == $convert->textToUserStatus("OFFLINE")) {
$skype->changeUserStatus($convert->textToUserStatus("ONLINE"));
}
// Create a user object
$user = $skype->user("echo123");
echo "User " . $user->handle . " online status is " . $convert->onlineStatusToText($user->onlineStatus) . "\n";
// Place a call
$call = $skype->PlaceCall($user->handle);
// Wait for the call to be "in progress" and report an error if:
while ($call->status <> $convert->textToCallStatus("INPROGRESS")) {
if ($call->status == $convert->textToCallStatus("FAILED") ||
$call->status == $convert->textToCallStatus("REFUSED") ||
$call->status == $convert->textToCallStatus("CANCELLED") ||
$call->status == $convert->textToCallStatus("FINISHED") ||
$call->status == $convert->textToCallStatus("BUSY"))
die ("Call status " . $convert->callStatusToText($call->status));
else
com_message_pump (500);
}
// Send dtmf tones:
com_message_pump (10000);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "0";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "1";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "2";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "3";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "4";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "5";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "6";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "7";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "8";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "9";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "#";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "*";
// Finish the call:
if ($call->status <> $convert->textToCallStatus("FINISHED")) $call->finish();
//Sleep:
com_message_pump (1000);
?>

Example Call.php

Codetcha: CAPTCHA resolviendo Javascript

La verdad es que este CAPTCHA es muy friqui, pero es una idea interesante que quizás se pueda utilizar. Se trata de un CAPTCHA que en vez de tener que escribir una palabra, hay que modificar un código Javascript para que no tenga errores y así validar el formulario.
codetcha.png
Para pasar el CAPTCHA hay que eliminar todos los errores, se puede ir viendo si el código es correcto y si no es así, qué errores sigue habiendo. El código de Codetcha se puede usar para clases o ejemplos de Javascript, porque me da la sensación de que no es muy accesible este CAPTCHA.
Aún así la idea se podría sustituir usando matemáticas en vez de Javascript.
Codetcha

links for 2008-03-19

Diferencias entre count(*) count(col)

Algo a tener muy en cuenta es conocer la diferencia entre count(*) y count(col) en consultas a MySQL.
Cuando realizamos un count(*), lo que hacemos es contar filas, si se trata de una tabla MyISAM y no hay un where, es la forma más rápida de obtener el número de registros de una tabla. Si existe un from o un where, es necesario contar el número de resultados.
Diferente es realizar un count(col), ya que cuenta las filas que tienen esa columna distinta de NULL, por lo que siempre habrá que contar todos los resultados.
Siempre me entra la duda entre count(*) y count(1), las “leyendas urbanas” dicen que es preferible el segundo caso ya que en el primero recuperas todos los datos. Yo sinceramente creo que es lo mismo y recuerdo que un consultor de Oracle también me lo dijo en un proyecto.
COUNT(*) vs COUNT(col)

Javascript para realizar drag y resize

Buen script que nos permite mover nuestras capas mediante drag&drop y cambiarlas de tamaño.
dragresize.png
Funciona con posicionamiento relativo y absoluto de los elementos en la página. Además permite personalizar los estilos mediante CSS. No es obtrusivo. Es posible indicar tamaños máximos y mínimos para las cajas y es compatible con la mayoría de los navegadores.
DragResize
Vía / Ajaxline