viernes, 22 de julio de 2016

El Libro del Día: Apache Cordova in Action

El Libro del Día: 2016-07-22

Titulo: Apache Cordova in Action
Autor: Raymond Camden
Editorial: Manning
Nro Paginas: 250

Capítulos:
PART 1 GETTING STARTED WITH APACHE CORDOVA
1. What is Cordova?
2. Installing Cordova and the Android SDK
PART 2 CORE CONCEPTS
3. Creating Cordova projects
4. Using plugins to access device features
5. Mobile design and user experience
6. Considerations when building mobile apps
7. Tools for debugging Cordova and other hybrid apps
8. Creating custom plugins
9. Packing options for Cordova projects
10. Using PhoneGap Tools
PART 3 APPLICATION RELEASE
11. Submitting your app
12. Building an RSS reader app with Ionic

Descarga:
Apache_Cordova_in_Action

miércoles, 20 de julio de 2016

El Demo del Día: Leer Archivos de Excel 2007 usando Archivos XML

Leer Archivos de Excel 2007 usando Archivos XML

Este Demo es muy interesante ya que nos permite leer archivos Excel 2007 sin necesidad de tener instalado ni Office (para Automatización COM) ni los Componentes de Acceso a Datos de Office (para OLEDB), ya que solo debemos tener instalado .NET Framework para ejecutar la aplicación (el cual ya viene instalado en la mayoría de Windows).

En el Demo al Descomprimir el archivo de Excel No se crean archivos en disco sino se guardan en memoria usando una lista de objetos XmlDocument ya que se van a leer varios nodos de cada archivo XML. Es por eso que la velocidad es superior a las otras 2 técnicas, sobre todo con gran cantidad de datos.

1. Formatos Office Open XML

Quizás la mayoría no se ha dado cuenta que los archivos de Office a partir de la versión 2007 cumplen con el estándar Open XML que quiere decir que cada archivo es un comprimido (zip) que contiene archivos XML con Metadatos y datos.

Antes los archivos de Office (versión 2003 e inferiores) eran archivos binarios definidos por Microsoft, pero a partir de la versión 2007 son archivos XML comprimidos en una extensión que termina en X (Xml) o M (Macros), por ejemplo:

- En Word: Documentos (docx), Documentos con Macros (docm), Plantillas (dotx), Plantillas con Macros (dotm).

- En Excel: Libros (xlsx), Libros con Macros (xlsm), Plantillas (xltx), Plantillas con Macros (xltm).

- En PowerPoint: Presentaciones (pptx), Presentaciones con Macros (pptm), Plantillas (potx), Plantillas con Macros (potm).

- Otros: XML Paper Specification (XPS), Open XPS (OXPS), etc.

Como experimento solo basta cambiar la extensión de cualquiera de estos archivos a rar y descomprimirlos para ver que contienen archivox XML, por ejemplo, en el caso de uno de mis archivos de Excel 2007:

- Carpeta _rels: archivo .rels

- Carpeta docProps: archivos app.xml y core.xml

- Carpeta xl:
  -) SubCarpeta _rels: archivo workbook.xml.rels
  -) SubCarpeta theme: archivo theme1.xml
  -) SubCarpeta worksheets: sheet1.xml, sheet2.xml, ...
  -) Archivo sharedStrings.xml
  -) Archivo styles.xml
  -) Archivo workbook.xml

- Archivo [Content_Types].xml

2. Crear una Aplicación Windows Forms en C#

Abrir Visual Studio y crear una aplicación Windows Forms en C# llamada "Excel_Leer_XML", cambiarle de nombre al formulario por "frmVisorExcel" y realizar el diseño similar a la figura mostrada:

Diseño del Formulario "frmVisorExcel"

En el diseño hay una etiqueta (lblArchivo), un cuadro de texto (txtArchivo), 2 botones (btnAbrir y btnNuevo) y un control Tab (tabExcel) sin ninguna página ya que estas se crean en tiempo de ejecución en función al número de hojas.

3. Escribir el Código de la Aplicación en C#

Abrir el formulario "frmVisorExcel" y escribir el siguiente código:
using System;
using System.Text;
using System.Data;
using System.IO;
using System.IO.Compression;
using System.Xml;
using System.Windows.Forms;
using System.Collections.Generic;

namespace Excel_Leer_XML
{
    public partial class frmVisorExcel : Form
    {
        public frmVisorExcel()
        {
            InitializeComponent();
        }

        private void abrirExcel(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Selecciona el archivo de Excel a abrir";
            ofd.Filter = "Archivo de Excel 2007|*.xlsx";
            ofd.InitialDirectory = @"C:\Data\NET\Practicas\Archivos\Excel";
            if (ofd.ShowDialog().Equals(DialogResult.OK))
            {
                string archivo = ofd.FileName;
                txtArchivo.Text = archivo;
                tabExcel.Controls.Clear();
                List<XmlDocument> docs = new List<XmlDocument>();
                List<string> nombres = new List<string>();
                List<string> valores = new List<string>();
                //Descomprimir el archivo Excel y guardar solo los archivos xml necesarios
                //en una Lista de objetos de tipo XmlDocument
                using (var archivoExcel = File.OpenRead(archivo))
                using (var zip = new ZipArchive(archivoExcel, ZipArchiveMode.Read))
                {                  
                    XmlDocument doc;
                    foreach (var archivoXml in zip.Entries)
                    {
                        if (archivoXml.Name == "workbook.xml" ||
                             archivoXml.Name == "sharedStrings.xml" ||
                             archivoXml.Name.StartsWith("sheet") &&
                             Path.GetExtension(archivoXml.Name)==".xml")
                        {
                            using (Stream stream = archivoXml.Open())
                            {
                                doc = new XmlDocument();
                                doc.Load(stream);
                                docs.Add(doc);
                                nombres.Add(archivoXml.Name);
                            }
                        }
                    }
                }
                if (docs.Count > 0)
                {
                    //Leer el archivo xml donde se guardan los datos de tipo cadena
                    int pos = nombres.IndexOf("sharedStrings.xml");
                    if (pos > -1)
                    {
                        XmlDocument xdStrings = docs[pos];
                        XmlElement nodoRaizStrings = xdStrings.DocumentElement;
                        XmlNodeList nodosValores = nodoRaizStrings.ChildNodes;
                        if (nodosValores != null)
                        {
                            foreach (XmlNode nodoValor in nodosValores)
                            {
                                valores.Add(nodoValor.FirstChild.FirstChild.Value);
                            }
                        }
                    }
                    //Leer el archivo xml workbook donde se guardan la lista de hojas
                    pos = nombres.IndexOf("workbook.xml");
                    if (pos > -1)
                    {
                        XmlDocument xdLibro = docs[pos];
                        XmlElement nodoRaizHojas = xdLibro.DocumentElement;
                        XmlNodeList nodosHojas = nodoRaizHojas.GetElementsByTagName("sheet");
                        string id, hoja;
                        if (nodosHojas != null)
                        {
                            foreach (XmlNode nodoHoja in nodosHojas)
                            {
                                id = nodoHoja.Attributes["sheetId"].Value;
                                hoja = nodoHoja.Attributes["name"].Value;
                                //Leer cada archivo xml con la hoja
                                pos = nombres.IndexOf("sheet" + id + ".xml");
                                if (pos > -1)
                                {
                                    XmlDocument xdHoja = docs[pos];
                                    XmlElement nodoRaizHoja = xdHoja.DocumentElement;
                                    XmlNodeList nodosFilas =
                                    nodoRaizHoja.GetElementsByTagName("row");
                                    DataTable tabla = new DataTable();
                                    DataRow fila = null;
                                    int indice;
                                    string celda, valor;
                                    XmlAttribute tipoString;
                                    int cf = 0; //contador de filas
                                    int cc = 0; //contador de columnas
                                    string nombreCol; //nombre de la columna: A, B, C, ...
                                    if (nodosFilas != null)
                                    {
                                        foreach (XmlNode nodoFila in nodosFilas)
                                        {
                                            XmlNodeList nodoCeldas = nodoFila.ChildNodes;
                                            if (nodoCeldas != null)
                                            {
                                                cc = 0;
                                                foreach (XmlNode nodoCelda in nodoCeldas)
                                                {                              
                                                    celda = nodoCelda.Attributes["r"].Value;
                                                    tipoString = nodoCelda.Attributes["t"];                              
                                                    valor = "";
                                                    if (tipoString != null)
                                                    {
                                                        if (valores != null && valores.Count > 0)
                                                        {
                                                            indice = int.Parse(nodoCelda.FirstChild.
                                                            FirstChild.Value);
                                                            valor = valores[indice];
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if(nodoCelda.FirstChild!=null &&  nodoCelda.FirstChild.
                                                        FirstChild!=null)
                                                          valor = nodoCelda.FirstChild.FirstChild.Value;
                                                    }
                                                    if (cf == 0)
                                                    {
                                                        nombreCol = ((char)(65+cc)).ToString();
                                                        tabla.Columns.Add(nombreCol);
                                                    }
                                                    if (cc == 0)
                                                    {
                                                        fila = tabla.NewRow();
                                                    }
                                                    if (cc < tabla.Columns.Count)
                                                    {
                                                        fila[cc] = valor;
                                                    }
                                                    cc++;
                                                }
                                            }
                                            tabla.Rows.Add(fila);                      
                                            cf++;
                                        }
                                        DataGridView dgv = new DataGridView();
                                        dgv.Dock = DockStyle.Fill;
                                        dgv.ReadOnly = true;
                                        dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                                        dgv.AllowUserToAddRows = false;
                                        dgv.DataSource = tabla;
                                        dgv.CellFormatting += new
                                        DataGridViewCellFormattingEventHandler(cambiarCabeceraFilas);
                                        TabPage pagina = new TabPage();
                                        pagina.Text = hoja;
                                        pagina.Controls.Add(dgv);
                                        tabExcel.Controls.Add(pagina);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        private void cambiarCabeceraFilas(object sender, DataGridViewCellFormattingEventArgs e)
        {
            DataGridView dgvHoja = (DataGridView)sender;
            if (e.RowIndex > -1 && e.ColumnIndex == 0)
            dgvHoja.Rows[e.RowIndex].HeaderCell.Value = (e.RowIndex + 1).ToString();
        }

        private void nuevaLectura(object sender, EventArgs e)
        {
            txtArchivo.Clear();
            tabExcel.Controls.Clear();
        }
    }
}

Nota: El método "abrirExcel" estaasociado al evento click del botón "btnAbrir" y el método "nuevaLectura" esta asociado al evento click del botón "btnNuevo".

4. Ejecutar y Probar la Aplicación Windows Forms

Grabar la aplicación y pulsar F5 para ejecutarla, luego clic al botón "..." y se mostrará el diálogo de abrir mostrando los archivos de Excel 2007 (xlsx), tal como se muestra en la siguiente figura:

Dialogo de Abrir archivos de Excel

Seleccionar un archivo del diálogo y se cargarán todas las hojas del libro, mostrándose en una página del control Tab una grilla, tal como se muestra en la siguiente figura:

Primer Tab con la primera Hoja

Nota: Observar que la grilla muestra en las cabeceras de columnas las letras: A, B, C, D, etc. y en la cabecera de las filas los números: 1, 2, 3, 4, etc. Además en este Demo el orden de las hojas si es el verdadero (en el Demo anterior de OLEDB era como se leía primero).

Como en mi caso abrí un archivo con 2 hojas, la primera que tiene Frameworks de JavaScript y la segunda con algunos Videos de JavaScript, tal como se muestra en la siguiente figura:

Segundo Tab con la segunda Hoja

Si se desea se puede abrir cualquier otro archivo dando click nuevamente al botón "...", tal como se muestra en la siguiente figura:

Archivo Excel con solo una Hoja

En este último caso se abrió un archivo con solo una Hoja de Productos.

5. Comentario Final

En este Demo hemos visto como Leer todas las hojas de un libro de Excel 2007 usando archivos XML, para lo cual primero descomprimimos en memoria el archivo usando la clase "ZipArchive" y usando la colección de "Entries" obtuvimos solo los archivos xml necesarios: workbook.xml, sharedStrings.xml y todos los sheets.xml.

Primero se procedió a leer el archivo "sharedStrings.xml" donde se guardan los datos de tipo cadena y luego se procedió a leer el archivo "workbook.xml" donde se guardan la lista de hojas, finalmente para cada hoja se procedió a leer su archivo xml con los datos de la hoja, los cuales se almacenaron en un DataTable y se mostró en una grilla dentro de un tabPage en el tabControl.

Esta aplicación solo es una demostración y no incluye el formato, fórmulas, gráficos y demás objetos que también pueden leerse del archivo Excel xlsx, pero es un buen punto de partida para todos aquéllos que quieran entender "como funcionan las cosas", en este caso saber el contenido del archivo excel.

El que desea saber todo sobre la especificación de Excel 2007 les comparto el documento que lo encuentran también en la web de Microsoft Protocols junto con los demás formatos:
Especificación de Excel Open XML (XLSX)

Espero que les guste el Demo que es una primicia ya que no creo que lo encuentren en ningún lugar, sobre todo explicado, además si "entendieron" la técnica también la pueden usar para Aplicaciones Web y solo en el Cliente sin ir al Servidor, podemos usar JavaScript para descomprimir el archivo Excel y leer los archivos XML para mostrar su contenido. Esto lo haré en otro post, siempre y cuando valoren los demos, les den Like y los compartan en sus redes sociales (claro esta incluyendo al autor: Luis Dueñas).

6. Descarga la Aplicación Windows

2016_07_20_Demo_Excel_Leer_XML

martes, 19 de julio de 2016

El Demo del Día: Leer Archivos de Excel 2007 usando OLEDB

Leer Archivos de Excel 2007 usando OLEDB

Vamos a retomar nuevamente los Demos, con algo muy solicitado que es leer Archivos de Excel 2007 (XSLX), esta forma de lectura la usaba hace muchos años, pero ahora la comparto para los que no han llevado un curso conmigo.

1. Técnicas para Leer Archivos de Excel

Para leer un archivo de Excel con todas sus hojas hay varias formas que describo brevemente a continuación:

- Automatización ActiveX o COM

Consiste en abrir una instancia de Excel desde otra aplicación (en este caso en .NET) y obtener el valor de cada celda o de un rango de celda por cada hoja. Esta forma es la mas usada y es la de peor rendimiento y requiere tener instalado el Excel. Esta forma es la mas antigua cuando todavía no existía ADO.

- Usando OLEDB

Consiste en usar el proveedor de OLEDB en ADO.NET para conectarse a un archivo de Excel 12.0 (XSLX) para lo cual es necesario tener instalado "Microsoft Access Database Engine 2010 Redistributable" el cual puede descargarse de la siguiente dirección:
https://www.microsoft.com/en-us/download/details.aspx?id=13255
En esta página habrán 2 ejecutables:
- AccessDatabaseEngine.exe (25.3 MB) para equipos con S.O. de 32 bits
- AccessDatabaseEngine_X64.exe (27.3 MB) para equipos con S.O. de 64 bits
Esta forma es la que veremos en este Demo.

- Usando Archivos

Es la forma mas óptima y consiste en descomprimir el archivo XLSX y leer los XML donde se encuentran definidos los datos y las hojas. Esto se puede hacer de forma nativa o usando Librerías de Terceros como SpreedSheet (DevExpress), NPOI, EPPlus, ExcelDataReader, etc.
En el siguiente Demo que subiré trataré como leer Excel en forma nativa usando archivos XML.

2. Crear una Aplicación Windows Forms en C#

Abrir Visual Studio y crear una aplicación Windows Forms en C# llamada "Excel_Leer_OLEDB", cambiarle de nombre al formulario por "frmVisorExcel" y realizar el diseño similar a la figura mostrada:

En el diseño hay una etiqueta (lblArchivo), un cuadro de texto (txtArchivo), 2 botones (btnAbrir y btnNuevo) y un control Tab (tabExcel) sin ninguna página ya que estas se crean en tiempo de ejecución en función al número de hojas.

3. Escribir el Código de la Aplicación en C#

Abrir el formulario "frmVisorExcel" y escribir el siguiente código:

using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace Excel_Leer_OLEDB
{
    public partial class frmVisorExcel : Form
    {
        public frmVisorExcel()
        {
            InitializeComponent();
        }

        private void abrirExcel(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Selecciona el archivo de Excel a abrir";
            ofd.Filter = "Archivo de Excel 2007|*.xlsx";
            ofd.InitialDirectory = @"C:\Data\NET\Practicas\Archivos\Excel";
            if (ofd.ShowDialog().Equals(DialogResult.OK))
            {
                string archivo = ofd.FileName;
                txtArchivo.Text = archivo;
                tabExcel.Controls.Clear();
                using (OleDbConnection con = new OleDbConnection
                ("provider=Microsoft.Ace.oledb.12.0;data source=" + archivo + ";
                 extended properties=Excel 12.0"))
                {
                    try
                    {
                        con.Open();
                        DataTable tblHojas = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,
                        new object[] { null, null, null, "TABLE" });
                        foreach (DataRow fila in tblHojas.Rows)
                        {
                            if (fila["TABLE_NAME"].ToString().EndsWith("$"))
                            {
                                string nombreHoja = fila["TABLE_NAME"].ToString();
                                DataTable tblHoja = new DataTable();
                                using (OleDbDataAdapter dap = new OleDbDataAdapter
                                ("Select * From [" + nombreHoja + "]", con))
                                {
                                    dap.Fill(tblHoja);
                                }
                                DataGridView dgv = new DataGridView();
                                dgv.Dock = DockStyle.Fill;
                                dgv.ReadOnly = true;
                                dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                                dgv.AllowUserToAddRows = false;
                                dgv.DataSource = tblHoja;
                                TabPage pagina = new TabPage();
                                pagina.Text = nombreHoja.Replace("$","");
                                pagina.Controls.Add(dgv);
                                tabExcel.Controls.Add(pagina);
                            }
                        }                      
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message,"Error al leer el Excel");
                    }
                }
            }
        }

        private void nuevaLectura(object sender, EventArgs e)
        {
            txtArchivo.Clear();
            tabExcel.Controls.Clear();
        }
    }
}

Nota: El método "abrirExcel" estaasociado al evento click del botón "btnAbrir" y el método "nuevaLectura" esta asociado al evento click del botón "btnNuevo".

4. Ejecutar y Probar la Aplicación Windows Forms

Grabar la aplicación y pulsar F5 para ejecutarla, luego clic al botón "..." y se mostrará el diálogo de abrir mostrando los archivos de Excel 2007 (xlsx), tal como se muestra en la siguiente figura:

Dialogo de Abrir archivos de Excel

Seleccionar un archivo del diálogo y se cargarán todas las hojas del libro, mostrándose en una página del control Tab una grilla, tal como se muestra en la siguiente figura:

Primer Tab con la primera Hoja

En mi caso abrí un archivo con 2 hojas, la primera que tiene Personajes de JavaScript y la segunda con algunos términos de programación, tal como se muestra en la siguiente figura:

Segundo Tab con la segunda Hoja

Si se desea se puede abrir cualquier otro archivo dando click nuevamente al botón "...", tal como se muestra en la siguiente figura:

Archivo Excel con solo una Hoja

En este último caso se abrió un archivo con solo una Hoja de Productos.

5. Comentario Final

En este Demo hemos visto como Leer todas las hojas de un libro de Excel 2007 usando OLEDB, para lo cual se uso el método "GetOleDbSchemaTable()" con la restricción de tablas para obtener todos los nombres de tablas pero solo mostramos las que terminan en $, que son las Hojas de Excel.

Se uso un "OleDbDataAdapter" para ejecutar el comando Select para obtener los datos de la hoja en un "DataTable" y luego se creó dinámicamente una grilla, un tabPage y se agregó la grilla al tabPage y el tabPage al tabControl para que se vea los datos de cada hoja.

El que desea conservar todos los datos para después trabajarlos y luego guardarlos en una base de datos, en ves de usar un DataTable local (en el DataAdapter) debe usar un DataSet global (a nivel de clase).

Espero que les sea útil este Demo y en estos días publicaré una técnica más rápida que es leer archivos xml dentro del paquete (xlsx) la cual es más rápida aunque mas laboriosa y que algunos usan sin darse cuenta al usar librerías de lectura de archivos Excel.

6. Descarga la Aplicación Windows

2016_07_19_Demo_Excel_Leer_OLEDB

El Libro del Día: Beginning NFC

El Libro del Día: 2016-07-19

Titulo: Beginning NFC
Autor: Tom Igoe, Don Coleman, Brian Jepson
Editorial: O'Reilly
Nro Paginas: 245

Capítulos:
1. Introduction
2. NFC and RFID
3. Getting Started with PhoneGap and the PhoneGap-NFC Library
4. Introducing NDEF
5. Listening for NDEF Messages
6. An NFC Application in Practice
7. Introduction to Arduino and NFC
8. Peer-to-Peer Exchange
9. NFC on Embedded Systems
A. NFC Specification Codes

Descarga:
Beginning_NFC

viernes, 15 de julio de 2016

El Libro del Día: Crypto 101

El Libro del Día: 2016-07-15

Titulo: Crypto 101
Autor: Laurens Van Houtven
Editorial: Independent
Nro Paginas: 246

Capítulos:
I Foreword
1 About this book
2 Advanced sections
3 Development
4 Acknowledgments
II Building blocks
5 Exclusive or
6 Block ciphers
7 Stream ciphers
8 Key exchange
9 Public-key encryption
10 Hash functions
11 Message authentication codes
12 Signature algorithms
13 Key derivation functions
14 Random number generators
III Complete cryptosystems
15 SSL and TLS
16 OpenPGP and GPG
17 Off-The-Record Messaging (OTR)
IV Appendices
A Modular arithmetic
B Elliptic curves
C Side-channel attacks

Descarga:
Crypto_101

miércoles, 13 de julio de 2016

Artículo - JavaScript Developer

JavaScript Developer

1. Introducción

JavaScript es un Lenguaje de Programación interpretado desarrollado por Brendan Eich en 1995 cuando trabajaba en Netscape. JavaScript es orientado a objetos, basado en prototipos, débilmente tipado y dinámico. La especificación de este lenguaje se denomina ECMAScript y es elaborada por ECMA International.

Actualmente es uno de los Lenguajes de Programación mas usados en el mundo, ya que sirve para crear aplicaciones web, tanto de lado del cliente (desde sus inicios) y también de lado del servidor (en la actualidad).

En los 20 años de vida que tiene JavaScript, en los 10 primeros años solo se usaba para validaciones y manejo de controles, pero a partir de la incorporación de AJAX (2005), la creación de librerías como jQuery (2006), la creación de JavaScript en el servidor con NodeJS (2009), la aparición de las nuevas APIs sobre todo de HTML5 y la nueva especificación del lenguaje ECMAScript6 (2012), ha originado que JavaScript tenga un crecimiento exponencial.

Muchos desarrolladores escribían la mayor parte del código en el servidor, ya que los Frameworks de ese lado tenían una gran cantidad de APIs o Librerías que permitían realizar cualquier tipo de tareas, desde acceso a datos hasta gráficos, operaciones con datos, manejo de archivos, etc. Es por eso que se usaba mucho código en PHP, Java o .NET, ysolo un mínimo de código en JavaScript para validar, manejar el DOM y mejorar el formato o estilo.

Actualmente, todo lo que podíamos hacer en el servidor, lo podemos hacer en el cliente con JavaScript, desde hacer llamadas asíncronas con XHR o AJAX hasta manipular los datos, crear gráficos (en 2D y en 3D), cifrar datos, enviar y recibir notificaciones en tiempo real, etc. Esto se puede hacer nativamente usando las APIs de JavaScript o usando una Librería o Framework que encapsule dicho trabajo.

Nota: Antes yo escribía 80% de código en el servidor y 20% en el cliente, pero desde hace unos años escribo 20% de código en el servidor y 80% en el cliente usando JavaScript puro. Estos porcentajes concuerdan con "El Problema de la Performance" que se da 80% en el cliente y 20% en el servidor.

Muchos programadores creen conocer JavaScript, pero en realidad no conocen ni el 10% de lo que tiene. El propósito de este artículo es contribuir a aumentar ese conocimiento, mostrando la Historia, las APIs, las Librerías, los Frameworks, las Herramientas y las fuentes donde pueden aprender más sobre este lenguaje, para cambiar su forma de programar y usar "La Web como Plataforma de Desarrollo" a través del Navegador (Browser) usando como lenguaje "JavaScript".

2. Cronología de JavaScript (20 años)

- 1995: En Mayo Brendan Eich crea Mocha en 10 días
- 1995: En Setiembre se crea LiveScript
- 1995: En Diciembre cambia de nombre a JavaScript
- 1996: Microsoft crea JScript
- 1996: DHTML
- 1997: ECMA-262 Ed1 (ES1)
- 1998: DOM Level 1
- 1999: ES3 (Base JavaScript actual)
- 1999: Microsoft crea XmlHttpRequest (Pre-AJAX)
- 2000: DOM Level 2
- 2001: Douglas Crockford crea JSON
- 2004: DOM Level 3
- 2005: AJAX
- 2008: ECMAScript 4 (ES4)
- 2009: ECMAScript 5 (ES5). JSON, Object.create
- 2012: ECMAScript 6 (ES6). Modulos, Proxys
- 2012: Navigation Timing
- 2012: HTML5 Web Messaging
- 2012: Web Workers
- 2012: WebSocket
- 2013: Web Storage
- 2013: Touch Events
- 2013: Geolocation API
- 2013: Performance Timeline
- 2013: Web Notifications
- 2013: File API
- 2013: Messaging API
- 2013: Web Telephony API
- 2013: MediaStream Image Capture
- 2013: WebRTC 1.0
- 2013: Web Audio API
- 2014: Progress Events
- 2014: Indexed Database
- 2014: Server Sent Events (SSE)
- 2014: Web Cryptography API
- 2014: Web NFC API
- 2014: XMLHttpRequest Level 1
- 2014: Push API
- 2014: Streams API
- 2014: Screen Orientation API
- 2014: Service Workers
- 2014: TCP and UDP Socket API
- 2014: URL
- 2014: Clipboard API and Events
- 2015: ECMA-262 (6th Edition). ECMAScript 2015 Language Specification

3. APIs de JavaScript

- Document Object Model (DOM)
  -) HTML: Document, Element, Event, HTML..., Node, NodeList, ParentNode, etc.
  -) XML: XMLDocument.
  -) SVG: Scalable Vector Graphics

- Gráficos
  -) Canvas: CanvasGradient, CanvasRenderingContext2D, HTMLCanvasElement, ImageData.
  -) SVG: SVGAnimate, SVGAnimated, SVGColor, SVGElement, SGVFont, SVGPath, SVGText.
  -) WebGL: WebGLBuffer, WebGLObject, WebGLRenderbuffer, WebGLRenderingContext, etc.

- Almacenamiento
  -) File API: Blob, File, FileList, FileReader, FileReaderSync, URL.
  -) IndexedDB: IDBCursor, IDBDataBase, IDBFactory, IDBIndex, IDBObjectStore, etc.
  -) Web Storage: Storage, StorageEvent, WindowLocalStorage, WindowSessionStorage.

