domingo, 5 de enero de 2020

¿Google strikes again? Linux VM en Chrome OS sobre Chromebox HP Gen 2 para desarrollo Web.


Resultado de imagen de hp chromebox gen 2Plataformado de un Chromebox HP Gen 2 para desarrollo .NET contra App API REST corriendo en servidor JavaScript Node.js, usando Visual Studio Code y KVM Debian sobre Chrome OS. Futuro esperanzador para  este sistema operativo si consigue seducir a la comunidad desarrolladora Web. 

Asumiendo que los informáticos nos tenemos que adaptar a la evolución que la tecnología ofrece a los sistemas informáticos (mundo IT) en cualquiera de sus variantes - FrontEnd, BackEnd y FullStack - , a finales del 2019 entra en cartera un proyecto con necesidad de conectar una aplicación .NET que consume datos de SQL Server en un servidor local (POS), a un vertical del sector de transporte a través de una API REST CRUD corriendo bajo un motor Javascript (Node.js).





Era necesario tener un entorno de pruebas de manera eficiente y rápido para, valorar la viabilidad del desarrollo antes de finalizar el 2019. Existe muchísima literatura en la red para poder instalar "distros" de Linux y, poder correr un servidor de aplicaciones basado en el motor de JavaScript Chrome V8, es decir Node.js.

Para poder generar un análisis en las modificaciones a realizar en proyectos ya validados  y valorar su desarrollo, necesitábamos un escenario real de pruebas para adaptar rápidamente nuestro código .NET según las especificaciones que se usarían en el proyecto. Era necesario disponer de un ordenador con sistema operativo que no penalizara la creación del mencionado escenario y, su posterior cotización del proyecto. Nos decidimos por un Chromebox de HP con Chrome OS por su simplicidad en gestión y, su posterior mantenimiento tras la posibilidad de activar una distribución de Debian dentro de el mismo hardware, manteniendo su sistema operativo nativo Chrome OS.

Este es su despiece y sus especificaciones del Celeron adquirido - existen CPUs i5 / i7 con mejores prestaciones - consultable en el el manual de mantenimiento que HP tiene disponible en sus servidores: http://h10032.www1.hp.com/ctg/Manual/c06011401):

  • HP Chromebox G2
  • Intel Celeron® 3865U 1.80-GHz, dual-core processor (2.0-MB L3 cache, 2133-MHz, 15-W).
  • Intel HD graphics 610
  • Memory Two SODIMM memory module slots 4096 MB (4096 MB × 1) 
  • Storage Solid-state hard drive (2242, M.2, SATA-3) 32 GB (ampliable)
  • Audio Realtek ALC5662 HD Audio Audio Codec
  • Wireless Integrated wireless options with dual antennas (M.2/PCIe)
  • Intel Dual Band Wireless-AC 7265 802.11 AC 2×2 WiFi + Bluetooth 4.2 Combo Adapter (non-vPro)
  • External media cards HP Multi-Format Digital Media Card Reader
  • Supports SD/SDHC/SDXC


(1) Top cover 
(2) Metal top shield (includes antenna) 
(3) Rear I/O bracket 
(4) Power button board 
(5) Power button board cable 
(6) Fan
(7) Heat sink 
(8) Memory modules 4 GB 
(9) Memory cover 
(10) Mylar Kit (for use when replacing bottom cover)
(11) Intel Dual Band Wireless-AC 7265 802.11 AC 2×2 WiFi + Bluetooth 4.2 Combo Adapter
(non-vPro) WLAN module
(12) Solid-state drive (M.2, SATA-3) 32 GB
(13) Solid-state drive absorber 
(14) System board (includes processor and replacement thermal material): Equipped with an Intel Celeron 3865U processor
(15) HDMI gasket 
(16) Bottom shield 
(17) Power connector bracket
(18) Power connector cable L17259-001
(19) Bottom cover L17258-001
(20) Rubber feet L17271-001

En las ultimas releases de Chrome OS - a partir de la 69 -, Google permite ejecutar binarios nativos de Linux. Es decir, podemos bajarnos el paquete para Debian de Visual Studio Code e instalarlo. Nos aparecerá el icono de Visual Studio en el sistema operativo Chrome OS. Si queremos podemos anclarlo en la barra de sistema del sistema operativo.
Resultado de imagen de API REST NODE.js
Esto lo consiguen mediante su proyecto Crostini: una tecnología que hace uso de virtualización a través de KVM. Kernel-based Virtual Machines, es una solución para implementar virtualización completa con Linux. "KVM permite ejecutar máquinas virtuales utilizando imágenes de disco que contienen sistemas operativos sin modificar. Cada máquina virtual tiene su propio hardware virtualizado: una tarjeta de red, discos duros, tarjeta gráfica, etc." Fuente: Wikipedia.

