Usar GoogleDrive como CDN

A la hora de mejorar la velocidad de carga de nuestra web es interesante usar un CDN para liberar de trabajo a nuestro servidor. Si bien es cierto que lo mejor sería pagar por uno a veces no nos compensa para el proyecto que realizamos. Y nos encontramos con otra opción: Usar una cuenta gratuita de GoogleDrive como CDN. ¿Es esto posible? Sí.

El primer paso, obviamente, es tener una cuenta de Google. Gracias a eso tendremos 15 GB de almacenamiento en GoogleDrive.Crea entonces dentro de tu cuenta una carpeta y llámala, por ser original, CDN.

Haz click derecho sobre la nueva carpeta y eliges la opción compartir. Una vez dentro de la ventana «Compartir» haces click en «Avanzada».

Compartiendo una carpeta en google drive
Esta imagen está siendo cargada desde una cuenta de drive

Por defecto la carpeta estará configurada para que sólo la veas tú, así que le das a cambiar y eliges la opción «Sí: Público en la web». Luego sólo te queda metar imágenes en esa carpeta.

otra imagen desde Drive como CDN

Ahora lo interesante es ver cómo usar esa imágenes en una web.

Si te vas a la foto y eliges «Compartir» te sacará un churro tal cual este

https://drive.google.com/file/d/0B-GFTravIZzzZWpkUnVwMkRLdUE/view?usp=sharing

