Cómo procesar y tratar datos JSON con Excel

Hace 15 años parecía que el futuro del intercambio de datos pasaba por XML. Este lenguaje de marcas permitía definir estructuras de datos todo lo complejas que necesitáramos, con varios niveles de estructura anidados, y de manera sencilla pues está basado en texto. De hecho recuerdo que cuando apareció la plataforma .NET lo que más destacaban en la documentación era el soporte para XML (hasta el propio nombre se derivaba en cierto modo de que estaba preparado para la Red gracias a este soporte).

Desde entonces ha llovido mucho, y las cosas han cambiado mucho también. En la actualidad existe un consenso bastante amplio en que el formato de intercambio de datos por antonomasia es JSON: JavaScript Object Notation. Este formato, basado en sintaxis JavaScript, tiene todas las ventajas del XML como el poder describir estructuras todo lo complejas que queramos, pero añade varias ventajas, como que es más fácil de leer y escribir por los humanos y, sobre todo, que es mucho más compacto para ser transmitido por la Red. Además, si consideramos su uso en la Web, el consumo de datos JSON desde una aplicación escrita en JavaScript es directo. No podría ser más cómodo.

Si necesitamos tratar información que está en formato JSON desde una herramienta más convencional como una hoja de cálculo o una base de datos, es cuando podemos tener más dificultades. Este tipo de herramientas están pensadas para manejar datos de forma tabular, por lo que acceder desde ellas a estructuras complejas, con datos anidados dentro de otros datos, etc… puede ser complejo.

Microsoft Excel es una herramienta que la mayor parte de la gente desaprovecha. Una gran mayoría de usuarios la usa de una manera muy básica, pero realmente para mi (y para mucha otra gente) es la verdadera estrella de la suite de Office, y la que de verdad marca una diferencia brutal entre Office y otros conjuntos de herramientas ofimáticas. Sus características avanzadas son bastante desconocidas, pero lo cierto es que se pueden hacer verdaderas “virguerías” con ella.

En el siguiente vídeo te cuento cómo puedes usar Excel para beber datos en formato JSON directamente desde la fuente (o sea, desde Internet por ejemplo), cómo puedes decidir exactamente cómo convertirlos en una tabla, cómo los puedes expandir y transformar y, finalmente, usarlos desde una hoja de cálculo para filtrarlos, analizarlos, graficarlos o introducirlos en otros sistemas como una base de datos. Se puede conseguir gracias a Power Query y un poco de habilidad y es algo que te puede resultar muy útil en muchas ocasiones.

SIGUE LEYENDO PARA VER EL VÍDEO COMPLETO.

Cómo instalar ChromeOS en VirtualBox

Aunque en España no se ven mucho todavía, en EEUU hace tiempo que los “Chromebooks” son muy populares, hasta tal punto que están empezando a dominar las ventas de portátiles de gama baja, especialmente en el mundo estudiantil. Se trata de portátiles, generalmente baratos, que incorporan el sistema operativo ChromeOS de Google.

ChromeOS

ChromeOS consiste básicamente en una base Linux para lanzar un navegador Chrome, que es la única aplicación que se ejecuta de cara al usuario. Es decir, al arrancar la máquina lo que se nos ofrece es un escritorio vacío con un acceso directo a Chrome y a varias aplicaciones basadas en Chrome.

Esto, que puede parecer muy limitado, en realidad es más que suficiente para la mayor parte de los usuarios. Si te fijas, el 90% o más de las aplicaciones que usas hoy en día están basadas en la web, por lo que una máquina como esta tiene mucho sentido, especialmente si no quieres gastarte mucho dinero. Incluso si eres un desarrollador (aunque no es la mejor opción para éstos) puedes desarrollar con editores avanzados en la nube como Cloud9, CodeAnywhere o Nitrous.

