Booleanos, pseudo-booleanos, operadores y condicionales en Java Script mucho más complejo de lo que parece

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Booleanos-pseudo-booleanos-operadores-y-condicionales-en-JavaScript-mucho-mas-complejo-de-lo-que-parece.aspx

True-or-FalseLo que voy a explicar hoy tiene mucho más trasfondo del que puede parecer a simple vista, y es aplicable no solo a JavaScript sino a cualquier lenguaje débilmente tipado que maneje valores que se pueden evaluar automáticamente como si fueran booleanos.

En JavaScript existen valores booleanos (true y false) pero existen también otros valores que usados en el contexto de un operador booleano se comportan también como si fueran booleanos. A los tipos de datos no booleanos que se interpretan como verdadero cuando se evalúan se les denomina valores «truly» (o como les llamo yo en español: valores «verdadosos»). Cuando se evalúan como falsos se les denomina valores «falsy» (o valores «falsosos»).

Condicionales y conversiones implícitas

Por ejemplo consideremos este código:

 

var v = "cualquier cosa";

if (v)

    alert("verdadero");

else

    alert("falso");

¿Cuál crees que será el resultado que muestra el mensaje?

En este caso el resultado será ver por pantalla «verdadero». El motivo es que dentro de la expresión a evaluar en el condicional tenemos una cadena de texto y ésta se convierte automáticamente a un booleano para poder devolver un resultado y ejecutar la rama pertinente del condicional. Como es un valor «verdadoso», el resultado de convertirlo es true.

El apartado 12.5 de la especificación ECMAScript indica que se debe llamar al método interno ToBoolean() sobre el resultado de evaluar la expresión que hay dentro de los paréntesis del if. Por ello se convierte automáticamente la cadena en un booleano.

Reglas de conversión a booleano

Las reglas de conversión se indican en la especificación ECMAScript, y dependen del tipo de dato, y son las que nos dan los valores «verdadosos» y «falsosos»:

  • undefined: se interpreta como falso. Un miembro de un objeto que no existe, por ejemplo.
  • Null: sería falso también.
  • NaN: falso
  • Un número: si es 0 se interpreta como falso, siendo verdadero para cualquier otro valor.
  • Cadenas de texto: si la cadena está vacía («»), entonces es falso. Cualquier otra cadena se interpreta como un verdadero.
  • Un objeto cualquiera siempre se interpreta como true.

Es decir son valores:

  • falsosos o falsy: el número 0, las cadenas vacías, los resultados de operaciones no válidas (NaN: not a Number) los valores nulos y los valores no definidos.
  • verdadosos o truly: cualquier otra cosa (los números distintos de cero, las cadenas no vacías, cualquier objeto…)

Es gracias a esto que, por ejemplo, podemos verificar la existencia de ciertas características en un navegador escribiendo cosas como:

if (window.Worker)

    alert("Este navegador soporta Web Workers");

else

    alert("Navegador viejo!! Actualízate!!");

Si la ventana tiene el objeto Worker lo devuelve y al convertirlo en booleano, según las reglas anteriores, el resultado del condicional será true. Si no existe devolverá undefined, y por lo tanto se interpretara como un false.

¿Cuándo se interpreta un valor como booleano?

Bueno, obviamente cuando ya es booleano, claro :-P, pero la conversión implícita que hemos visto de valores «verdadosos» o «falsosos» en verdaderos booleanos sólo se da cuando se evalúa el valor dentro de cierto contexto. En concreto cuando se evalúa como resultado de una expresión en un condicional (lo hemos visto más arriba), pero también cuando se utiliza con un operador booleano (apartado 11.11 de la especificación ECMAScript)

Y este detalle es muy importante porque si no lo tenemos en cuenta podemos acabar cometiendo errores difíciles de detectar.

Por ejemplo, si variamos ligeramente el código del condicional anterior y ponemos una comparación en la expresión dentro del if:

var v = "cualquier cosa";

if (v == true)

    alert("verdadero");

else

    alert("falso");

Aparentemente no ha cambiado demasiado. Cabría pensar que como v contiene una cadena no vacía (un valor verdadoso) el condicional sigue siendo cierto. Sin embargo lo que veremos por pantalla será «falso». El motivo es que ahora lo que estamos haciendo es comparar el valor de la variable v, que es una cadena, con un booleano para ver si son iguales. Y no lo son. Por lo tanto el resultado de la expresión es false. En este caso no se hace una conversión a booleano de la cadena aunque esté dentro de un condicional. Lo que se convierte siempre a booleano es el resultado de la expresión dentro del if, pero no cada elemento de la misma. Importante diferencia.

Sin embargo vamos a cambiarla nuevamente de manera sutil. ¿qué pasaría si utilizamos un operador booleano (AND, OR…) dentro de la expresión?:

var v = "cualquier cosa";

if (v && true)

    alert("verdadero");

else

    alert("falso");

Lo que hemos hecho es comparar el valor v con true usando un operador AND (&&). Según la lógica es equivalente a comprobar la igualdad, ya que el AND solo devuelve true si ambas partes son true. En este caso veríamos por pantalla la palabra «verdadero» y no «falso» como en el anterior. ¿Por qué? El motivo es que en este caso el valor de la variable v se convierte a booleano antes de hacer la operación, ya que estamos en el contexto de un operador lógico booleano.

El orden de los operadores importa cuando manejamos «verdadosos» y «falsosos»

Pero no se vayan todavía, que aún hay más… Vamos a darle una vuelta de tuerca más al asunto, con algo que seguro que a más de uno le puede sorprender.

¿Qué crees que devolverá por pantalla esta expresión?:

alert("cualquier cosa" && true);

Efectivamente, veremos aparecer «true» por pantalla pues la expresión se evalúa como verdadera al ser ambos valores «verdadosos».

Si variamos ligeramente la expresión:

alert( true && "cualquier cosa");

Es exactamente la misma comparación, así que deberíamos ver lo mismo ¿no?: ¡No!, en este caso veremos por pantalla la frase «cualquier cosa» y no un «true» aunque el resultado de la operación es un verdadero al ser ambos valores «verdadosos».

¿Qué ha pasado aquí?

Para comprenderlo hay que ver bien lo que pone la especificación acerca de cómo evaluar operadores lógicos booleanos.

En el caso del operador AND (&&), la especificación dice que se evalúa de la siguiente manera (resumiendo las pasos en una sola frase):

  • Si el valor convertido a booleano del primer operando es false, entonces devolver el primer operando, sino devolver el segundo operando.

En el caso del operador lógico OR (||) la regla es parecida:

  • Si el valor convertido a booleano del primer operando es true, entonces devolver el primer operando, sino devolver el segundo operando.

Así de sencillo pero con muchas implicaciones:

  1. En primer lugar, los operadores lógicos AND y OR no devuelven siempre un booleano, como casi todo el mundo piensa. Devuelven el valor del primer o del segundo operando dependiendo de si son «verdadosos» o «falsosos». Solo devuelven un booleano si el operando que devuelven lo es.
  2. Se hace cortocircuito de expresiones, es decir, que llega con evaluar el primero si con eso ya sabemos cuál va a ser el resultado. Así, en un AND, si el primero es false ya no hace falta seguir evaluando pues tendrían que ser los dos true y ya es imposible. En el caso de OR si el primero es true ya no hace falta seguir evaluando porque si uno de ellos es true el resultado será true.

