miércoles, 8 de febrero de 2017

Introducción a NodeJs para programadores

¿Qué es NodeJs?

Es un motor que lee código en javascript y lo ejecuta. Funciona de manera similar jvm (Java Virtual Machine) o CLR de .NET (Common Language Runtime).

¿Puedo leer excels, mostrar páginas web, hacer una aplicación de escritorio, generar pdf o leer una base de datos?

Si, todo se puede hacer mediante módulos.

¿Qué son los módulos?

Los módulos son un conjunto de funciones empaquetados para un fin común (por ejemplo: leer un excel, subir archivos a una web). Su funcionalidad es similar a las bibliotecas de .NET o los paquetes de Java.

¿Cómo es la estructura de un proyecto?

Es algo como esto:


Las demás preguntas se irán resolviendo en el camino.

Comencemos

Lo primero que debes hacer es descargar el motor de nodejs. La descarga de node viene acompañada de NPM.

NPM es un repositorio de módulos. Se ejecuta a través de comandos de consola (DOS en Windows, terminal en Linux). Las funciones más usadas son las siguientes:

npm init: Permite generar el archivo package.json, el archivo package.json define el nombre del proyecto, la versión, el archivo principal (lo definiremos como server.js), las palabras clave, la licencia de distribución y los módulos necesarios del proyecto. Dejen en blanco los valores que no quieran definir en el momento, siempre se puede volver a editar el archivo.

npm install [nombre del módulo]: Permite descargar un módulo a tu proyecto. Los nombres de los módulos los puedes extraer de https://www.npmjs.com/. Si luego del nombre del módulo agregas "--save", se agregará la dependencia de este módulo al archivo package.json.

npm uninstall [nombre del módulo]: Funciona de manera similar a "install" pero elimina. También se puede agregar el atributo "--save" luego del nombre del módulo.

npm install: Permite descargar todos los módulos definidos en el archivo package.json.

Estos comandos deben ser ejecutados con la consola posicionada en la carpeta del proyecto.

Todos los módulos descargados a través de npm están en la carpeta "node_modules" de tu proyecto. Debido al tamaño de esta carpeta comúnmente se excluye del control de versiones.

Control de versiones

El control de versiones perfecto para nodejs es Git ya que las herramientas de trabajo de Node vienen incluidos con el soporte a este. Git necesita de un servidor donde se alojarán los archivos (por ejemplo: GitHub o BitBucket) y un cliente que es el programa encargado de subir los cambios de tu proyecto. El cliente de Git se puede descargar desde acá. Viene con un gestor visual pero no lo utilizaremos, sólo nos interesa el motor en linea de comandos.

Git vs SVN

Estos dos controles de versiones tienen grandes diferencias pero en términos prácticos. Definiremos lo que hacen sus funciones básicas.

SVN:
Checkout: Baja un proyecto del servidor y lo copia en una carpeta local.
Commit: Sube los cambios al servidor.
Update: Baja los cambios desde el servidor.

Git:
Clone: Baja un proyecto del servidor y lo copia en una carpeta local.
Commit: Sube los cambios al repositorio local en la carpeta .git del proyecto.
Push: Sube los cambios al servidor desde el repositorio local.
Pull: Baja los cambios desde el servidor.

Para excluir archivos o carpetas en Git se usa el archivo ".gitignore". Dentro de este archivo debe estar definida la carpeta "node_modules" o git se volverá muy pesado debido al tamaño de la carpeta.
Se pueden descargar plantillas de ".gitignore" desde el repositorio https://github.com/github/gitignore. Dentro de este repositorio busca el archivo "Node.gitignore", renombralo a ".gitignore" y dejalo en algún lugar temporal hasta que más adelante.

Función Clone

Para clonar un proyecto de BitBucket se debe ejecutar de la siguiente forma:
git clone https://MiCuenta@bitbucket.org/CuentaCreadorRepositorio/nombre_proyecto.git

Luego pedirá la contraseña de tu cuenta. Alternativamente se puede ejecutar definiendo la contraseña:
git clone https://MiCuenta:mi_contraseña@bitbucket.org/CuentaCreadorRepositorio/nombre_proyecto.git