Aunque las máquinas Chromebook tienen un pequeño almacenamiento local, la mayor parte del mismo se delega a Google Drive (que funciona off-line también) , de modo que tienes casi todo siempre disponible desde cualquier sitio. De hecho una de sus ventajas es que siempre tienes todo donde lo dejaste aunque cambies de equipo, lo pierdas o se estropee. A mayores dispones de “sistemas de archivos” para otros almacenamientos online como Dropbox o OneDrive, que te dejan usarlos en local también de manera transparente. Y para cuando no te llegue tu máquina puedes conectarte a otra remota con Mac o Windows usando la aplicación “Remote Desktop” que funciona en Chromebook.

En general son una buena opción, pero debes comprar equipos que lleven de serie este sistema operativo si quieres utilizarlo. No puedes descargarlo e instalarlo en un equipo que ya tengas, lo cual es un fastidio.

Por suerte ahora la empresa Neverware ha lanzado un ChromeOS que puedes instalar en cualquier PC que tengas por casa. Se llama CloudReady y es gratuito para uso personal (cobran si quieres usarlo en empresas y gestionar remotamente los equipos).

Te permite crear una llave USB para poder arrancar desde la misma e instalarlo en casi cualquier PC que tengas por casa. La verdad es que es genial para darle “vidilla” a un portátil viejo que tengas por ahí ya que el sistema es muy ligero y va muy bien.

Puedes instalarlo ocupando todo el disco o bien puedes instalarlo con un arranque dual junto con Windows, teniendo así las dos opciones.

Si, como yo, simplemente te interesa probarlo sin necesidad de usar una máquina real, VirtualBox es una buena opción.

Para instalarlo en Virtualbox debes tener realizar algunas operaciones y usar ciertos ajustes específicos.

SIGUE LEYENDO para ver paso a paso cómo hacerlo.

Detectar la aparición y desaparición de un elemento: evento "inViewport"

Una cuestión que puede resultar muy útil en una página o aplicación web es la posibilidad de detectar cuándo aparece o desaparece de la pantalla un elemento determinado debido a las acciones del usuario.

Aparecer-Desaparecer

Por ejemplo, si desaparece una pieza de información importante porque el usuario hace scroll moviendo los contenidos,  podemos sacar una nota resumen, recordatorio o acceso directo para ir verla de nuevo, y ocultarlo de nuevo cuando vuelva a aparecer. Cosas por el estilo.

Para conseguir algo así nos vendría muy bien disponer de un evento inViewport o similar que nos informase de cuándo un elemento aparece o desaparece de la parte visible de la página. Nos suscribiríamos a este evento y recibiríamos automáticamente notificaciones si el elemento aparece o desaparece.

El problema es que no existe ningún evento como este en HTML/JavaScript.

No nos queda más remedio que buscarnos la vida para poder disponer de una funcionalidad similar a esta.

En este artículo vamos a desarrollar desde cero la funcionalidad necesaria para conseguir tener un evento como este, listo para utilizar en cualquier página.

La funcionalidad la vamos a dividir en varios pasos individuales que, en conjunto, nos permitirán obtener lo que necesitamos.

SEGUIR LEYENDO para leer el artículo completo y obtener el código.

La solución al problema de las claves seguras: NullPass+

En la actualidad utilizamos tantos servicios on-line diferentes y heterogéneos que es muy complicado gestionar todas las claves que debemos manejar. Yo mismo manejo varios centenares de claves diferentes, lo cual por si mismo es todo un reto. Pero es que además, si realmente quieres que sean seguras, deberías usar una clave compleja, larga y diferente para cada uno de los servicios que utilices.

La realidad es que, al final, la mayor parte de los usuarios hacen justo lo que jamás deberían hacer: utilizar una misma clave, sencilla y fácil de recordar, para todos los servicios. Problema resuelto para ellos, pero luego pasan “cosas extrañas”.

Algunas opciones para guardar tus claves de manera segura

Lo de las claves es algo que ha mejorado bastante en los últimos años gracias a la posibilidad de loguearse en muchos sitios usando tu cuenta en algún servicio popular como GMail, Facebook o Twitter. Lo bueno de eso es que solo tienes que preocuparte de una cuenta, así que puedes tener una clave robusta que recordar. Lo malo es que en muchos sitios no es posible hacerlo, y en otros simplemente no te da la gana de darles acceso a tus datos personales en la red social de turno. Así que es poco más que un paliativo.

