AOWS

Just another adrian’s weblog

Efecto botón en un enlace con a:active

dejar un comentario »

Las pseudo-clases se aplican a ciertos selectores CSS para añadirles algunos efectos. Un buen ejemplo lo tenemos en los enlaces, a los que le podemos aplicar reglas según el estado en el que se encuentren:

  • a:link un enlace no visitado
  • a:visited un enlace ya visitado
  • a:hover el ratón está sobre el enlace
  • a:active el usuario hace click sobre el enlace

En este ejemplo vamos a usar a:active para darle un efecto botón a un enlace. Para ello tendremos que añadir las siguientes reglas a nuestro CSS, así cuando un usuario haga click en el enlace éste se desplazará ligeramente hacia abajo dando la impresión de que se ha presionado un botón (lo cual puede ser una interesante ayuda visual).

a:active {
  position: relative;
  top: 2px;
}

Como wordpress.com no deja insertar estilos propios en los posts, no me queda más remedio que dejar el ejemplo en mi dominio: ejemplo de efecto botón con a:active.

Visto en “The definitive guide to styling web links“.

Escrito por adrian

14 Febrero, 2010 a 02:24

Escrito en Uncategorized

Etiquetado con

La web se decanta por Unicode

dejar un comentario »

Casi el 50% de la red usa Unicode

Casi el 50% de la red usa Unicode

El problema con los encodings está presente en los programas informáticos desde hace muchos años; el rápido crecimiento de Unicode en la web, cerca ya del 50% de las webs usan alguna variante de esta codificación (el gráfico proviene de estadísticas internas de Google basadas en las páginas indexadas por el buscador), nos permite ver algo de luz para aquellos cuyo idioma principal no sea el inglés. Puede que algún día dejemos de ver caracteres como ërnôn.

Escrito por adrian

13 Febrero, 2010 a 01:46

Escrito en Uncategorized

Etiquetado con , ,

Logging con SLF4J

dejar un comentario »

SLF4JSLF4J (Simple Logging Facade for Java) proporciona una capa de abstracción sobre otros APIs de logging como log4j o LogBack. Esta librería permite cambiar la implementación de forma transparente, de un modo similar a Commons Logging. Sin embargo, ésta última elige el API en tiempo de ejecución (lo cual puede provocar algún que otro problema), mientras que SFL4J lo hace al desplegar la aplicación usando un JAR puente.

Una de las grandes ventajas de SLF4J es que no necesitamos inundar nuestro código con comprobaciones del nivel de log. Si usamos log4j, por ejemplo, podemos tener algo como:

log.debug("Esto es un " + texto + " muy largo, con " + variables[i] + " que se van añadiendo a una " + object.getCadena());

Por mucho que el compilador optimice este código (reemplazando las concatenaciones de cadenas usando StringBuilder), si se ejecuta muchas veces repetidamente sin necesidad (porque la aplicación está desplegada en producción y el nivel de log está por encima de debug, por ejemplo) podría llegar a afectar al rendimiento. Por lo que no es extraño ver código Java tal como este:

if (log.isDebugEnabled()) {
  log.debug("Esto es un " + texto + " muy largo, con " + variables[i] + " que se van añadiendo a una " + object.getCadena());
}

SLF4J nos permite parametrizar el log al estilo printf de C:

log.debug("Esto es un {} muy largo, con {} que se van añadiendo a una {}", texto, variables[i], object.getCadena());

Esto evita problemas de rendimiento al tratar con cadenas, pero evidentemente si los parámetros como object.getCadena() son costosos nada nos librará de tener que usar los dichosos if.

SLF4J tiene más ventajas, para conocerlas nada mejor que este artículo o el manual oficial.

Escrito por adrian

13 Febrero, 2010 a 01:16

Escrito en Uncategorized

Etiquetado con , ,

Stand vertical casero para el MacBook

con 2 comentarios

Stand vertical para el MacBook

Me encontraba a un solo click de comprar este soporte vertical, cuando se me ocurrió la idea del servilletero. Cutre, pero barato y completamente funcional. Ahora bien, he de buscar uno un poco más acorde con el ordenador y que no cante tanto :)

Escrito por adrian

11 Febrero, 2010 a 23:07

Escrito en Uncategorized

Etiquetado con ,

Desplegando Twitter en producción usando BitTorrent

dejar un comentario »

Los problemas de mantenimiento que conllevan aplicaciones tan grandes como Twitter pueden pasar desapercibidos para los que no estamos acostumbrados a una escala de centenares (e incluso miles) de máquinas en producción. Y no se puede negar el que la solución adoptada no sea original: desplegar utilizando BitTorrent.

