Decoradores en Zend Form

De cuando en cuando, tengo que lidiar con formularios Zend_Form en Zend Framework. Son maravillosos, ya que simplifican enormemente el trabajo, y bien usados pueden aumentar notablemente la calidad de los formularios. Si no estás ya convencido, deja que te cuente alguna de sus ventajas:

  • Separación del formulario de las vistas. Ahora los formularios serán un objeto sobre el que puedes realizar numerosas operaciones. La clase encargada es Zend_Form.
  • Cada elemento del formulario es también un objeto, que hereda de Zend_Form_Element. Es decir, si añades un campo de texto, éste será también un objeto que, entre otras propiedades contiene su nombre, valor, etiqueta, descripción, errores, filtros, validadores, etc. Están todos los elementos de un formulario HTML disponibles en la biblioteca de Zend_Framework
  • Filtros, gracias a Zend_Filter. Podemos hacer que un elemento filtre de forma limpia y elegante su valor, como por ejemplo conversión a mayúsculas. Zend Framework trae un gran número de filtros.
  • Validaciones, gracias a Zend_Validate. Del mismo modo que podemos filtrar, también podemos añadir validaciones. Por ejemplo, que un valor numérico se encuentre en un determinado rango, que cumpla una determinada expresión regular, o que no exceda un determinado número de caracteres.
  • Comprobar el formulario. ¿Queremos saber si el formulario que ha completado el usuario es correcto? Simplemente invocamos el método isValid() del formulario, y sabremos si ha sido correcto.
  • Definir el formulario en un archivo .ini o .xml.

Pero volviendo al hilo, cada vez que tengo que retomar Zend_Form, hay un punto en el que me atasco: los decoradores. Su funcionamiento se basa en el patrón decorador.

Decorator Pattern

¿Qué hace exactamente? Añadir en tiempo de ejecución una nueva funcionalidad (decorar) a un objeto. Se usa mucho en entornos gráficos. Por ejemplo, para añadir nuevas opciones a una ventana o a un elemento gráfico. Nótese que en lugar de eso, podrían crearse subclases que heredaran unas de otras, pero esto conllevaría un problema: el número de clases total seguiría un crecimiento exponencial del tipo 2^funcionalidades. Precisamente ese problema es el que soluciona ese patrón.

Por ejemplo. Supongamos una clase base ‘Cafe’. Para la clase Cafe creamos 4 decoradores: ConAzucar, ConLeche, ConChocolate, ConEspuma. Si quisiéramos resolver todas las combinaciones posible, creando una clase para cada una de ellas, tendríamos 2^4 clases, es decir, 16. Con decoradores, añadimos estas funcionalidades al vuelo.

¿Y en qué afecta esto a Zend_Form? Como hemos dicho, tanto el formulario como los campos de éste, son objetos. Al renderizarse en HTML, muy seguramente, queramos modificar el modo en que se muestran por defecto. Y ahí es donde entra en juego el patrón decorador: Añadimos nuevas funcionalidades dinámicamente, para que por ejemplo un campo de texto esté envuelto en un div, que a su vez pertenece a una celda td.

Nota: La mayoría de la información de este artículo, y ejemplos, los he sacado del artículo Decorators with Zend Forms de la Zend Developer Zone.

La mayoría de elementos de un formulario (por ejemplo un campo de texto, un textarea o un combo) tiene una serie de decoradores “de serie” (el orden importa):

  1. ViewHelper – Es el encargado de renderizar el propio elemento
  2. Errors – En caso de que haya errores (por ejemplo, el valor introducido supera el tamaño máximo), lo mostraría este decorador.
  3. HtmlTag – Envoltura, por defecto con la etiqueta <dd> para el ViewHelper y Errors.
  4. Label – Etiqueta, envuelta en la etiqueta <dt> por defecto.

Se invocan (y anidan de dentro a fuera) en orden, de modo que la anterior pila generaría algo similar a lo siguiente:

$label->render($htmlTag->render($errors->render($viewHelper->render(''))));

Visto paso a paso, esto es lo que ocurriría:

Punto de partida

Partimos de una cadena de texto vacía

''

Se renderiza ViewHelper

A continuación se genera el código HTML de la etiqueta. En este ejemplo, al elemento se le había definido como tipo texto con nombre e id igual a “foo”

<input name="foo" id="foo" type="text" value="" />

Se renderiza Errors

Posteriormente se añade el código que muestra los errores. Por defecto se pospone (prepend) al contenido que ya hubiera.

<input name="foo" id="foo" type="text" value="" />
<div><ul>
    <li>...</li>
</ul></div>

Se renderiza HtmlTag

En este paso, añade una etiqueta dd (por omisión), que, por defecto, envuelve al contenido que ya hubiera.

