Hands-On Machine Learning with Javascript 
- Burak Kenber: "Hands-On Machine Learning with Javascript", 2018
 
1. Exploring the Potential of JavaScript 
Why Javascript 
- Javascript ha ido ascendiendo como lenguaje más popular en la web 
- Prototype Javascript Framework introdujo la notación $() para reemplazar a document.getElementById()
 - jQuery uniformizó la manipulación del DOM, AJAX y efectos
 - La iniciativa CommonJS, con NodeJS, llevo Javascript más allá del navegador como server-side language
 - El registro npm agiliza la publicación y descubrimiento de módulos
 
 - Python suele ser el lenguaje preferido para ML y tiene una amplia biblioteca
 - Sin embargo, los algoritmos de ML se pueden implementar en cualquier lenguaje, como javascript.
 - Aunque python tiene una popularidad ganada, javascript se está volviendo más atractivo para proyectos ML.
 
Why machine learning, why now? 
- Aunque técnicas ML se remontan a los 1970s y 1980s, no eran prácticas en ese momento.
 - La tecnología actual provee la potencia para usarlas con fines prácticos. 
- Además AWS democratiza el escalamiento de recursos.
 
 - EC2, de AWS, democratiza la potencia de cómputo.
 - TensorFlow, de Google, democratiza las redes neurales.
 - La democratización de ML lleva a las empresas a un nuevo tipo de competencia.
 - Cada nuevo mercado creará una demanda de nuevos desarrolladores ML.
 - Estamos en camino a un boom en Inteligencia Artificial (AI).
 
Advantages and challenges of JavaScript 
- Javascript tiene sus ventajas y desventajas.
 - Historicamente, se le han criticado algunas de sus características poco comunes y desconcertantes para muchos programadores. 
- Que tiene sentido para aquellos con experiencia en programación funcional.
 - Las quejas vienen generalmente por aquellos con experiencia sólo en OOP.
 
 - Sin embargo, con la llegada de NodeJS, que lo habilita para desarrollo en el lado del servidor; Electron, que lo habiita para desarrollo de aplicaciones de escritorio; y React Native, que lo habilita para desarrollo de aplicaciones mobile, javascript se ha convertido en un lenguaje de propósito general y multiplataforma.
 - Aunque python tiene la predominancia en ML, la tendencia es que javascript seguirá avanzando para alcanzarlo, tarde o temprano.
 - Actualmente, puede ser un desafío ir incorporando ML a javascript y dejar una semilla para la siguiente generación de investigadores ML.
 
The CommonJS initiative 
- Se había advertido que para que javascript pueda correr en el lado del servidor, necesitaria de ayuda para acceso a disco, base de datos y un sistema de módulos.
 - La iniciativa CommonJS resolvió esas cuestiones.
 
Node.js 
- El surgimiento de Node.js es uno de los más importantes en la historia de javascript.
 - Chrome desarrolló la máquina V8 y una forma de compilación Just in Time para ejecutar javascript.
 - Node.js tomó V8 y le agregó un sistema de manejo de eventos, acceso a disco y lo que necesitaba para que pudiera funcionar en un servidor.
 - Su forma de manejo a eventos, con un único ciclo de eventos que maneja muchas solicitudes concurrentes, favorece la asincronicidad y la programación por eventos. 
- Ha sido clave para su adopción y éxito.
 
 - Otro ingrediente clave ha sido el registro npm que permite que los desarrolladores puedan usar fácilmente código compartido por otros desarrolladores.
 - Node.js ha permitido que frontend y backend puedan ser desarrollados en el mismo lenguaje y por los mismos desarrolladores.
 - Innovaciones en javascript han permitido el desarrollo de conceptos como isomorphic applications, single page applications y serverless.
 - Además, proyectos como Cordova/PhoneGap, han permitido que javascript pueda ser envuelto como componente en aplicaciones mobile.
 
TypeScript language 
- Microsoft desarrollo Typescript para introducir un javascript con clases, interfaces y tipado estático, que puede facilitar la construcción de IDEs y el desarrollo OOP en gran escala.
 - A diferencia de Dart, Microsoft se ha asegurado que Typescript sea un superconjunto de Javascript. 
- Código javascript es código typescript válido.
 
 - Algunas de las propuestas de typescript han venido siendo implementadas por ES6.
 - Typescript requiere un proceso de build para transformarse en javascript ejecutable.
 
Improvements in ES6 
- El comité ECMAScript define la especificación para el lenguaje javascript. 
- ES5 es el estandar actual.
 
 - La especificación ES6 indica una serie de mejoras que los fabricantes de navegadores se encargarían de implementar.
 - Como la implementación tarda, los desarrolladores echan mano de herramientas de traspilación, como Babel, que les permite programar en javascript futuro y compilarla hacia javascript actual ES5.
 - Let and const 
- var define una variable que es la misma independiente del contexto
 - let define una variable que es diferente en cada contexto
 - const define una constante a la que no se puede asignar un nuevo valor 
- Sin embargo, una constante puede tener partes variables
 
 - La recomendación suele ser usar const tanto como se pueda, luego let y luego var.
 
 - Classes 
- La ausencia de clases y la herencia por prototipos suelen parecer poco intuitivos para muchos desarrolladores.
 - ES6 agrega clases y herencia de modo similar a OOP.
 - Sin embargo, es sólamente syntactic sugar, internamente se sigue usando la herencia por prototipos.
 
 - Module imports 
- ES6 define import y export para los módulos.
 - CommonJS usaba require() y modules.export.
 
 - Arrow functions 
- Es syntactic sugar para escribir funciones de modo más suscinto.
 - Tienen el contexto heredado, de modo que el contexto de la variable this se conserva dentro de la función arrow.
 
 - Object literals 
- Si el nombre de una variable es el mismo que el de una propiedad, se puede omitir.
 - El operador spread (
...) facilita hacer referencia a los items de un objeto 
 - The for...of function 
- Facilita hacer referencia a los items de un enumerable.
 
 - Promises 
- Una promise es una referencia a una variable asíncrona cuyo valor estará disponible en el futuro.
 - Las promises pueden pasarse como objetos y sus manejadores pueden ser encadenados.
 
 - The async/await functions 
- Es parte de ES8
 - Es syntactic sugar que facilita el uso de llamadas asíncronas.
 
 
Preparing the development environment 
- Para poder usar ES6 de manera segura, usaremos herramientas como Babel y Browserify.
 - Installing Node.js 
- Usaremos node 9.4.0 o superior
 - node --version
 - npm --version
 
 - Optionally installing Yarn 
- Yarn es un manejador de paquetes similar a npm, pero más rápido y fácil de usar.
 - Yarn y npm usan diferentes comandos equivalentes pero interactúan con el mismo package.json
 
 - Creating and initializing an example project 
- babel-core 
- el transpilador
 
 - babel-preset-env 
- permite usar ES6, ES7 y ES8
 
 - browserify 
- hace un bundle
 
 - babelify 
- plugin de Babel para Browserify
 
 - yarn add -D babel-cli browserify babelify babel-preset-env 
- npm install --save babel-cli browserify babelify babel-preset-env
 
 - Usaremos la convención de colocar la fuente en src y el resultado en dist
 - NOTA: 
- Esto ya está desactualizado
 - Node 18 soporta import/export si se coloca "type": "module" en el package.json
 
 
 - babel-core 
 - Creating a Hello World project 
- node index.js
 - node index.js "good readers"