Tiene un poco de "delay" la ejecución del aclamado editor de código VS Code de Microsoft, pero una vez ejecutado, no hay razón alguna para pensar que está corriendo sobre un contenedor (Virtual Machine) dentro de Chrome OS. La compatibilidad con Linux es importante para la comunidad desarrolladora; los Chromebook tiene una autonomía de batería envidiable, los Chromebox tienen una capacidad de proceso importante con el Intel en su interior. Ademas es la tendencia en computación, mini cajas que no hacen ruido (fanless), con una gráfica aceptable (4K) y con posibilidad de ampliación de RAM, disco duro SSD e instalación de dos pantallas. Todo esto en un tamaño de ordenador que deja libre las mesas de trabajo, o el comedor o las habitaciones...en definitiva cualquier estancia. Y si se prefiere, se puede fijar en la parte posterior de la pantalla (anclaje VESA).


Podemos instalar IDEs (entornos de programación) y programas necesarios para el desarrollo en entorno web, en cualquiera de sus variantes.

Una vez comprobado en los vídeos de Google I/O 2019 "Linux for Chrome OS", los principios del diseño de "Crostini" hacen que la capa de virtualización, mantenga una seguridad excelsa entre lo que se esta ejecutando en Chrome OS con lo que esté "levantado" en la VM. En realidad los contenedores del Linux, tiene acceso sólo a su contenedor. No pueden interactuar con los demás contenedores. 

La experiencia de usuario es impresionante, pues tan solo es necesario activar el switch "Linux" en la configuración de Chrome OS para tener un linux operativo. Nos habrá creado un nuevo icono llamado "Terminal" en los iconos de las aplicaciones, que es una shell de Debian totalmente funcional.

Para instalar las aplicaciones, se deben bajar los paquetes en el Chrome OS y copiarlos a la carpeta "Ficheros de Linux", para que aparezcan en la carpeta /home/{usuario}.

Esta tan separado que para poder acceder a una app servidora corriendo en el motor JavaScript (Node.js) en el Chromebox, es necesario "natear" con una extensión dentro navegador Chrome para, permitir ser visible desde una máquina W7, W10 o cualquier otro dispositivo dentro de la misma red. Es el único pequeño "tuning" necesario en Chrome OS.

Este es el guión que hemos seguido para poder hacer el escenario de pruebas requerido (con los enlaces de ayuda):

1.- Activar Linux en Chrome OS para tener un Kernel en un contenedor (KVM) de una distribución Debian totalmente operativa: https://medium.com/@jacoboakley/web-development-with-a-chromebook-terminal-setup-dc0d4668d411


2.- Instalar Node.js :


Cambiar la versión de la linea siguiente por la que corresponda en el momento de la instalación (en nuestro caso versión 12.X):

      curl -sl https://deb.nodesource.com/setup_10.x | sudo -E bash -


Una vez instalados tanto node.js como el gestor de paquetes deberíamos comprobar las versiones instaladas en la VM de Debian tal y como se muestra en la siguiente imagen. 



NOTA: Instalar proyecto de Github -> https://github.com/FaztWeb/express-basic-restapi


3.- Instalar VS Code de https://code.visualstudio.com/#alt-downloads seleccionando Linux y paquete para Debian / Ubuntu (.deb):

(si da error la instalación del paquete desde Shell -> sudo apt-get install -f. Correr otra vez la instalación después de hacer correr el fix anterior)


4.- Instalar  Connection Forwarder. Aplicar regla personalizada para poder redireccionar el puerto TCP 3000 (o el que corresponda de nuestra aplicación) de localhost a la IP de la VM (container Debian) generalmente 100.115.92.206:3000. Mirar con sudo ifconfig eth0.


Ofrecido por: chromebeat.com

Comentario / inquietud de un usuario de la aplicación: "No idea why Android on ChromeOS needs its own network interface...but this Chrome App can forward connections from localhost in ChromeOS to the Android network interface. Really useful. As a suggestion it might be good to log what's going on or show some indication packets are being forwarded. Many thanks for your efforts!"

Nota: Esta aplicación debe estar "levantada" sin necesidad de tener Chrome abierto. Anclamos la app en barra de sistema y la ejecutamos con la configuración guardada. Tiene que tener la "rayita" debajo que nos indica que se está ejecutando.

5.- En la máquina W7 de entorno de desarrollo .NET.

Instalar Postman. Comprobar que accedemos al recurso de pre-producción.



6.- Instalar en el entorno .NET la librería para poder trabajar con JSON. https://www.newtonsoft.com/json la asociamos a nuestro proyecto.