La parte interesante viene con el id de la imagen, que sería 0B-GFTravIZzzZWpkUnVwMkRLdUE (es decir, lo que va entre el /d/ y el /view?usp=sharing. Para poder usar la imagen en vuestra web debéis utilizar esta estructura

https://drive.google.com/uc?export=download&id=

y pegarle detrás el id de la imagen, tal que así:

https://drive.google.com/uc?export=download&id=0B-GFTravIZzzZWpkUnVwMkRLdUE

La desventaja de este método está a nivel de posicionamiento, ya que cuando los buscadores encuentren la imagen no remitirá a tu sitio sino a Google Drive, aunque por otra parte te libras del riesgo de hotlinking. En todo caso, esto de proporciona una solución por si tiene un hosting gratuito con espacio muy limitado, o simplemente para mejorar la velocidad de carga de tus imágenes.

Javascript: Devolver 0 cuando parseInt() o parseFloat() reciban una cadena vacía

Tip rápido sobre Javascript: Imaginad que recogemos los datos de un formulario para que calcule en pantalla un sumatorio conforme el usuario los va introduciendo. Ahora imaginad que el usuario se deja un campo vacío. Cuando la función javascript se encuentre una cadena vacía, e intente convertirla a un número (con parseInt() o parseFloat() según lo que necesitemos) el resultado de la suma será NaN. ¿Cómo lo evitamos? Pues con un OR.

Si utilizamos el operador || seguido de un cero, tal como está en el ejemplo que verás a continuación, este evaluará de forma lógica la expresión, y en caso de que el primer término evaluado sea falso devolverá el segundo, un cero (el resultado NaN que devolverá la función que parse a número será evaluado como falso):

var s = '';
var total = 1;

//Si hago esto, el resultado es NaN
total = total + parseInt(s);

//Si hago esto, el resultado es 1
total = total + (parseInt(s) || 0;);

//con parseFloat funciona igual

Otra opción, utilizar el operador ternario ?:, como pusimos en otro ejemplo pasado.

El operador ternario ?: en Java

Seguramente hayas visto en algún ejemplo de código usar el símbolo de interrogación como un operador. Y te preguntarás ¿esto cómo va?. La idea es que más o menos funciona como un condicional if/else devolviendo un valor según una condición se cumpla o no. La sintaxis sería expresiónAEvaluar?valorADevolverSiCierto:valorADevolverSiFalso;

Y como ejemplo práctico, el siguiente código:

/*
Comprobamos si x es mayor que y. 
En caso afirmativo nuestra variable vale x,
y en caso negativo y.
*/
variable=(x>y)?x:y;
/*la alternativa al operador ternario, usando if/else sería*/
if(x>y){
  variable = x;
}else{
  variable = y;
}

Dicho operador existe, con algunas variantes en su sintaxis, también en PHP, C, C++, Python, Perl y aunque en VB.NET no existe sí disponéis de la función IIF cuyo funcionamiento es similar. Como puedes ver te permitirá ahorrar líneas de código y tener un código más elegante.

Java/JSP: al enviar formulario por método POST los caracteres UTF-8 no aparecen bien representados

Me encontraba esta mañana trabajando sobre un proyecto desarrollado en Java haciendo uso de páginas JSP para las vistas, y me encontré con que al enviar un formulario no se insertaban bien en la base de datos los caracteres acentuados y las ñ, apareciendo otros extraños en su lugar. No era la primera vez que veía esto, era evidente que había un problema de codificación.

Lo primero fue comprobar que todas las páginas tuvieran definida en su cabecera la codificación adecuada:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

Tras ver que eso estaba correctísimo, se me ocurre aplicar al principio del código, antes de recoger los resultados, la siguiente función:

request.setCharacterEncoding("UTF-8");

Y parecía que funcionaba, pero no. En principio en la mayoría de los casos eso soluciona el problema, pero a veces el Tomcat es puñetero (en mi caso estaba usando este servidor) y en algunas casuísticas decide que sigue cascando. Así que seguí buceando, y me encontré con que el problema está en que por defecto Tomcat interpreta los datos recibidos por POST como ISO-8859-1. Y había por medio un servlet funcionando como filtro que me escarallaba todo haciendo inútil el consejo anterior. Total, que fui a estudiarme la configuración del Tomcat, a ver si lo arreglaba definitivamente. Y así fue.

Lo primero es ir a la configuración de Tomcat y editar el archivo Server.xml, buscas allí el elemento Connector y en el valor de URIEncoding pones «UTF-8». Tras esto te vas a la carpeta WEB-INF de tu aplicación y allí editas web.xml, pegando este filtro antes que ningún otro:

  <filter>
    <filter-name>Character Encoding Filter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>Character Encoding Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Un último punto: ojito a servlets que puedan funcionar como filtros intermedios antes de llegar a vuestra página jsp, a librerías de generación de contenidos o a frameworks varios, que igual tenéis que configurarlos también (cada proyecto es un mundo, pero por ejemplo con Velocity o Freemarker tendríais que configurarlos para UTF-8).

Detectando intrusos en tu red wifi y bloqueándolos con Ubuntu.

Hace un rato comentaba en Facebook un artículo de El País sobre cómo detectar y echar a intrusos de tu red wifi. Aquí ya hablamos en el pasado sobre cómo asegurar una red wifi, y hace ya unos años sobre herramientas de Windows para detectar intrusos. Pero ¿y con Ubuntu/GNU Linux?

Recordaréis que hace unos meses hablamos sobre la forma de ver qué IP’s están libres en una red haciendo uso de nMap. Pues de forma similar, podemos usar esta herramienta para ver qué equipos están en nuestra red. Usaremos nMap para escanear nuestra red local en busca de todas las ip conectadas:

nmap -v -sP 192.168.1.1/24 | grep down -v

Nos dará un resultado tal cual este de la imagen (en mi caso está el portátil, un móvil y el router)

Escaneando ip con nMap
Captura de la consola usando el comando

Bueno, si compruebas que en esa lista de IP hay dispositivos que no deberían estar el primer paso es cambiar la contraseña del router para echarlos, pero antes puedes apuntar las MAC de los dispositivos para bloquearles el acceso a tu red. No es una medida definitiva, ya que les bastaría con camuflar su MAC para saltar el bloqueo, pero les dará la lata (otra solución, más efectiva aunque tampoco definitiva es usar una lista blanca, es decir, bloquear todas las MAC menos las de tus dispositivos). ¿Cómo conocemos las MAC de los equipos conectados? Pues ya que sabes su IP basta con un comando arp para que veamos la MAC:

#usamos arp -n seguido de la IP
#Para conocer la MAC de ese dispositivo
#en el ejemplo el 192.168.1.103
arp -n 192.168.1.103

De la lista de resultados obtenida, la MAC es el número que aparece como DirecciónHW. Una vez apuntadas las MAC a bloquear (o a permitir), te vas a la configuración de tu router y allí configuras el filtrado por MAC.

Y con esto tienes a los intrusos fuera, al menos por un rato.

jqPlot: mostrar la leyenda en varias columnas

El otro día trabajaba con la librería jqPlot, una librería para crear gráficas por medio de javascript y jQuery, y me encontraba con que la leyenda de un gráfico de tarta que estaba haciendo se salía de su elemento contenedor, dado que tenía muchas líneas (en concreto, 58). Me pregunté ¿Cómo hago para que se muestre en dos columnas?. Pensé que era obvio que a alguien le habría pasado ants y encontré la solución en stack-overflow:

//La localización no es importante, sólo el 
//rendererOptions
legend: { 
  show: true, 
  location: 'ne',
  rendererOptions: {numberColumns: 2}
}

Luego decidí bucear un poco más en la documentación y me encontré con un plugin que nos dará mayor versatilidad para trabajar con la leyenda: jqplot.enhancedLegendRenderer.js

La cuestión es invocarlo dentro de la configuración de la leyenda y, además de permitirnos definir el número de filas y columnas (cosa que ya podemos hacer con el renderer normal, pero en este han pulido algunos bugs) también nos permite ocultar/mostrar una serie al pinchar en la leyenda. Se me ocurrió usarlo para mostrar los resultados debajo de la gráfica, en 6 columnas de 10 filas, para que quedara más bonito. Total, que la cosa fue así:

//La localización no es importante, sólo el 
//rendererOptions
legend: {
  renderer: $.jqplot.EnhancedLegendRenderer, 
  show: true, 
  location: 's',
  rendererOptions: {numberColumns: 10, numberRows: 6}
}

Utilizar .htaccess para protegerse de inyecciones SQL

Llevo unos días que no encuentro tiempo para escribir, pero vamos con un tip cortito que puede servir de ayuda para mejorar la seguridad de nuestra web.

La inyección SQL es un peligro para la integridad de nuestros datos y ya más de una vez hemos visto formas de protegernos. Como un plus de seguridad nunca está mal, vamos a ver cómo usar el fichero .htaccess de nuestro servidor para conseguir un plus de protección contra este tipo de ataques. El siguiente cojunto de reglas nos ayudará a mejorar la protección de nuestro sitio:

RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR]
RewriteCond %{QUERY_STRING} \.\./\.\. [OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC]
RewriteRule .* - [F]

