domingo, 16 de febrero de 2014

Seleccionar un registro aleatoriamente con MySQL

Si necesitamos obtener una fila aleatoria de una tabla MySQL, es muy probable que si no conocemos sus problemas, optemos por la función RAND().


SELECT * FROM tabla ORDER BY RAND() LIMIT 1;


Éste es una de esas funciones que suenan muy bien a primera vista y donde muchos programadores suelen caer. Sin embargo se trata de una función lenta y que utiliza muchos recursos del servidor ya que MySQL tiene que generar una tabla temporal completa con todos los datos de la tabla original reordenados aleatoriamente.

Si realmente necesitas obtener un registro aleatorio hay mejores formas de hacerlo y así prevenir un cuello de botella que aumentará a medida que aumenta el número de registros de la tabla.

   $res = mysqli->query("SELECT count(*) FROM tabla");
   $fila = $res->fetch_row();
   $rand = mt_rand(0, $fila[0] – 1);
 
   $res = mysqli->query("SELECT * FROM tabla LIMIT $rand, 1");

Web service SOAP con PHP

SOAP es un protocolo de intercambio de datos entre diferentes procesos basado en XML. Una definición bastante completa la podéis encontrar en wikipedia. Una vez dicho esto vamos a empezar a ver cómo creamos un web service básico en PHP y que use dicho protocolo.
Lo primero que necesitaremos será descargar NuSOAP a nuestro proyecto. Se trata de un pequeño toolkit que nos facilitará la vida con varias clases para trabajar con este protocolo en PHP. Una vez descargado y descomprimido dentro de una carpeta de nuestro proyecto, simplemente la deberemos incluir en el archivo PHP que va a funcionar de web service.
A continuación veremos un ejemplo básico. A nuestro fichero le llamaremos test.php y lo que hará será recibir dos números enteros, multiplicarlos y devolver el resultado.

require_once("nusoap.php"); 

$server = new soap_server();

$server->register('multiplicarNumeros'); 

function multiplicarNumeros($valor1, $valor2){ 
 $res = $valor1 * $valor2; 
 return $res; 
} 

$server->service($HTTP_RAW_POST_DATA);
A continuación nos hará falta un cliente del web service al que llamaremos cliente.php. Lo que haremos será en el constructor llamar a la url del servidor y mediante la función call() llamar al método que nos multiplicarla los números. Los parámetros de la función los pasaremos en forma de array.

require_once("nusoap.php"); 

$cliente = new nusoap_client("http://localhost/test.php");

$error = $cliente->getError(); 
if ($error){ 
 echo "Error: $error"; 
} 

$res = $cliente->call("multiplicarNumeros", array("valor1" => "10", "valor2" => "15")); 

$error = $cliente->getError(); 
if ($error){ 
 echo "Error: $error"; 
} else { 
 echo "Resultado: $res"; 
}
Hasta aquí tendríamos un cliente y servidor básico pero para que sea un web service más correcto nos haría falta definir el WSDL en la parte del servidor y así tener una definición de los métodos y parámetros que contiene. Para que NuSoap nos lo genere deberemos cambiar un poco la parte del servidor y nos quedaría de la siguiente forma.

require_once("nusoap.php"); 

$server = new soap_server(); 

// Configuramos el namespace y el WSDL 
$ns = "test"; 
$server->configureWSDL('test', $ns); 
$server->wsdl->schemaTargetNamespace = $ns; 

// Cambiamos la llamada para añadirle los parámetros de entrada y salida y el namespace 
$server->register('multiplicarNumeros', array('valor1' => 'xsd:integer', 'valor2' => 'xsd:integer'), array('return' => 'xsd:integer'), $ns); 

function multiplicarNumeros($valor1, $valor2){ 
 $res = $valor1 * $valor2; 
 return $res; 
} 

$server->service($HTTP_RAW_POST_DATA);
Ahora simplemente debes acceder a tu navegador y llamar a la URL http://localhost/test.php?wsdl y verás el WSDL que se ha generado.

lunes, 30 de diciembre de 2013