<dd>
    <input name="foo" id="foo" type="text" value="" />
    <div><ul>
        <li>...</li>
    </ul></div>
</dd>

Se renderiza Label

Y en último lugar, se genera el código HTML de la etiqueta (por omisión viene envuelto en dd), y lo antepone a lo que ya hubiera (append).

<dt><label for="foo">Foo</label><dt>
<dd>
    <input name="foo" id="foo" type="text" value="" />
    <div><ul>
        <li>...</li>
    </ul></div>
</dd>

¿Cómo modificamos la forma en que se genera el código por defecto? Hay dos vías.

La primera nos permite añadir nuevos decoradores al comienzo de la pila, eliminar alguno de ellos, y/o modificar la ubicación en que se muestra alguno de los que ya hay. Por ejemplo, esto extraería el decorador ‘label’ de la pila de decoradores del elemento, y modificaría su ubicación (valores posibles appendo o prepend):

$label = $element->getDecorator('label');
$label->setOption('placement', 'append');

Del mismo modo, podríamos eliminar de la pila de decoradores el decorador ‘label’ así:

$element->removeDecorator(‘label’);

La segunda es más potente, y nos permite redefinir toda la pila

$element->setDecorators(array(
    'ViewHelper',
    'Description',
    'Errors',
    array(array('elementDiv' => 'HtmlTag'), array('tag' => 'div')),
    array(array('td' => 'HtmlTag'), array('tag' => 'td')),
    array('Label', array('tag' => 'td')),
));

Cada elemento dentro del array es un decorador, de modo que en este caso tenemos 6: ‘ViewHelper’, ‘Description’, ‘Errors’, ‘HtmlTag’, ‘HtmlTag’, ‘Label’.

A cada elemento le podemos añadir opciones, como por ejemplo el tag a utilizar. En ese caso, en lugar de utilizar sólo su nombre, lo haríamos así:

array('decorador', array('opción' => 'valor'))

Además, si usamos dos veces un mismo decorador, debemos necesariamente etiquetarle con un nombre que lo identifique de manera unívoca, ya que sino, el último decorador de ese tipo que se añada, sustituirá al anterior. Para poner una etiqueta, lo haríamos así:

array( array('etiqueta' => 'decorador'), array('opción' => 'valor'))

Explicación:

  1. Primero renderiza ViewHelper (V), que es un atajo del elemento (por ejemplo, el campo de entrada). De forma resumida, generaría el siguiente código: <V>.
  2. En segundo lugar, renderiza la descripción (D), que por defecto se ubica tras (prepend) lo que hubiera, de modo que quedaría: <V><D>.
  3. Ahora con los errores (E), los renderiza por defecto antes (append) de lo que hubiera: <E><V><D>.
  4. En el cuarto paso, creamos un decorador de tipo HtmlTag al que etiquetamos como ‘elementDiv’, y que le pasamos como opciones que use el tag ‘div’. Este decorador, por defecto, envuelve lo que hubiera: <div><E><V><D></div>.
  5. Quinto paso, al igual que en el anterior creamos un decorador de tipo HtmlTag, etiquetado como ‘td’, y que usará el tag ‘td’, quedando así: <td><div><E><V><D></div></td>.
  6. Sexto y último paso, renderizamos la etiqueta (L), cuya ubicación por defecto es antes de lo que hubiera (append), y a la que le pasamos una opción adicional para que esté contenida dentro de un tag de tipo ‘td’: <td><div><E><V><D></div></td><td><L></td>.

Ahora ya conocemos la dinámica de cómo decorar un elemento de un formulario. Hemos visto sólo unos pocos (ViewHelper, Description, Errors, HtmlTag y Label). Por cada tipo de campo (input text, button, file, etc.) hay un decorador, siendo ViewHelper sólo un atajo que deduce cuál de ellos usar. Estos algunos decoradores más (aquí la lista completa):

  • Callback – Si no nos queremos complicar, podemos definir una función callback que reciba como parámetro el elemento, para con una sentencia similar a ésta, devolver el nuevo contenido:
    return ’<span>’ . $element->getLabel() . ”</span>”;
  • Form – Es el decorador por defecto del propio formulario. No lo hemos dicho, pero no sólo los elementos del formulario tienen decoradores. También los tienen los formularios en sí.
  • FormElements – Este es el encargado de renderizar cada uno de los elementos dentro de un formulario, es decir, es el que envuelve a nuestros elementos.
  • Image – Para renderizar una etiqueta de tipo img en el formulario. Útil por ejemplo cuando queremos mostrar en un formulario de actualizar perfil de usuario su avatar activo.
  • ViewScript – ¿Que todo lo anterior resulta demasiado farragoso para un simple formulario? No hay problemas. ViewScript permite diseñarlo a la antigua usanza, con una plantilla. Todo esto sin tener que dejar de lado toda la potencia y facilidades que nos ofrece utilizar Zend_Form como sustituto de los formularios no gestionados.

Hay mucho más que ver sobre los decoradores, como por ejemplo, aprender a definir nuestros propios decoradores, o saber cómo hacer uso de ViewScript. En cualquier caso, Matthew Weier O’Phinney lo tiene todo explicado de maravilla en el artículo del Zend Developer Zone que enlazaba al comienzo.

Gracias por leer este artículo :)

Capturador de enlaces de Películas Yonkis

AVISO IMPORTANTE: Script obsoleto

Desde que el diseño de Películas Yonkis cambió, el script que desarrollé y que hay aquí colgado, se ha quedado obsoleto. Sería necesario reajustar las expresiones regulares. Ignoro si hay más cambios (como nuevas “trampas” en JavaScript).

Por favor, si has creado una versión actualizada, compártelo y añado una referencia a la URL donde lo tengas alojado.

¡Cuantísimo tiempo sin escribir! Por suerte o por desgracia, últimamente tengo muy poco tiempo para mí. Recientemente se han visto varias noticias sobre cómo dejar de depender de páginas de enlaces como Series Yonkis y compañía. Al hilo de ese asunto, alguien redactó el Proyecto Communis. En resumen consiste en crear una base de datos única con todos los enlaces a descargas. De esa base de datos podrán beber todos los servicios que lo deseen. En mi opinión, ése no es el camino a seguir; seguiría siendo un sistema centralizado, en tanto que tanto los ficheros como la base de datos estarían alojadas en algún servidor en particular. Es un sistema muy débil, pero es el que venimos usando ahora. La solución pasa por volver a un sistema completamente descentralizado como es el P2P.

Ahora bien, las páginas de descargas son hoy por hoy la solución más eficaz para acceder a los contenidos. En concreto, la web que más tráfico tiene (y entiendo que la mayor base de datos también) es Películas Yonkis. Y no sé a vosotros, pero a mí no me gusta, no me gusta nada. Está inundada de screeners, audios en latino, o versiones originales. No hay nada malo en ello, siempre y cuando hubiera alguna forma eficaz de poder filtrar contenidos. Y como no existe, pues me he hecho un programa (sí, otro más) para descargar su base de datos. Luego tengo una web de uso personal para yo (y mi señor padre) poder localizar esos enlaces.

Os presento mi script capturador de Películas Yonkis: crawler.php

Funciona igual que el que desarrolló Carlos Capote para Series Yonkis: Un script se encarga de descargar documentos web, y mediante expresiones regulares, captura su contenido. Finalmente, se salta la protección javascript ejecutando javascript en consola (con SpiderMonkey).

Características

Como principales características tiene:

  • Funciona en PHP, de modo que se puede ejecutar en prácticamente cualquier servidor web.
  • Es únicamente para Películas Yonkis, aunque está hecho de forma que sea fácilmente extensible para añadir otros portales (próximamente, CineTube).
  • Guarda una copia local en SQLite.
  • Puede ejecutarse en busca de nuevos enlaces. Sólo lleva unos segundos, ya que mediante peticiones HEAD comprueba si la URL ya se ha analizado: para ello, almacena una lista de URLs y sus cabeceras ETag y last-modified.
  • Evita duplicados, ya que almacena en base de datos cada URL de descarga.

Únicamente tiene dos dependencias: SpiderMonkey y cURL para PHP.

Base de datos

La base de datos tiene dos tablas, Movies y Movie_Links:

Movies:

  • id – identificador numérico.
  • title – Título de la película.
  • year – Valor numérico para el año.
  • description – Sinopsis.
  • genres – Lista separada por comas de géneros.

Movie_Links:

  • id – Identificador numérico.
  • movie_id – Identificador de la película a la que pertenece.
  • urls – Lista de URLs de esta descarga. En la mayoría de los casos será sólo una, pero hay películas que están divididas en partes.
  • lang – Idioma.
  • subs – Indica si tiene o no subtítulos.
  • quality – Calidad, de 1 a 5.
  • length – Duración en minutos.
  • enc – Método de codificación, por ejemplo DVD-Rip o Screener.
  • size – Tamaño total en MB.
  • format – Formato del fichero, por ejemplo AVI.
  • resolution – Resolución de salida.
  • type – Indica si es descarga directa o visualización online.
  • service – Almacena el servicio utilizado, por ejemplo, megaupload, megavideo, veoh, fileserve, etc.
  • broken – No usado todavía, sirve para notificar si un enlace está roto.

Y aquí dejo una copia de la base de datos (14.85MB). Puedes descargarla y ejecutar:
$ sqlite3 peliculas.db

Supongamos que queremos consultar todas las pelis de ciencia ficción que estén en megaupload, en DVD-Rip y en español de España, podríamos ejecutar:

$ sqlite3 peliculas.db
SQLite version 3.6.12
Enter SQL statements terminated with a ";"
sqlite> select distinct(m.title)
from movies m, movie_links ml where
ml.movie_id = m.id
and enc="DVD-Rip"
and genres like "%ciencia%"
and lang="spanish"
and service="Megaupload";

Comparativa entre la web de la Comunidad de Madrid y la de la Casa Blanca

Leyendo noticias en menéame, me encuentro con un artículo que hace referencia a una comparativa entre las páginas web de las comunidades autónomas de España. El artículo se centra en el protagonismo que recibe la presidenta de la Comunidad de Madrid, con respecto al resto de presidentes en las páginas de sus respectivas comunidades. A mí lo que mas me ha llamado la atención es el sorprendente parecido entre la página de la Presidencia de Madrid y la de la Casa Blanca.

Página web de la Presidencia de la Comunidad de MadridPágina web de la Casa Blanca

Vamos a verlo paso a paso

Cuestiones generales

Tienen en ambos casos un diseño de ancho fijo (en torno a 995px).

Los colores son sospechosamente parecidos: Juegan con tonos azules y grisáceos.

Contra todo pronóstico no utilizan el mismo gestor de contenidos. En el caso de la página de la Casa Blanca, utilizan Drupal, mientras que en la Presidencia de la Comunidad de Madrid utilizan Joomla!.

El contenido está estructurado exactamente de la misma forma:

  1. En primer lugar la cabecera
  2. Le sigue un menú horizontal
  3. Inmediatamente después un slider de casi 400px de alto.
  4. Diseño de dos columnas.
  5. Pie de página.

Quizás no sorprenda, ya que al fin y al cabo hay bastantes páginas con esta organización, pero sigamos.

Fondo de la página

En ambos casos encontramos un fondo de un tono gris claro, que se degrada verticalmente hasta alcanzar un tono blanco. Todo ello arrojando la página una sombra a cada lado.

Además, en la parte superior los dos fondos cuentan con motivos decorativos en tonalidades grises, que siguen una trayectoria elíptica, y que llegan a verse por debajo de una cabecera semitransparente:

Cabecera

La cabecera, además de ser en los dos casos semitransparente, también incluyen un dibujo en blanco y negro, centrado, del edificio emblemático.

Con tipografías muy similares, en mayúsculas y en gris oscuro encontramos tanto el nombre del edificio (White House vs Presidencia de la Comunidad de Madrid) a mayor tamaño, como el del anfitrion (President Barack Obama vs Excma. Sra. Doña Esperanza Aguirre Gil de Biedma) en un tamaño menor.

Menú

Tras la cabecera encontramos tanto en una como en otra un menú horizontal, desplegable, de tonos azules y letras blancas.

Además, en los dos casos, incluyen en el mismo menú la bandera propia.

Slider

Inmediatamente debajo del menú encontramos en los diseños un slider de imágenes. Esto es, la parte que va rotando las fotografías. Los dos casi coinciden milimétricamente en tamaño.

Tienen un fondo azul que se degrada verticalmente a un tono más oscuro. Los textos que acompañan a cada imagen son de color blanco, y se componen de un título y una descripción. Tanto en uno como en otro encontramos un destello azul claro debajo del título.

Diseño a dos columnas

Quizás no parezca mucha casualidad que las dos páginas utilicen un diseño a dos columnas, pero la cosa cambia si tenemos en cuenta esto:

  • La columna izquierda es la principal y la derecha la secundaria.
  • La columna izquierda es de fondo blanco y la derecha de fondo gris claro.
  • La columna izquierda contiene noticias.
  • La columna derecha contiene la caja de búsqueda en primer lugar, enlaces a espacios corporativos en redes sociales, videos/imágenes destacados…

Pie de página

Quizás sea la parte que tiene menos coincidencias, pero llama igualmente la atención que las dos webs cuenten con pies de página extensos, en los que se muestra un mapa web dispuesto en columnas.

Conclusión

No sé qué pensaréis, pero a mí me parece evidente que los diseñadores de la página de Madrid se han servido de la de la Casa Blanca para realizar el diseño. Son demasiadas casualidades inexplicables, y si no que se lo digan a Iker Jimenez, toda una serendipia.

Blogs a los que sigo

Alguna vez me han preguntado cuáles son los blogs y páginas que sigo por RSS. Son al rededor de 100, y también mi principal fuente de información (prácticamente no veo la tele, tampoco escucho la radio, ni leo prensa escrita). Pues bien, ésta es mi lista:

Noticias

Sí, ya sé que no son noticias generalistas. Sobre todo se trata de noticias tecnológicas, mi dosis diaria de información :)

  1. Barrapunto – Noticias tecnológicas, software libre, informática, y muy alto nivel.
  2. Genbeta – El blog más visitado de España. Para estar a la última en cuanto a software y páginas web.
  3. Loogic.com – Noticias sobre negocios en Internet.
  4. Menéame – Noticias de todo tipo, enviadas y elegidas por la comunidad. Se dice que si eres de izquierdas, ateo, antitaurino, antisgae y prolinux, eres el estereotipo de usuario de Menéame. Sólo son tópicos :)

Web

En esta categoría incluyo todas las páginas que tratan temas relacionados con la web. Puede ser desde diseño, programación, usabilidad, o rendimiento. Gracias a todas estas páginas, logro mantenerme actualizado:

  1. A List Apart – Una de las páginas mas veteranas y completas sobre desarrollo web. Literalmente, hay de todo.
  2. aNieto2K – Seguramente el mayor divulgador de conocimientos sobre diseño y programación web en español. Recomendadísimo.
  3. blog.mozbox.org – Actualmente fuera de línea, presenta experimentos, trucos y novedades de las versiones venideras de Mozilla Firefox.
  4. Codeulate – Artículos para diseñadores web. Escriben con poca frecuencia, pero son interesantes.
  5. CSS-Tricks – Uno de los más famosos a nivel mundial. Es el blog de Chris Coyier, todo un experto en exprimir al máximo CSS y jQuery para hacer cosas sencillamente geniales.
  6. Daniel Carrero Blog – Un blog nuevo sobre desarrollo y proyectos web.
  7. Guiabreve – Blog en español sobre desarrollo web, wordpress, y mucho más.
  8. IEBlog – Blog de Internet Explorer. De aquí sale todo lo que se sabe de IE9.
  9. Intenta – En español, para estar al tanto de noticias de diseño. Comparten muchísimos recursos gratuitos de utilidad para los diseñadores web.
  10. Ordered List – Curiosidades sobre diseño web. Escriben con muy poca frecuencia.
  11. Planet PHP – Compendio de noticias de PHP de diversas fuentes. Sin duda, el mejor recurso para no perderte nada de PHP.
  12. Psdtuts+ – Tutoriales y videotutoriales paso a paso para Photoshop.
  13. Román Cortés – Algo así como una deidad del desarrollo web. Cada vez que publica alguno de sus proyectos, es para dejar a medio mundo con la boca abierta. Y encima es español :D
  14. Sentido Web – Noticias en español sobre diseño web.
  15. SEO by the SEA – Un poquito de SEO. Estudia todas las novedades de los principales buscadores.
  16. Signal vs. Noise – Blog sobre diseño y usabilidad. Una fantástica fuente de información.
  17. SitePoint Blogs – Sitepoint es una comunidad de diseñadores, project managers, programadores, expertos en usabilidad. Aquí están sus blogs y sus artículos.
  18. SitePoint – Aquí están los artículos principales de la comunidad SitePoint.
  19. Smashing Magazine – Completísima publicación sobre diseño web. Cada artículo suyo es un completo repaso al estado del arte del asunto del que trata. Muy recomendado.
  20. Snook.ca – Otro blog muy interesante sobre desarrollo web.
  21. Stopdesign – El blog de un estudio de las interfaces gráficas, especialmente en web.
  22. Vitamin Master Feed – Otro fantástico blog sobre desarrollo y diseño web. Y no sólo eso, está muy enfocado a freelance, por lo que contiene artículos muy interesantes para programadores autónomos.
  23. W3C News – Noticias del World Wide Web Consortium. La mejor fuente de información sobre estándares, y sobre las tecnologías web que se están gestando.
  24. Zend Developer Zone – Noticias sobre PHP y ZendFramework. Una recopilación recomendadísima.

Tecnologías

Blogs sobre tecnologías de Internet, proyecto software, etc.
  1. Adium Blog – Blog de Adium, el excelente cliente de mensajería instantánea de Mac.
  2. Android Developers Blog – Desarrollo sobre el Sistema Operativo Móvil Android.
  3. Chromium Blog – Proyecto de software libre detrás del conocido Google Chrome.
  4. Joel on Software – Todo un clásico. Compendio de las cavilaciones de un fantástico programador.
  5. Bing Webmaster Center Blog – Blog oficial del buscador de Microsoft, Bing.
  6. Martin Fowler’s Bliki – Una eminencia de la ingeniería del software. Uno de los culpables de que hoy sea tan popular el “desarrollo ágil”, con MVC, patrones, test unitarios, y todas esas cositas que todos usamos ahora.
  7. MySQL Workbench – Web del proyecto MySQL Workbench, una aplicación gráfica para gestionar MySQL, generar diagramas ER, UML, y muchísimo más.
  8. Yahoo! Search Blog – Blog oficial del buscador de Yahoo!

Gente

En esta categoría meto los blogs personales de gente a la que no conozco en persona, valga la rebuznancia.
  1. Amado Martín – Blog de un emprendedor para emprendedores. ¡Y web!
  2. Bernardo Martinez Gil – Una de las voces más conocidas en España sobre emprendimiento web.
  3. Jesus Encinar – Fundador de Idealista. En su blog habla de negocios en internet, tecnologías, usabilidad, etc.
  4. Luna Miguel – Una estudiante de periodismo que da su enfoque de las cosas en el diario Público.
  5. Ricardo Galli – Fundador de la web de noticias meneame.

Otros

Muchos blogs no tienen cabida en ninguna de las categorías principales. En un alarde de creatividad, decidí guardarlos bajo la etiqueta “otros”:

  1. Amazings.es – En mi opinión, el mejor blog en español sobre ciencia.
  2. BricoGeek.com – Para los que les encante el DIY (Do It Yourself). Te enseñan a hacerte desde una impresora 3D, a un proyector láser.
  3. Como Hacer – Guías de iniciación para todos los públicos. Una página muy didáctica que nunca cansa.
  4. Consejos, utilidades y curiosidades para freelance – Qué decir que no diga el título del blog…
  5. El blog para aprender inglés – Todas las semanas entregan varios artículos explicándonos cosas nuevas de inglés. Una forma genial de no parar de aprender.
  6. Instituto Nacional de Estadística – Para los que, como a mí, les encante bucear por los números.
  7. La Cartoteca – Cartografía y geografía, para los que les gusten los mapas.
  8. Blog de menéame – Blog oficial de la web y del proyecto menéame.
  9. Agencia Estatal de Meteorología – Resúmenes, efemérides y noticias meteorológicas.
  10. Per Ardua ad Astra – Artículos sobre curiosidades mayormente científicas.

Ocio

Porque también hay que reírse, entretenerse y descansar un poco.

  1. Dando por culo – Compendio de humor gráfico. NSFW.
  2. Deambulando la red – Humor de todo tipo, preferiblemente para un público adulto.
  3. FAIL Blog – Conocidísimo blog sobre los mayores fails cazados.
  4. Humor Desvariandoando – Humor de todo tipo, pero más para todos los públicos.
  5. Juegos Microsiervos – Jueguecitos sobre todo de ingenio.
  6. Listonauta – Similar a “Dando por culo”. Tiene muchas más viñetas de humor inteligente.
  7. Mi mesa cojea – No necesita presentación. Aunque si sigue así va a acabar perdiendo un lector ;)
  8. Oddee – Listas de curiosidades, tipo “los 10 sombreros más raros” o “las 8 peores intervenciones quirúrgicas”.
  9. Perspicalia » Fuckowski – El gran Alfredo de Hoces, aka Fuckowski. Autor de “Fuckowski, Memorias de un Ingeniero”, y del famoso artículo contra la cancamusa de Internet.
  10. Sinergia sin control – Humo mayormente gráfico, y con temática friki.
  11. Talk nerdy to me – Tumblr con imágenes curiosas, se describe como “poco serio y poco fino. Humo nerd, negro y políticamente incorrecto”.
  12. The Oatmeal – Viñetas cómicas, encuestas, howtos, todo de humor. De lo más divertido de internet.
  13. Wardog y el Mundo – El BOFH más conocido de España. Narra las aventuras de un administrador de sistemas.
  14. xkcd – Tira cómica en inglés sobre temas tecnológicos.

Google

Si es que para que lo voy a negar. Me encanta esta compañía y sus productos.

  1. Dentro de AdSense – Canal de comunicación en español del programa Google Adsense.
  2. Gmail Blog – El blog oficial del mejor correo web.
  3. Google Apps updates – Novedades sobre Google Apps, la familia de herramientas de Google para empresas.
  4. Google Geo Developers – Blog oficial de geoposicionamiento de google, no-solo-google-maps.
  5. google.dirson.com – Web no oficial muy completa sobre todo lo relacionad con google. Lleva bastante tiempo sin actualizarse.
  6. Matt Cutts – Uno de los encargados del buscador de Google. Posiblemente el mayor referente mundial en cuanto a posicionamiento. Desvela con cuentagotas algunos de los secretos de Google.
  7. Official Google Webmaster Central Blog – Blog oficial de las herramientas para Webmasters de Google.
  8. Programa con Google – Comunidad oficial de Google en español para los programadores.

Conocidos

Aquí he omitido bastantes, sobre todo los que son sobre todo aquéllos que tratan únicamente temas personales. Esta categoría la tengo porque son blogs a los que presto especial atención. ¡Que para algo son de conocidos!

  1. Al escondite inglés – Divertidísimo blog de temas de actualidad. Para todos los públicos.
  2. elblogdeluru – Programación avanzada en entornos .NET.
  3. Le petit écolier – Bitácora sobre temas de interés. Software libre, reivindicaciones, citas, etc.
  4. MoreOcio – Para los aficionados a las rutas en bici.
  5. Yvoictra Tech Blog – Artículos relacionados con informática.