Otra opción cada vez más popular es usar un gestor de claves on-line como LastPass o similar. Yo personalmente no lo veo una opción. Ningún sistema está blindado en lo que respecta a seguridad y me da igual que solo se puedan descifrar las claves usando tu clave principal: tarde o temprano aparecen problemas.

También existen gestores de claves seguros que funcionan off-line (en local) y que permiten sincronizar las claves entre equipos a través de alguna “nube” de archivos como Dropbox. A mi personalmente me gusta bastante KeePass, que encima es gratuito y funciona en casi cualquier dispositivo que te puedas imaginar. Lo que me ocurre con este tipo de servicios es que los veo poco operativos: tienes que mantener las claves bien clasificadas, localizarlas para leerlas, cambiarlas, etc… Y es un engorro mayor si tienes que acceder a ellas desde el móvil.

Al final tradicionalmente he venido utilizando un enorme archivo de texto que guardo en una unidad encriptada con una clave fuerte, que es la única que debo recordar. Esta unidad encriptada la sincronizo entre los diferentes equipos usando un disco “cloud”. Me facilita la vida porque el manejo del archivo de texto es muy sencillo y ágil, pero sigue siendo un verdadero engorro, sobre todo -nuevamente- en el móvil :-S

Una solución mejor

Hace un par de semanas estaba en un restaurante con unos amigos, cuando surgió el tema de las malditas claves. Ellos son usuarios “de a pié”, pero usan multitud de cuentas de todo tipo y deben recordar decenas de claves. Al final acababan haciendo lo de todo el mundo: usan una o dos claves sencillas en todas partes. ¡Error!.

Así que a raíz de esa conversación y de ver las malas prácticas que la situación está provocando, se me ocurrió pensar si habría algún sistema mejor para solucionar el problema, algo que no me había planteado antes.

Lo que pensé es que el sistema ideal debería cumplir los siguientes requisitos:

  1. Solo sería necesario recordar una única clave.
  2. Las claves no deberían almacenarse en ningún lado. Esto nos evita tener que andar almacenándolas en la nube, sincronizar archivos o dar la posibilidad de que alguien pueda acceder a ellas. Simplemente no estarían guardadas.
  3. Debería valer para cualquier tipo de servicio, aunque tengan requisitos de complejidad o longitud muy altos.

Y se me vino a la cabeza enseguida un sistema bastante sencillo pero efectivo capaz de conseguir todo lo anterior. Se trataba de crear un generador de claves que, a partir de una única clave larga y segura y el nombre del servicio, sería capaz de generar siempre la misma clave compleja, sin necesidad de anotarla en ningún lado.

SIGUE LEYENDO para obtener la solución y poder usar NullPass+, que te permitirá hacer todo lo que se indica más arriba, sin conexión a Internet y desde cualquier móvil, tablet o escritorio.

Mi Visual Studio no sincroniza el archivo actual en el Explorador de Soluciones

Una cosa muy útil cuando estamos programando con Visual Studio es que, si tienes varios archivos de código abiertos a la vez, cuando cambias de uno a otro se seleccione dicho archivo en el explorador de soluciones.

De ese modo, al cambiar de archivo, sabes exactamente en qué proyecto concreto y en qué parte del proyecto estás en cada momento. Esto es especialmente útil en desarrollos grandes, formados quizá por decenas de proyectos y cientos o miles de archivos de código.

En Visual Studio 2010 esto era así por defecto (y si no me equivoco ni siquiera lo podrías cambiar). En versiones más recientes de Visual Studio como Visual Studio 2013 o 2015, esto no es así. Por defecto, cuando abres un archivo no se selecciona automáticamente en el explorador de soluciones.

En proyectos pequeños esto no tiene importancia, pero en proyectos grandes es un fastidio (o al menos a mi me lo parece).