Si nos fijamos en nuestras expresiones anteriores a la luz de estas reglas, entonces vemos que tienen toda la lógica del mundo.

En el primer caso («cualquier cosa» && true) el primer operador es verdadero, así que se devuelve directamente el segundo. Al darles la vuelta (true && «cualquier cosa»), pasa lo mismo y se devuelve directamente el segundo argumento, que en este caso es una cadena.

¿Cómo asegurarnos de que siempre vamos a trabajar con verdaderos booleanos?

Es fácil ver que toda esta casuística es muy peligrosa cuando trabajamos con valores que no son verdaderos booleanos, es decir, que se pueden interpretar como tales o no dependiendo del caso y de donde los usemos.

Para solucionarlo podemos usar una técnica muy sencilla que consiste en asegurarnos de devolver siempre todos los valores de nuestras funciones que deban ser booleanos convertidos en booleanos.

¿Y cómo los convertimos?

El operador ToBoolean es interno y no podemos llamarlo, así que podemos hacerlo de dos maneras: usando un objeto de tipo Boolean o utilizar el operador de negación dos veces.

La primera técnica es farragosa e ineficiente implica crear un objeto a partir de un tipo primitivo:

var b = Boolean("cualquier cosa");

alert(b);

La segunda es mucho más elegante y concisa y la verás utilizada por ahí bastante en código profesional. Se basa en que el uso del operador negación (!) convierte cualquier valor en booleano y lo niega, devolviendo un verdadero booleano. Si lo aplicamos dos veces, lo vuelves a negar y obtienes el valor original convertido en booleano:

var b = !!"cualquier cosa";

alert(b);

Así, si quieres asegurarte de que las expresiones anteriores devuelven un booleano siempre, puedes escribirlas así. Por ejemplo, el comparador que hicimos antes entre una cadena y un booleano dentro de un if, lo podemos transformar así:

var v = "cualquier cosa";

if (!!v == true)

    alert("verdadero");

else

    alert("falso");

y funcionará como un booleano de verdad, devolviendo un «verdadero» como esperábamos.

Sin embargo es una tontería aplicarlo a los operadores de la condición un if cuando se usan con operadores lógicos booleanos:

var v = "cualquier cosa";

if (!!v && true)    //Esto no sirve para nada

    alert("verdadero");

else

    alert("falso");

Ya que como hemos visto el if ya lo convierte siempre a un booleano. Esto lo verás muchas veces por ahí aplicado de esta manera y es una mala práctica porque no aporta absolutamente nada y aumenta la ineficiencia del código.

Una buena práctica sin embargo es asegurarnos de que lo que devuelve una función nuestra en la que se espera obtener siempre un booleano como resultado, usando el operador negación dos veces (!!) para ello:

return !!res;

De este modo aunque los datos originales sobre los que trabajamos no sean booleanos, nuestra función va devolver siempre uno. Esto es especialmente importante cuando trabajamos con elementos del DOM, que en un momento dado pueden no existir o carecer de alguna propiedad que estamos utilizando en el código. De hecho bibliotecas como jQuery hacen esto constantemente para devolver valores en sus funciones.

double negativeEn resumen

Una cosa aparentemente trivial como parece ser el trabajo con booleanos y pseudo-booleanos (verdadosos o truly y falsosos o falsy) tiene muchos pequeños detalles que debemos conocer para evitar desagradables sorpresas. Es el precio que tenemos que pagar a cambio de la flexibilidad que nos proporciona un lenguaje débilmente tipado como es JavaScript.

Si vamos a trabajar con valores que suponemos que son booleanos en comparaciones o para devolverlos como resultados de funciones es recomendable aplicarles una doble negación (!!) para asegurarnos de que los hemos convertido en booleanos verdaderos antes de usarlos. También debemos tener cuidado con los operadores lógicos booleanos (&& y ||) porque no siempre devuelven verdadero o falso, sino que dependiendo de los operando que utilicemos y de si estos son verdaderos booleanos o no, el resultado podría ser cualquier cosa.

¡Espero que te resulte interesante!

Para saber más: Fundamentos de JavaScript y AJAX para desarrolladores y diseñadores web

Si vas a compartir este post: por favor utiliza la URL original en JASoft: http://www.jasoft.org/Blog/post/Booleanos-pseudo-booleanos-operadores-y-condicionales-en-JavaScript-mucho-mas-complejo-de-lo-que-parece.aspx

Nuevos proyectos unificados de aplicaciones ASP.NET en Visual Studio 2013

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Nuevos-proyectos-unificados-de-aplicaciones-ASPNET-en-Visual-Studio-2013.aspx

Un poco de historia para comenzar y ayudarnos a entender el porqué de lo que voy a explicar.

ASPNETWebFormsCuando nació ASP.NET hace ya casi 15 años lo único que existía era ASP.NET Web Forms. Este novedoso paradigma de desarrollo trataba de acercar el desarrollo web a los programadores de escritorio, y permitía arrastrar y soltar controles, controlar eventos en el servidor como si fueran eventos de cliente, etc… Algo muy innovador y que todavía sigue siendo muy útil (y muy utilizado), pero que cada vez se usa más para ciertos ámbitos concretos, como las aplicaciones empresariales.

Una década más tarde Microsoft decidió que aunque esto estaba muy bien para crear rápidamente aplicaciones de tipo empresarial no daba la flexibilidad apropiada para crear aplicaciones web generales, donde se necesitaba un control absoluto sobre el HTML generado, y se necesita poder sacar partido con total libertad a las nuevas características de los navegadores, apoyadas en HTML5, CSS3 y JavaScript. Por ello se sumó a la tendencia del sector de usar el patrón MVC (Model-View- Controller) para crear aplicaciones web en las que toda la responsabilidad de la definición de la interfaz de usuario recaía en el programador. Era una vuelta al modelo de desarrollo web más puro, donde la diferencia entre cliente y servidor estaba muy clara (al contrario que en Web Forms) y se separa la aplicación en capas funcionales, cada una con su propia responsabilidad. Así que lanzaron ASP.NET MVC, ahora ya por su versión 5.

Posteriormente, en un (en mi opinión) vano intento de atraer a la plataforma a programadores de PHP y ASP clásico, presentaron también ASP.NET Web Pages, un “mix” entre páginas HTML y MVC que usa código de servidor con sintaxis Razor para crear páginas dinámicas de manera más o menos sencilla. Esto va acompañado de un entorno de desarrollo propio llamado WebMatrix, nombre que reutilizaron de un antiguo proyecto de 2003 (un IDE gratuito que tenían antes de que hubiera las versiones Express de Visual Studio).