- Conectividad
  -) Web Sockets: BroadcastChannel, CloseEvent, EventSource, PortCollection, WebSocket.
  -) Messaging: MessageChannel, MessageEvent, MessagePort.
  -) WebRTC: RTCPeerConnection, RTCIceServer, RTCIceCandidate, RTCDataChannel, etc.

- Acceso:
  -) Drag And Drop (D&D): DataTransfer, DataTransferItem, DataTransferItemList, DragEvent.
  -) FullScreen: Document (fullscreenElement, fullscreenEnabled), Element (requestFullscreen).

- Estilos
  -) CSS Object Model: CSS, CSSRule, CSSStyleSheet, MediaList, StyleSheet, etc.
  -) Selectors: Document (querySelector, querySelectorAll), DocumentFragment, Element.

- Multimedia
  -) Animation Timing: Window (cancelAnimationFrame, requestAnimationFrame).
  -) Media: AudioTrack, HTMLMediaElement, HTMLTrackElement, MediaController, VideoTrack.
  -) Pointer Lock: Document (exitPointerLock), Element (requestPointerLock), MouseEvent.
  -) Web Audio: AnalyserNode, AudioBuffer, AudioListener, AudioParam, DelayNode, GainNode.

- Performance
  -) Browser: History, ImageBitmap, Location, MimeType, Navigator, WindowBase64 (atob, btoa),
     WindowTimers (clearInterval, clearTimeout, setInterval, setTimeout), etc.
  -) Typed Arrays: ArrayBuffer, ArrayBufferView, DataView, Float..Array, Int..Array, Uint..Array.
  -) Web Workers: AbstractWorker, SharedWorker, Worker, WorkerLocation, WorkerNavigator, etc.

- Componentes Web
  -) Shadow DOM: CSSHostRule, CSSRule, Element (createShadowRoot), ShadowRoot, etc.
  -) Custom Elements: Element (customElements.define)
  -) HTML Imports: HTMLLinkElement (rel=import), Document (write, close).

- ECMAScript
  -) Tipos de Datos Primitivos: Boolean, Null, Undefined, Number, String, Symbol (ES6).
  -) Tipos Objetos: Array, Date, Error, Function, Global, JSON, Math, Object, RegExp.
  -) Colección de Claves (Objetos): Maps, Sets, WeakMaps, WeakSets.

- Seguridad Web (WebCryptography)
  -) Clases: Crypto, Algorithm, KeyAlgorithm, CryptoKey, SubtleCrypto, etc.
  -) Operaciones: encrypt, decrypt, sign, verify, deriveBits, wrapKey, unwrapKey,
     generateKey, importKey, exportKey, getLength.
  -) Algoritmos: RSASSA-PKCS1-v1_5, RSA-PSS, RSA-OAEP, ECDSA, ECDH, AES-CBC,
     HMAC, DH, SHA-1, SHA-256, SHA-384, SHA-512, CONCAT, HKDF-CTR, PBKDF2, etc.

- Comunicación Asíncrona con el Servidor:
  -) Cliente al Servidor: XmlHttpRequest (XHR)
  -) Servidor al Cliente: Server-Send Events (SSE)
  -) Bidireccional: Web Sockets