¿Cómo puedes hacer que se sincronice lo que estás viendo con el Explorador de Soluciones?

Muy fácil. Es solo saber en dónde está un ajuste.

DESCUBRE CÓMO ACTIVARLO en el post original.

TRUCO: Hacer "bundling" de archivos JavaScript o CSS sin necesidad de herramientas externas

Este es un truco rápido pero muy útil para programadores Front-End que trabajan con HTML, CSS y JavaScript.

Como todo el mundo sabe (o debería saber), con HTTP 1.1 cada petición que se envía al servidor añade "peso" a la carga total de la página porque se debe abrir una nueva conexión, se deben enviar las cabeceras y recibirlas, hay un máximo de conexiones abiertas a la vez, etc…

Por ello, si la página incluye por ejemplo 10 archivos .css que en conjunto pesan 250KB, su descarga va a tardar más que si descargásemos ese mismo contenido exactamente, con el mismo peso, pero en un solo archivo .css.

Esto no ocurre con la nueva versión HTTP 2, pero no siempre está disponible todavía.

Como en una aplicación o en una página web cada milisegundo cuenta, se suelen utilizar dos técnicas habitualmente para disminuir el efecto de tener varios archivos y disminuir su peso:

  • "Bundling" o empaquetamiento: consiste en combinar varios archivos dentro de uno solo para que, aunque ocupen lo mismo, puedan descargarse con una sola conexión de una sola vez, con lo que se ahorra tiempo total de descarga y procesamiento. Lo verás más a menudo como "bundling" que es el término que se usa en inglés (y casi todo el mundo en español).
  • "Minificación" o minimización: se trata de reducir al máximo el tamaño de los archivos quitando todo lo que no es necesario: espacios en blanco, tabuladores, cambios de línea… Generalmente puede ir acompañado además de ofuscación del código para dificultar su seguimiento. El primer término "minificación" es incorrecto en español, pero se utiliza mucho porque es como se le llama en inglés (minification).

Existen multitud de herramientas que se pueden encargar de llevar a cabo estas tareas antes de pasar un proyecto a producción (siendo Grunt y Gulp los programadores de tareas más conocidos: ambos tienen plugins para hacer esto).

Sin embargo lo que muchos no saben es que en el propio sistema operativo Windows tenemos una herramienta muy simple que nos permite hacer "bundling" instantáneamente sin necesidad de instalar nada más.

SIGUE LEYENDO para averiguar cómo hacerlo y como evitar posibles problemas.

No me aparece el DataContext en un LinqDataSource

Linq to SQL es una tecnología precursora del actual Entity Framework que fue pionera en sacar partido a Linq para crear un ORM fácil de utilizar con esta tecnología. Su principal limitación es que solo funciona con SQL Server y que los "mapeos" deben ser 1 a 1 con las tablas (una tabla = 1 clase). Sin embargo es tremendamente fácil de usar y tiene un diseñador visual muy efectivo, por lo que a mucha gente (incluyéndome yo mismo) nos gusta mucho y es válido para la mayor parte de las situaciones si trabajas con el gestor de datos de Microsoft.

En ASP.NET Web Forms (otra tecnología ahora en retroceso pero tremendamente efectiva para ciertos tipos de aplicaciones Web, como por ejemplo las orientadas a gestión) se incluye un control para acceso visual a datos llamado LinqDataSource que está especialmente diseñado para trabajar con esta tecnología. Este control combinado con los diferentes controles enlazados a datos (y especialmente los ListView y DataPager) permite crear interfaces web orientadas a datos de manera visual, efectiva y rápida.

Sin embargo en algunas versiones de Visual Studio, por ejemplo la 2015, existen algunos problemillas debido a la forma en la que está configurado el entorno por defecto.

Haz la siguiente prueba: abre Visual Studio 2015, crea un nuevo proyecto web vacío de tipo de ASP.NET Web Forms:

Proyecto-Nuevo-WebForms-VS2015

Ahora añade una nueva clase de tipo Linq2SQL. Enlázala, por ejemplo, a la base de datos Northwind para poder hacer una prueba, y arrastra algunas tablas sobre el diseñador.