La tendencia más reciente, casi imparable, es la de descargar cada vez más responsabilidad en el navegador, aprovechando la enorme capacidad que ofrecen los navegadores modernos, y que la mayor parte del procesamiento se encuentre en el cliente y no en el servidor. Esta filosofía se relaciona con la tendencia a crear aplicaciones de tipo Single Page Application o SPAs. Ello implica que en el lado servidor muchas aplicaciones modernas se limitan casi en exclusiva a proveer de servicios de tipos REST que trasiegan datos entre el navegador y la base de datos (o el almacenamiento que sea). Ello implica crear servicios REST que se comuniquen bien con el navehador (JSON) y que sean rápidos de crear, escalables y fáciles. Para dar respuesta a estas necesidades Windows Communication foundation era quizá muy complejo y con demasiadas características, por lo que Microsoft buscó varias posibles opciones que cubrieran esta necesidad, y finalmente, junto con Visual Studio 2012 y MVC4, lanzaron hace un año ASP.NET Web API. Gracias a Web API es muy sencillo crear servicios REST orientados a servir y recibir datos de aplicaciones web de lado cliente, basadas en JavaScript.

Finalmente, otra necesidad cada vez más común es la de dotar a las aplicaciones de capacidades en tiempo real: chats, notificaciones, sincronización de procesos… y también la posibilidad de devolver esa información de la manera más rápida posible y sobre todo siendo muy escalable, de modo que el servidor pueda atender a muchos usuarios al mismo tiempo de manera síncrona. Esta tendencia la marca la prominencia que está tomando la plataforma Node.js. La respuesta a estas necesidades dentro del "stack" de tecnología de desarrollo Microsoft ha sido ASP.NET SignalR, cuya primera versión vio la luz hace tan solo 8 meses y que lanzará su versión 2.0 en unos días.

Es decir, resumiendo, tenemos multitud de tecnologías que llevan el nombre ASP.NET pero diferentes apellidos: Web Forms, MVC, Web Pages, Web API y SignalR.

Lo curioso es que a pesar del nombre común (todos llevan ASP.NET delante), como cada una tiene sus propias plantillas en Visual Studio y se lanzaron como proyectos independientes, muchos programadores creen que realmente son cosas distintas e incompatibles, cuando no es así. En realidad todas estas tecnologías tienen por debajo un mismo framework (.net) y comparten las características que les proporciona el núcleo de ASP.NET. Los conocimientos generales de ASP.NET que tienen los programadores de Web Forms se pueden aplicar también a MVC (desde la autenticación o las sesiones a la monitorización en tiempo real de aplicaciones).

Microsoft ha querido reforzar esta visión y últimamente está hablando del concepto One ASP.NET: se trata de un único ASP.NET y no de un conjunto disjunto de tecnologías. Todas ellas usan por debajo el mismo núcleo, y se pueden usar al mismo tiempo. Eso se refleja bien en esta figura que he pintado:

ONE ASPNET

En Visual Studio 2013, la última versión de VS aparecida hace unos días, este refuerzo conceptual se puede ver muy claro cuando intentas crear un nuevo proyecto de aplicación web:

VS2013_ASPNET_NuevaAppWeb

Pulsa para aumentar

Ahora hay una sola plantilla para crear una nueva aplicación, que se llama simplemente ASP.NET Web Application. Todavía tenemos las antiguas plantillas de VS2012 si queremos (justo debajo, en un nodo hijo, fíjate en la figura), pero esta es la plantilla oficial que Microsoft quiere que utilicemos. La idea es reforzar que no existen muchos ASP.NET diferentes, sino uno único, y que podemos usar las características que queramos de manera modular. Son complementarias, no excluyentes.

Así, al elegir esta nueva plantilla, se nos abre un diálgo que nos pregunta qué queremos usar:

VS2013_ASPNET_NuevaAppWeb_Dlg

Pulsa para aumentar

Como vemos podemos elegir entre una serie de plantillas de contenido para los sitios: WebForms, MVC, Web API, librerías específicas para Single Page Application o incluso para crear aplicaciones para Facebook (a mi esta última me sobra bastante en este diálogo). Si elegimos estos iconos Visual Studio nos creará un proyecto con un montón de cosas ya hechas (como páginas por defecto, autenticación, librerías JavaScript apropiadas, etc…) con la tecnología elegida.

Estupendo, pero ¿qué diferencia hay entre esto y las antiguas plantillas que traía VS2012?.

La diferencia es que se refuerza esa idea de una única plataforma, y no varias diferentes (o al menos dos, como mucha gente piensa: Web Forms y MVC). Además tenemos la opción de añadir carpetas y referencias de Web Forms, MVC y Web API por si queremos usarlas pero no queremos contenido por defecto, teniendo el proyecto configurado para usar todas las piezas a la vez si quisiésemos.

El botón “Change Authentication” nos permite elegir de qué forma queremos autenticar a nuestros usuarios en la aplicación, creando por debajo lo necesario según el caso:

VS2013_ASPNET_NuevaAppWeb_Dlg_Auth

Pulsa para aumentar

Podemos no autenticar (sitio público), usar cuentas individuales en una base de datos (la API de Membership de toda la vida contra SQL Server), usar cuentas organizacionales (que se refiere a cuentas de Directorio Activo pero que pueden estar sincronizadas en la nube y autenticar con Office 365 o Azure), o usar la autenticación local de Windows (para aplicaciones de Intranet que trabajan con el Directorio Activo local).

Además las nuevas plantillas utilizan por defecto Bootstrap para crear los estilos de las páginas por defecto. Esto significa que además de tener un aspecto moderno y atractivo, son también “Responsive”, es decir, se comportan bien en cualquier tipo de resolución o dispositivo (mientras no le metamos nuestro contenido, en cuyo caso hay que saber hacerlo bien para que esto se conserve). Por ejemplo, este es el aspecto de la página principal de una aplicación Web Forms:

VS2013_ASPNET_NuevaAppWeb_UI
Pulsa para aumentar

Muy atractivo y moderno (y muy reconocible).

El editor visual de Visual Studio 2013 visualiza el mismo HTML de la siguiente manera:

VS2013_ASPNET_NuevaAppWeb_UIEnEditor

Pulsa para aumentar

Es decir, como si se visualizara en un móvil.

Con el contenido por defecto del sitio se nos ofrece también ayuda sobre cómo está creada la aplicación, con información bastante interesante:

VS2013_ASPNET_NuevaAppWeb_Readme

Pulsa para aumentar

Conviene eliminar esa página antes de desplegar el proyecto.

En resumen

Con estas nuevas plantillas Microsoft pretende reforzar la idea de ASDP.NET como una plataforma única para desarrollo web dotada de diferentes piezas que podemos usar a voluntad según las necesidades, y no como un conjunto de plataformas diferentes. Además ha incluido interesantes mejoras en los editores y las nuevas plantillas se basan en Bootstrap para darnos un aspecto moderno, elegante y multi-dispositivo.

En algunos post posteriores comentaré algunas mejoras particulares que vienen con el entorno y que hacen que sea muy recomendable actualizar si eres desarrollador web.

¡Espero que te resulte útil!

TRUCO: Guardar un plan de mantenimiento fuera de SQL Server

Post original en JASoft.org: http://www.jasoft.org/Blog/post/TRUCO-Guardar-un-plan-de-mantenimiento-fuera-de-SQL-Server.aspx

