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

Taffy DB: usar JSON de forma similar a SQL

Interesante librería que nos permite acceder a datos JSON mediante una nomenclatura parecida a SQL. Así cuando desarrollemos una capa de Ajax podemos buscar entre los datos, o modificarlos mediante esta librería.

Unos ejemplos de uso serían los siguientes:

products.find({price:{lessthan:10},
type:{not:"Book"}});
friends.insert(
{name:"Brian",
gender:"M",
married:"No",
age:52,
state:"FL",
favorite_foods:["fruit","steak"]
});

Esta librería nos permite en sus 10K hacer consultas, insertar, borrar y actualizar datos, ordenar, realizar bucles, queries avanzadas, ordenar los datos y a parte es compatible con YUI, JQuery, Dojo, Prototype y EXT.

Taffy DB

Vía / AjaxLine