Nota: Clone es la única función que se ejecuta fuera de la carpeta del proyecto ya que esta misma lo crea.

No es necesario ocupar Git desde linea de comando, sólo deberías necesitarlo para la función clone. El resto lo puedes hacer a través del IDE que usaremos para programar: Visual Studio Code.

Visual Studio Code

Con este sofware realizaremos nuestros programas en NodeJS ya que es fácil de usar, incorpora a Git, un depurador de Node y extensiones para personalizarlo. Lo puedes descargar desde acá.

Ya con el proyecto creado desde Git deberías hacer click en "Abrir carpera" y seleccionar tu proyecto.
Deberías tener la carpeta .git (puede que esté oculta) y el archivo package.json.

Visual Studio Code tiene 5 secciones:

 EXPLORADOR: Acá estará la carpeta de tu proyecto con todos sus archivos. Desde esta sección se programa.

 BÚSQUEDA: Acá puedes encontrar archivos o texto dentro de proyectos grandes. Pinchando en el botón de 3 puntos (...) puedes excluir archivos de la búsqueda.

 GIT: acá manejarás el control de versiones. Si aún no subes ningún archivo deberás presionar en "Publicar" antes de hacer un Push.

 DEPURAR: Acá podrás ejecutar tu programa Node y ver lo valores de tus variables en tiempo real. Posee puntos de interrupción y por defecto sólo depura Node pero se pueden depurar otros motores a través de extensiones.

 EXTENSIONES: Permiten agregar o modificar funcionalidades u otros aspectos a Visual Studio Code. Por ejemplo: Autocompletados, iconos, depuradores, snippets y muchos más.

Archivo principal, archivo servidor, app.js o server.js (es el mismo)

El archivo principal de node en internet se puede encontrar con diversos nombres: archivo principal, archivo servidor, app.js o server.js pero todos se refieren al mismo, al archivo donde comienza la ejecución del programa. Ya que en el archivo package.json lo definimos como server.js, acá también crearemos un archivo con el mismo nombre.

Mostrar páginas web

Para desplegar una página web, necesitas levantar un servidor web. Para esta tarea usaremos el módulo "express". Para instalarlo bastaría con ejecutar en una consola o terminal "npm install express --save". Ya con VScode instalado puedes hacer click derecho en un espacio vacío dentro del explorador y pinchar en "Abrir en símbolo de sistema" o "Abrir en terminal".

Luego pega el siguiente código en el archivo server.js:
var express = require('express');
var app = express();
app.get('/', function(req, res){
    res.send('Hola Mundo');
})
app.listen(1338, function () {
    console.log('Express activo en el puerto 1338');
});
Luego ve a la sección DEPURACIÓN y presiona el botón verde "Iniciar depuración" eso iniciará el servidor web de prueba. Ve al navegador y escribe "http://localhost:1338". Debería mostrar "Hola Mundo".

Grunt

Últimamente muchos sitios trabajan con javascripts y hojas de estilos minificados (.min.js y .min.css) esto ayuda a ahorrar ancho de banda, acelerar la carga de páginas y proteger el código fuente de estos archivos. Hace un tiempo habían extensiones para los IDEs en los que con un click minificabamos estos archivos y luego desde los archivos html llamabos a estos archivos generados.

También estaba el tema de los less, estos archivos muy similares a los css que nos permiten crear jerarquías de estilos, al igual que los archivos anteriores teníamos que estar constantemente generar los archivos css y luego estos a css.min.

Grunt hace todo esto de forma automática ahorrándonos tiempo y dolores de cabeza. Grunt se compone de 3 partes:

1) Modulos de funciones: la biblioteca base es "grunt" pero dependiendo de las funciones que necesites en tu proyecto necesitarás bajar otras. Acá está la lista completa de funciones: http://gruntjs.com/plugins. La más importante es watch que se queda en espera de algún cambio en el código y ejecuta las funciones programadas.
2) Módulo de consola o terminal: Nos permite ejecutar grunt desde la consola. Se instala de la siguiente forma: npm install -g grunt-cli
3) Archivo gruntfile.js: Es el archivo que define todo lo que tiene que hacer grunt.

