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"