Torrijos

Como buen torrijeño, me encanta estar al día de todo lo que aquí sucede. Estas son mis fuentes de información.

  1. Agenda de Torrijos – Agenda de actividades del Ayuntamiento de Torrijos.
  2. Crainblog – Blog gamberro de torrijeños. Cine, humor y, a veces, cosas de Torrijos.
  3. IU Torrijos – Blog de IU en Torrijos.
  4. Juan José Gómez-Hidalgo Palomo – Blog oficial del alcalde.
  5. Juventudes Socialistas de Torrijos – Blog de las Juventudes Socialistas.
  6. Noticias de Torrijos – Canal de noticias de la página web del Ayuntamiento de Torrijos.
  7. Partido Popular de Torrijos – Blog del PP en Torrijos.
  8. PSOE-Torrijos – Blog del PSOE en Torrijos.
  9. Según los padres los hijos – La mejor de todas. Todas las noticias relacionadas con Torrijos, desde un punto de vista neutral, y cómodo. La más completa de todas. Me encanta :)
  10. toledo torrijos – Google Noticias – RSS de las noticias de Torrijos que aparecen en Google.

CoRD, cliente de escritorio remoto de Mac

Hace unos días hablaba de mi reintroducción al mundo Windows. Para conectar desde Mac mencionaba que se podía utilizar el cliente de escritorio remoto de Microsoft. Bien, al poco de probarlo uno se da cuenta de que es un software que no está listo para producción. El teclado de un Mac es ligeramente distinto al de un Pc convencional. Una de las diferencias es que no tiene tecla “Alt Gr”. Si utilizas un teclado inglés de EEUU, esto no te supondrá un problema, ya que no se utiliza esa tecla:

Disposición de un teclado Inglés

Pero si ése no es tu caso, el cliente de escritorio remoto de Microsoft no te servirá; no hace una conversión previa de un teclado a otro, sino que envía a Windows tal cual las teclas que has pulsado.

Todo esto intenté antes de dar con la solución:

  • Utilizar otro software, como VNC.
  • Hacer uso de la combinación Alt+Ctrl, que en Windows emula la tecla AltGr. Además de ser incómodo, no muestra algunos caracteres como ‘{‘ o ‘\’.
  • Hacer un mapeo de teclado personalizado modificando el registro.

Cuando ya creía haberlo probado todo, vi un foro en el que hablaban de CoRD, un cliente de escritorio remoto para Windows. Lo probé, y a la primera :)

Además de contar con las mismas funcionalidades que el de Microsoft, tiene unas cuantas cosas que lo convierten en un mejor cliente RDP:

  • Se comporta mejor en el modo pantalla completa, ajustándolo a la resolución de tu monitor. Con el de Microsoft esto no ocurría, dejando una banda negra a cada lado.
  • Interpreta y convierte de tu teclado al equivalente en Windows. Puedes escribir la arroba, llaves, almohadillas, o corchetes.
  • Convierte la tecla cmd de Mac en la tecla Win.
  • Puedes tener varias sesiones abiertas a la vez, pudiendo navegar entre ellas desde un cómodo panel.

Y además, es open source!

Mejorar el rendimiento de javascript con timers

Uno de mis últimos encargos consiste en una aplicación financiera para el navegador. En resumen, se trata de “traducir” una serie de hojas en Excel a javascript. El cómo lo he implementado da para otro artículo.

Básicamente el funcionamiento es el siguiente:

  • Creamos un campo de texto por cada celda del fichero Excel.
  • Muchas celdas tienen valores dinámicos, es decir, se generan a partir del valor de otras.
  • Definimos la fórmula que genera el valor de cada celda dinámica, y esa fórmula la añadimos a la pila de callbacks del evento ‘change’ de todas las celdas de las que depende.

Problema: Hay miles de celdas, prácticamente todas dinámicas. Esto implica que a menudo, al cambiar un sólo valor, se generan cientos o miles de cálculos. Javascript es single threaded, es decir, sólo se ejecuta una única hebra (para realizar cálculos, modificar el árbol DOM, gestionar eventos, o redibujar la pantalla). Si una operación muy costa en cálculos conlleva 8 segundos, la interfaz de usuario se quedará bloqueada hasta que finalice. Mal asunto.

El experto en usabilidad Jakob Nielsen dijo:

0,1 segundos es el límite para que el usuario perciba que el sistema responde inmediatamente.

¿Son los Web Workers la solución?