4. Cronología de Librerías y Frameworks de JavaScript (11 años)

- 2004: Dojo Toolkit (Alex Russell)
- 2005: Prototype JavaScript Framework (Sam Stephenson)
- 2005: Script.aculo.us (Thomas Fuchs)
- 2006: Yahoo UI Library (YUI)
- 2006: Google Web Toolkit (GWT)
- 2006: jQuery (John Resig)
- 2006: MooTools (Valerio Proietti)
- 2007: ExtJS (Jack Slocum)
- 2007: WaveMaker (Scott Miles)
- 2007: jQuery UI (Scott González, Adam Sontag, etc)
- 2008: Processing.js (John Resig)
- 2008: QUnit (John Resig)
- 2009: CofeeScript (Jeremy Ashkenas)
- 2009: Glow (BBC)
- 2009: Raphaël (Dmitry Baranovskiy)
- 2009: NodeJS (Ryan Dahl)
- 2010: BackboneJS (Jeremy Ashkenas)
- 2010: KnockoutJS (Steve Sanderson)
- 2010: AngularJS (Misko Hevery)
- 2010: Three.js (Ricardo Cabello)
- 2010: jQuery Mobile (jQuery Foundation)
- 2010: Jasmine (Pivotal Labs)
- 2011: Dart (Lars Bak, Kasper Lund)
- 2011: Ember.js (Yehuda Katz, Tom Dale)
- 2011: Modernizr (Paul Irish)
- 2011: D3.js (Bostock, Heer, Ogievetsky)
- 2011: Kendo UI (Telerik)
- 2011: Unit.js (Nicolas Tallefourtane)
- 2012: TypeScript (Anders Hejlsberg)
- 2012: Bootstrap (Mark Otto, Jacob Thornton)
- 2012: Enyo.js (Palm, HP)
- 2012: Meteor (Meteor Development Group)
- 2012: ExpressJS (TJ Holowaychuk)
- 2013: Polymer (Google)
- 2013: X-Tag (Mozilla)
- 2013: Webix (XB Software)
- 2013: React (Jordan Walke)
- 2013: Sails.js (Mike McNeil)
- 2013: Snap.svg (Adobe)
- 2014: Underscore.js (Jeremy Ashkenas)
- 2014: Socket.io (Guillermo Rauch)
- 2015: Reac Native (Tom Ochinno, Christopher Chedeau)
- 2015: Aurelia.io (Rob Eisenberg)