Bower

Cuando mostré el proyecto anteriormente, omití algunas carpetas para simplificar el proyecto. El proyecto completo es el siguiente:


Dentro de la carpeta public hay 2 carpetas importantes "vendors" y "vendors/bower_components".

Al igual que npm, Bower es un repositorio que se utiliza desde la consola, sólo que en vez de manejar los módulos de Node maneja los vendors. Se le llama vendors a las bibliotecas de funciones de otras empresas utilizadas en tu proyecto del lado del cliente. Por ejemplo: JQuery, Angular, PhoneJS, DevExtreme, Boostrap. Se usa exactamente igual que npm pero el archivo donde almacena las dependecias se llama bower.json en vez de package.json.

lunes, 30 de enero de 2017

VirtualBox Error: Disconnect reason: I: MCS: Disconnect Request I: RDP CLIENT: The server has dropped connection

Error: Disconnect reason: I: MCS: Disconnect Request I: RDP CLIENT: The server has dropped connection


Si alguna vez recibes este error nada intuitivo al intentar conectarte desde la consola web de Virtual Box es por que hay otra instancia de la consola web abierta.

Verifica que no hayan otras personas de tu equipo conectadas, si no hay nadie, puede que tengas un intruso en tu red, por lo que tendrás que chequear las solicitudes al puerto en especifico de tu equipo.

Una vez desconectado el usuario que tiene tomado el equipo el problema desaparecerá.

sábado, 28 de enero de 2017

Pasar de windows 10 a Linux (debian) - Guía definitiva

Hay muchas guías en internet sobre esto, pero realmente logra crear un paso facil, sin errores y explicando todos los inconvenientes que conlleva este cambio. Puede ser porque la mayoría de estos articulos son creados por personas que manejan linux y les hacen un favor a la gente de windows para que logren el cambio.

En esta guía se asume que usas regularmente Windows 7, 8 o 10 y que es un computador de uso personal.

Esta guía tendrá dos secciones (pero te recomiendo que la leas desde el comienzo):
  • Usuario común: sólo necesita manejar programas de ofimática (Office), explorador de internet, música y video.
  • Usuario avanzado: necesita las funciones de los usuarios comunes y una o más de las siguientes funciones:
    • Control remoto
    • Programación
    • Instalar programas no comunes.
    • Servidores web, mail, base de datos, archivos, etc.

Usuario común 

Posiblemente tu computador vino instalado con Windows. Si haz llegado acá es porque sabes que hay otras opciones además de tu sistema operativo. Linux puede tener muchas ventajas y desventajas respecto a Windows, pero te enumero las que posiblemente más te interesen.

  • Ventajas:
    • Repositorios: similar a Google Play de Android o AppStore de Apple. Te permite acceder a una gran cantidad de programas de forma segura y facil.
    • Es más rápido: lo notarás de inmediato. Los programas serán más agiles.
    • Más programas al mismo tiempo: tiene mejor gestión de los recursos.
    • No necesita antivirus: si te limitas a usar los programas de los repositorios. Posiblemente si lo necesitarás si utilizas muchos programas no muy comunes.
    • Muchas distribuciones y escritorios (tiene otro nombre pero para entendernos): en Windows siempre tiene los programas abiertos en la barra de tareas y para acceder a los programa tienes que presionar el botón de inicio. En linux tienes muchas opciones para esto.
  • Desventajas:
    • No hay un equivalente 100% de Office: hay algunos programas que se le parecen visualmente y otros que se comportan de manera similar al utilizar gráficos, celdas y parrafos pero ninguno que lo reemplace completamente. Posiblemente si no trabajas en una oficina esto no te afecte.
    •  Puede que tengas problemas con los controladores: Los controladores (o drivers) son programas que logran que tu sistema operativo pueda enviarle instrucciones a tus parlantes. puerto usb, puerto de cable de red, wifi, etc.

Debian

 Usaremos Debian como destribución para el cambio. Acá muchos me diran: "¿Por qué si Ubuntu es más facil?, tiene un mejor explorador de archivos y viene sudo instalado por defecto.", el problema es que en Windows no existe nada equivalente a sudo y lo que buscamos en un paso