Como es sabido, SQL Server dispone de una utilidad estupenda llamada "Planes de Mantenimiento" que nos permite, sin apenas tener ni idea, crear un montón de tareas útiles para nuestras bases de datos: desde comprobar la integridad de las base de datos o actualizar las estadísticas, hasta crear copias de seguridad con multitud de opciones. También nos permite definir con mucho nivel de detalle las tareas a realizar, con una interfaz gráfica que nos muestra el flujo de trabajo y nos permite programarlas a determinadas horas, etc…

1
Pulsa para aumentar

Se trata de algo realmente útil que nos permite obtener un gran control sobre las acciones a realizar de manera periódica, sin tener que recurrir a programarlas en T-SQL.

Estos planes de mantenimiento se almacenan por defecto en el propio motor de base de datos. Si queremos guardarlos a disco para persistirlos fuera de la base de datos o para reutilizarlos en otro servidor, el SQL Server Management Studio (SSMS) no nos facilita las cosas demasiado por defecto, ya que no nos ofrece ninguna opción para guardarlo o exportarlo en su menú contextual:

2

¿Cómo podemos hacer para guardarlos a disco y reutilizarlos?

La solución es poco intuitiva pero muy fácil.

Lo que debemos hacer es abrir una nueva conexión con SSMS, pero no al motor de bases de datos, sino a los Integration Services (servicios de integración). Éstos nos permiten crear paquetes para realiar cargs de datos, consolidaciones, transformaciones, etc… Y también nos dan acceso a todos los paquetes de la base de datos, incluyendo los planes de mantenimiento, pero con una interfaz más rica y con más opciones.

3

Desde el árbol de esta conexión podremos encontrar los planes de mantenimiento bajo "Paquetes almacenados·MSDB·Planes de mantenimiento". Si pulsamos con el botón derecho sobre el plan que nos interese guardar, veremos que tenemos la opción de exportarlo:

4

En el diálogo que aparece, por defecto nos dirá de guardarlo en la base de datos de nuevo, pero basta con elegir en la lista desplegable que queremos guardarlo a disco y seleccionar una ruta más abajo:

5

¡Listo!

Ahora podemos importarlo en otro servidor (o en este mismo si lo necesitásemos) usando el mismo menú contextual de Integration Services que hemos usado para exportarlo.

Una opción muy sencilla pero que si no te la indican cuesta mucho identificar.

¡Espero que te sea útil!

OFF-TOPIC: Nuevo curso de HTML y CSS

Post original en JASoft.org: http://www.jasoft.org/Blog/post/OFF-TOPIC-Nuevo-curso-de-HTML-y-CSS.aspx

<disclaimer>
Llevo casi diez años haciendo este blog (y muchos años más con esta página) ayudando a mucha gente, así que me vas a perdonar que alguna vez de tarde en tarde haga algo de auto-bombo y te cuente mis proyectos personales. Como hoy 🙂 Quizá te puede interesar lo que cuento en cualquier caso.
Gracias por leerlo.
</disclaimer>

La verdad es que durante los últimos meses he estado muy ocupado. Mucho más que de costumbre. Y esa es la causa de que, aunque sí he puesto cosas interesantes últimamente, no haya publicado aquí en JASoft.org tanto como me hubiera gustado, además de haber dejado de lado muchas otras otras cosas.

Hay dos motivos principalmente para ello:

  • He estado trabajando todo el verano en un nuevo curso.
  • He estado (y todavía estoy) trabajando codo con codo con nuestros autores en nuevos cursos para campusMVP.

¿Detectas la palabra clave? 😉

Efectivamente: cursos, cursos, cursos…

Este ha sido mi verano (y parte ya del otoño) un montón de horas al día:

Ocupado

Mi nuevo curso de HTML(5) y CSS(3)

Durante Julio y Agosto he trabajado un montonazo de horas (bufff, me canso solo de pensarlo) en un nuevo curso para enseñar HTML y CSS desde cero y hasta un nivel medio-alto. Estoy muy contento con el resultado, y los primeros alumnos y revisores que nos han estado dando feedback confirman mis buenas vibraciones.

HTML y CSS son las herramientas básicas necesarias para todo programador web, sea cual sea la plataforma que utiliza. También para webmasters, Social Media Managers, etc… Si quieres dedicarte profesionalmente a la Web necesitas dominarlo.

El problema es que aunque lo básico es muy sencillo y mucha gente lo conoce, hay muchísimos detalles y conocimientos que normalmente se escapan al programador promedio.

Mi idea con el curso fue partir de cero y llegar a alcanzar un nivel muy bueno de trabajo con HTML y CSS, de modo que le pudiera servir a los principiantes que quieran aprender seriamente el tema. Pero también quería que le sirviera a programadores web que han aprendido de manera informal HTML y CSS y que se manejan con él todos los días, pero les falta una educación formal en el tema. Por eso lo he hecho práctico y lo he salpicado de consejos y detalles que no todo el mundo conoce y que le resultarán útiles a mucha gente. Por supuesto incluye HTML5 y CSS3 para estar a la última.

El contenido es muy amplio, con 11 módulos que incluyen más de 300 folios de teoría, más de 7 horas de vídeos prácticos, decenas de enlaces interesantes para profundizar, etc… He metido muchas prácticas sugeridas al final de cada módulo para que no tengas disculpa para no practicar y reforzar lo aprendido. Y al final creé bastantes más de un centenar de preguntas para hacer evaluaciones dinámicas y poder dar un certificado de aprovechamiento bien merecido a los que hagan el curso.

Además, claro, estaré disponible todo el tiempo para contestar las dudas de los alumnos. Los alumnos pueden preguntarme cualquier cosa que les surja durante el curso relacionada con el contenido, y yo se las contesto enseguida y de manera personalizada. Contacto directo con el autor, vamos, ya que soy también el tutor del curso.

Como siempre el curso cuenta con una planificación temporal para ir marcando el paso a los alumnos, te avisamos si te quedas atrás, etc… De modo que los alumnos acaben aprendiendo en tiempo y forma (tiramos de uno si remolonea, vamos). Como ves se trata de una formación muy personalizada y siendo on-line se tiene oportunidad de aprender mucho más que en un curso presencial.

En fin, aunque no te interese personalmente, por favor, échale un vistazo y quizá se lo puedas recomendar a alguien que sí lo necesite o le interese. Gracias 🙂

El nuevo catálogo de campusMVP

Además en campusMVP llevamos meses trabajando codo con codo con los autores para crear nuevos cursos para el catálogo que amplíen nuestros horizontes. Aparte del mío que acabo de comentar, los primeros ya han salido del horno y han quedado genial:

Pero en las próximas semanas y meses todavía lanzaremos más que están en preparación (¡algunos muy pronto!).

Ha sido duro porque como director de campusMVP me empeño en que les exijamos a nuestros autores y tutores el mismo nivel de calidad y compromiso que yo mismo le impongo a mis propios cursos. Así que muchas veces los autores abandonan (crear un curso parece más fácil de lo que es), otras los descartamos nosotros, y al final nos quedamos solo con los mejores contenidos de los mejores tutores.