Recordad que hay que tener el servidor configurado para que .htaccess esté activo y permita el filtrado de URL.

SquashFS: Creando archivos de sólo lectura para ahorrar espacio.

SquashFS es un sistema de archivos comprimido de sólo lectura para Linux. Se diseñó para utilizarlo en sistemas de memoria muy limitada, por ejemplo en muchos live-Cd de Linux, en el firmware de un router (y en general para sistemas embebidos), aunque también puede ser utilizado para ahorrar espacio. Veamos cómo:

Imagina que tu empresa tiene carpetas donde almacena los documentos de la última década organizados en carpetas por años. Lo más habitual es que estos archivos no vayan a ser modificados sino simplemente consultados. SquashFS nos permitiría comprimirlos, ahorrándonos espacio e incluso mejorando la velocidad de lectura.

El procedimiento a seguir consta de dos pasos: crear una imagen de disco con SquashFS para comprimir los datos y montarla en el sistema para acceder a ellos. Para lo primero tenemos el comando mksquashfs, cuxa sintaxis sería algo así: mksquashfs [directorios a comprimir] imagenDestino.sqsfs -comp [el algoritmo de compresión a usar] -b [tamaño de bloque ]. Vale, que visto así acojona pero os pongo un ejemplo práctico, donde comprimiremos las carpetas Facturas-2010, Facturas-2011 y Facturas-2012 en una imagen de SquashFS llamada HistoricoFacturas201012, usando el algoritmo de comprsión xz (que es la opción que nos da un mayor ratio de compresión) y con un tamaño de bloque de 1024kb (1 mega). Si no definís tamaño de bloque, por defecto serán 64kb:

mksquashfs facturas-2010 facturas-2011 facturas-2012 historicofacturas201012.sqsfs -comp xz -bs 1M

Con eso habremos creado una imagen de disco de sólo lectura en formato sqsfs, por lo que sólo nos queda montarlo como si fuera un disco para poder acceder a su lectura:

mount historicofacturas201012.sqsfs Facturas_10_12/

Si posteriormente quisiéramos extraer una de estas carpetas, por ejemplo para eliminar algún archivo, nos bastaría con el comando unsquashfs, usado tal que así unsquashfs [opciones] nuestraimagen.sqsfs [Directorios o archivos que extraemos]

Con nuestro ejemplo:

unsquashfs historicofacturas201012.sqsfs facturas-2010

Por defecto usará como directorio de extracción squashfs-root. Esto puede cambiarse usando la opción -d con el comando antes citado.

Fight – War of Words (1993)