Se necesita una máquina que haga las veces de tracker y otra que sirva como seeder. Una vez creado el torrent, el resto de servidores comenzarán a descargar los archivos y a compartirlos entre sí; el despliegue es (obviamente) mucho más rápido que si subimos la aplicación servidor a servidor.

El proyecto, llamado Murder, está basado en BitTornado y está disponible en GitHub bajo la licencia Apache. Como ejemplo de despliegue dejan esta secuencia de comandos que usan Capistrano:

cap murder:distribute_files
cap murder:start_tracker
cap murder:create_torrent tag="Deploy20100101" files_path="/usr/local/twitter/production/current"
cap murder:start_seeding tag="Deploy20100101"
cap murder:peer tag="Deploy20100101" destination_path="/usr/local/twitter/releases"

Escrito por adrian

10 Febrero, 2010 a 22:50

Escrito en Uncategorized

Etiquetado con ,

“null”, o una de las maldiciones de Java

con 5 comentarios

Tratar con valores nulos es, desde siempre, un dolor de muelas muy importante en el mundo de Java. En este artículo de Redcode nos lo recuerdan y proponen algunas de las pocas opciones que hay:

  • Confiar en que nuestras referencias nunca serán nulas y no realizar ninguna comprobación. Como es obvio, un tanto peligroso, sobre todo cuando utilizamos librerías de terceros cuyos resultados no conocemos con seguridad.
    List<Person> people = getPeople();
    for (Person person : people) {
      House house = person.getHouse();
      System.out.println("House price: " + house.getPrice());
    }
    
  • Inundar el código con condicionales anidados, uno detrás de otro según el número de objetos que tengamos.
    List<Person> people = getPeople();
    if (people != null) {
      for (Person person : people) {
        if (person != null) {
          House house = person.getHouse();
          if (house != null) {
            System.out.println("House price: " + house.getPrice());
          }
        }
      }
    }
    
  • Utilizar anotaciones (@Nullable y @NotNull) que nuestro IDE usará para advertirnos de posibles riesgos de obtener un NullPointerException. No nos evitará el tener que hacer comprobaciones, pero podemos fiarnos si no hay warnings.
    @Nullable
    private List<Person> getPeople() {
      // ...
    }
    
    // ... 
    
    List<Person> people = getPeople();
    // recibiremos un warning, y es que "people" puede ser nulo
    for (Person person : people) {
      House house = person.getHouse();
      System.out.println("House price: " + house.getPrice());
    }
    
  • Utilizar algún patrón como Null Object pattern o una versión más general (Special Case) propuesta por Martin Fowler. El problema es que esto no soluciona las interacciones con librerías externas (que pueden seguir devolviendo nulos) y complica el proyecto con un montón de objetos nuevos.

Por desgracia, la nueva versión de Java no incluirá ningún operador específico para solucionar esta situación. Estuvo en los planes incluir algo similar al operador Elvis safe navigation operator de Groovy:

List<Person> people = getPeople()
println people?.get(0)?.getHouse()?.getPrice()

pero finalmente todo seguirá igual. Una pena porque esto mejoraría enormemente la legibilidad del código; lo pondría incluso por delante de nuevas características como las closures (que llegan tarde, esperemos que no mal y arrastro).

Escrito por adrian

4 Febrero, 2010 a 22:47

Escrito en Uncategorized

Etiquetado con ,

Facebook lleva a PHP al límite con HipHop

con un comentario

HipHop for PHPQue PHP tiene problemas de rendimiento es un hecho que muchos desarrolladores han sufrido en sus propias carnes. Para muchos es despreciable, pero cuando tu producto es una web que por momentos supera en visitas a Google, lo que tienes es un problemón.

Según comentan en el blog de desarrolladores, PHP proporciona muchas ventajas a Facebook: es más rápido de aprender que otros lenguajes, más simple a la hora de programar, y mucho más sencillo encontrar trabajadores en esta tecnología. Salvo en lo último, en el resto no estoy de acuerdo; pero este no es el tema.

El caso es que en Facebook estaban decididos a mejorar PHP, y parece que lo han conseguido con HipHop for PHP. Hoy mismo lo harán open source y estará disponible en GitHub para que cualquiera que quiera lo instale en su servidor.

Básicamente, lo que hace HipHop es transformar el código fuente PHP en código C++, para luego compilarlo con g++; en dicha transformación trata de hacer al lenguaje lo menos dinámico posible, traduciendo después las sentencias directamente por su equivalente en C++ (no parece hacer ningún tipo de optimización adicional).

Con la implantación de HipHop for PHP desde Facebook indican que el rendimiento aumenta de media un 50%; actualmente el 90% de las peticiones a Facebook ya son servidas por HipHop, por lo que su fiabilidad debería estar más que probada.