Aunque suene a tópico, el objetivo principal de la empresa es que la gente aprenda de verdad y que gracias a ello salga encantada de los cursos. Y lo solemos conseguir. El año pasado por ejemplo el 91,3% de nuestros alumnos nos valoraron con un 5 o un 4 sobre sobre 5 en las encuestas de satisfacción.

En fin, que me apetecía mucho contar todo esto. Y que, aunque he estado muy ocupado y lo sigo estando, espero poco a poco volver a la normalidad y retomar con más fuerza el blog durante las próximas semanas.

Gracias por leer hasta aquí. Es por gente como tú que este blog tiene sentido 🙂

Nueva versión mejorada de FileEncoding Converter (v1.3)

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Nueva-version-mejorada-de-FileEncoding-Converter-(v13).aspx

Ya hace unos años creé una aplicación, pequeña pero muy útil, llamada FileEncoding Converter.

Su objetivo es sencillo: le pasas una carpeta, y opcionalmente una codificación y un filtro de archivos y convierte todos los archivos a la codificación especificada.

Se trata de una aplicación de consola (línea de comandos) que toma los siguientes parámetros:

1.- La ruta base que contiene nuestros archivos a procesar. Acepta rutas relativas a la carpeta actual y rutas absolutas.

2.- El tipo de codificación al que queremos transformarlo (opcional).

Los tipos de codificación soportados son los siguientes:

  • ANSI
  • ASCII
  • Unicode
  • UnicodeBI (Big Indian)
  • UTF32
  • UTF7
  • UTF8.

Este parámetro no distingue entre mayúsculas y minúsculas, por lo que podemos poner cualquiera de estos valores como queramos. Si omitimos este parámetro la codificación que se usará por defecto será ANSI.

3.- El tercer parámetro (opcional) permite especificar una o varias plantillas de nombres de archivo a buscar para procesar. Permite el uso de comodines. Si no le pones nada buscará solamente archivos de texto y HTML (.htm o .html), pero puedes especificar, separados por comas, qué tipos de archivos quieres transformar.

4.- Finalmente el cuatro parámetro es “/f” y sirve para forzar la conversión siempre. Esto es muy útil cuando, por ejemplo, tienes archivos en formato UTF8 sin BOM. Si los conviertes también a UTF8, al detectar que ya están en UTF8 no los codifica. Forzando la conversión los grabará de nuevo como UTF8 pero esta vez poniéndoles el BOM, lo cual puede ser muy útil.

Codificación UTF8 y preámbulos

Este es un dato importante…

Los archivos codificados según alguno de los tipos anteriores generalmente llevan delante una marca de tres bytes llamada preámbulo o BOM (Byte Order Mark). Aunque no es obligatorio sí es muy útil puesto que nos indica de modo inequívoco de qué forma está codificado un archivo. Cuando se usa en un entorno cerrado (donde ya conocemos cuál es la codificación que se usa siempre) no hace falta, pero en el intercambio de archivos debería usarse siempre.

La cuestión es que en Windows casi todos los editores le ponen el BOM a los archivos. Pero en Mac y Linux es al contrario y no se lo suelen poner. Por regla general si no llevan el BOM están codificados en ANSI o en UTF8. Lo malo es que la única forma de saberlo si no llevan el BOM es usando un método heurístico que consiste en tratar de identificar ciertas secuencias de bytes dentro del archivo, que te indicarán la presencia de la codificación con un alto grado de probabilidad.

Esta nueva versión del conversor identifica los archivos UTF8 sin BOM usando este método, por lo que es capaz de trabajar con la mayoría de archivos que te puedas encontrar por ahí. Es importante saberlo.

A raíz de esta nueva capacidad he incluido la opción de forzar la reconversión que mencionaba antes (/f) para forzar la inclusión del BOM en los archivos UTF8 y facilitar su intercambio.

Ejemplos de uso

Lo que hace la utilidad es recorrer la carpeta base especificada y todas sus subcarpetas y transforma todos los archivos indicados a la codificación de destino especificada (por defecto ANSI).

Muestra un progreso de los archivos que va transformando, y al final muestra un resumen de lo que ha hecho.

Así, por ejemplo, para transformar todos los archivos con extensiones .htm, .html y .txt de una carpeta y sus subcarpetas de su codificación actual a Unicode Big Indian escribiríamos:

FileEncodingConverter C:Micarpeta UnicodeBI

o para convertir todos a ANSI valdría con poner simplemente (con todas las opciones por defecto):

FileEncodingConverter C:Micarpeta

Para forzar la conversión (o re-conversión) a UTF8 de todos los archivos XML cuyo nombre contenga las letras ‘ES’, además de todos los de texto así como los HTM (tanto .htm como .html), podrías escribir:

FileEncodingConverter C:MisArchivosDedatos UTF8 *ES*.xml,*.txt,*.htm* /f

Para ver una ayuda rápida sobre su uso basta con poner /? o -?.

Para ejecutarlo necesitarás la versión 2.0 o posterior de .NET.

Puedes descargarlo desde aquí: FileEncodingConverter.zip (5,15KB)

¡Espero que te sea útil!

Desentrañando la "Ley de Cookies" y cómo afecta a tus sitios y aplicaciones web

Post original en JASoft.org: http://www.jasoft.org/Blog/post/Desentranando-la-Ley-de-Cookies-y-como-afecta-a-tus-sitios-y-aplicaciones-web.aspx


 <disclaimer> No soy jurista ni especialista en leyes, y tampoco pretendo proporcionar servicios relacionados con este ámbito ni nada parecido. Este artículo es simplemente mi visión del asunto tras haber investigado, haber buscado mucha información y haberme leído la última versión de la LSSI. Espero simplemente que te haya resultado útil.  </disclaimer>

MonstruoGalletas

En primer lugar vaya por delante que esta mal llamada «Ley de Cookies» me parece un despropósito tal y como está planteada, y en mi opinión supone poner más palos en las ruedas de las maltratadas empresas europeas, poniéndolas en mayor desventaja aún con las empresas de otras partes del mundo y en especial con las de EEUU.

La «Ley de Cookies»

La Ley de Servicios de la Sociedad de la Información, más conocida como LSSI, que data del año 2002, describe los derechos de los usuarios de servicios en la Red así como las obligaciones de los prestadores de dichos servicios. Es decir, que afecta a todas las empresas y personas que hagan uso de Internet para vender algo, promocionarse, prestar servicios, poner publicidad, etc… En la práctica, por tanto, afecta a casi todo el que haga algo en Internet, por lo que hay que tenerla muy en cuenta.

Nota: Esta ley es muy amplia y tiene muchas exigencias. En esta ocasión me voy a centrar únicamente en la parte relativa a las «cookies» y el almacenamiento de información, así que ten en cuenta que hay muchas más cosas que hacer para adaptarse a la LSSI.

En marzo del año pasado (2012), con vigencia desde abril, se aprobó en España el Real Decreto-Ley 13/2012 de 30 de marzo,por el que (y cito):

«se transponen directivas en materia de mercados interiores de electricidad y gas y en materia de comunicaciones electrónicas, y por el que se adoptan medidas para la corrección de las desviaciones por desajustes entre los costes e ingresos de los sectores eléctrico y gasista«.

¿Comorrrr? ¿Qué tiene que ver la electricidad y el gas con la LSSI?