Unir campo DATE y TIME en un único campo TIMESTAMP con MySQL

Hace unos días me encontré la necesidad de unir un campo DATE y TIME para hacer un UPDATE sobre un campo TIMESTAMP de otra tabla.

La solución es muy sencilla. Simplemente tenemos que usar la función TIMESTAMP de la siguiente forma:

UPDATE tabla2, tabla1
SET tabla2.campo=TIMESTAMP(tabla1.campofecha, tabla1.campohora)
WHERE tabla2.id=tabla1.id

Espero que os sirva de ayuda.

miércoles, 4 de diciembre de 2013

Mapas vectoriales con el CANVAS en HTML5 mediante el proyecto Cartagen

A continuación vamos a hablar de un proyecto muy interesante llamado Cartagen (http://cartagen.org). Según ellos mismos definen en su repositorio de github se trata de:

"Cartagen es un framework de cliente basado en vectores para renderizar mapas en HTML5 nativo. Escrito en JavaScript, utiliza el nuevo elemento Canvas para cargar datos de mapas desde varias fuentes, incluyendo OpenStreetMap."

En el sitio web de Cartagen podemos ver varias demos que muestran el funcionamiento y la potencia de este framework. Además podrás ver y editar el código GSS (Geographic Style Sheets), con el que se le da estilo al mapa e incluso descargar el mapa creado como bitmap.

lunes, 12 de agosto de 2013

Evitar problemas de compatibilidad con HTML5 usando Modernizr

Si estamos empezando un proyecto en el que vamos a utilizar HTML5, de las primeras cosas que nos van a venir a la cabeza son los problemas de compatibilidad que tendrá nuestra web con navegadores antiguos como IE8.

Modernizr es una herramienta que nos va a ayudar a resolver este problema, ya que permite adaptar nuestras webs programadas con HTML5 a cualquier navegador sin importar la versión. La idea es detectar qué funcionalidades no son compatibles con el navegador que estamos usando y buscar la manera de simularlo mediante Javascript.

La herramienta nos permite descargar solamente las capacidades que necesitemos y la url al proyecto es http://www.modernizr.com.

viernes, 2 de agosto de 2013

Elemento audio HTML5

Al igual que con el elemento <video>, hasta la llegada del HTML5, no existía ningún estándar para mostrar audios en una web y la mayoría eran mostrados a través de plugins que podían cambiar para los diferentes browsers.

Con HTML5 se define un nuevo elemento <audio> que especifica un método estándar de insertar audios en una web.

Los formatos soportados son mp3, wav y ogg y aquí os dejo una tabla donde se indica qué formato soporta cada browser.


BrowserMP3WavOgg
Internet Explorer 9+YESNONO
Chrome 6+YESYESYES
Firefox 3.6+NOYESYES
Safari 5+YESYESNO
Opera 10+NOYES
YES

SINTAXIS

La sintaxis necesaria para insertar un audio en la web es la siguiente:

<audio controls>
  <source src="audio.mp3" type="audio/mp3">
  <source src="audio.wav" type="audio/wav">
  <source src="audio.ogg" type="audio/ogg">
  Tu navegador no soporta el elemento audio.
</audio>


ATRIBUTOS

Encontramos la mayoría de atributos y elementos iguales al <video>:
  • controls: añade los controles, como los botones play, stop, pausa y volumen.
  • source: el elemento de HTML5 source nos servirá para indicar qué audio queremos reproducir. Podemos indicar varios sources con varios formatos y así el navegador reproducirá el primero que reconozca, ya que todos los navegadores no son capaces de reproducir todos esos formatos
  • track: con este nuevo elemento de HTML5 indicamos las pistas de texto para los audios.

MÉTODOS Y EVENTOS

El elemento <audio> dispone además de atributos una serie de métodos básicos para poder iniciar o pausar, como son play() pause(), además de eventos que nos permitirán controlar aspectos de la reproducción, como el momento de la carga, el aumento del volumen, etc.

Para obtener una referencia completa de las características del elemento <audio> de HTML5 podéis acceder al siguiente link: