Sortear grupos online con Sortea2

En sortea2 siempre tratamos de comprender a nuestros usuarios y ofrecerles lo que creemos que necesitan, es por ello que hemos desarrollado la opción en los sorteos avanzados de sorteo de grupos, ideal para cualquier deporte e incluso útil para otros fines simplemente para agrupar gente de cuatro en cuatro.

sorteo_gruposs_prueba

Está opción estará disponible solamente desde los sorteos avanzados porque creemos que sorteos simples se debe mantener como una herramienta fiel a su propio nombre: simple, debe tener el mínimo número de opciones posible.

sortear_grupos_sortea2

Simplemente seleccionamos la opción de sorteo de grupos y ya obtendremos la lista de jugadores encuadrada en grupos de cuatro. Si el número de jugadores no es múltiplo de 4 entonces habrá un grupo que quedará cojo aunque es así también en el Mundo Real, por lo que no se consideraría un error.

Decir que estos sorteos también podrán ser programados y se podrá abrir la participación para que se vayan apuntando los participantes.

Enlace: http://www.sortea2.com/sorteos-avanzados

XML-RPC con PHP. Servidor y cliente

XML-RPC es un conjunto de implementaciones que permiten que software escrito en distinto lenguaje y/o plataforma puedan comunicarse entre sí mediante el empleo del XML.

Se utiliza el protocolo HTTP clásico para el transporte de datos y el XML como el lenguaje.

¿En qué consiste su funcionamiento?

La idea es crear un servidor XML-RPC utilizando el lenguaje de programación con el que nos sintamos más cómodos y que esté accesible desde una ruta en concreto, por ejemplo algo así como trackingo.com/xmlrpc

A continuación, un cliente, utilizando nuevamente el lenguaje que se quiera se conectará a esa dirección y llamará a métodos disponibles en la implementación del servidor.

Por ejemplo, el servidor puede tener unos métodos llamados “sorteo.Crea”, “sorteo.Borra” y “sorteo.Edita”, cada uno de los cuales con una serie de parámetros requeridos cada uno de un tipo concreto. El cliente podrá leer la documentación de la API o llamar a los métodos genéricos que devuelven la lista de métodos y podrá hacer uso de ellos a su antojo.

¿Cómo deberían ser los métodos?

Un método debe estar declarado en el servidor primeramente antes de ser definido explícitamente en el lenguaje que estemos usando. Cada método tendrá su nombre, que no tiene por qué ser el mismo que el nombre de la función propiamente dicha del lenguaje y que puede pertenecer a un namespace si lo deseamos, es decir, reunir conceptos delante de un punto para así agrupar mucho mejor las funciones.

A continuación, debemos definir el acceso a la función (function), una signature que es la lista de parámetros que aceptará y el tipo de estos. Al fin, tenemos que rellenar la docstring que no es más que una línea o dos de texto con una descripción breve de en qué consiste el método.

Creación del servidor y de los métodos con PHP

La manera óptima de usar la implementación XML-RPC sin duda es la librería XML-RPC for PHP, software libre y de gran aceptación, la usa la inmensa mayoría de la gente. Aunque PHP trae de manera nativa una serie de funciones relacionadas con XML-RPC, difícilmente conseguiremos hacer que funcionen. Sin contar que son experimentales y la documentación es nula.

Una vez descargada la librería, haremos un include_once() suyo y ya empezaremos a usar sus clases y métodos para montar el servidor.

Crear el servidor es tan simple como crear el objeto xmlrpc_server($dispatchMap); siendo el dispatchMap un array con la lista de declaraciones de métodos, siguiendo una estructura como la siguiente:

$dispatchMap = array("nombreMetodo1’ => array(“function” => “metodo1”, “signature” => array(array(XML_ARRAY, XML_STRING, XML_INT)));

$server = new xmlrpc_server($dispatchMap);

Con esto crearíamos un servidor con un método que recibe de parámetros un array, una string y un entero.

Los tipos de datos es muy recomendable tenerlos almacenados en constantes de PHP. Los tipos de datos existentes son:

¿Cómo se conecta uno luego al servidor?

En el cliente tendremos que tener exactamente la misma librería que utilizábamos para crear el servidor, hacer un include() de ella y crear el siguiente objeto:

$cliente = new xmlrpc_client($ruta, $host, $puerto);

La ruta será la lo que debemos añadir después del dominio para acceder al servidor, el host el servidor y el puerto casi siempre será 80.

Para llamar a los métodos ya será cuestión de crear un objeto de la clase xmlrpcmsg y enviarlo al servidor.

$funcion = new xmlrpcmsg($nombre_metodo, array(new xmlrpcval($parametro1), new xmlrpcval($parametro2, XML_INT));

$respuesta = $cliente->send($funcion);

Cabe destacar que cuando creamos un valor de tipo STRING no hace falta decirle el tipo porque es por defecto.

Consideraciones muy a tener en cuenta al crear una API XML-RPC

  1. Crea una key para la API. Que cada usuario que se conecte tenga una clave única para conectarse y así poder controlar quien se conecta, qué hace, cuando y cuantas veces.
  2. Si tienes que enviar un nº de parámetros indeterminado a priori, usa los tipos de datos STRUCT y ARRAY.
  3. Si tu aplicación realiza altas, bajas y modificaciones en una Base de Datos es aconsejable además llevar un registro de la sesión del usuario. Puede no ser interesante que todas las operaciones estén asociadas al usuario que ha implementado la API sino que cualquiera pueda usar el cliente para conectarse con sus datos.
  4. Utiliza límites de uso. Piensa qué pasaría si a alguien se le ocurre hacer un bucle de 1 a 1 millón haciendo llamadas absurdas a tu sistema. Haz un log de cada operación y calcula si ha alcanzado el límite de llamadas por día, hora, minuto o segundo (lo que prefieras). Límites de segundos no es recomendable de todas maneras porque habrán implementaciones que requieran de dos llamadas o más para ejecutarse.

Para terminar

Esto no es ni muchísimo menos una guía de XML-RPC, simplemente una idea de como se utiliza, en qué consiste y para orientar al posible usuario.

Fuentes: http://oreilly.com/catalog/9780596001193
http://www.xmlrpc.com/
http://www.trackingo.com/api

Ganador Sueldo Nescafé 2010

Este miércoles ya se dieron a conocer los resultados de uno de los sorteos anuales más importantes de este país, el Sueldo Nescafé.

Este año el ganador ha sido Joaquín Martinez Herrera y según publica Nescafé en su página de facebook, es de Jerez de la Frontera.

Al parecer Ángel Llácer fue en persona a Jerez de la Frontera a darle la noticia directamente.

Seguid animándoos a participar para la edición del año que viene.

Montar SVN en tu proyecto web

Subversion (SVN) es, junto a GIT el líder en control de versiones de software libre. Subversion es una mejora del antiguo sistema llamado CVS que tenía sus limitaciones; aunque aún se sigue utilizando en multitud de proyectos creo que es mucha mejor opción Subversion.

Subversion logo

En esta entrada no voy a hablaros de montar un servidor SVN, principalmente porque es una tarea compleja que está destinada más bien a administradores de sistemas. Os voy a hablar de como configurar vuestro proyecto para beneficiarse del funcionamiento de un servidor existente. Si lo que necesitas es crear tú mismo un servidor para estos fines, te recomendaría mejor el libro de O’Reilly de SVN.

Para proyectos en los que trabaje más de una persona creo que es una herramienta que una vez se conoce es poco menos que imprescindible. Incluso si trabajamos solos puede servirnos de gran ayuda para no perder ninguno de los cambios que hagamos y poder tener un histórico permanente del proceso de desarrollo.

Antes de adentrarme a explicar la configuración, diré básicamente en qué puede ayudarnos este sistema:

Hasta aquí la enumeración de algunas de las ventajas, estoy seguro que me he saltado decenas de ellas.

Conseguir servidor:

Bueno, pues lo primero que necesitamos para empezar es un hosting de Subversion. Hostings hay muchos, aunque la mayoría son de pago y hay que saber encontrar el óptimo. Si tu proyecto es de software libre no debes preocuparte lo más mínimo de tener que pagar ni nada, puesto que para apoyar el Software Libre hay hostings gratuitos con capacidades ilimitadas para sus usuarios.

Una comparativa genial de los distintos hostings de Subversion que hay se puede encontrar en http://www.svnhostingcomparison.com/

Para software libre está claro que las dos opciones idóneas deben ser Google Code y SourceForge.net. Hay más que ofrecen capacidades ilimitadas, pero creo que esos están por delante.

Si nuestro proyecto es de software propietario entonces tendremos que ajustarnos un poco más, tendremos que escoger entre pagar para tener algo holgado o encontrar un hosting que permita privacidad en los proyectos y una cantidad de almacenamiento y usuarios aceptable.

Sin duda alguna, la mejor opción gratuita para software propietario es Assembla. Brinda de manera gratuita 2GB de almacenamiento, un número ilimitado de programadores e incluso SSL; sin contar que la velocidad de subida y bajada es super apropiada.

Hay más opciones, aunque la siguiente mejor ofrece 1/4 del almacenamiento que da Assembla, por lo que no merecen la pena. Si queremos pagar ya solo depende de lo que necesitemos y lo que podamos pagar, hay un punto en el que compensa tener un servidor dedicado tanto propio como alquilado para que se encargue únicamente del control de versiones.

Montar servidor:

Para montar el servidor habrá que seguir los pasos por los que nos guíe el sitio web del servicio web escogido hasta que finalmente obtendremos una dirección URL tal que así:

https://subversion.assembla.com/svn/sortea2

Hay que tenerla muy en cuenta puesto que a esta URL es a la que nos conectaremos. El usuario y la contraseña para conectarse será exactamente el mismo que el que tuvimos que usar para loguearnos en la página web.

Programa cliente:

A continuación tendremos que usar nuestro programa de lado del cliente para conectarnos; esto es, un programa en nuestro ordenador al que le daremos URL, password y usuario y estaremos conectados.

Para Windows el que se utiliza casi siempre es el Tortoise SVN, que es un cliente de escritorio de software libre también con una interfaz inmejorable. Una vez lo tengamos instalado este programa lo que hace es añadir unas opciones a los menús contextuales del explorador de Windows relativas a repositorios SVN.

Una nota importante a tener en cuenta para pasos posteriores es que si utilizamos Dreamweaver nos interesará descargar la versión de 32 bits de Tortoise si luego queremos conectar ambos sistemas. Se puede tener instalada la versión de 32 y de 64 bits al mismo tiempo de cualquier manera, pero conviene tenerlo en cuenta.

Conectarse al repositorio:

La primera vez que queramos establecer conexión tendremos que dar click derecho sobre la carpeta y seleccionar SVN Checkout…, en el cuadro que nos saldrá pegaremos la URL del repositorio que nos proporcionó el sistema de hosting y a continuación se nos pedirá un par de usuario/contraseña. Si le damos a “recordar” no volverá a preguntar ni pedir autorización.

Ejemplo de Checkout con Tortoise

Una vez aquí, si todo ha ido correctamente lo que tendremos que hacer es subir los archivos al repositorio. Para ello haremos click derecho sobre la carpeta y le daremos a “SVN Commit”. De ahí seleccionaremos archivos que no estén versionados (“show unversioned files”), seleccionaremos los que queramos y se subirán uno a uno al hosting de SVN.

Si por el contrario nuestro hosting ya estaba montado anteriormente y lo que queremos es descargar las cosas para tener las copias en local, en vez de “Commit” seleccionaremos “SVN Update” y nos descargaremos todo lo que no tengamos descargado.

Integrar con Dreamweaver:

Si utilizas Adobe Dreamweaver como entorno de desarrollo quizás lo que más te interese es tener las posibilidades de envío y recepción de archivos en la misma ventana del programa en vez de estar intercambiando con el explorador de windows para hacer las operaciones.

Dreamweaver desde la versión CS4 incluía un cliente de SVN integrado, el problema viene de que si tenemos un repositorio creado con Tortoise y luego los usamos con el cliente ese de DW no nos servirá, porque tiene una incompatibilidad documentada que Adobe contempla en su sitio web ofreciendonos un parche. Dicho parche está escrito en Python, por lo que si no tenemos instalado Python (90% de los mortales) no funcionará, además hay que tener en cuenta que la versión de Python deberá ser la de 32 bits, porque si no tampoco se iba a poder instalar el parche, debido a que DW dirá que no encuentra una instalación de Python válida.

En definitiva, es mejor olvidarse de todos estos escollos y simplemente usar una extensión para Dreamweaver llamada SubWeaver que actúa como intermediario entre Dreameaver y Tortoise. Ya es cuestión de usar los menús contextuales que nos brinda la extensión y estaremos 100% integrados con Tortoise desde Dreamweaver.

10 consejos para optimizar MySQL

En un proyecto web medianamente ambicioso llega siempre el momento en que la parte “sagrada” de la aplicación es la Base de Datos. El problema reside cuando las tablas de nuestra Base de Datos empiezan a tener más de 10.000 registros. A partir de ese momento debemos pensar de diferente manera: los accesos deben optimizarse, el sistema de búsqueda ya es demasiado lento y a veces llega incluso al límite de tiempo de ejecución, ya no se puede hacer un ALTER TABLE sin tener que tener la tabla bloqueada unos segundos, etc. Cuando nos empezamos a encontrar con estos problemas es cuando no hemos hecho una predicción suficientemente buena y debemos actuar rápidamente para remediarlo.

Optimizar MySQL es una tarea que debemos tener en mente desde el minuto cero al empezar a programar. A continuación os mostraré 10 consejos que pueden acelerar los accesos a vuestras tablas:

  1. Usa índices:

    Seguramente lo hayas oído cientos de veces, pero al utilizar inteligentemente índices los accesos se hacen de una manera directa. Los campos que solamos incluir dentro del “WHERE” de las consultas debería tratarse de estar indexadas.

    Los accesos vía PRIMARY KEY son, con diferencia los más veloces. Si sabemos que un determinado registro no va a poderse repetir, debemos incluirle un índice UNIQUE y si vamos a realizar búsquedas sobre un campo de fecha por ejemplo, le podemos añadir un INDEX simple.

    Hay que tener en cuenta que los índices son acumulativos y se tienen en cuenta de izquierda a derecha en la definición de la estructura de la tabla. Esto quiere decir que las búsquedas estarán optimizadas en ese orden. El primer campo indexado será el primer criterio en velocidad.

  2. Utilización de campos binarios

    Los tipos de dato binario son BINARY, VARBINARY y BLOB que van en consonancia con CHAR, VARCHAR y TEXT. Si el texto que vas a almacenar no va a tener una codificación como UTF-8 es mucho más conveniente utilizar campos binarios, puesto que ocupan mucho menos espacio y las comparaciones se hacen como datos numéricos internamente.

    Por ejemplo, campos que guarden cadenas codificadas como MD5, campos de permalink, nombres de usuario que sepamos que no permiten caracteres extraños, etc. pueden ser puestos como binarios y los accesos y el tamaño de la tabla será muy inferior.

  3. Utiliza UNSIGNED

    Si sabes que en ese campo solamente irán números positivos, utiliza UNSIGNED. Esto aumenta al doble la capacidad máxima de los campos sin alterar el número de bytes necesarios para almacenar cada dato. Por ejemplo, todos los campos que utilicen un AUTO_INCREMENT deben utilizarlo, puesto que de la otra manera tendremos un rango enorme de números que jamás utilizaremos.

  4. Guarda información redundante

    Si tienes una entidad fuerte con entidades débiles, guarda toda la información que puedas en la entidad padre sobre las entidades débiles, esto es: total de datos de cada una, máximos, mínimos y media (si se utilizarían para algo), último dato introducido, etc. Cada vez que se realice una modificación en las entidades débiles habrá que actualizar a la padre, pero si normalmente nuestra aplicación recibe más consultas que actualizaciones esto supondrá una ventaja en el rendimiento.

  5. No uses tipos de datos gigantes

    Me atrevería a decir que el 99% de las personas jamás necesitarán un campo LONGTEXT a no ser que se trate de un gestor de contenidos o algo por el estilo; incluso habrá muy pocas que necesiten un campo BIGINT para uso normal. Un BIGINT ocupa cada número 8 bytes y puede almacenar un número de un 9 seguido de 18 ceros (aproximadamente). El campo LONGTEXT almacena hasta 4 billones y pico de caracteres, que pueden ser mucho más de 50 páginas de Word por ejemplo.

    Los tipos de dato exageradamente grandes ocupan por cada unidad más tamaño y rara vez se utilizan por completo. Es por eso que es más recomendable usar medidas más comedidas de datos.

  6. Trata de usar los simplificadores del lenguaje

    MySQL proporciona algunas maneras que ayudan a hacer las consultas más cortas y más fáciles de entender. Estos métodos no solo nos ayudan a nosotros, sino que internamente son mucho más eficientes. Por ejemplo, usar la expresion " WHERE sorteo = 1 OR sorteo = 2 OR sorteo = 5" es mucho menos eficiente que la siguiente: " WHERE sorteo IN(1,2,5)".

    Algunas de estas expresiones pueden ser BETWEEN, IN, LEAST, GREATEST o INTERVAL.

  7. Intenta unificar consultas

    Intenta siempre hacer una consulta cuando normalmente lo harías con varias. INSERT puede insertar varios registros al mismo tiempo si se separan los “VALUES” por paréntesis y comas, por ejemplo: INSERT INTO sorteo VALUES (1,23),(4,5,6),(7,8,9).

    DELETE múltiples se pueden construir en vez de en bucle insertando los valores a borrar dentro de un IN() de MySQL.

  8. Evita operaciones matemáticas

    No es buena idea hacer cálculos complejos en una SELECT. Siempre que sea posible hay que traer los datos al lenguaje que utilices (PHP por ejemplo) y hacer estos cálculos. Por ejemplo, realizar redondeos, medias, divisiones y demás puede resultar problemático y hay que tener siempre en mente que cuanto menos trabajo haga la Base de Datos, más eficiente será.

  9. Utiliza MyISAM si es posible

    Un denominador común en las aplicaciones web es que casi siempre se hacen más selects que inserts/updates/deletes. Si este es nuestro caso, podemos renunciar a las posibilidades relacionales que permite InnoDB para tener un gestor más rápido en las consultas.

  10. Emplea frecuentemente el LIMIT

    Esto es a la vez un consejo de rendimiento y de seguridad. Si estamos seguros de que vamos a borrar un registro de la tabla, entonces podemos añadirle un LIMIT 1 al final y así nos aseguraremos que no se borrará en ninguno de los casos nada fuera de control. Esto es aplicable también para SELECTs y UPDATEs.

    Cada vez que tengas claro con cuantos registros estás trabajando, utilízalo.

En definitiva todos los puntos se refieren a que hay que tener control total de los datos que tenemos almacenados, siempre teniendo en cuenta las limitaciones y tratando de mantener una integridad de los datos.

Fuentes: MySQL Certification Study Guide, Building Scalabe Web Sites (The Flickr way).