Bueno, por lo que se ve en el Real Decreto en el que se establecía principalmente esa corrección, incluyeron de canto lo que nos afecta a nosotros como trabajadores de la Red. Se trata de una modificación que afecta a la manera en la que podemos almacenar en el navegador la información sobre los visitantes y usuarios de nuestros sitios web, y es una adaptación de una directiva de ámbito europeo que paulatinamente están adoptando todos los países de la UE. Es lo que se ha llamado «Ley de cookies».

Esta mal llamada «Ley» no es tal, sino que se trata únicamente del artículo 22 de la LSSI, que dice algo tan escueto como lo siguiente:

«Los prestadores de servicios podrán utilizar dispositivos de almacenamiento y recuperación de datos en equipos terminales de los destinatarios, a condición de que los mismos hayan dado su consentimiento después de que se les haya facilitado información clara y completa sobre su utilización, en particular, sobre los fines del tratamiento de los datos, con arreglo a lo dispuesto en la Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.

Cuando sea técnicamente posible y eficaz, el consentimiento del destinatario para aceptar el tratamiento de los datos podrá facilitarse mediante el uso de los parámetros adecuados del navegador o de otras aplicaciones, siempre que aquél deba proceder a su configuración durante su instalación o actualización mediante una acción expresa a tal efecto.

Lo anterior no impedirá el posible almacenamiento o acceso de índole técnica al solo fin de efectuar la transmisión de una comunicación por una red de comunicaciones electrónicas o, en la medida que resulte estrictamente necesario, para la prestación de un servicio de la sociedad de la información expresamente solicitado por el destinatario.»

¿Qué demonios quiere decir todo esto?

Traducido al cristiano, de lo que habla este artículo es de la ilegalidad de almacenar información de cualquier tipo en el navegador del usuario que vaya a estar disponible entre visitas sin el previo consentimiento de éste. Lo más habitual: las cookies. Ya he hablado anteriormente de las cookies: qué son, para qué sirven, cómo se utilizan, etc…

El espíritu de la Ley me parece muy apropiado: proteger tu privacidad evitando que, sin tu permiso previo, los anunciantes vayan siguiéndote por todo Internet sabiendo qué páginas visitas, qué artículos o temas te interesan, etc… Eso es bueno, pues evita ciertos abusos que se cometen constantemente por parte de grandes anunciantes, grandes buscadores, grandes medios de comunicación y grandes tiendas on-line.

¿Ves un patrón en lo anterior? 😉 Sí, efectivamente, la palabra clave es «grandes». Y es ahí, a mi juicio, donde la LSSI (y otras leyes similares) no están bien diseñadas. El problema es que, en lugar de atajar el problema enfocándose en las prácticas que llevan a cabo Google, Facebook, DoubleClick y otras muchas grandes empresas, lo que hacen es trasladar el problema a los pequeños empresarios y a la gente que simplemente trata de ganarse a vida en Internet. El resultado es: mucha más complejidad, uso de las leyes como arma arrojadiza o para tácticas contra la competencia, y finalmente que es inefectiva para el objetivo real que debiera tener, porque los grandes siguen haciendo lo que les da la gana (entre otras muchas cosas porque no se guían por la Ley Española o europea).

Dejando de lado este asunto: ¿qué implicaciones tiene sobre mis desarrollos en Internet?

Tipos de cookies y almacenamientos locales según la directiva europea

Lo que implica, grosso modo, es que debemos informar a los usuarios de manera clara sobre qué cookies vamos a guardar en su ordenador antes de hacerlo. Y ello incluye no solo las cookies propias que podamos generar con nuestras aplicaciones, sino también las cookies de terceros que pudiera haber: esto incluye por ejemplo las de Google Analytics, Faceboook y otros botones de redes sociales, etc…

Aunque el artículo 22 de la LSSI no se mete en nada más específico, podemos referirnos a la directiva europea y leer el Dictamen 4/2012, adoptado en Junio de 2012, en el que aclara con mucho detalle qué implicaciones tiene todo esto. Este dictamen, algo posterior a la modificación de la LSSI y surgido como aclaración, divide las cookies que pueden estar exentas de la aplicación de la directiva, y que por tanto están permitidas, en dos criterios:

  • Criterio A: la cookie se utiliza «al solo fin de efectuar la transmisión de una comunicación a través de una red de comunicaciones electrónicas».
  • Criterio B: la cookie es «estrictamente necesaria a fin de que el proveedor de un servicio de la sociedad de la información preste un servicio expresamente solicitado por el abonado o el usuario». Esto quiere decir que sea «estrictamente necesario» desde el punto de vista del usuario, no del prestador de servicios, lo cual es una puntualización extremadamente importante.

Y también distingue entre «cookies de sesión» (las que se eliminan cuando el usuario cierra el navegador) y las «cookies de terceros» (que son las que generan en tu sitio web otras empresas que no son la tuya, por ejemplo Google o Facebook).

Esto quiere decir que, sin consentimiento previo del usuario, está permitido usar: cookies de sesión y las cookies que -aún siendo persistentes- sean estrictamente necesarias para el funcionamiento de la aplicación.

El documento anterior muestra un montón de ejemplos prácticos reales y es bastante interesante leerlo, pero por ejemplo serían válidas la siguientes cookies:

  • Cookies de identificación de sesión: como las que usa ASP.NET y casi todos los frameworks de servidor.
  • Cookies de autenticación: las que se utilizan para persistir la sesión abierta de una visita a las siguientes, algo muy habitual también.
  • Cookies de seguridad: según el criterio B. Serían las que pongamos para tratar de mejorar la seguridad del usuario, como por ejemplo una que almacene que ha intentado autenticarse erróneamente varis veces y que tomamos medidas extra de seguridad al detectarlas. Cosas así.
  • Cookies multimedia: necesarias a veces para reproducir audio y vídeo y que almacenan cosas como la velocidad de conexión, la calidad preferida, etc… y que según el criterio B se consideran indispensables para el funcionamiento de este tipo de aplicaciones.
  • Cookies para personalización de la interfaz de usuario: si el usuario indica su idioma favorito, una plantilla concreta que quiere utilizar para cambiar la estética, colores, etc… Este tipo de almacenamiento entre sesione está permitido.
  • Algunas de las cookies necesarias para intercambiar contenidos sociales: con ciertas salvedades. Este caso es bastante complejo, por lo que lo comentaré en exclusiva un poco más adelante.

Cookies de redes sociales

Esta parte es demencial, y merece una explicación por separado.

Hoy en día es muy común colocar en tu página web botones específicos de redes sociales, tanto para permitir que te sigan a ti o a tu empresa, como para fomentar que compartan artículos, productos y otros contenidos en las diferentes redes sociales. Además las redes sociales se integran en nuestras páginas y aplicaciones de muchas otras formas: para hacer comentarios, con posts embebidos, contadores de compartición de páginas… En la actualidad las principales redes sociales están presentes en una gran mayoría de las páginas web de terceros, y se puede considerar en muchos casos que son una parte casi indispensable.