5. Herramientas de JavaScript

5.1. Herramientas de Calidad del Código (JavaScript Code Quality Tools)

1. JSLint
- Es la más antigua y fué creada por Douglas Crockford en el 2002

2. JSHint
- Team: Rick Waldron, Caitlin Potter, Mike Sherov, Mike Pennisi, y Luke Page

3. JSCS (JavaScript Code Style checker)
- Team: Marat Dulin, Oleg Gaidarenko, Mike Sherov, Joel Kemp, Alexej Yaroshevich, Henry Zhu

4. ESLint (Pluggable JavaScript Linter)
- Originalmente creada por Nicholas C. Zakas en el 2013
- Actualmente mantenida por jQuery Foundation
- Usuarios: Algolia, Disqus, 2GIS
- Requerimientos: Node.js or io.js
- Sistemas Operativos: Windows, Mac, Linux

5.2. Herramientas de Pruebas Unitarias (JavaScript Unit Testing Tools)

1. QUnit (JavaScript Unit Testing framework)
- Originalmente creada por Jhon Resign en el 2006 como parte de jQuery
- En el 2008 fue extraida de jQuery para ser independiente en el 2009
- Usos: jQuery, jQuery UI, jQuery Mobile

2. Unit.js (Unit testing framework for JavaScript)
- Creado por el Francés Nicolas Talle (Nicolab) en el 2014
- Requerimientos: Node.js y el Browser