Quizás te preguntes qué son los Web Workers. Se trata de una especificación de WHATWG, el equipo que ha dado forma a lo que hoy conocemos como HTML5, para permitir programar aplicaciones multihebra en javascript, es decir, correr procesos en segundo plano.

Si bien es una funcionalidad que han empezando a incorporar recientemente los navegadores (a excepción de IE9), no es nada nuevo; el paquete Google Gears ya ofrecía estos mecanismos. De hecho, los web workers están basados en la API WorkerPool de Google Gears.

Por tanto, ¿son la solución al problema? Sí, pero…

A pesar de que una hoja de cálculo puede ser un ejemplo de libro para el uso de Web Workers, finalmente no los he utilizado. Existen algunas limitaciones, por cuestiones de seguridad, a la hora de usar Web Workers. A destacar, que no tiene acceso a:

  1. DOM.
  2. objeto window.
  3. objeto document.
  4. objeto parent.

Toda la comunicación con la hebra principal se realiza mediante mensajes. Esto interfiere con el código que ya tenía, de modo que implicaría reescribirlo en gran parte. No es una opción por desgracia.

Luego está el motivo de que no funcionan ni funcionarán en Internet Explorer.

Timers al rescate

Repasemos conceptos de sistemas operativos. En un sistema multitarea, en un momento dado no se pueden ejecutar más tareas que procesadores tiene el equipo. Por eso existe el planificador de procesos, que es la parte que se encarga de repartir el tiempo disponible entre los distintos procesos en ejecución. Si se asignan tiempos bajos de ejecución, el efecto será que están funcionando varios procesos concurrentemente. Sintetizando muchísimo, podríamos decir que el planificador de procesos se encarga de asignar bloques de tiempo a cada proceso.

Ahora repasemos los timers. ¿Qué hacen exactamente? Posponen la ejecución de un comando. Esto significa que, mientras se espera ese tiempo, el navegador queda libre para hacer otras cosas.

¿Y si añadimos pausas voluntarias en la propagación de eventos ‘change’ de las celdas? De esta forma, habrá pausas que permitirán “descongelar” la interfaz de usuario, emulando que los cálculos se están ejecutando en un segundo plano, haciendo que la interfaz de usuario sea fluida. Miremos el siguiente gráfico:

Gráfico de relación de tiempos con y sin timers

El color azul representa los cálculos. El verde, es cuando no realizamos cálculos y la interfaz responde a eventos (el equivalente a este proceso en sistemas operativos se llama idle).

En el primer caso no utilizamos timers. Lo que ocurre es que el navegador se queda congelado durante más de tres segundos.

Sin embargo, en el segundo caso añadimos pausas voluntarias, con lo que percibimos que en todo momento el navegador reacciona inmediatamente a nuestras acciones.

Demo

He hecho una sencilla demo. El script se encarga de calcular los números primos menores de 300.000. En un caso con timers y en otro sin él:

  1. Sin timers. La página se quedará congelada hasta que finalice el cálculo.
  2. Con timers. Podrás interactuar con la página mientras hace los cálculos.

Si miramos el código, veremos que hay algunas diferencias. En el primer caso, esto es lo que ocurre:

jQuery("#button").bind('click', function() {
  for (var i=1; i<=300000; i++) {
    if(isPrime(i)) {
      jQuery('#prime').append(" "+ i);
    }
  }

Comprobamos uno a uno cada número desde un bucle, y si es primo, lo mostramos en pantalla. Seguramente haga saltar un aviso en el navegador de que el script está llevando demasiado tiempo.

El segundo ejemplo es un poco más elaborado:

function comprobarPrimo(numero, fin,total) {
  var delay = 10;
  var heap = 500;
  if (isPrime(numero)) {
    jQuery('#prime').append(" "+ numero);
  }
  if(++numero < fin) {
    if (total%heap === 0) {
      setTimeout("comprobarPrimo("+numero+","+fin+","+(total+1)+")", delay);
    } else {
      comprobarPrimo(numero, fin, (total+1));
    }
  }
}

jQuery("#button").bind('click', function() {
  comprobarPrimo(1,300000,0);
});

En lugar de usar un bucle, usamos una función recursiva. Esto lo hacemos porque, cada vez que llamamos a setTimeout, se ejecuta el código que le sigue sin esperar el delay. Es decir, que al añadir un timer no pararíamos realmente toda la ejecución. Con una función recursiva corregimos esto.

Y definimos dos variables: delay, que es el retardo en milisegundos que se aplicará, y heap, que define cada cuántas llamadas se aplica delay. En este ejemplo se establece un delay de 20 milisegundos que se aplica cada 500 números primos. Los otros 499 se ejecutan sin retardo.

El resultado es completamente distinto al del primer ejemplo. Y únicamente añadimos pausas de 20 milisegundos cada 500 números primos. Por supuesto el tiempo de ejecución se ve incrementado.