Sesión de Introducción a Big Data
El pasado 23/04/2013 asistí a un evento organizado por FORMAN en el PTA (Málaga) donde José Álvarez Gómez impartió una sesión introductoria a Big Data desde el punto de vista de Oracle: además de introducir el concepto general de Big Data, también informó sobre Oracle Big Data Appliance.
Comparto aquí algunas notas que tomé durante la sesión.
El concepto Big Data
Big Data (en Wikipedia)) se puede definir como un conjunto de técnicas y de tecnologías que permiten analizar eficazmente todos los datos disponibles, estructurados o no, obtenidos de diferentes recursos u orígenes. El uso de estas técnicas y tecnologías se reparte en cuatro fases del análisis:
- Adquirir.
- Organizar.
- Analizar.
- Decidir.
Los objetivos de captar toda la información posible deben ser (a) reaccionar a eventos y (b) poder cambiar por los resultados de forma proactiva.
Nos encontramos con grandes retos: enormes volúmenes de datos que se generan a gran velocidad. Pero, sobre todo, la necesidad de obtener los valores que interesan, a partir de estos grandes volúmenes de datos, en el tiempo adecuado.
En general, el término Big Data se aplica sobre todo a esos grandes volúmenes de datos no estructurados que se filtran, se procesan, se almacenan posteriormente en bases de datos estructuradas y se integran con mi aplicación.
Tecnologías y software para Big Data
Me permito poner aquí una diapositiva de la sesión que muestra una arquitectura para Big Data:
Destaco algo de tecnologías y software comentados en la sesión:
- Cloudera: una distribución de Apache Hadoop que se utiliza en las fases de adquisición y organización de datos no estructurados. De esto me llamó la atención el Hadoop Distributed File System (HDFS), un sistema de ficheros distribuido especialmente útil en este tipo de aplicaciones.
- Oracle NoSQL Database: base de datos distribuida basada en pares clave-valor, usada sobre todo en la fase de adquisición de datos no estructurados.
- Oracle Data Integrator: herramienta para integrar datos de diferentes fuentes que se utiliza en la fase de organización de datos junto con los conectores Oracle Loader for Hadoop y Oracle Direct Connector for HDFS.
- MapReduce: framework para computación distribuida diseñado para dar soporte a grandes cantidades de datos. Forma parte del sistema Hadoop y se utiliza en las fases de adquisición y organización de datos, pues opera con pares clave-valor.
- R: lenguaje de programación de código abierto diseñado para computación estadística y para generación de gráficas. Oracle también tiene su distribución que se puede utilizar en la fase de análisis de datos.
- Endeca Information Discovery: otro producto de Oracle que forma parte del Business Intelligence que se utiliza en las fases de análisis y decisión.
Para finalizar, podéis acceder a las diapositivas de la presentación aquí y aquí.
Enlaces rápidos
Una recopilación de enlaces que me han parecido interesantes en esta última semana:
- WordPress Performance Optimization: un completo artículo que orienta sobre los distintos aspectos a considerar cuando se quiere optimizar el rendimiento de WordPress.
- The Anatomy of a Perfect Web Page: muy buena guía sobre el proceso de diseño y desarrollo de un proyecto web.
- Custom Report Sharing for Google Analytics: espacio donde los apasionados de la analítica web pueden encontrar y compartir informes y paneles de mandos para Google Analytics.
Configurar WordPress para varios servidores con un único fichero wp-config.php
Es una práctica común entre los desarrolladores web el tener varias versiones de un mismo sitio WordPress: versión local, versión en desarrollo, versión de pruebas, versión en producción, etc.
En caso de que no utilices un sistema de control de versiones (SVN, Git, etc.), aquí tienes una manera fácil de mantener un único fichero de configuración wp-config.php que contenga las distintas conexiones a la base de datos, en función del servidor donde se encuentre el fichero.
Edita el fichero wp-config.php y, al principio del mismo, reemplaza los datos de conexión que suelen venir predeterminados por estas líneas (como en la imagen superior):
if ($_SERVER['SERVER_ADDR'] == '127.0.0.1') { // Entorno LOCAL define('DB_NAME', 'nombreBDlocal'); define('DB_USER', 'nombreUSRlocal'); define('DB_PASSWORD', 'contraseñalocal'); define('DB_HOST', 'servidorlocal'); // normalmente, localhost } else { // Entorno PRODUCCION define('DB_NAME', 'nombreBDpro'); define('DB_USER', 'nombreUSRpro'); define('DB_PASSWORD', 'contraseñapro'); define('DB_HOST', 'servidorpro'); }
En cada constante aquí definida, tendrás que escribir los valores correspondientes de las conexiones a tus bases de datos.
Como ves, los parámetros de conexión a la base de datos se definen en función de la IP del servidor donde esté alojado el fichero wp-config.php.
Jugando con $_SERVER['SERVER_ADDR']
y varios if...else if...
(o case...switch...
) podrás contemplar los distintos entornos en los que se ejecute tu sitio web con WordPress.
Actualización 19/05/2013
Otra manera muy práctica de mantener el mismo wp-config.php en distintos servidores (distintos entornos de ejecución de WordPress) es guardar los datos de conexión a la base de datos de cada entorno en un fichero distinto. En el siguiente ejemplo, se tiene un entorno local de desarrollo y un entorno real de producción:
El código que ponemos en wp-config.php es este:
if ( file_exists( dirname( __FILE__ ) . '/local-config.php' ) ) { // ENTORNO LOCAL - DESARROLLO include( dirname( __FILE__ ) . '/local-config.php' ); } else { // ENTORNO REMOTO - PRODUCCIÓN define('DB_NAME', 'dbbd'); define('DB_USER', 'dbmy'); define('DB_PASSWORD', 'dbpw'); define('DB_HOST', 'localhost'); }
Y el contenido del fichero local-config.php es este:
<?php /** * Datos acceso a base de datos local (desarrollo). */ define('DB_NAME', 'localdb'); define('DB_USER', 'localdbusr'); define('DB_PASSWORD', 'localdbpwd'); define('DB_HOST', 'localhost');
Si estás utilizando un sistema de control de versiones para tus desarrollos en WordPress, asegúrate de excluir el fichero local-config.php.
Primeras impresiones del Congreso Web 2012 en Zaragoza
Apenas he podido asistir a dos sesiones del Congreso Web en el día de su inauguración, pero ya puedo decir que tengo buenas expectativas para lo que veremos el resto de las jornadas.
Con este artículo inauguro una serie que no pretende ser una crónica de estas jornadas, pero sí quiero dejar apuntadas algunas ideas que iré recopilando de mi experiencia durante el fin de semana en Zaragoza.
Un plan de Analítica Web, con Xavier Colomés
Se propone utilizar segmentos para identificar distintos tipos de usuario de un sitio web ya que, para cada tipo de usuario, son aplicables métricas diferentes que proporcionen una información útil para el negocio.
Entender el significado de los parámetros medium, campaign, source es clave para poder realizar una implementación de Google Analytics que realmente pueda ser útil. Por ejemplo, puede haber 2 medios distintos para un mismo origen. Otra aclaración: una visita desde una página de resultados de Google siempre es un origen, y esa visita puede ser considerada como orgánica o proveniente de CPC.
Podemos utilizar la técnica AIDA para decidir QUÉ analizar, fijándonos en analizar cosas que generan:
- Atención: visitas, top content, landing pages.
- Interés: rebote, tiempo en la página, engagement.
- Deseo: site search, top fichas, likes/tweets.
- Acción: entradas a carrito de compra, look to book, top fichas.
Elaborar un panel de control con información agregada de todo lo recopilado, en el cual es bueno incluir unas recomendaciones de acción.
Tras haber analizado la información recopilada, es hora de recomendar una serie de actuaciones que sirven para mejorar el sitio web. Es clave identificar y poner el foco en 2 áreas de mejora: un segmento y un proceso que ocurra en nuestra web. Esto nos llevará a hacer un cambio (uno solo) para que podamos volver a empezar el ciclo de la analítica.
Clínica de Usabilidad, con Daniel Torres Burriel
Hemos conocido una parte de la metodología de diseño de la experiencia de usuario de un sitio web, basada en el uso de una matriz Objetivo / Tarea / Interfaz según la cual, para cada objetivo, hay que proponer al usuario una forma de conseguirlo (la tarea), y para ello se le ofrecen en pantalla una serie de elementos en la interfaz de usuario.
Sobre los Objetivos: se refiere al objetivo que debe cumplir el sitio web de la empresa, y no debe confundirse con el objetivo de la propia empresa. Si cambia el objetivo, deberá por tanto cambiar algo en el sitio web.
Sobre las Tareas: debemos preguntarnos «para qué» hacen los usuarios tal cosa en el sitio web, qué consiguen si hacen click aquí o despliegan una ventana por allí. Este «para qué» debe estar alineado con los objetivos de la web porque, si no, ¿para qué le estás pidiendo al usuario que haga eso?
Sobre la Interfaz: cada pantalla de la web debe tener un foco, como mínimo un punto sobre el cual debe girar la atención del usuario. Todas las pantallas deben servir para algo.
Me ha parecido interesante y cómodo el uso de Lynx (navegador web en modo texto, que no soporta imágenes ni otros elementos visuales o multimedia) para comprobar, de un vistazo, cómo están estructurados los textos de la página web (disposición, jerarquía de contenidos, etc.). Por ejemplo, se puede detectar con facilidad cuándo hay enlaces que no tienen un contexto claro que los relacione entre sí o que indiquen qué ocurrirá cuando hagas click en ellos.
Ha habido mucho énfasis sobre la necesidad de conocer bien el lenguaje HTML porque «ahí están todos los secretos». Concretamente, se ha mostrado la especificación del estándar HTML 4.01 que existe desde 1999.
Se ha llamado la atención sobre el uso de efectos «mouse over» ya que, en dispositivos táctiles, no tiene sentido y debería sustituirse por otra forma de interacción.
Me he dado cuenta en esta charla de una cosa: todos tendemos simplemente a «informar» en nuestros sitios web, esperando que la curiosidad del usuario y la calidad de nuestro producto sea suficiente para que haya una experiencia de usuario satisfactoria y, quizá, una conversión. Pues no, no sólo debemos informar.
Al final del día hemos disfrutado de unas cervezas y unos aperitivos saladitos al calor de Zaragoza, con ganas de que comience la siguiente jornada.
Enlaces rápidos
- Software open source para gestión de proyectos: Redmine y LibrePlan.
- HTML to JavaScript convertor: herramienta para transformar bloques de código HTML en sentencias Javascript.
- 25 Useful CSS/Wordpress Snippets: colección de útiles trozos de código para CSS y para WordPress.
- Tema WordPress basado en Skeleton: HTML5 responsive layout.
- Algunos ebooks gratuitos sobre experiencia de usuario.
- Curso básico de mapas mentales.
- Técnicas para optimizar el rendimiento de Apache y PHP: este, este y este.
- Documentación sobre el optimizador de Oracle: papers about Oracle CBO.
Seguimos…
Seguridad en la venta por Internet
El pasado 1 de diciembre de 2011 asistí a la jornada «Seguridad en la venta por Internet» organizada por la Cámara de Comercio de Granada, dentro del programa Feria del Conocimiento. Aparte de ser un evento puramente comercial para ofrecer diferentes servicios a las personas y empresas asistentes, anoté algunos detalles que me gustaría compartir.
- La seguridad de la información con la que trabaja cualquier organización debe ser valorada en dos ámbitos:
- El ámbito interno de la organización: funcionamiento interno, procesos de trabajo, comunicaciones internas, etc.
- El ámbito externo de la organización: imagen pública, lo que se percibe desde fuera, lo que transmite esa organización.
- Las características de una información segura son: disponibilidad, integridad, confidencialidad, autenticación y trazabilidad. La información segura es tratada/afectada/gestionada por personas, procesos y tecnología.
- Si guardamos información en países extranjeros, la legislación vigente de ambos países debe ser «compatible» para garantizar la seguridad de la información.
- En un formulario web en el que pidas cualquier dato personal, debes requerir expresamente el consentimiento de la persona para que esos datos personales sean tratados para llevar a cabo esa solicitud o servicio. Para ello lo habitual es colocar una casilla de verificación (checkbox) que la persona deba marcar obligatoriamente antes de enviar el formulario, indicando así que acepta nuestra política de privacidad de datos y que da su consentimiento. Si no marca esa casilla, el formulario no debería enviarse; dicho de otra manera, si no marca la casilla tú nunca deberías tener ninguno de sus datos personales.
- Si tienes pensado enviar comunicaciones comerciales a quien te dio un dato de contacto a través de un formulario web, es imprescindible que en ese formulario web también solicites el consentimiento de la persona para recibir publicidad. Esto puedes hacerlo mediante una casilla de verificación para que la persona la marque en caso de aceptar la recepción de publicidad. De esta manera, tendrás menos posibilidad de ser calificado como spam.
- Es posible que tengas acuerdos con alguna otra organización para pasarle datos de tus clientes o tus contactos. En ese caso, en el formulario web donde recabes datos personales también debes solicitar expresamente el consentimiento a la persona mediante una casilla de verificación, de forma que acepte la cesión de sus datos a terceros. Esto no es necesario si, para completar el servicio solicitado por la persona, es imprescindible que se utilicen sus datos. Por ejemplo, al comprar un producto en una tienda online es necesario que la empresa de logística conozca la dirección de la persona para poder entregar el paquete y así completar el servicio que solicitó y pagó.
A nivel técnico, cuando vas a tratar con información segura a través de Internet deberias conocer estos conceptos:
- Certificado digital.
- Firma electrónica.
- Servidor seguro.
- Cuando una persona está navegando por un sitio web seguro (esto es, mediante HTTPS) y ese servidor web dispone de un certificado digital, resulta que toda la información que viaja desde el equipo de la persona (cliente) hacia el servidor va encriptada, pero la información que va desde el servidor hacia el cliente no va encriptada.
Para asegurar que la comunicación entre un equipo cliente y un servidor es segura, y que la información viaja encriptada en ambos sentidos, es necesario que tanto el servidor como el cliente dispongan de certificado digital.
Más información:
- Ley Orgánica 15/1999, de 13 de diciembre, de Protección de Datos de Carácter Personal.
- Ley 34/2002, de 11 de julio, de servicios de la sociedad de la información y de comercio electrónico.
- Web informativa sobre la Ley de Servicios de la Sociedad de la Información.
- Agencia Española de Protección de Datos.
- Área de Seguridad del Instituto Nacional de Tecnologías de la Comunicación (INTECO).
- CriptoRed: red temática de criptografía y seguridad de la información.
- Legislación de la Unión Europea para la Sociedad de la Información.
- Mis notas sobre LSSI y LOPD extraídas de otra jornada sobre el tema.
Convertir de SQLite a MySQL
Aunque he intentado hacer funcionar de forma aceptable un WordPress con SQLite, finalmente el servidor donde lo alojaba no me facilitaba la tarea así que he decidido utilizar WordPress con MySQL, como toda la vida, aunque tenga que alojar la base de datos en un servidor externo.
Tras investigar algo por Internet y darme algún cabezazo con imports/exports de SQL, estos son los pasos que he seguido para convertir una base de datos SQLite a MySQL (proceso también conocido como migración de SQLite a MySQL):
- Generar una exportación de la base de datos SQLite en un fichero SQL.
- Editar el fichero SQL generado para hacer los siguientes cambios:
- Reemplazar AUTOINCREMENT por AUTO_INCREMENT.
- Eliminar las comillas dobles en los nombres de los objetos, ya que MySQL no las contempla. Por ejemplo, hay que reemplazar «wp_posts» (incluyendo las comillas) por wp_posts.
- En los campos que deban ser de tipo fecha/hora, reemplazar text not null default ‘0000-00-00 00:00:00’ por datetime not null. Fíjate en el not null: cámbialo si te conviene que sea null. Además, es posible que tú sí necesites algún valor predeterminado para algún campo de tipo datetime.
- Eliminar el valor predeterminado (default) de los campos blob/text.
- En general, repasar todos los campos que tengan formato text (generado por SQLite) ya que que algunos deberán cambiarse por datetime (como he explicado anteriormente) o por varchar.
- Aunque yo no he tenido que hacerlo, en algún sitio he visto que hay que borrar todas las líneas donde aparezca sqlite_sequence.
- Una vez modificado y guardado el fichero (previa copia de seguridad, claro está 😉 ), importar este fichero SQL a la base de datos MySQL (por ejemplo, con phpMyAdmin).
- Fin.
Un ejemplo
A continuación muestro un ejemplo de migración de una tabla, lo que viene a llamarse «el antes y el después»:
Tabla wp_comments en SQLite (ANTES)
CREATE TABLE wp_comments ( comment_ID integer NOT NULL PRIMARY KEY AUTOINCREMENT , comment_post_ID integer NOT NULL default '0', comment_author blob NOT NULL, comment_author_email text NOT NULL default '', comment_author_url text NOT NULL default '', comment_author_IP text NOT NULL default '', comment_date text NOT NULL default '0000-00-00 00:00:00', comment_date_gmt text NOT NULL default '0000-00-00 00:00:00', comment_content text NOT NULL, comment_karma integer NOT NULL default '0', comment_approved text NOT NULL default '1', comment_agent text NOT NULL default '', comment_type text NOT NULL default '', comment_parent integer NOT NULL default '0', user_id integer NOT NULL default '0');
Tabla wp_comments en MySQL (DESPUÉS)
CREATE TABLE wp_comments ( comment_ID integer NOT NULL PRIMARY KEY AUTO_INCREMENT , comment_post_ID integer NOT NULL default '0', comment_author text NOT NULL, comment_author_email varchar(100) NOT NULL default '', comment_author_url varchar(200) NOT NULL default '', comment_author_IP varchar(100) NOT NULL default '', comment_date datetime NOT NULL , comment_date_gmt datetime NOT NULL , comment_content text NOT NULL, comment_karma integer NOT NULL default '0', comment_approved varchar(20) NOT NULL default '1', comment_agent varchar(255) NOT NULL default '', comment_type varchar(20) NOT NULL default '', comment_parent integer NOT NULL default '0', user_id integer NOT NULL default '0');
Pues nada más, espero que te sirva.
No consigo clientes con mi sitio web
Esta frase la he oído alguna que otra vez en clientes propios y ajenos, y es que puede haber numerosas causas por las que un sitio web precioso y estupendo y que ha costado mucho dinero no atraiga visitas y, lo peor, que las visitas no se conviertan en clientes. No es preciso que una empresa base su negocio en Internet para que la web deba resultar provechosa: las empresas quieren ganar dinero, sea por el medio que sea, y quieren que una inversión sirva para incrementar sus ganancias.
Hablando con diseñadores web que comienzan su carrera profesional, alguno/a tiene la idea equivocada de que un buen diseño «vende». Yo creo que un buen diseño puede atraer, pero vender es otra cosa.
A continuación tienes algunas razones por las que tu sitio web puede estar «perdiendo dinero». Quizá te ayude a detectar algún fallo y corregirlo.
Llamadas a la acción: «Y ahora ¿qué?»
Con frecuencia me he encontrado en páginas web a las que he llegado porque me interesa un producto, tanto como para comprarlo, pero no he encontrado fácilmente la manera de adquirirlo y a los 10 segundos ya estaba cansado y con el interés por los suelos. Es probable que también te haya ocurrido en alguna ocasión y entonces deberías ser consciente de que no quieres eso para tu empresa ni para tu sitio web.
Cada página relevante de tu sitio web debería tener una llamada a la acción claramente visible y diseñada específicamente para que el visitante termine haciendo lo que tú quieres que haga.
Una llamada a la acción en un sitio web puede ser un botón, un enlace, un banner o un formulario que guía a los visitantes hacia el siguiente paso en el proceso de conversión [de visitante a cliente].
Es conveniente que el visitante perciba de un rápido vistazo tanto el beneficio (texto «hacer llamadas más baratas») como la manera de obtenerlo (botón «comienza a ahorrar ahora»). Además, vemos cómo podemos incluir en la misma página incluso una segunda acción importante para el negocio: el botón «Ofertas especiales». Todo ello dispuesto mediante un diseño claro y coherente y expresado en un lenguaje adecuado.
Caso particular: sitios web realizados con Flash
Hay por ahí algunos sitios web realizados íntegramente con Flash en los que los principales problemas a la hora de convertir visitas en clientes son la falta de contenido útil y la ausencia de guías claras para el usuario, así como caminos y métodos incómodos de navegación por el sitio web.
Veamos este ejemplo:
Diseño sobrio, quizá atractivo para alguien… Pero ¿de qué va esta empresa? Esta página de inicio no dice nada, tienes que ser un «visitante curioso» para enterarte de qué va. Además si haces clic en alguna sección, luego tienes que ir cerrando ventanitas para poder acceder a otra.
Es común ver este tipo de páginas incluso hoy en día: son de las que se hacen con el único objetivo de estar en Internet, pero nada más. Porque la URL aparece en la tarjeta de visita.
La falacia del «visitante curioso»
En varias ocasiones, charlando con clientes sobre la creación de su próximo sitio web, ha salido la frase «ponemos todo esto en la web clasificado de esta forma y así la gente, si quiere, podrá visitar cualquier cosa». Además ha sido un razonamiento difícil de refutar en alguna ocasión debido al peculiar y «corto» punto de vista del cliente.
Este mismo razonamiento también es habitual a quienes gustan de clasificar las cosas y atenerse a esa clasificación por encima de todo. Por experiencia sé que los informáticos tendemos a eso, a veces equivocadamente. Creo que el ejemplo más claro podrían ser tiendas/catálogos online, o directorios temáticos. Veamos:
Mirando la clasificación de la ropa en el menú de la izquierda, no apetece mucho ponerse a buscar una prenda. Veo «Pantalones para Hombre» y «Jeans para Dama» pero ¿habrá jeans para hombre? ¡Buf! Tengo que ponerme a buscarlos… Probablemente esta misma clasificación es la del inventario, que les vendrá bien para la catalogación de las prendas, pero no podemos pretender llevar a la web el mismo modo de clasificación porque no estamos en una tienda física donde uno pasea y localiza los productos de interés de una forma distinta que delante de una pantalla.
Al diseñar una web no puedes limitarte a exponer lo que tienes y esperar, de forma pasiva, que al visitante le guste algo y te lo compre. La gente que visita tu web seguramente no piensa como tú, ni ordena las cosas como tú, ni le gusta las mismas cosas que a ti.
Landing pages: «Esto no es lo que buscaba»
Cuando has puesto el foco en algún producto/servicio de tu web y has decidido darle mucha visibilidad, deberías esforzarte en la investigación de qué palabras/frases clave pueden utilizar los clientes potenciales para encontrar ese producto/servicio en los buscadores, de forma que diseñes una landing page lo más atractiva posible y con los textos más adecuados a las palabras clave que hayas encontrado en tu investigación. Sin olvidar, por supuesto, una clara llamada a la acción.
No es conveniente que tu página salga listada en buscadores (Google, Bing, etc.) para cierto término de búsqueda, una persona haga clic y, al cargar la página correspondiente, no encuentre «eso» que estaba buscando. Es aún peor si esto ocurre tras haber hecho clic en un anuncio tipo Google AdWords, ya que la inversión publicitaria se perderá la mayoría de las veces… a menos que te haya visitado el «visitante curioso» y termine convirtiéndose en tu cliente, cosa muy poco frecuente.
Como ejemplo, he buscado en Google «guitarras baratas»:
Tras ver los resultados, he decidido hacer clic en el último anuncio de abajo a la derecha, por el cual la empresa correspondiente estará pagando sus euros, y he llegado a esta página:
¿Dónde están las guitarras baratas que yo estaba buscando? Lo primero que veo son novedades en CDs, anuncios, un botón de ofertas y más abajo (seguramente por debajo del scroll de muchísimos usuarios) aparece un puñado de guitarras.
Espero que estas ideas te ayuden a definir mejor el diseño y los contenidos de tu sitio web. Cuanto más trabajo en ello, más me convenzo de que cada página hay que planificarla con especial atención. Además, a mayor inversión en el diseño web (con todo lo que ello conlleva), mejores resultados en buscadores y en el boca-a-oreja. ¡Ánimo!
Enlaces rápidos
Recopilación de enlaces que me han resultado interesantes en los últimos tiempos:
- CSSDesk – Online CSS Sandbox. Entorno para diseñar con CSS online.
- 16 Pixels: For Body Copy. Anything Less Is A Costly Mistake. Sobre el tamaño de texto en las páginas web y la importancia de facilitar la lectura en pantalla.
- DBA Tips Archive for Oracle. Interesante colección de scripts SQL y técnicas para tareas varias de administración de bases de datos Oracle.
- Cómo extraer información de los backups de Plesk: aquí y aquí.
- Plugin Portable phpMyAdmin para WordPress.
- Optimal Javascript loading in WordPress.