Esta situación otorga un poder sin precedentes a estas redes sociales, ya que tienen un «chivato» en casi cada página de Internet, recaban información sobre las visitas, su frecuencia, su ubicación y muchos otros datos. Y como la mayoría de los usuarios se encuentra conectado permanentemente a esas redes (por vagancia generalmente nadie cierra la sesión) toda esa información se recoge en muchos casos con nombre y apellidos, y puede ser atada para crear perfiles muy completos de cada usuario de esas redes. Existe un vídeo muy efectista que te recomiendo que veas para darte cuenta de lo que esto representa. Se trata de un «medium» que le cuenta cosas personales a gente que conoce por la calle en Bruselas, y que lo único que hace es darles información que saca simplemente de su perfil público de Facebook. Imagínate lo que saben Facebook y otras redes de ti accediendo a toda la información, no solo a la que es pública.

Está claro que esto es algo que debería ser controlado en aras de nuestra privacidad, así que una Ley bien planteada en este sentido es interesante. El problema es que, como la Ley «no puede» forzar a estas grandes empresas extranjeras a comportarse (aunque imagino que sí podría presionarlas actuando sobre las filiales locales, pero…), lo que hace es trasladar el problema a los usuarios finales, es decir, a las empresas que usan las redes sociales de manera totalmente inocua tratando simplemente de dar a conocer sus productos y vender más, pero no invadiendo en modo alguno la privacidad de sus visitantes.

¿Qué dice la directiva europea respecto a las cookies de estas redes sociales?

Primeramente distingue entre los usuarios que están con su sesión abierta en las redes sociales y los que no la tienen abierta o no pertenecen a la red. Los primeros se supone que son conscientes de ello y que saben que las redes en las que estén les están «vigilando» por lo que no es necesario avisarles de las cookies puestas por los botones y complementos de estos sitios que haya en nuestra página. A los demás usuarios (si no están dados de alta o no tienen la sesión abierta) hay que avisarles y además impedir la escritura de las cookies hasta que consientan explícitamente a ello.

En la práctica tú no tienes forma de saber si el usuario está conectado o no, además de que en mi opinión la mayoría de ellos no son conscientes de que sus redes sociales les están siguiendo por Internet y elaborando un perfil de consumo. Los que sí lo saben y por tanto podrían actuar según la directiva son las redes sociales en cuestión. Pero no lo hacen, por lo que la responsabilidad recae en nosotros. Como lo oyes. Aunque tú no seas el que pone esas cookies en tu página o aplicación, y aunque tampoco te beneficies de los perfiles que elaboran, si un usuario denuncia la responsable será tu empresa y no la red social o la aplicación ajena que ha creado la cookie. Así que no nos queda más remedio que controlar este hecho y ser nosotros los que no permitamos que se guarden esas cookies hasta que el usuario de su consentimiento. Surrealista.

Cookies de Google Analytics y otras herramientas de análisis de tráfico

Otra parte esencial de cuaquier sitio web es la necesidad de analizar el tráfico que recibe. ello nos permite conocer de forma anónima cuestiones fundamentales para para mejorar el marketing y el foco de nuestro sitio web o de nuestra aplicación: de dónde vienen nuestros visitantes, qué palabras clave de búsqueda han utilizado para llegar a nosotros, cuánto tiempo echan en el sitio, qué rutas siguen, en qué punto abandonan un proceso de compra…. Imprescindible.

La herramienta más habitual de análisis y que usa un elevado porcentaje de los sitios web es Google Analytics. Es gratuita y fácil de poner en marcha y ofrece un análisis anónimo realmente bueno que, bien utilizado, nos permitirá optimizar nuestro sitio al máximo según nuestros objetivos de negocio.

Por suerte hay relativas buenas noticias en este frente: Google Analytics utiliza solamente cookies de tipo «first-party», es decir, que son generadas exclusivamente en tu propio dominio, y no en un dominio de terceros (cookies «thrid-party», como podría ser uno de Google) y por lo tanto utilizadas para agregar información de tus usuarios, como hacen las redes de publicidad o las redes sociales. Según esto, y mientras no uses ninguna técnica para identificar a los usuarios y sean estadísticas anónimas, sería suficiente con informar al usuario de que estás usando una cookie de analítica, sin que sea necesario que éste la acepte explícitamente. Es decir, bastaría incluso con que estuviese explicado en el aviso legal de tu sitio. Es más, el propio Dictamen 4/2012 de Europa, mencionado antes, dice hacia el final:

«A este respecto, si el artículo 5, apartado 3, de la Directiva 2002/58/CE se revisara en el futuro, el legislador europeo podría añadir un tercer criterio de exención del consentimiento para cookies que se limiten estrictamente a fines estadísticos agregados y de anonimización de origen.
Hay que distinguir claramente entre los análisis propios y los análisis de terceros, que utilizan un cookie de terceros común para recoger datos de navegación de los usuarios a través de diferentes sitios web y suponen un riesgo notablemente más elevado para la privacidad.
«

Es decir, que no las considera peligrosas e incluso se plantean meterlas en las excepciones más adelante. Se nota que al menos hay alguien que ha pensado bien este asunto 😛

En mi opinión (y la de muchos otros) las cookies de Analytics se pueden utilizar siempre y cuando informes de ello en el aviso legal. De todos modos en Internet hay muchas opiniones enfrentadas al respecto, y he encontrado también muchos artículos expresando una opinión contraria. De todos modos David González Calleja, de Lexnova, dice que la falta de consentimiento para el uso de cookies no podrá ser sancionada (las multas en teoría podrían llegar a ser de 30.000€).

Mi recomendación sería ponernos del lado de la seguridad e informar de manera más evidente (y no solo en el aviso legal) de que estamos usando cookies par analítica anónima en nuestro sitio web.

¿Y si la página de mi empresa está alojada en una plataforma ajena (WordPress, Blogger, Tumblr, Facebook, LinkedIn…)?

Mala suerte. El hecho de que sean estos servicios, fuera de tu control, los que ponen las cookies y no tú no te exime de la responsabilidad que emana del artículo 22 de la LSSI. Es tu empresa como responsable de la página la responsable también de cumplir con la legislación e informar y pedir el consentimiento para el uso de las cookies. Si te denuncian el responsable es tu empresa y no la empresa que te presta el servicio.

Así que si tienes la página de tu empresa en wordpress.com, por ejemplo, ojo porque estaréis incumpliendo por defecto la «Ley de cookies» puesto que se generará automáticamente una cookie de seguimiento de la empresa Automatic («madre» de WordPress) y encima en EEUU, con lo que es transmisión internacional de datos.

Lo mismo si tienes una página de empresa en Facebook, LinkedIn o Google+, algo muy habitual. Aunque dudo que nadie te vaya a denunciar por eso (y le vayan a hacer caso), pero lo cierto es que iría contra la LSSI y su artículo 22.

¿Afecta a mi blog o página personal?

Si tu página no es comercial no estás afectado por la LSSI. Eso sí, si incluyes banners para tratar de ingresar algo por publicidad o si tienes botones de pago para vender algún producto (por ejemplo un pequeño libro electrónico o lo que sea), o si la utilizas con cualquier fin que se pueda considerar mínimamente comercial, entonces sí estará afectado.

