Mostrando entradas con la etiqueta linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta linux. Mostrar todas las entradas

viernes, 17 de febrero de 2017

Introducción al NodeJS

Muy bien, aquí escribiendo después de algún tiempo y a petición de un viejo amigo que requeria un poco de NodeJS y como funcionaba ya que la distancia nos ha alejado le dije que retomaria el blog para ayudarle un poco con sus problemas además que mis primeros post del año. De momento les explicare ¿Qué es? ¿Cómo funciona? ¿Para qué sirve?

En el transcurso de los días iremos viendo temas con pequeños ejemplos.

¿Qué es?

NodeJS es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente esta tecnología es lo que permite trabajar con Javascript del lado del servidor. 

El ecosistema de paquetes NPM (node package manager) es el gestor de paquetes javascript de NodeJS por excelencia. (En la semana publicare una entrada de como funciona)

Node es un programa que puede hacer todo lo que hace Apache (con algunos módulos), pero que también puede hacer mucho más, al ser una plataforma JavaScript extensible desde la cual usted puede construir.

Tan importante como entender lo que Node es, tambien es importante entender lo que Node no es. Node no es simplemente un reemplazo de Apache que instantáneamente vaya a hacer más escalable su aplicación Web PHP. Eso no podría estar más lejos de la verdad. Node está creciendo extremadamente rápido, la comunidad se esta involucrando bastante y rapidamente tanto así que se está creando una gran cantidad de módulos y este crecimiento podría generar un amplio negocio muy pronto.

¿Cómo funciona?

El motor V8 de Javascript de Google está diseñado para correr en un navegador y ejecutar el código de Javascript de una forma extremadamente rápida esto permite ejecutar procesos desde el servidor abriendo un nuevo abanico de posibilidades en cuanto al mundo de desarrollo se refiere.


Node trabaja con un único hilo de ejecución que es el encargado de organizar todo el flujo de trabajo que se deba realizar. Node gestiona todas sus tareas de una forma asincrona para evitar que se pierda el número de tarea que va o si se bloquea por x o y razón no pierda el hilo.

Para poder trabajar de una forma óptima se delega todo el trabajo en un pool de threads. Este pool de threads esta construido con la librería libuv la cual dispone de su propio entorno multithread asíncrono. Por lo tanto Node.js envia todo el trabajo al pool.


Libuv realizará a través de alguno de sus threads el trabajo encomentado. Una vez que el trabajo haya sido completado libuv emitirá un evento que será recibido por Node.

Recibido el evento una función de callback se encargará de terminar de procesarlo. Por eso cuando trabajamos con Node practicamente toda la programación es asíncrona y se parece tanto a las clásicas llamadas AJAX.


A muchos programadores se les ha hecho creer que la programación orientada a objetos es el diseño perfecto de programación y que no deben usar nada más. Node utiliza lo que se conoce como modelo de programación orientado por eventos.

¿Para qué sirve?

Está extremadamente bien diseñado para situaciones en que usted esté esperando una gran cantidad de tráfico y donde la lógica del lado del servidor y el procesamiento requeridos, no sean necesariamente grandes antes de responder al cliente. 

Algunos ejemplos podrian ser:

Una API RESTful. Un servicio Web que proporcione una API RESTful toma algunos parámetros, los interpreta, arma una respuesta y descarga esa respuesta (usualmente una cantidad relativamente pequeña de texto) de vuelta al usuario. Esta es una situación ideal para Node, porque puede construirse para que maneje decenas de miles de conexiones. 
Tampoco requiere una gran cantidad de lógica y básicamente sólo busca valores de una base de datos y los reúne como una respuesta. Como la respuesta es una pequeña cantidad de texto y la solicitud entrante es una pequeña cantidad de texto, el volumen de tráfico no es alto, y una máquina probablemente puede manejar las demandas de API de incluso la API de la más ocupada de las empresas.

Fila de Twitter. Piense en una compañía como Twitter que recibe tweets y los escribe en una base de datos. Literalmente hay miles de tweets llegando cada segundo y la base de datos posiblemente no puede seguir el ritmo del número de escrituras necesarias durante los horarios pico de uso. Node se convierte en una pieza clave de la solución a este problema. 
Node puede manejar decenas de miles de tweets entrantes. Luego puede escribirlos rápida/fácilmente en un mecanismo de cola en memoria (memcached, por ejemplo), desde donde otro proceso separado puede escribirlos en la base de datos. El rol de Node en esto es reunir rápidamente el tweet y pasar esta información hacia otro proceso responsable de escribirlo.
Comparado con un servidor PHP normal que intente manejar escrituras en la base de datos misma, cada tweet podría causar una pequeña demora mientras se escribe en la base de datos, dado que el llamado de base de datos estaría bloqueando. Una máquina con este diseño sólo podría manejar 2.000 tweets entrantes por segundo, debido a la latencia de base de datos. A un millón de tweets por segundo, usted estaría hablando de 500 servidores. Node, en cambio, maneja cada conexión y no causa bloqueo, permitiéndole capturar tantos tweets como se le puedan arrojar. Una máquina nodo capaz de manejar 50.000 tweets por segundo, y usted estaría hablando de sólo 20 servidores. 