[DevExtreme] Traducir o cambiar localización de DevExtreme 16.1+

DevExtreme ocupa la librería globalizejs para controlar los textos de la mayoría de sus widgets. Globalizejs es una librería que nos permite internacionalizar (también llamado i18n como abreviación de internationalization por la cantidad de letras entre la 'i' y la 'n') nuestra aplicación.Esto quiere decir que podremos cambiar el idioma de nuestra aplicación fácilmente.

Repaso

Antes de la versión 16.1 de DevExtreme, este ocupaba la versión 0.1.3 de globalizejs que la mayoría de los desarrolladores podían utilizar fácilmente ya que era sólo llamar al archivo javascript de Globalize y otro archivo donde definíamos los textos (llamado diccionario). Con esto ya teníamos el sitio en nuestra idioma local.

Desde la versión 16.1 de DevExtreme, este necesita la versión 1.x de globalizejs. Desde la documentación ponen una guía (link) de como deberíamos definir los texto que queremos traducir.

Resumiendo, nos indican que se debemos crear un archivo html que debe implemetar DevExtreme y este nos permitirá exportar el archivo diccionario en una de las idiomas que viene por defecto y luego nosotros tendremos que traducirlo y renombrarlo a "dx.all.es.json". Una vez traducido debemos llamarlo de la siguiente manera y todo funcionará.

$.when(
    $.get("dx.all.es.json")
).then(function(data){
    Globalize.loadMessages(data);
});

Además menciona que debemos importar un motón de diccionarios (link) sin explicarnos mucho de que hacen y porque son tantos. Esto sin mencionar que su guía no funciona.

CLDR

Son bloques (en nuestro caso archivos js) construidos con un propósito clave (fechas, monedas, números, periodos, etc). Dice ser el mayor y más extenso repositorio estándar de datos de localización disponibles. Trabajan en formato unicode lo que quiere decir que soporta una infinidad de codificaciones cómo las de los idiomas árabe, chino, coreano y muchos más.

Desde la versión 1.x de Globalizejs obtiene los datos de CLDR

En construcción...

viernes, 23 de septiembre de 2016

[SQL Server] Convertir número Año-mes a fecha de manera simple

Muchas veces tenemos procedimientos almacenador de los que su resultado depende de fechas.

Si la fecha es un día en particular bastaría con declarar un parametro de entrada de esta manera:
declare @fecha date

O si además necesitamos la hora la declaramos así:
declare @fecha datetime

El asunto aparece cuando sólo necesitamos discriminar por un año y mes en particular. Nos puede llegar un valor cómo este:
declare @fecha_codigo int -- 201605, 201504 o 200001

Para convertir este valor intuitivamente podemos pensar en una función como esta:
declare @fecha date
    set @fecha = substring(cast(@fecha_codigo as varchar(6)), 1, 4) + '/' + substring(cast(@fecha_codigo as varchar(6)), 5, 2) + '/01'
El problema de esta función es que dependiendo de la versión de SQL Server nos puede asignarel día y el mes al revés generando fechas erroneas.

Para prevenir cualquier error en la generación de la fecha la genereramos de esta manera, que no tiene ningún problema entre las versiones de SQL Server:

declare @fecha date
set @fecha = convert(date, cast(@fecha_codigo * 100 + 1 as varchar(8)), 112)
Cuando se utiliza la función CONVERT con fecha tiene dos modos de uso:
1) Para generar una fecha con un formato especifico de tipo varchar desde una fecha de tipo date o datetime.

2) Para generar una fecha date o datetime a partir de un varchar con un formato especifico.

El formato especifico al que me refiero es el tercer parametro de la función convert.
Pueden ver la lista completa acá.

Especificamente el 112 es el formato "yyyyMMdd" que nos permite generar la fecha.

Dentro cast varchar(8) está el siguiente código:
@fecha_codigo * 100 + 1

Esto convierte nuestro año-mes (yyyyMM) en formato "yyyyMMdd" concadenando el día 1. Y así haciendolo compatible con el formato 112 de fechas.