Ahora, en una nueva página .aspx vacía arrastra un control Linq2SQL. Al ir a configurarlo verás que la lista desplegable de los DataContext ¡está vacía!:

LinqDataSource_Vacio

Es decir, no se ha reconocido la clase de contexto de datos que tenemos en el archivo Linq2SQL. ¿Cómo es posible si todo el objeto de ese control es, precisamente, reconocer este tipo de contextos de datos?

El problema es que el proyecto de Web Forms, por defecto, no incluye ninguna referencia a la biblioteca de Linq y por eso no reconoce el DataContext, lo cual es una cosa extraña.

La solución es sencilla: hay que añadir al web.config de nuestra solución la siguiente referencia directamente en la sección de "assemblies":

<compilation debug="true" targetFramework="4.5.2">
      < assemblies>
        < add assembly="System.Data.Linq, Version=4.0.30319.17929, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
< /compilation>

De este modo el proyecto logrará encontrar los DataContext y podremos seleccionar sin problema nuestra clase Linq2SQL:

LinqDataSource_OK

Problema solucionado.

¡Espero que te sea útil!

A mi tablet con un Atom Z3735F Baytrail no le dura la batería ni un día: ¿Cómo solucionarlo?

Si tienes un tablet con Windows 10 y un procesador Intel Atom Z3735F QuadCore de tipo "Baytrail", probablemente tienes un problema con tu dispositivo: la batería en reposo apenas te dura un día, ¿verdad?.

En un tablet lo que haces normalmente es, tras haberlo utilizado, pulsas el botón de encendido/apagado y éste se pone en un estado de baja energía que apenas consume y que te permite acceder de nuevo a él instantáneamente.

El problema con este tipo de tablets, por otro lado tan comunes, es que existe un problema de gestión de energía que hace que cuando apagas la pantalla en realidad el equipo no entre en modo de baja energía, sino que se queda trabajando de la manera habitual solo que con la pantalla apagada.

Esto se traduce en un consumo energético muy alto porque todos los sistemas están funcionando con normalidad, por lo que al final el nivel de la batería baja a toda velocidad y cuando vas a encenderlo de nuevo al cabo de unas horas te encuentras con que está prácticamente agotada. Un verdadero fastidio.

SIGUE LEYENDO para averiguar:

  • A qué se debe este problema y cómo diagnosticarlo en tu caso
  • Cómo solucionarlo
  • Qué tablet me he comprado y por qué no te recomiendo que lo compres tú Confused smile

Cómo obtener una referencia al ámbito global en cualquier entorno JavaScript (HTML, Node.js, Windows Scripting Host…)

El ámbito global de JavaScript es el ámbito superior en el que se definen las variables y que contiene algunas de las funcionalidades globales del entorno de ejecución.

Se trata de un objeto especial que:

  • Siempre está disponible
  • Se llama de manera implícita, es decir, no es necesario mencionar su nombre explícitamente para usar sus métodos o propiedades, al contrario que con cualquier otro objeto.
  • Según indica el estándar ECMAScript, este objeto global no dispone de constructor ni de prototipo y no se puede invocar como una función al igual que el resto de los objetos.

Si en un fragmento de código JavaScript definimos una variable o una función como estas fuera de todo contexto, o sea, para simplificar, sin ser dentro de una función):

var miVar = 0;
function sumar(a, b) {
   return a+b;
}

Lo que estamos haciendo es crear sendos miembros en el objeto global, que es el que constituye dicho ámbito: una variable y una función globales.

Es decir, declarar una variable o una función global implica crear un miembro de este objeto global.

Además, se definen otros ámbitos según en dónde declaremos cada variable, y estos ámbitos se "contienen" unos a otros. Es decir, los ámbitos van en una jerarquía que comienza en el ámbito más restringido y sube hasta llegar al ámbito global. En nuestro ejemplo híper-sencillo tendríamos tan solo dos ámbitos: el global y el de la función:

JavaScript-Ambitos