7.- Aplicación VB.NET.

Clase contenedora de TAD película:

Imports Newtonsoft.Json
Public Class pelicula
    Private _id As String
    Private _title As String
    Private _director As String
    Private _year As String
    Private _rating As String
    <Newtonsoft.Json.JsonProperty("id")> Public Property id() As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            _id = value
        End Set
    End Property
    <Newtonsoft.Json.JsonProperty("title")> Public Property title() As String
        Get
            Return _title
        End Get
        Set(ByVal value As String)
            _title = value
        End Set
    End Property
    <Newtonsoft.Json.JsonProperty("director")> Public Property director() As String
        Get
            Return _director
        End Get
        Set(ByVal value As String)
            _director = value
        End Set
    End Property
    <Newtonsoft.Json.JsonProperty("year")> Public Property year() As String
        Get
            Return _year
        End Get
        Set(ByVal value As String)
            _year = value
        End Set
    End Property
    <Newtonsoft.Json.JsonProperty("rating")> Public Property rating() As String
        Get
            Return _rating
        End Get
        Set(ByVal value As String)
            _rating = value
        End Set
    End Property
End Class

Código que consume del servidor Node corriendo en Chrome OS HP Gen 2 el recurso dentro de la API REST movies. Ejecuta la librería JSON de Newtonsoft, para volcarla en un array. Posteriormente iteramos sobre esa lista para presentar los datos en el Listbox.

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        lbout.Items.Clear()
        Dim request As WebRequest = WebRequest.Create("http://penguin.linux.test:3000/api/movies")
        request.Method = "GET"
        request.ContentType = "application/json;charset=utf-8"
        Dim response As WebResponse = request.GetResponse()
        Me.APIRESTLabel.Text = "Obteniendo respuesta..."
        StatusStrip1.Refresh()
        Dim dataStream As Stream = response.GetResponseStream()
        Dim reader As New StreamReader(dataStream)
        Dim responseFromServer As String = reader.ReadToEnd()
        If responseFromServer = "0" Then
            MsgBox("Fallo en conexión...")
        Else
       Dim peliculas As List(Of pelicula) = JsonConvert.DeserializeObject(Of List(Of pelicula))(responseFromServer)
            'Recorrer la lista para informar en el list box...
            For Each item As pelicula In peliculas
                lbout.Items.Add(item.id & " / " & item.title & " / " & item.director)
            Next
            Me.APIRESTLabel.Text = "Proceso terminado !!!"
            StatusStrip1.Refresh()
        End If
        reader.Close()
        dataStream.Close()
        response.Close()
    End Sub



8.- Quitar hibernación servidor Node.js.  Ir a Configuración > Dispositivo > Batería . Seleccionar de la lista desplegable la opción "Apagar la pantalla" cuando esté inactivo. Esto evitará el apagado del Chromebox.

Conclusión:

El porque de la rápida aceptación de soluciones usando el motor de JavaScript Node.js, viene dada por la unificación de JavaScript en aquellos desarrollos donde exista JavaScript en el lado cliente (FrontEnd). Node.js permite la ejecución de código JavaScript en el lado del servidor (BackEnd), sin la necesidad de un navegador (browser). 

Por otro lado, la escalabilidad del motor es su punto fuerte. Esta pensado para poder soportar una gran cantidad de conexiones simultáneas o, petición de datos de miles de orígenes a la vez. Sea el dispositivo de que sea.

Muchas tecnologías del BackEnd usan hilos independientes para atender las peticiones de sus consumidores de datos. Ante una petición masiva de datos los recursos del servidor pueden caer.

Node.js es gestiona un solo hilo y un bucle de eventos asíncrono, todas las nuevas peticiones son tratadas como eventos en un único bucle. Este es el motivo por el que las características asíncronas y los eventos de JavaScript encajan tan bien en la filosofía de Node.js.

Este diseño de compartir un único hilo de ejecución entre todas las solicitudes atiende a necesidades de aplicaciones altamente concurrentes, en el que toda operación que realice entradas y salidas debe tener una función callback.

Todo cocinado con filosofía Open Source.




El gestor de paquetes npm, permite acceder a miles de librerías Open Source, aptas para incluir en el nacimiento de un desarrollo.

Google golpea otra vez fuerte, con productos como Flutter, Chrome OS, KVM, el motor V8 (base de Node.js) para, no volverse un paquidermo de avanzada edad y movimientos lentos. Si consigue seducir a la comunidad developer de entornos Web, seguirá en la cresta de la ola por muchos años. Buen hardware de HP que hace una simbiosis perfecta con el sistema operativo Chrome OS.

La Cita:

“Una corazonada es la creatividad que está tratando de decir algo”, Frank Capra.