3. Jasmine (Behavior-Driven JavaScript)
- Creada por Pivotal Labs en el 2010

4. Mocha (the fun, simple, flexible JavaScript test framework)
- Creada en el 2011 por la organización Mocha
- Requerimientos: Node.js y el Browser
- Usos: should.js, express.js, chai, better-assert, unexpected
- Usuarios: Sauce Labs, Yahoo
- Contribuidores: Christopher Hiller, Daniel St. Jules, ScottFreeCode, David Da Silva

6. Entrenamiento en JavaScript

6.1. Libros











6.2. Cursos Oficiales Microsoft Virtual Academy (MVA)











6.3. Tutoriales























6.4. Conferencias













6.5. Reuniones (Meetups)







6.6. En Vivo (Hangouts)



7. Comentario Final

En este artículo me propuse dar la mayor cantidad de información sobre JavaScript, ya que en muchos lugares todavía no se toma conciencia de la necesidad de trabajar lo mas desconectado posible y solo actualizar en tiempo real los datos cuando ocurran cambios, para lo cual es necesario conocer mas JavaScript.

Particularmente, en los últimos 3 años mi orientación de desarrollador, cambio radicalmente, hacia el lado del cliente usando JavaScript y priorizando la performance usando una arquitectura con pocos archivos y poco contenido lo cual tiene ventajas en velocidad incomparables.