Estadísticas de videojuegos. Si usted alguna vez jugó un juego como Call of Duty on-line, algunas cosas le habrán llamado la atención inmediatamente cuando observó las estadísticas del juego, principalmente el hecho de que deben estar rastreando toneladas de información sobre el juego para poder producir tal nivel de estadísticas. Luego, multiplique esto por los millones de personas que lo juegan en cualquier momento, y tendrá una idea de la inmensa cantidad de información que se genera con bastante rapidez. Node es una buena solución para este escenario, porque puede capturar los datos que están generando los juegos, hacer un mínimo de consolidación con ellos y luego ponerlos en una fila para escribirlos en una base de datos. 
Parecería algo tonto dedicar todo un servidor a rastrear cuántas balas disparan las personas en los juegos, lo cual podría ser el límite útil si usted utilizara un servidor como Apache, pero parecería menos tonto si en lugar de ello usted pudiera dedicar un solo servidor a rastrear casi todas las estadísticas de un juego, como usted puede llegar a hacerlo con un servidor que ejecute Node.

viernes, 5 de febrero de 2016

Lectura ADC Raspberry Pi (GPIO) con un MCP3202 o MCP3008

No todo en la electronica son unos y ceros (1-0) tambien tenemos dispositivos, sensores, medicion de voltajes, corrientes que van desde el 0 en adelante. Desafortunadamente en la Raspberry Pi no hay un una entrada donde conectemos directamente algo analogo y no lo lea pero afortunadamente tenemos algo llamado SPI, lo cual nos permite la lectura de 2 puertos dentro GPIO en la Raspberry Pi para obetener datos análogos (CE0 y CE1).

Elementos de SPI

SCLK - Serial CLocK 
CE   - Chip Enable (Chip Select) (Dos puertos CE0 y CE1) 
MOSI - Master Out Slave In 
MISO - Master In Slave Out 

Sin embarho el SPI master driver esta deshabilitado por default en la raspberry, pero es muy fácil habilitarlo, solo tenemos que teclear una línea de código en la consola para quitarlo de la lista negra o bien hacerlo desde raspi-config.

Manual:

- sudo sed -i 's/blacklist spi\-bcm2708/\#blacklist spi-bcm2708/g' /etc/modprobe.d/raspi-blacklist.conf
- sudo reboot

Automático:

- sudo raspi-config

Una vez habilitado tenemos los siguientes pines del GPIO funcionales.

 MOSI P1-19, MISO P1-21, SCLK P1-23, CE0  P1-24 y CE1  P1-26

Ya tenemos habilitado el SPI, lo que para empezar a hacer pruebas necesitamos los siguiente:
  1. MCP3202 ó MCP3008
  2. Python y Python-dev
  3. Spidev 
Para instalar python python-dev realizar:
sudo apt-get install python-dev python






Para instalar spidev:

- git clone git://github.com/doceme/py-spidev
- cd py-spidev/
- sudo python setup.py install

Recordemos que el MCP3202 es un chip de 2 canales codificado a 12 bits por lo tanto vamos a estar leyendo valores de 0 - 4095 y el MCP3008 es un chip de 8  canales codificado  a 10 bits teniendo valores desde 0 - 1023. Eso se evalua en el código para la manipulación de datos. Los chips deben conectarse de la siguiente manera.

 
Rojo: V+
Negro: GND
Naranja: CLOCK
Amarillo: MOSI
Azul: MISO
Violeta: CE

Los canales es donde va a entrar la línea de lo que queremos medir y vamos a manipular tanto el canal como el puerto CE que deseamos medir mediante el siguiente script:

Para crear el script creamos un archivo con extensión .py

Con esto podemos a jugar con los numeros de los canales o de los CE para ver y entender el funcionamiento correcto.

Espero que les haya servido, realmente es una excelente herramienta para hacer medicion de sensores ya que por lo regular estos nos arrojan numeros que van de 0 en adelante.






viernes, 22 de enero de 2016

Crear SD de Raspbian Jessie desde MAC OS

Antes que nada espero que esten iniciando de excelente manera el 2016, retomando el blog como uno de mis propositos traigo un tema rápido pero que a muchos se les complica un poco esta parte.

Pues bien el 21 de Noviembre del 2015 salio una nueva distro de Raspbian llamana Jessie (¿será la Jessie de ToyStory? Curioso...) bueno pues antes que nada lo que tenemos que hacer es descargarla de la página oficial https://www.raspberrypi.org/downloads/raspbian/

Uná vez descargada lo primero que tenemos que hacer es darle formato a nuestra SD para eso vamos Aplicaciones > Utilidades > Utilidad de Discos

Damos clic en la seccion donde dice borrar.



No olviden el formato debe de ser FAT esto es sumamente importante, una vez esto borramos.


Ahora si, tenemos lista nuestra SD para continuar. Vamos a Aplicaciones > Utilidades > Terminal Esto nos abrira una consola.



Ahora tecleamos los siguientes comandos en orden.

1.- diskutil list (enlista todas las unidades de disco)


2.- diskutil unmountdisk /dev/disk4 (desmontamos la unidad para poder trabajar con ella)

3.- cd Desktop/ (navegamos a la carperta donde tenemos el archivo desomprido en .img en este caso el escritorio)