Symfony propel: usar funciones en el objeto Criteria
Criteria es el objeto que permite definir los criterios de selección de resultados en sistemas que emplean Propel como ORM. Propel y Doctrine son dos plataformas de mapeo de resultados SQL a clases empleados por Symfony. Este post se centra en el uso de Propel y describo como emplear funciones SQL propias en el objeto Criteria.
Imagina que tenemos una tabla llamada producto con dos campos:
- id
- nombre
En el modelo de clases generado por Symfony tendremos una clase llamada ProductoPeer que es la encargada de realizar los accesos a base de datos. Para realizar las consultas hemos de construir un objeto Criteria que contiene las características de los datos que deseamos seleccionar. En algunas ocasiones es útil emplear funciones que hemos escrito en base de datos, como por ejemplo, una función que dado un id de producto nos devuelve el número de veces que se ha consultado en nuestra web. El código lógico sería el siguiente:
$criteria = new Criteria();
$criteria->addAsColumn(‘consultas’, ‘getConsultasProducto(‘.ProductoPeer::ID.’)');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);
getConsultasProducto es una función de base de datos que devuelve el número de consultas.
Si lanzamos la aplicación dará un error indicando que ProductoPeer no puede encontrar el campo con la clave primaria. Para evitar esto usamos lo siguiente:
$criteria = new Criteria();
$criteria->clearSelectColumns();
$criteria->addSelectColumn(self::ID);
$criteria->addSelectColumn(self::NOMBRE);
$criteria->addAsColumn('consultas', 'getConsultasProducto('.ProductoPeer::ID.')');
$criteria->add(ProductoPeer::ID, $productoId);
ProductoPeer::doSelect($criteria);
Lo nuevo con respecto al código inicial es que se resetean los campos que estarán en la select y se añaden en el mismo orden en el que están declarados en config/schema.yml del proyecto. Gracias a esto, podemos ordenar los resultados por el número de consultas del producto:
$criteria->addDescendingOrderByColumn($criteria->getColumnForAs('consultas'));
Espero que sea de utilidad. Saludos.
Sistemas Captcha
Seguramente has visto en elgún momento un Captcha, esas imagenes que contiene textos, números o formas con una casilla de texto cercana en la que introducir el texto de la imagen, el resultado de alguna operación aritmética simple o el nombre de la forma que representa la imagen.
Un Captcha no es más que un Test de Turing, ese que dice que si una máquina se comporta de forma inteligente en todos los aspectos es que es inteligente. La idea principal de los Captcha no es más que establecer un pequeño desafío que se debe resolver como el reconocimiento de texto o formas, actividades que son fáciles de ejecutar para un ser humano pero que entrañan una gran complejidad emularlas en computación. Por evitar a los spambots se ha extendido su uso y es raro encontrar una página web con tráfico que no los use en sus formularios de alta, envío de sugerencias o cualquier otro formulario. Los spambots son robots de Internet que pueden ralizar altas masivas en sitios web y llenarlos de comentarios spam, subir imagenes o cualquier otra actividad para la que hayan sido programados. Para que quede claro, enumero alguna de las aplicaciones de los Captchas:
- Prevenir comentarios spam en blogs y foros.
- Protección del registro en sitios web.
- Protección de las direcciones de correo electrónico de los Scrapers.
- Para evitar el voto automático en encuestas.
- Prevenir ataques de direccionario en formularios de login: tras varios intentos, mostrar un Captcha tras un número de intentos fallidos.
- Evitar que robot de indexado accedan al HTML de algunas páginas. Los bot como los de Google respetan el robot.txt, pero existen otros que lo ignora. Podría mostrarse un Captcha para estos últimos.
En Vavag.com, he puesto recientemente un Captcha en el formulario de alta de nuevos usuarios para evitar el registro automático masivo. El Captcha que he usado es el del conocido reCaptcha, una aplicación que empezó como un proyecto de Universidad Carnegie Mellon, y que fue adquirido por Google en 2009. Como Vavag está implementado en Symfony framework, he empleado el plugin sfReCaptchaPlugin de Massimiliano Arione que posee licencia MIT.
Otras alternetivas
Existen otras aplicaciones Captcha como AdsCaptcha que genera desafíos de texto basados en eslogan publicitarios, lo que significa que cada vez que se resuelve un Captcha, se deja algo de dinero a la web en la que está incluido. Sin duda una buena idea para monetizar comentarios en blogs y foros.
Espero que os sea de utilidad este pequeño repaso por los mecanismos Captcha. Bye.
Reseña libro: La Caída de los Gigantes
Hace meses que terminé este libro y tenía ganas de comentarlo pero por motivos oscuros no lo hice en su momento ja ja. Yo lo he leído en versión digital mediante el Kindle, que es mi plataforma habitual de lectura. El libro cuenta la historia de cinco familias diferentes orientada en la difícil época que rodeó la Primera Guerra Mundial. Habla sobre la poca presencia de la mujer en la política, las formas de trabajo de aquellos momentos y sobre el trascurso de la Primera Guerra Mundial desde el punto de vista alemán, inglés, americano y ruso. Gracias a este libro refrescas aquellas nociones de historia de la época juvenil y respondes a la pregunta de si Europa ha sido siempre como es.
Sin duda, para mí, una gran obra de Ken Follet con buena documentación histórica que engancha desde el primer momento. Puede que exista cierta dificultad por la cantidad de personajes históricos que aparecen pero hoy en día Wikipedia te soluciona la duda.
Capturar pantalla en Android sin ser Root
Muchos estareis en la necesidad de capturar la pantalla en vuestro dispositivo Android. Existen aplicaciones en el Adroid Market que capturan la pantalla, pero requieren ser Root o emplear el PC. Este “truco” es sencillo:
- Pulsa el botón volver y no lo sueltes.
- Presiona el botón de la Home hasta escuchar un sonido que indica que se ha realizado la captura… y listo.
- Revisa tu carpeta de contenido multimedia.
Yo lo he probado en Adroid 2.2.1 Froyo y funciona correctamente. Si probais en otras versiones, podeis indicar si funciona en los comentarios.
Saludos
Detectar los navegadores móviles en PHP
Que los dispositivos móviles, como los smartphones o las tablets, han llegado para quedarse es un realidad innegable. Para todos ellos existe varios sistemas operativos: iOS, Android, BlackBerry OS, Symbian, Palm… etc. A su vez, estos contiene aplicaciones, tales como los navegadores, que se han convertido en una de las aplicaciones más importantes de estos dispositivos. Disponer una versión para móvil de nuestra página web es muy recomendable y para poder mostrarla es necesario detectar cuando el agente o navegador proviene de una plataforma móvil. Hoy os presento Detect Mobile Browsers una web que, mediante un sencillo formulario,configuramos las acciones que se realizarán cuando se detecte el user-agent de navegadores móviles como el de iPhone, iPad, Android…
El resultado de completar el formulario es una función llamada mobile_device_detect con los parámetros adecuados para llevar a cabo las reglas configuradas. Dicha función se encuentra en un fichero PHP que podemos descargar. Para usarlo es necesario realizar un include:
require_once('mobile_device_detect.php');
$mobile = mobile_device_detect(param1, param2, ...);
En el fichero PHP que incluimos hay escritas una gran cantidad de expresiones regulares para detectar los principales navegadores. Además, si el user-agent no coincide con el de algún navegador conocido, emplea patrones usados por los principales operadores de telefonía en el user-agent de los sistemas operativos que personalizan.
El código generado se acompaña con una licencia propia que indica la posibilidad de usarlo en un sitio web sin coste alguno siempre que la web no presente actividad comercial.
Cervezas de importación #1: Birra Moretti
Tenia ganas de escribir en el blog sobre cervezas, nacionales y de importación. La cerveza me encanta, es una bebida que combina con cualquier comida y en su justa medida, como el vino, es muy sana. Con este post se inaugura una serie de entradas relacionadas con la cerveza.
Birra Moretti es una cerveza de origen italiano comercializada actualmente por Heineken. La variedad que he probado es la Pale larger, que es el tipo de la mayoría de las cervezas que se fabrican en la actualidad. Bajo el nombre de Birra Moretti se comercializan seis tipos de cerveza, entre ellas La Rossa que contiene un mayor graduación. Tiene un ligero sabor amargo que se disimula con el frío. El precio no es excesivo. Es realmente barata para ser de importación.
A modo de curiosidad, el emblema de la marca es la foto de un anciano tomada por Lao Menazzi Moretti en 1942, que según Menazzi, representa perfectamente a su cerveza.
Más info:
El perro más feo del mundo se llama Yoda
Terry Schumacher ostenta el título de tener el perro más feo del mundo del pasado año declarado en la feria Sonoma Marin.
Insertará Twitter publicidad en los enlaces acortados?
Ayer me fijé en el tipo de redirección que realizan algunos enlaces de el servicio t.co de Twitter: usando Javascript. Sin duda la peor de todas las opciones y la que menos beneficios SEO reporta al dominio al que redirige. Twitter optó por crear su propio servicio por motivos de seguridad, para asegurarse que los enlaces publicados no contienen malware y esas historias:
En cualquier caso, para realizar todas las labores de seguridad y estadísticas que fueran necesarias no se necesita redirección por javascript. Se puede usar redireccionamiento 301, por ejemplo, que traspasa el PageRank a la dirección destino cuando rastrea el enlace GoogleBot. El motivo por el que se hace este tipo de redirección podría ser el de mostrar publicidad antes de redirigir al destino pero eso el tiempo lo dirá.
Tres e-books gratuitos para aprender a programar en Objetive-C y Cocoa Framework
Como todo lo que crea Apple alcanza la cima, si quieres programar aplicaciones nativas para plataformas como iPhone o iPad tienes que aprender a programar en Objetive-C. A su vez, para realizar aplicaciones más complejas y utilizar todo el potencial de la plataforma subyacente, tendrás que usar un conjunto de APIs llamadas Cocoa. Para aprender a usar todo esto dejo tres libros para aprender Objetive-C y Cocoa que he encontrado vía Reade & Write muy interesantes.