Si bien es cierto, en la mayor parte del mundo se esta de acuerdo en que JavaScript es el número 1 por encima de Java, PHP, Phyton, Ruby, C#, C++, etc; donde no estoy de acuerdo es en el uso indiscriminado de Frameworks sobre todo de lado del cliente que "debilitan el rendimiento".

Los programadores tienen que entender que el Navegador (Browser) es un Framework con cientos de clases y métodos (APIs), las cuales detallamos en el tema 3 de este artículo: "APIs de JavaScript" y que no es necesario usar ninguna Librería ni Framework para hacer cualquier cosa (al final tanto las Librerías como los Frameworks usan dichas APIs).

Hay que invertir mas tiempo aprendiendo lo que nunca pasará de moda (lo nativo) y dejar de lado la moda (las Librerías y Frameworks, que salen por decenas en un año y en poco quedan obsoletas). De mi parte llevo enseñando mas de 3 años las APIs de JavaScript en cada curso, taller o capacitación que hago.

Lamentablemente, en muchas partes todavía se piensa que se debe hacer todo de lado del servidor y los que piensan lo contrario (hacerlo de lado del cliente) lo hacen usando Librerías o Frameworks, por tanto, mi arquitectura y mis técnicas de programación de lado del cliente con JavaScript son solo requeridas por un grupo reducido de seguidores, lo cual me apena mucho y me anima a dar un paso al costado, ya que el mercado laboral y el de entrenamiento es reducido (todos quieren lo estándar, nadie quiere cambiar 180 grados).

Si los programadores siguieran las técnicas usadas en mis capacitaciones, cursos o talleres verían la diferencia brutal de velocidad entre una pagina web clásica o moderna (MVC, SPA, etc.) con lo que nosotros hacemos en forma nativa con pocos archivos: un HTML, un CSS, un JavaScript y un Sprite.

Si les gusto no se olviden de dar Like y el que desea lo puede compartir en cualquier medio: Sitio Web, Google+, FaceBook, Twitter, solo mantener el nombre del creador. Los que están llevando el Taller de los Domingos no falten ya que es el último mes de mi último curso (aprovechen lo poco que queda).

El Libro del Día: Mastering JavaScript

El Libro del Día: 2016-07-13

Titulo: Mastering JavaScript
Autor: Ved Antani
Editorial: Packt
Nro Paginas: 250

Capítulos:
Chapter 1: JavaScript Primer
Chapter 2: Functions, Closures, and Modules
Chapter 3: Data Structures and Manipulation
Chapter 4: Object-Oriented JavaScript
Chapter 5: JavaScript Patterns
Chapter 6: Testing and Debugging
Chapter 7: ECMAScript 6
Chapter 8: DOM Manipulation and Events
Chapter 9: Server-Side JavaScript

Descarga:
Mastering_JavaScript