Vamos a ponernos en situación: 1992, tras la gira de Painkiller, que a la postre se convertirá en uno de los discos más influyentes del heavy metal en esa década, Rob Halford abandona Judas Priest. Durante esa gira se llevaron de teloneros a los emergentes Pantera (que también posteriormente se convertirán en una de las bandas más influyentes y reverenciadas de su generación) y Rob se enamora de su sonido. El primer lanzamiento post-Judas de Rob Halford contará de hecho con la colaboración de miembros de Pantera: el tema Light Comes Out of Black, que formará parte de la BSO de la película Buffy la Cazavampiros. Satisfecho con el resultado, el vocalista decidirá formar una nueva banda que siga esos derroteros musicales: Fight. Para ello reclutará al batería con el que grabó Painkiller y realizó esa gira de presentación, el increíblemente preciso y contundente Scott Travis (ex-Racer X). Con un 40% de los últimos Judas Priest no les cuesta conseguir un contrato con Epic Records para editar su primer disco, que es el que nos ocupa. El resto de la banda la formarán el entonces prometedor guitarrista Russ Parrish, que años más tarde ganaría fama en las filas de la paródica banda Steel Panther, el bajista Jay Jay y otro guitarrista llamado Brian Tilse (ambos procedentes de una banda llamada Cyanide). Con esta formación se irán a grabar a Holanda y en septiembre de 1993 publicarán este War of Words.

Hay que empezar recordando que en este momento Halford todavía conserva intacta su potencia y su registro, y para no dejar dudas abre el disco con dos cañonazos llenos de agresividad: Into de Pit, dejándose la voz en un registro muy agudo, y Nailed to the Gun. El estilo baterístico de Travis casa perfectamente con estos temas, donde su metronómico manejo del doble bombo y su tremenda pegada confieren a los temas una pegada similar a la que mostraba Vinnie Paul en los primeros trabajos de Pantera. El talento de Rob para escribir y adaptarse a un nuevo registro queda también patente con estas piezas, probablemente las dos más recordadas del disco y las que más ha explotado en sus posteriores giras en solitario.

Fight-War_Of_Words-Frontal

Tras el poderoso inicio del album la banda levantará el pie del acelerador con Life in Black, donde un riff oscuro e hipnótico me trae a la mente a John Crist y su trabajo en los primeros discos de Danzig. Y siguiendo a rito de medio tiempo, aunque ahora con un riff más directo, entra Inmortal Sin, donde Halford nos regala una muestra de su tremenda versatilidad. Y con War of Worlds volverá el registro vocal más agudo y agresivo junto a un guitarreo más cañero. El ecuador del disco llega con otro medio tiempo pesado, oscuro y con líneas melódicas: Laid to Rest, que en algún momento me trae a la cabeza las atmósferas de No Quarter o Kashmir de Led Zeppelin. Y si Pantera, entre su caña, podían ofrecer baladas como Cemetery Gates, el Metal God no iba a ser menos y nos regala la preciosa, pero intensa, For All Eternity. Jugando con arreglos de guitarra muy blueseros arranca Little Crazy, un tema que con otra producción habría pasado por una pieza de boogie rock y que fue el single del disco, alcanzando en los EEUU el puesto número 21 en las listas de éxitos (el disco llegaría al 83 en el Billboad 200). Y tras este tema más rockero entran tres piezas de nuevo de metal más trallero: Contortion, Kill It y Vicious, las tres cortadas más o menos por el mismo palo. Y para cerrar Reality, a new beginning nos devuelve el ritmo más pesado y de medio tiempo. Esta pista oculta, a partir del minuto 9:43, un tema llamado Jesus Saves como bonus track.

Fight

Se le podría achacar al disco que a ratos se vuelve monótono y que tras los dos trallazos de salida pierde algo de fuerza, por buscarle puntos negros. Por otra parte no podemos sino alabar la grandeza de Rob Halford, que en este trabajo abarca gran cantidad de registros sin flaquear en ningún momento. Junto a él, los otros dos pilares que sostienen el album serán Travis, mostrándonos uno de sus trabajos más sólidos, y un Parrish que a pesar de su juventud no se achica y se marca un trabajo sobresaliente.

Fight documental grabación

En los 90 salieron imitadores del sonido Pantera de debajo de las piedras. En este caso el que se subía al carro era uno de los maestros de esta banda completando un disco excelente. Tras esta primera entrega llegaría un EP de remzclas llamado Mutations, un segundo disco bastante más flojo titulado Small Deadly Space, una colaboración con Trent Reznor bajo el nombre de Two bastante decepcionante y un glorioso regreso al sonido del heavy metal más clásico con Resurrection, ya firmando el disco como Halford. En general una pieza que todo amante del metal de los 90 debería acercarse a escuchar y que ha quedado demasiado olvidada en la historia.