Escrito por adrian

3 Febrero, 2010 a 00:03

Escrito en Uncategorized

Etiquetado con , ,

¡Vuelve Lost!

dejar un comentario »

Y también vuelve Kate, por supuesto

Esta noche comienza la sexta y última temporada de la serie que más ha dado que hablar en la década pasada. Después de 103 capítulos emitidos, el primero de ellos el 22 de septiembre del 2004, el argumento está en su momento álgido y en su punto para que alguien dé una buena explicación de lo que ocurre en esa isla.

Tras su estreno en la cadena americana ABC, mañana los usuarios de Digital+ podrán disfrutarla en versión original subtitulada en castellano (¿se bajarán los subtítulos de lostzilla.net?), aunque eso sí, previo pago. Para el resto de los mortales, Cuatro emitirá la serie con una semana de retraso pero en perfecto castellano.

Yo, para continuar con la tradición, ya le estoy sacando brillo al Transmission; ya no está Mininova, pero por suerte hay alternativas.

Para el que tenga problemas de memoria y necesite un refresco de lo que ha ocurrido hasta ahora, nada mejor que hacerse con el capítulo 6×00.

Vuelven los números chungos. ¿A que ya no los recordáis?

Escrito por adrian

2 Febrero, 2010 a 22:30

Escrito en Uncategorized

Etiquetado con ,

¿El principio del fin para Flash?

con 2 comentarios

El iPad no soportará Flash

La negativa de Apple a incluir Flash en sus dispositivos móviles está trayendo mucha cola. A la empresa californiana no le gusta la tecnología de Adobe, y así lo confirman los rumores sobre unas declaraciones de Steve Jobs:

Apple no soporta Flash porque está lleno de bugs. Siempre que un mac se cuelga, muy probablemente la causa es Flash. Nadie va a usar Flash, el mundo se está moviendo al HTML5.

Es una apuesta arriesgada por parte de Apple, pero como muchos ya están señalando, esto puede haber ocurrido ya en el pasado a menor escala con la salida de Firefox. Cuando Mozilla lanzó el navegador del zorro rojo (o un panda, me es lo mismo), éste no renderizaba bien muchas páginas importantes como bancos o tiendas online, y sin embargo la respuesta de los usuarios obligó al mercado a adaptarse a los estándares y a día de hoy es raro encontrar una web que no funcione correctamente en Firefox (aunque hay excepciones, está claro). Apple tiene ahora mismo más de 70 millones de dispositivos móviles por todo el mundo (entre iPhones e iPod Touchs) que no soportan Flash, una cantidad que empieza a ser importante.

Los movimientos de los grandes protagonistas en Internet juegan a favor de HTML5 (aunque la polémica de los codecs puede ir para largo), aunque el soporte de Flash en Android puede darle algo de vida a Adobe.

¿Es Flash una tecnología con futuro o simplemente fue un parche para dotar de capacidad multimedia a un lenguaje (HTML) que no lo soportaba de serie?

Es tiempo para que Adobe juegue sus cartas; el próximo mes presentará en el Mobile World Congress la versión 10.1 de Flash para móviles y su estrategia para estos dispositivos. Y porqué no decirlo, puede que el porno, como ya lo ha sido otras veces, sea clave en esta guerra no declarada.

Escrito por adrian

31 Enero, 2010 a 16:38

Escrito en Uncategorized

Etiquetado con , , , ,

DownloadHelper, una extensión para bajarse cualquier vídeo

con 7 comentarios

DownloadHelperYouTube es el gran dominador en el mundo del vídeo online, pero su llegada supuso la explosión del multimedia en Internet: hoy en día prácticamente todas las webs ofrecen vídeos de los más diversos temas. Y muchas veces nos puede interesar descargarlos, no sólo para almacenarlos, sino para verlos en otros dispositivos como la TV o el móvil.

En mi caso, me interesaba descargar los vídeos de InfoQ para ver en el teléfono. Dado que no ofrecen esta posibilidad y que después de echarle un vistazo al código no tenía nada claro cómo hacer para averiguar la dirección exacta del vídeo, la solución ideal pasaba por una extensión o similar.

La respuesta es DownloadHelper, una extensión para Firefox que nos permite descargar cualquier vídeo que se reproduzca en la página. Algunos como los de YouTube los detecta automáticamente y ofrece la posibilidad de descargarlos en multitud de formatos (flv, flv en HD, mp4…), otros como los de InfoQ es necesario empezar su reproducción para que los descubra.

Escrito por adrian

30 Enero, 2010 a 22:38

Escrito en Uncategorized

Etiquetado con , , ,