¿Llega con poner simplemente un aviso?

En absoluto. Eso sería demasiado fácil ¿verdad?.

La ley obliga a informar de manera clara, exhaustiva y previa a la instalación, de las cookies no-exentas que pueda haber en tu sitio web. Si instalas las cookies y luego informas no vale de nada.

Consulta y cambio de opinión en cualquier momento

No llega solo con informar y que acepten. Se debe permitir que si luego cambian de opinión, los usuarios puedan rechazar el consentimiento. Además en cualquier momento pueden volver a ver la información clara y exhaustiva sobre las cookies, por si quieren pensárselo mejor y estudiarlo un poco más :-/

¿Afecta solamente a las cookies?

No, en absoluto. Afecta a todo aquel sistema de almacenamiento local entre sesiones que se pueda realizar en el equipo cliente de tus usuarios. Es decir, que afecta a las cookies pero también al Local Storage, almacenamiento de Flash, o cosas mucho más exóticas y medio «hacks» como el uso de los ETags de caché para distinguir a usuarios entre llamadas (que son, por otro lado, mucho más difíciles de detectar). Así que cuidado con esto, pues te afectará en cualquier caso.

¿Conoces algunas herramientas que me ayuden a cumplir con la «ley de Cookies»?

Por fortuna la gente se ha puesto las pilas y existen en Internet algunas herramientas interesantes para ayudarnos a cumplir con la legislación europea.

En campusMVP y demás sitios de Krasis estamos utilizando una excelente herramienta llamada Cookie Consent. Es un script gratuito y Open Source muy potente, que puedes descargar y, controlando un poco de JavaScript, colocarlo en tu página y personalizarlo al máximo mediante su API. Además permite que no se muestre automáticamente a los visitantes fuera de la UE, para evitar molestarlos innecesariamente. Muestra inforamción clara, detallada y previa de todas las cookies que tú le marques, añade un enlace donde quieras (una vez que hayas consentido) desde el que podrás ver la información de nuevo y desactivar el consentimiento cookie por cookie. Muy recomendable.

Puedes verlo en acción en la página de campusMVP (si entras desde un país de la Unión Europea).

Si haces una búsqueda rápida en Internet verás que existen infinidad de plugins y servicios para ayudarte a cumplir con la directiva de cookies, algunos gratuitos, otros de pago, algunos sencillos y otros más profesionales. No te puedo recomendar ninguno porque no los he probado.

Una crítica personal

En general encuentro que las leyes que se promulgan en Europa en general y en España en particular sobre cuestiones relacionadas con las tecnologías de la información, tienen un buen espíritu pero están muy mal planteadas:

  • No distinguen entre grandes empresas y PYMEs y autónomos. Las primeras se pueden permitir pagar las multas sin problema y les compensa hacerlo en muchos casos incumpliendo la legislación. A las segundas les supone una dificultad enorme conocerlas y cumplirlas, la mayoría no lo hacen y están en perpetúo peligro de ser sancionadas. Si alguna es multada normalmente puede significar su cierre pues las multas son muy elevadas (hasta 30.000€ por una infracción leve en el caso de la LSSI o la LOPD).
  • Cargan la responsabilidad en las empresas usuarias y no en los prestadores de origen. En el caso concreto de las cookies, debería obligar a Google, Faceboook, grandes agregadores de publicidad y el resto de grandes empresas de Internet a cumplir con esa legislación. No obligar a un pequeño empresario que bastante hace con tener una web y mantenerla a tener que lidiar con esto y todas sus complejidades. Pero supongo que será lo más fácil. Y así nos va.
  • Matar moscas a cañonazos: El peligro a la privacidad no viene del hecho de que un pequeño negocio utilice Analytics o los botones de Facebook en su web. Viene del uso que Google y Facebook en este caso hacen de esa información. Entonces ¿por qué no legislarlos a ellos en lugar de al pequeño negocio que es un mero usuario? Además hay cuestiones como la publicidad agregada y mostrada por unos pocos en la mayor parte de los sitios, que sí es peligrosa para la privacidad y debería estar más controlada, pero hay otros tipos de registros mucho más inocuos que se están poniendo al mismo nivel.
  • Nos ponen en clara desventaja frente a empresas de fuera, especialmente las de EEUU. Éstas no tienen que lidiar con estas complejidades y sus negocios fluyen mucho mejor en Internet que los nuestros, sin miedo a recibir sanciones monumentales por las cosas más tontas. Ellos tienen códigos de auto-regulación, no leyes que les obligan. Es el usuario el que decide si una empresa que no se auto-regula le merece confianza o no.
  • Se usan de arma arrojadiza. Como estas leyes no hacen distinciones y muchas veces se aplican ciegamente, se pueden usar como armas arrojadizas contra la competencia. Se ponen trampas a la competencia para que incumplan o si se sabe que no cumplen se les puede denunciar para que les caiga una sanción. Una empresa grande puede hundir a una pequeña si ésta es incapaz de conocer y cumplir toda la legislación que le compete. No olvidemos que las multas incluso por sanciones leves pueden ser de hasta 30.000€. Imagino que aquí se está teniendo sentido común a la hora de aplicar la legislación, pero ha habido casos famosos de sanciones claramente desproporcionadas.
  • Hoy en día hay medios para la responsabilidad individual. ¿No quieres que te hagan «tracking» en Internet? Usa la navegación privada que tienen todos los navegadores modernos o deshabilita explícitamente las cookies y demás cuestiones en los ajustes de seguridad y privacidad de tu navegador.
  • Los usuarios europeos tienen que aguantar molestos pop-ups o capas informativas cuando que entran por primera vez en un sitio. En la mayoría de los casos a la gente no le importa pero tendrán que aguantar que los bombardeen en cada sitio con la preguntita. Seguro que hay maneras menos intrusivas de hacerlo. Es más, el que no lo ponga e incumpla la ley tendrá ventaja frente a los que si lo hagamos, que estaremos molestando al usuario.
  • Do Not Track. Existe una propuesta, adoptada hoy en día por casi todos los navegadores, para explicitar de manera voluntaria que no se quiere que a uno lo sigan en Internet. No me gusta la opción por defecto de IE10 y posteriores de enviar la cabecera «DNT» por defecto en todas las peticiones, y creo que le está haciendo daño a su adopción. Sin embargo es una idea interesante que sería fácil de implementar en los navegadores de modo que permitiera una decisión sitio por sitio, y combinarla con la legislación relacionada para hacer que los grandes sitios de Internet tuvieran que hacerle caso.

Esperemos que más allá de la ley, los encargados de aplicarla tengan el buen criterio y sentido común de discernir la intención y la casuística a la hora de sancionarla, y no aplicarla ciegamente.

Como digo no soy jurista y con todo lo anterior no pretendo más que facilitar un poco el conocimiento de estos temas a personas con un perfil técnico normalmente y que están alejadas por regla general de este tipo de cuestiones. Es tan solo mi punto de vista obtenido a partir de lo que he podido investigar, y espero que a más de uno le resulte útil y le pueda ahorrar mucho tiempo. Ya bastante difícil nos ponen las cosas a las PYMEs ¿verdad?

¡Espero que te resulte útil!