Desde el ámbito de la función tenemos acceso al ámbito global.

Todo esto de los ámbitos se complica mucho más (tenemos clausuras, por ejemplo). En el estándar podemos leer sobre ello (les llama entornos léxicos) y que nos de vueltas la cabeza.

Como sabemos, aunque nació en los navegadores, JavaScript en la actualidad se utiliza para casi todo, y podemos encontrarlo en casi cualquier entorno imaginable: servidores, dispositivos embebidos, sistemas operativos…

Aunque el estándar ECMAScript describe el objeto global y qué debe contener, no es igual en todos los entornos.

En un navegador el ámbito global lo constituye la ventana en la que se ejecuta el script, y de hecho podemos acceder a él mediante el objeto window. Por ejemplo, a partir del código anterior que definía una variable y una función podríamos escribir:

alert(miVar);
alert(window.miVar);

Y veríamos que son instrucciones equivalentes, ya que al ser una variable global queda definida dentro del ámbito global (es decir, de window en un navegador).

En otros entornos, sin embargo, no disponemos de un objeto window que actúe de ámbito global. Por ejemplo, en Node.js existe un objeto llamado global (o GLOBAL, es un alias) que nos permite acceder al ámbito global. En Windows Scripting Host el objeto global no tiene un nombre definido que lo represente y que nos permita acceder a él directamente… Cada entorno, por tanto, tiene sus particularidades.

La pregunta entonces es: ¿Cómo podemos acceder al ámbito global de JavaScript de manera genérica e independiente del entorno?.

SIGUE LEYENDO para descubrir:

  • Cómo enumerar propiedades de objetos
  • Distintas técnicas de acceso al ámbito global y cuál es la verdaderamente correcta
  • Qué tenemos en el ámbito global ennavegadores, Windows Scripting HOst y NOde.js
  • Por qué en Node.js nos devuelve "cosas extrañas"

Módulo para notificaciones web desde el navegador con HTML5

campusMVP_Notification

Estos días he estado creando un módulo JavaScript para facilitar el uso de las notificaciones del navegador usando la API estándar "Web Notifications" del World Wide Web Consortium (W3C).

La idea es poder mostrar notificaciones nativas al usuario (de las que aparecen al lado del reloj en Windows, por ejemplo) pero desde aplicaciones web. Por ejemplo, cuando llega un nuevo correo (como hace GMail), o cualquier otra circunstancia que necesitemos notificar en segundo plano al usuario, pero desde el navegador.

Actualmente el único navegador que NO las soporta es Internet Explorer / Edge, y no parece que tengan intención de soportarlas tampoco, pero en todos los demás funcionarán sin problemas.

En su día escribí un artículo explicando con detalle cómo utilizarlas "a pelo", sin usar ninguna biblioteca intermedia. Esto es una especie de continuación. Lo que he hecho es crear una biblioteca que, en mi opinión, hace más sencillo el uso de esta característica. Además homogeniza cuestiones como el tiempo de mostrar una notificación o el estado actual de permisos para mostrarlas.

Se trata de un modulo dual y se puede utilizar tanto directamente, incluyéndolo con una etiqueta <script> normal y corriente, como mediante inyección de dependencias con AMD (por ejemplo con Require.js).

He creado un repositorio en GitHub que incluye:

  • Documentación completa del módulo, con explicaciones de las funciones expuestas, su funcionamiento, etc… De momento está solo en inglés, pero entiendo que no debería suponer demasiado problema.
  • El código fuente completo (WebNotifications.js). Incluye comentarios explicativos para entender mejor cómo funciona.
  • La versión minimizada del módulo (WebNotifications.min.js), para usarlo con la mínima carga posible (962 bytes). Incluye un archivo de mapa (WebNotifications.min.js.map) para ayudar a la depuración en producción si fuera necesario.
  • Un archivo de ejemplo de uso (WebNotificationsTest.htm) que implementa todas las funcionalidades para comprobar que funcionan (debe usarse desde un servidor web: en local no funcionará).

¡Espero que lo encuentres útil!