Cómo instalar Git e iniciarse en los mundos del versionado

Si en tu día a día te dedicas a desarrollar software seguro que conoces Git, espero por tu bien, si no te suena de nada bueno… no te preocupes porque te voy a explicar qué es y cómo puedes instalar Git en tu máquina.

En el desarrollo a nivel serio tenemos que asegurarnos de alguna forma que el código que estamos produciendo esté guardado en algún servidor para que si un día nuestro ordenador muere podamos volver a acceder a el fácilmente.

Vamos, un servidor de backups diría alguno….

Si, pero con mas cosas.

Estos servidores son llamados como servidores de control de versiones y permiten llevar un control exacto sobre los cambios en los ficheros que ahí se guardan.

Da igual el tipo de archivo que subas ahí (algunos no se aconsejan) que podrás ver el histórico de… si se ha añadido algo nuevo… se ha borrado algún fichero… otro compañero ha modificado parte de un documento… etc…

¿Se entiende no?

Pues este tipo de servidores se configuran con cierto software. En el mercado existen muchas opciones pero el que ya se ha convertido casi en un estándar es Git y hoy vamos a aprender a usarlo.

 

¿Qué es Git?

Aunque ya te lo he explicado antes hablando de los servidores VCS…

Según la Wikipedia:

Git (pronunciado “guit”​) es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en archivos de computadora y coordinar el trabajo que varias personas realizan sobre archivos compartidos.

 

Primer paso: Instalar Git

Lo primero que tienes que sabes es que Git es un programa puramente de consola, de terminal, de línea de comandos… como quieras llamarlo pero de esa ventanita negra con solo letras.

terminal de comandos

Así que, si estas empezando a programar ves quitándote el miedo ella porque la vas a tener que utilizar si o si.

Voy a decir también que existen programas de escritorio que añaden una capa gráfica, visual y por encima de Git que tal vez a los mas novatos les funcione.

Pero es mejor trabajar cuanto antes desde la línea de comandos.

Así que….

 

Cómo instalar Git en Linux

Si tu ya tienes alguna distribución basada en Linux instalada en tu máquina mi enhorabuena. Ya has hecho un gran paso para perderle el miedo a la terminal de comandos.

Imagino que si estas leyendo esta parte es por que tienes un Ubuntu así que voy a poner el ejemplo de instalar Git en Linux sobre esta distribución pero si tienes otra por ejemplo que este basada en Debian, por ejemplo Mint, no te costará tampoco mucho esfuerzo.

Tenemos que abrir la terminal de comandos. Desde el mismo Dash buscando por terminal o desde el Escritorio y pulsando Control, Alt, T (ctrl + alt + t) podremos abrir la consola y empezar a jugar a ser juanquers.

 

Soy programador

 

Una vez que tengamos la consola abierta tenemos que escribir lo siguiente:

sudo apt-get update

Este comando lo que hace es actualizar el repositorio de paquetes disponibles. Es decir, las referencias que le dicen dónde esta el software que queremos instalar.

Cuando se haya actualizado ya podemos instalar Git en Linux escribiendo lo siguiente:

sudo apt-get install git

Déjalo que se vaya instalado solo y cuando acabes ya podremos empezar a usar Git como un loco.

Puedes comprobar que se ha instalado correctamente Git comprobando la versión.

Si ejecutas la siguiente línea:

git version

Te debería salir lo siguiente:

Comando Git version
Comando Git version

Cómo instalar Git en Mac OS X

Es muy posible que ya lo tengas instalado. Algunas versiones de OS X ya viene con Git instalado por defecto, junto a otras herramientas.

Pero en caso de que no lo tengas instalado al ser un sistema operativo basado en UNIX, su proceso de instalación es igual de sencillo que cuando se instala en Linux.

O incluso mas!

Entra en esta dirección https://git-scm.com/download/mac y comenzará a descargarse el paquete instalador.

Cuando lo tengas abierto lo demás es ya Siguiente > Siguiente > Siguiente.

instalar git en mac

Una vez que se termine de instalar podemos comprobar que todo el proceso ha ido bien escribiendo:

git version

Pero también podemos instalar git de otra forma y es desde la terminal…

Instalar Git en Mac desde la terminal de comandos

Puedes hacerlo desde Homebrew, si no tienes esto ya instalado en tu Mac ya estás tardando porque simplifica enormemente el proceso de instalación de software.

Para instalar Homebrew que después nos ayudará a instalar Git abre la terminal y escribe lo siguiente:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew doctor

Esta línea comenzará el proceso de instalación y te preguntará además que si deseas instalar las herramientas de desarrollo de línea de comandos de Apple. Instálalo todo y ejecuta la siguiente línea:

brew install git

Ya está, ya lo habrás instalado. A disfrutar!

 

Cómo instalar Git en Windows

¿Quién dice la Wikipedia que ha creado Git?

Linus Torvals, el padre de Linux. Por lo cual podemos deducir que este programa no chutará bien en Windows. Ya sea por limitación y/o arquitectura de Windows contra Linux.

Pero aun así podemos instalar Git en Windows fácilmente. Desde la propia página web de GIT nos ofrecen una herramienta con la que podemos emular comandos pensados para sistemas Unix en nuestro flamante y no-espiador Windows 10.

Git Bash se llama.

Entra en la web https://git-scm.com/download/win y automáticamente empezará descargar del ejecutable que te va a instalar Git y Git Bash, la capa de abstracción entre los dos sistemas.

Cuando lo tengas descargado, ejecútalo y lo siguiente ya es hacer click como un loco en Siguiente, Siguiente, Siguiente.

Poca configuración lleva…

instalar git en windows
Instalar git en windows

 

Elegir el directorio donde se va a instalar GIT

Addons de Git en Windows

Mas configuración

Mas configuración git

200 años mas tarde

Instalando Git en Windows

terminal de git bash

Bravo 👏👏

 

Clientes de escritorio para Git

Para que no tengas que aprender a manejar Git (no recomendado) desde la consola he recopilado un par de clientes de escritorio que a pesar de ser un buen apoyo en cuestiones de logging también nos permite hacer lo mismo que se hace desde la terminal.

Hay clientes de escritorio tanto para Windows, para Mac OS X como para Linux, pero los mejores son los siguientes:

Sourcetree

Sourcetree logoEste bicho es compatible para ordenadores tanto con Windows como con Mac.

Tiene una interfaz muy clara y muy limpia lo que lo hace ideal para los que están empezando con el control de versiones aunque también es realmente útil para la gente que ya domina Git.

Puedes usarlo tanto para Git como para Mercurial (otro tipo de software de control de versiones) y entre sus ventajas tenemos:

  • Soporte para ficheros grandes
  • Integración con Git-flow
  • Soporte para submódulos en la administración de proyectos
  • Búsqueda en el local stage de commits

sourcetree atlassian

Por estas y otras razones junto a que es un programa totalmente gratuito lo recomiendo como una de las mejores opciones para Windows. Pero no para Mac, que tiene cosas mejores.

Puedes descargar Sourcetree desde aquí.

Github Desktop

Github Desktop logoAunque personalmente no lo he probado ya entrar en la web hace que te den ganas de bajártelo.

Tanto la web como el programa tiene un diseño realmente cuidado sabiendo diferenciar lo que es muy bien la parte del git log y su histórico de la parte de revisión de código.

Es otro de los programas que también van a funcionar tanto en Windows como en Mac.

A parte de integrar todas las funciones que integra cualquier otro cliente de escritorio de git, un punto a favor que le he visto es que en cada commit se integra el resultado de los tests de Integración Continua.

programa github desktop

Puedes descargarlo desde aquí y es gratis también.

Si quieres ver como han construido este programa puedes hacerlo desde su repositorio de Github.

GitKraken

gitkraken logo

La corona entre el hypeo maquetero.

Pese a ser un programa multiplataforma y encontrarse tanto en Linux como en Mac como en Windows, no se por qué pero una gran cantidad de usuarios de Mac sólo utilizan este programa…

La verdad es que este software si que te entra por la vista muy fácilmente ya que su diseña está cuidadísimo en extremo.

Tiene una versión gratuita para usos no comerciales y otra de pago para empresas. La verdad es que se entiende tanta emoción alrededor de este programa simplemente por los partners que tiene detrás .

Hay compañías como Lego, Tesla, Google o Amazon que están usando sus soluciones así que es una buena garantía de uso.

gitkraken

Podeis descargarlo desde aquí.

 

Conclusiones

Con todo lo que hemos visto ya tendríamos suficiente para poder instalar git en cualquier sistema operativo y comenzar a usarlo con nuestros proyectos.

Otra cosa ya es cuando entremos en el uso de sistemas distribuidos de git como cuando alojamos nuestros proyectos en Github o Bitbucket, pero para comenzar a tirar comandos de git con esto ya tienes de sobra.

Durante el artículo he dejado claro que soy un usuario pro-terminal siempre. He tenido, tengo y tendré clientes de escritorio de git toda mi vida, pero ahí se quedan cogiendo polvo porque no los uso.

Haz el esfuerzo y aprende a utilizar git desde la consola.

Sus ventajas son muchísimas.

Pero si aun así no te sientes seguro o prefieres hacerlo con una interfaz gráfica tira hacia GitKraken, es el mas bonito de todos.

Al fin y al cabo con todos puedes hacer lo mismo.

GitKraken es fantasía pura.

magic

Anuncios

Utilizando contenedores Docker con Nodejs

Seguimos con los artículos dedicados al desarrollo de aplicaciones haciendo uso de javascript del lado del servidor. En este post vamos a ver cómo podemos aprovecharnos de la tecnología de contenedores Docker con NodeJs.

En un artículo anterior ya hice una comparativa entre Docker y Vagrant pero para el que venga de nuevas y antes de entrar en materia tenemos que conocer qué es Docker.

Según la Wikipedia:

Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de Virtualización a nivel de sistema operativo en Linux.

¿Eing?.. ¿Se te ha quedado cara de bobo tras leer eso? No te preocupes que voy a tratar de explicarte qué es Docker desde otra aproximación.

Imagina que puedes construir toda una aplicación funcional, con sus librerías, assets y dependencias de manera aislada.

Esta aplicación siempre te va a funcionar en cualquier ordenador en el que esté alojada. Ningún conflicto mas entre versiones ni librerías perdidas.

Olvídate de eso.

Tu metes tu aplicación en una cajita y te aseguras que dejes donde dejes esa cajita siempre va a funcionar.

Pues algo así es Docker y así es cómo nos ayuda.

Nos permite aislar los componentes de la aplicación del resto del sistema operativo asegurándonos que siempre va a funcionar.

Obviamente el uso de Docker está muy ligado tanto a entornos de desarrollo como a despliegues de aplicaciones, pero ahora que ya tienes una idea aproximada de qué son estos contenedores vamos a ver cómo podemos usar Docker con Nodejs.

Aprender a usar Docker con NodeJs

La finalidad de este ejemplo va a ser enseñarte como conseguir que tu aplicación NodeJs corra dentro de un contenedor Docker. Nos vamos a centrar bajo la óptica del entorno de desarrollo no en la de despliegue en producción así que si usas este ejemplo para hacer una subida a producción y peta luego no quiero represalias 😛

Podríamos utilizar el ejemplo que hemos venido desarrollando en artículos anteriores sobre cómo construir una aplicación NodeJs pero como el fin último de este articulo es aprender a configurar Docker con NodeJs vamos a crearnos una aplicación pequeñita desde cero.

Docker nos va a permitir empaquetar toda nuestra aplicación junto con sus librerías y dependencias en una unidad estandarizada y atómica, esto es lo que se conoce como contenedor docker.

Otro concepto importante del universo docker que hay que conocer son las imágenes y esto es el software que se va a cargar dentro del contenedor previamente creado.

Creando una aplicación NodeJs

Lo primero de todo, créate en tu workspace un directorio para la aplicación. Al mío yo le he llamado directorio_para_aplicación_nodejs_guay_con_docker. ¿Bastante intuitivo no creéis?

Bien, en este directorio residirán todos los ficheros de tu aplicación pero el primer fichero necesario para empezar es el package.json el cual sirve de descripción de tu aplicación y de todas sus dependencias.

Bien, una vez hecho esto vamos a crear el fichero que definirá la aplicación web haciendo uso del framework Express. Esto es, el fichero server.js.

A continuación vamos a ver cómo podemos crear esta aplicación tan tonta dentro de un contenedor de Docker usando para ello la imagen oficial aunque antes de eso es necesario que creemos la imagen Docker de la aplicación.

Creando el fichero Dockerfile

En el mismo directorio en el que hemos puesto los dos ficheros anteriores, vamos ahora a crear uno nuevo que se llame Dockerfile.

Este fichero contendrá las instrucciones necesarias para que Docker sepa cómo ha de construir la imagen que albergará la aplicación NodeJs.

Este fichero se ve tal que así:

Pero vamos a ir paso a paso:

  • La primera línea indica que tipo de imagen queremos construir. En este caso estamos haciendo uso de la versión de largo soporte (LTS) de argon para NodeJs. Puedes ver otras imágenes desde Docker Hub.
  • Las siguientes líneas le dicen a Docker que tiene que crear un directorio bajo /usr/src/app (hablando siempre desde dentro del contenedor) y establece este path como su directorio de trabajo
  • Después se le dice a Docker que copie el fichero de definición de la aplicación NodeJs (package.json) al directorio de trabajo creado en previamente y que ejecute las dependencias que tiene la aplicación. Al usar node:argon (primera línea) ya tenemos disponible NPM y NodeJs.
  • Ten presente que en lugar de copiar todo el directorio de trabajo tan solo estamos copiando el fichero package.json dentro del contenedor. Esto nos permite aprovecharnos de las diferentes capas cacheadas de Docker. Si quieres profundizar un poquito mas y saber que carajos son estas capas cacheadas échale un vistazo a este artículo.
  • La siguiente línea o instrucción le dice a Docker que copie todo el directorio de fuera del contenedor al directorio de dentro del contenedor. Es decir, en este ejemplo solo copiará el fichero server.js pero si tu aplicación tuviera mas cosas las copiaría todas pa’ dentro.
  • También tenemos que exponer un puerto a través del cual se comunicará el mundo exterior con nuestro contenedor. Es típico poner siempre el puerto 8080 aunque puedes elegir el que mas te guste siempre y cuando no esté dentro de los Well-Know Ports.
  • Por último pero no menos importante, hay que definir el comando a ejecutar a través de la terminal para nuestra aplicación. En el ejemplo usamos el inicio típico y básico de una aplicación NodeJs el cual ejecutará el fichero server.js.

Poh’ ya está. Con esto ya tenemos definido el fichero que dará vida a nuestra imagen Docker.

Construyendo nuestra imagen

Para ello vamos a ir al directorio en el que tenemos el fichero Dockerfile y ejecutaremos en una terminal el siguiente comando para que Docker construya la imagen Docker con Nodejs.

docker build -t node-web-app .

El parámetro -t del comando anterior te permite darle un nombre a la imagen por lo que es mas fácil después encontrar la imagen al hacer uso de docker images. A nuestra imagen la hemos llamado node-web-app, también muy original… xD

Al listar las imágenes disponibles con docker images tendríamos que ver lo siguiente:

$ docker images

# Example
REPOSITORY                      TAG        ID              CREATED
node                            argon      539c0211cd76    3 weeks ago
node-web-app                    latest     d64d3505b0d2    1 minute ago

Corriendo nuestra imagen Docker

Aquí hay varias opciones de configuración al correr una imagen que puedes consultar en la documentación oficial de Docker pero para no liarnos mas ejecuta el siguiente comando:

$ docker run -p 49160:8080 -d node-web-app

La opción -d le indica a Docker que tiene que ser ejecutado en modo detached, esto es, que corra el contenedor en segundo plano. Por otro lado, la opción -p lo que permite es redirigir todas las consultas desde un puerto público hasta el puerto privado del contenedor que hemos definido en el fichero Dockerfile.

En este caso estamos mapeando el puerto 49160 con el puerto 8080.

Una vez hayas ejecutado el comando anterior ya tendrás tu contenedor Docker con NodeJs corriendo satisfactoriamente y podrás acceder a tu aplicación a través de http://localhost:49160

Si hacemos una petición curl a la url anterior obtendremos lo siguiente:

$ curl -i localhost:49160

HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
Date: Sun, 02 Jun 2013 03:53:22 GMT
Connection: keep-alive

Que pasa gandul!

Como veis ya tenemos nuestra aplicación corriendo. Ha sido facilísimo configurar Docker con NodeJs pero por si acaso alguno tiene dudas o se ha liado en algún punto y me quiere preguntar algo hacedlo por favor en la sección de comentarios o en twitter a través del siguiente banner.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hasta la vista chumachos!

Cómo hacer una API REST con Node.js

En artículos anteriores hemos visto cómo hacer la primera configuración de las herramientas que vamos a instalar así como a organizar nuestro proyecto utilizando el patrón Modelo-Vista-Controlador. Pues bien, hoy toca entrar en materia y vamos a comenzar a hacer una API REST con Node.js.

Un primer paso necesario para seguir estudiando Node.js y una buena base para que después podamos crear una aplicación SPA, o consultar la API desde un proyecto Symfony o para hacer que nuestra aplicación móvil pueda explotar esos datos oooo yo que sé…. las posibilidades son infinitas así que empecemos!

Cómo hacer una API REST con Node.js

A lo mejor a mas de uno esto de hacer una API REST con Node le suena a chino así que lo mejor que podemos hacer es ver primeramente qué es eso de una API REST.

¿Qué es una API REST?

Pues es lo que se conoce como una interfaz de comunicación entre clientes que utilicen el protocolo HTTP. Para que se entienda, es el canal por el cual tu móvil le dice a los servidores de Clash Royale que has abierto un cofre y te ha tocado el mago eléctrico o por ejemplo es el canal que utiliza Instragram para subir las fotos que haces con tu smartphone a sus servidores.

¿Se entiende el concepto?

Hoy en día podemos encontrar usos de APIs en casi toda cosa tecnológica que nos imaginemos pero el concepto de API no es nuevo ya que hace años existía otro tipo de APIs que parecía ser el rey del desarrollo. Hablo de SOAP y su intercambio de datos mediante XML. Hasta que debido a su facilidad llegaron las API REST y el intercambio mediante JSON.

Principalmente con una API REST vamos a echar mano de lo que se conoce como verbos HTTP. En concreto 4 y cada uno de estos verbos los utilizaremos para una acción u operación diferente con los datos que queremos manipular.

Así pues:

  • Cuando queramos subir una imagen nueva a Instragram utilizaremos el método POST del protocolo HTTP.
  • Cuando queramos saber cuántos seguidores tenemos en Twitter utilizaremos el método GET del protocolo HTTP.
  • Cuando queramos eliminar nuestro último estado de Facebook utilizaremos el método DELETE del protocolo HTTP.
  • Cuando queramos actualizar la foto de perfil de Snapchat utilizaremos el método PUT del protocolo HTTP.
  • Cuando queramos ver la lista de seguidores de VK utilizaremos el método GET del protocolo HTTP.

Hasta aquí esto es lo mínimo que podemos hacer con una API REST pero si quieres saber mas te recomiendo que le eches un vistazo a este artículo en el que se explica muy bien toda esta película, que nosotros nos vamos a poner a hacer ya una API REST con Node.js 😀

Cuatro verbos para dominarlos a todos

¿Os acordáis de la aplicación sobre álbumes musicales que empezamos a crear en los artículos anteriores? Si no te acuerdas o todavía no los has visto retrocede un poquito en el tiempo desde este enlace y desde este y cuando los hayas terminado vuelve aquí para seguir con la API REST con Node.js

Pero para el que si que se acuerde mediante el patrón MVC llegamos a organizar los ficheros de nuestro proyecto de una forma lógica y funcional ¿no?

También te acordarás de que hicimos un pequeño controlador para probar ¿no? De hecho llegamos a definir los métodos mínimos que tiene que tener nuestra API pero la gran mayoría de estos métodos lo único que hacia era recibir los datos de la request y devolverlos en la response. No había lógica de negocio alguna.

Pues ha llegado el momento de darle cuerpo a esos métodos 🙂

Método GET, consultar datos en una API REST con Node.js

Este es el primer verbo que vamos a ver de nuestra API REST con Node.js y es que tiene dos aplicaciones. Por un lado podemos utilizarlo para que nos devuelva un listado de elementos y por otro lado si le pasamos un identificador (lo mas normal debido a su unicidad) obtendremos los datos de un solo registro.

Aclaro que no es necesario pasar un id, podemos pasarle cualquier parámetro aunque en los métodos tipo getBy lo mas normal es pasarle el identificador.

Fijaos, aquí tenemos el ejemplo de estos dos métodos GET de la API y que nos devolverán ya sea un elemento o varios elementos. Pero hay varias cosas importantes que explicar:

  1. Hay que incluir el modelo, eso se hace en la primera línea del código anterior mediante un require.
  2. Mediante la sentencia req.params.id de la linea 4 estamos accediendo al valor que le pasamos a la ruta como parámetro.
  3. En la línea 6 encontramos el método findById() que es definido por el ORM de Mongoose y que nos provee de una capa de abstracción para explotar datos. Este método acepta el identificador que ha de buscar y una función de callback.
  4. Línea 20 encadenamos el método find() y el método de ordenación sort(). Si al método find() no le pasamos ningún argumento tan solo un objeto vacío por defecto nos sacará todos los registros de ese modelo de nuestra base de datos. Por otro lado, el método sort() espera un argumento por el cual ordenar el listado.

Estos dos métodos de nuestra API matchearán con las siguientes rutas (recuerda, has de tenerlas definidas)

Método POST, guardar datos en una API REST con Node.js

Bien, el siguiente método que vamos a construir es el que se encarga de guardar datos y va a ir por POST.

  • Si antes accedíamos a los argumentos pasados por GET en la ruta mediante la sentencia req.params.id, ahora para obtener los valores pasados por el método POST tenemos que hacer uso de la sentencia req.body (línea 3)
  • Seteamos los valores de la instancia del modelo con lo que nos ha traído la petición POST de la línea 5 a la línea 8.
  • Hacemos uso del método definido por Mongoose save() para guardar estos datos. Este método acepta una función de callback que recibirá el error en caso de producirse o el objeto ya almacenado.
  • Lo demás es hacer unas comprobaciones mínimas para asegurar la integridad de los datos y a correr 🙂

Método PUT, actualizar datos en una API REST con Node.js

Este es el método de nuestra API que se va a encargar de actualizar datos.

  • Va a recibir los datos a actualizar mediante POST (línea 2)
  • Va a recibir el identificador del objeto a actualizar mediante GET, a través de la URL (línea 3)
  • El método findByIdAndUpdate() nos es provisto por el ORM Mongoose y acepta el identificador del objeto a actualizar, los datos a actualizar y una función de callback con el error (si es que hay alguno) y el objeto ya actualizado.

He de aclarar que gracias al middleware body-parser y que ya aprendimos a instalar en los artículos anteriores, todo lo que nos llegue por POST es transformado en objeto automáticamente, así podemos manipular los parámetros de una forma bien sencilla.

La URL definida para este método ha de ser de la siguiente forma:

Método DELETE, borrar datos en una API REST con Node.js

El último método del CRUD de nuestra API REST con Node.js es el método que se va a encargar de borrar y que funciona a través del método DELETE del protocolo HTTP.

  • Este método aceptará un único argumento que se pasa por la URL (el identificador del objeto) y que recogemos mediante la sentencia req.params.id (línea 2)
  • Gracias al ORM Mongoose podemos hacer uso del método findById() para encontrar el objeto que coincida con el identificador pasado por parámetro (línea 4).
  • Gracias al método remove() podemos eliminar el objeto solicitado (línea 9)

Con esto ya tenemos los 5 métodos necesarios para que el CRUD de nuestra API REST con Node.js funcione pero claro, necesitamos un modelo de datos para que transforme los datos que recibimos en objetos que podamos manejar mas facilmente.

Ademas que realmente el modelo es necesario para que corran los códigos anteriores…. 😛

Ea ahí tenéis el modelo de datos. Ese fichero ha de situarse en el directorio de models según la definición del patrón Modelo-Vista-Controlador y que aprendimos en el artículo anterior.

Vale Gorka, ya hemos aprendido a construir una API REST con Node.js perfecto, pero ahora… ¿cómo la probamos?

Pueeees para probar la API vamos a hacer uso de una extensión muy buena que se llama Postman y que podemos descargar desde aquí si utilizas Chrome.

He grabado un vídeo para que veáis cómo se usa.

Aprende a utilizar mongodb en node js como un PRO

Las bases de datos relacionales son para pussies. Muerte a MySQL y que vivan las bases de datos NoSQL. Si las grandes tecnológicas dieron el salto en su día por algo será y hoy vamos a aprender a utilizar MongoDB en Node JS!!

Jajajaja realmente la afirmación anterior no es tan tajante, no te vayas a pensar que las bases de datos relacionales han muerto para dar paso a este nuevo tipo de concepción. Eso es falso y si hay algún recruitmen de consultora que te lo dice huye rápido de su despacho.

Estos dos tipos de bases de datos están pensadas para solucionar problemas diferentes. Ya hice un artículo en el que hablaba de las diferencias entre MySQL y MongoDB y que puedes leer aquí así que échale un vistazo antes de utilizar MongoDB en Node JS 😉

Cómo instalar MongoDB en nuestra máquina

El primer paso como es lógico será instalar MongoDB en nuestra máquina. No quiero entrar mucho en detalle porque en la página de la comunidad de mongodbspain esta muy bien explicado así que me voy a limitar a dejar los enlaces:

Una vez lo tengas instalado hay un punto clave que tienes que tener en cuenta.

Para utilizar MongoDB en tu máquina es necesario que el demonio esté ejecutándose. Obviamente al igual que con otras bases de datos pero con MongoDB lo tienes que levantar tu mismo.

En la documentación de mongodbspain está profundamente ampliado pero quédate con los siguientes comandos:

$ mongod --config /usr/local/etc/mongod.conf

Este comando ejecuta el demonio y si le añades el flag –fork harás que mongo corra en segundo plano.

$ mongod --config /usr/local/etc/mongod.conf --fork

Si quieres hacer que mongo se ejecute de manera automática cuando enciendes el ordenador lanza los siguientes comandos.

//Iniciar el proceso principal mongod de MongoDB al iniciar sesión:
$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
 
//Iniciar MongoDB ahora en background y dejarlo en ejecución
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

Bien, con esto anterior ya habrás configurado esta base de datos no relacional y orientada a objetos en tu máquina. Ahora viene lo divertido y vamos a ver como utilizar MongoDB en Node JS.

Cómo utilizar MongoDB en Node JS

El primer paso para utilizar mongodb en node js es crearnos una base de datos, para ello abrimos una terminal y escribimos mongo. Esto nos conectará con el sistema de base de datos.

A diferencia con MySQL en la que para crear una nueva base de datos teníamos que pelearnos con los CREATE TABLE y definir una estructura con MongoDB eso no pasa.

Una vez conectados tenemos que indicar que queremos usar una base de datos e insertar un registro para que el sistema la construya on-the-fly. Sigue los pasos 😉

$ mongo
> use base-de-datos-de-prueba
> db.albums.insert({id: 1, band: 'Las Bistecs', album:'Oferta'});

Con esto ya habremos creado la base de datos y habremos insertado un nuevo registro en la colección de albums.

Vale ya tenemos lo básico pero… ¿cómo hacemos para conectar MongoDB con Node JS?

Pues eso lo vamos a hacer utilizando Mongoose que es un ORM.

Para el que no conozca qué son y cómo funcionan los ORM le dejo este enlace de la Wikipedia.

Conectar MongoDB a Node JS mediante Mongoose

Para ello vamos a instalar Mongoose tirando del gestor de dependencias NPM. Así pues en la terminal escribimos lo siguiente:

$ npm install mongoose --save

Ya sabéis, el flag –save para que guarde una copia en el directorio node_modules y actualice el package.json.

Una vez se haya instalado deberías tener el entrypoint de tu aplicación node parecido al que voy a poner a continuación. (En el post anterior expliqué cómo organizar un proyecto con node js y qué es eso del entrypoint, échale un vistazo desde aquí)

  • Línea número 3: incluímos el módulo mongoose para poder utilizarlo dentro de nuestra aplicación.
  • Línea número 8: hacemos uso del método connect. Este método acepta dos argumentos. El primero es la cadena de conexión a dónde tenemos que conectarnos y el segundo es la función callback. Fíjate en la cadena de conexión. Lo primero que hay que indicar es el protocolo (mongodb en este caso), después el nombre del host donde esté la base de datos (localhost, nuestra máquina local en este caso), después el puerto por defecto de MongoDB (27017 en este caso) y por último la base de datos a la que queremos conectarnos (base-de-datos-de-prueba en este caso)
  • Línea número 9: comprobamos si ha habido algún error de conexión y en caso contrario levantamos el servidor node

Y ya está, eso es todo.

Con esto ya podrás utilizar MongoDB en Node JS, es lo mínimo en cuanto a configuración se refiere. En el próximo artículo veremos cómo hacer las operaciones típicas de lectura, escritura, actualización y borrado sobre nuestro proyecto.

Y ya sabéis, si tenéis algún tipo de dudas o preguntas hacédmelas llegar en la sección de comentarios o a través del siguiente banner de Twitter.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a cascarla!

Cómo organizar un proyecto Node.js según MVC

Que Node.js sea una moda de desarrollo (esperemos que haya venido para quedarse) no lo discute nadie y como no podía ser de otra forma en esta serie de artículos vamos a aprender a trabajar con este entorno. Ya hemos visto los conceptos básicos en un post previo pero en este nuevo artículo vamos a ver como organizar un proyecto node.js siguiendo un patrón de diseño muuuuy conocido, el MVC.

Cómo organizar un proyecto Node.js de la mejor forma

Antes de entrar en materia deberías saber qué son los patrones de diseño.

Un patrón de diseño es un conjunto de reglas que nos indican cómo tenemos que organizar los ficheros de un proyecto para que este sea efectivo, reutilizable y escalable y siempre buscando la solución a un problema dado.

Existen miles de patrones de diseño diferentes y cada uno se ajusta a una casuística dada pero pongo la mano en el fuego si digo que en el ámbito del desarrollo web el que mas se utiliza es el patrón MVC.

Todos los que trabajamos con frameworks web como podrían ser Spring, Symfony o Angular (por citar diferentes tecnologías…) sabemos qué es el patrón Modelo-Vista-Controlador pero si has caído nuevo en este artículo y no sabes muy bien de que te hablo te recomiendo que le eches un vistazo a esta página de la Wikipedia.

Una vez que te hayas leído la entrada y entiendas el concepto de patrón MVC vamos a empezar a organizar nuestro proyecto Node.js 🙂

Definiendo la estructura básica de la aplicación

Deja de preguntarte ya cómo organizar un proyecto Node.js y dirígete al directorio que contendrá tu aplicación.

Ahí inicializaremos el proyecto con el comando npm init con el objetivo de crear el package.json que definirá toda nuestra aplicación. Cuando el comando termine y tengamos los ficheros básicos creados vamos a montar los siguientes directorios: /controllers,  /models y /routes

  • Directorio controllers: aquí guardaremos los ficheros que se encargarán de controlar cada parte de nuestra aplicación. Tenemos que ser capaces de abstraernos y saber atomizar la app y en consecuencia crear un controlador para cada una de estas partes. Los controladores contendrán la lógica de negocio.
  • Directorio models: en este directorio vamos a guardar lo que son los modelos de datos de la aplicación. Si tu aplicación trata sobre discos de música aquí crearemos una entidad con todas sus propiedades y métodos. Es lo que en Symfony se conoce como Entidad, en Java una POJO y en PHP una POPO.
  • Directorio routers: para hacer mas mantenible la exposición de rutas de cada controlador de tu aplicación en este directorio vamos a guardar la definición de estas rutas. Piensa que si estas construyendo una API a poco que sigas el modelo de API Restful como mínimo vas a tener 4 rutas por cada controlador (método GET, método POST, método PUT y método DELETE)

Una vez creados los directorio mínimos pasaremos a crear el fichero entrypoint (index.js) y el fichero de configuración de la aplicación.

En el fichero que hace la función de punto de entrada de nuestra aplicación, el fichero index.js, vamos a poner la configuración del servidor y a levantarlo.

Pero… y ¿cómo podemos hacer que este fichero “llame a otros”?

Pues como se ve en la línea numero 3 del script haciendo uso del require le estamos indicando a node que queremos que nos cargue el core de nuestra aplicación pero con esto no es suficiente ya que tenemos que indicar algo mas que veremos a continuación.

Este fichero es en el que configuraremos todos los aspectos de nuestra aplicación.

Como puedes leer, en el script estamos cargando el framework express, cargamos el middleware body-parser y si te fijas en la línea 7 cargamos el archivo de rutas.

A raíz de la pregunta anterior, si queremos hacer que un fichero “llame a otro”, a parte de hacer uso de la sentencia require en el fichero destino tenemos que exportarlo mediante el mecanismo de module.exports (última línea)

Una vez exportado ya podremos utilizarlo en cualquier parte de la app siempre y cuando lo carguemos con require.

Vale, hasta aquí todo correcto. Vamos a ver ahora como organizar un proyecto Node.js con sus rutas, sus controladores y sus modelos de datos.

Definiendo uno de los controladores de nuestra app

El controlador es el encargado de contener toda la lógica de negocio de nuestra aplicación. Tiene que actuar como una caja negra, le entran unos datos, los procesa y nos devuelve otros datos.

Hay varias formas de plantear y crear un controlador pero para el ámbito organizativo (no programático) de este artículo vamos a hacer funciones en lugar de clases, solo tenemos un controlador.

Fíjate en la estructura y no en el código, de hecho hace mas bien poco o nada.

Este es sería un controlador típico en un modelo de CRUD en el que implementamos las cuatro operaciones típicas, lectura de datos, creación, actualización de datos y borrado.

Cada función de este controlador hará una tarea diferente por lo que decimos que serán funciones atómicas.

Peeeeero lo importante de toda esta película esta al final del script. Fíjate que al igual que hacíamos en el fichero app.js, en este estamos exportando las funciones que nos interesan para que puedan ser llamadas desde otro fichero, como por ejemplo desde el fichero de definición de rutas.

pERO CUANTAS RUTAS TIENE ESTE TIO???

Ha llegado el momento de definir las rutas de nuestra aplicación.

Y al igual que en el fichero anterior habíamos creado cuatro funciones (bueno en realidad 5 pero dos de ellas internamente sirven para lo mismo, getAlbum y getAlbums, lectura de datos) ahora vamos a crear también 4 rutas y cada una de ellas matcheará con un método HTTP diferente.

Para que no te pierdas este va a ser el esquema de la relación métodos HTTP (API Restful) y funciones:

  • Método GET -> getAlbum() y getAlbums()
  • Método POST -> saveAlbum()
  • Método PUT -> updateAlbum()
  • Método DELETE -> delteAlbum()

Lo mas importante y lo primero de todo es crear el fichero album.js en el directorio de /routes.

Mira bien:

  • Línea número 3: cargamos el framework express.
  • Línea número 4: cargamos el controlador de álbum.
  • Línea numero 5: nos traemos el sistema para definir rutas del framework.
  • Línea 7: definimos una ruta GET para la función getAlbum().
  • Línea 8: definimos una ruta GET para la función getAlbums().
  • Línea 9: definimos una ruta POST para la función saveAlbum().
  • Línea 10: definimos una ruta PUT para la función updateAlbum().
  • Línea 11: definimos una ruta DELET para la función deleteAlbum().

Y con esto ya tendríamos la estructura básica y el artículo montado sobre como organizar un proyecto Node.js.

Por supuesto que faltan muchas cosas, de primeras el modelo de datos (eso lo dejaré para cuando empecemos con MongoDB) pero podríamos meter un directorio para la realización de test unitarios, otro para las vistas en caso en que quisiéramos ampliar la API… otro para utilidades, no sé…

El patrón MVC mínimo sería este, a partir de aquí tu ya Feel Free

Y nada, si tenéis algún tipo de preguntas no dudéis en hacérmelas llegar en los comentarios o a través del siguiente banner de Twitter.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a cascarla!

Aprender Node.js – Realizar el primer setup inicial

Toca renovarse. Después de muchos años usando una tecnología es normal que te hayas podido quedar un poquito estancado en cuanto a los referentes del mercado aunque por otro lado es muy seguro que hayas conseguido dominar esa tecnología y hoy vamos a empezar a aprender Node.js.

En el mundo tecnológico existe una máxima que dice que aproximadamente cada dos años se duplica el número de transistores que soporta un microprocesador. Hablo de la Ley de Moore. Esto es vertiginoso, trata de imaginar lo que supone, la tecnología avanza a pasos exponenciales y con las tendencias de desarrollo pasa casi lo mismo.

Lo que hoy sirve para desarrollar mañana ya no y por eso es muy importante que no caigamos en nuestra zona de comfort y salgamos a aprender lenguajes y tecnologías nuevas.

Por eso el sentido de estos artículos, vamos a aprender a programar con Node.js bajo una configuración de MEAN Stack y para que no nos perdamos empezaremos por el principio de todo.

¿Qué es Node.js?

Antes de entrar en materia y aprender Node.js deberíamos saber como hemos llegado hasta aquí, conocer un poquito la historia del desarrollo de aplicaciones web (tema en el que estoy especializado)

Tipicamente cuando desarrollabas una aplicación web dividías el trabajo en dos mundos. Por un lado tenías la parte Frontend y por otra la parte Backend. Normalmente se empezaba a trabajar primero en el Backend con lenguajes típicos de Backend como PHP, ASP o Java.

Ahí definías tus modelos de datos, tus controladores, servicios y básicamente la lógica de tu aplicación.

Por otro lado y de forma paralela había que ir construyendo la parte Frontend con lenguajes típicos como HTML, CSS y Javascript.

Ahí definías la parte visual, la estructura y la lógica de cara al cliente de tu aplicación/página web.

Esta dicotomía en el desarrollo de una aplicación/página web hizo que a medida que avanzaba la tecnología el mercado y los puestos de trabajo se dividieran en estas dos vertientes.

O te peleabas con la parte visual de la página o te peleabas con las tripas de la aplicación y por lo general el que trabajaba en el back no se entrometía en el front y viceversa. Esto generó muchos puestos de trabajo y muchos profesionales especializados en su “parte”.

Pero y aquí es cuando la matan, llegó un día en el que se “estandarizó” un lenguaje de programación para unir estos dos mundos tan diferentes.

Una herramienta que te permitía con el mismo lenguaje de programación trabajar en la parte Frontend y en la parte Backend. Hablo de Javascript y de Node.js.

Pero para entender qué es Node.js vamos a ver su definición formal de la Wikipedia:

Node.js es un entorno en tiempo de ejecución multiplataforma, de código abierto, para la capa del servidor (pero no limitándose a ello) basado en el lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a eventos y basado en el motor V8 de Google

Esto quiere decir que con Node.js vamos a tener la misma o parecida capacidad de desarrollo que tienen otros lenguajes de programación del lado del servidor pero trabajando con Javascript.

Suena fantástico para todos aquellos Frontend que quieren dar el salto a las aplicaciones de servidor ya que no van a necesitar aprender un lenguaje nuevo sino que se pueden adaptar a Node.js con su experiencia previa y con una de aprendizaje bastante baja.

¿Pero qué ventajas tiene aprender Node.js como para plantearme hacer el cambio?

Pues bueno, uno de sus puntos fuertes es la concurrencia. A diferencia de PHP o Java en el que cada petición genera un hilo de ejecución, con Node.js te tienes que despreocupar de eso ya que funciona de forma asíncrona con un único hilo de ejecución orientado a eventos.

Cuando llega una petición esta se pasa a un pool de eventos. Este pool va consumiendo las peticiones sin bloquear la I/O mientras que el script que lanzó la petición sigue trabajando.

Solo cuando el pool ha terminado de procesar la petición envía un evento que es capturado por el script original y ordena que se ejecute algo definido en la función de callback.

Si quieres profundizar en el funcionamiento interno de Node.js este enlace (ojo, en inglés) te ayudará a entender como funciona toda esta película 😉

http://www.journaldev.com/7462/node-js-architecture-single-threaded-event-loop

Algo que en mis años como programador Symfony siempre me ha encantado es el sistema de bundles que existe.

Un bundle no deja de ser un paquete de código atómico y reutilizable que solventa un problema y que cualquiera puede instalar en su proyecto sin necesidad de reinventar la rueda.

Como no podía ser de otra forma Node.js también tiene algo parecido y son los módulos.

Existen módulos básicos para el manejo de ficheros, de protocolos de red, de Timers, de Streams… pero también existen otros módulos desarrollados por la comunidad y que puedes usar en tu proyecto sin ningún tipo de problemas.

En este enlace puedes ver un listado de módulos típicos y útiles en una aplicación Node.js

https://www.codementor.io/ashish1dev/list-of-useful-nodejs-modules-du107mcv3

Estas dos características y la potencia que tiene el escribir en el mismo lenguaje todas las partes de tu página/aplicación web deberían ser suficientes como para que te plantees el aprender Node.js pero por si todavía tienes dudas aquí puedes ver una comparación de rendimiento entre una aplicación Java y otra construida con Node.js.

Cómo instalar Node.js

Instalar Node.js es muy sencillo, ya estés utilizando Windows, Linux o Mac OS lo único que tienes que hacer es dirigirte a su página de descargas y seleccionar el paquete que te interesa.

Una vez entres en este enlace podrás decidir si descargarte una versión LTS de largo soporte o la última versión liberada. Si vas a utilizar Node.js para producción te recomiendo que te descargues la versión LTS.

Su instalación es muy sencilla, te aparecerá un asistente y realmente tendrás que ir haciendo click en el botón de siguiente (a no ser que quieras configurar algo mas avanzado como el directorio de instalación…)

Junto con Node.js se te va a instalar también NPM que es el gestor de paquetes que utilizamos para manejar las posibles dependencias que tendrá nuestro proyecto.

Cuando haya terminado la instalación podemos comprobar la versión tanto de Node.js como de NPM con los siguientes comandos:

$ node -v 
v7.9.0

$ npm -v
4.2.0 

Si por un casual ha salido una versión nueva de NPM y queremos actualizarnos tenemos estos dos comandos:

$ npm install -g npm
$ npm update -g npm

El flag -g es para instalar/actualizar a nivel global.

Hasta aquí la parte mas sencilla de empezar a aprender Node.js 🙂

Primer script de consola en Node.js

En el camino al zen de aprender Node.js estamos en el primer nivel. Ya hemos configurado todo lo necesario para poder correr aplicaciones hechas con este entorno de desarrollo y lo que vamos a hacer a continuación es crear una pequeña aplicación de prueba.

Al ser Node.js un entorno para programar aplicaciones javascript del lado del servidor parece razonable que todos nuestros scripts sean scripts JS, ¿no?

Personalmente me encantan las aplicaciones de consola, ya sean desde procesos en bash y/o C, C++, los potentes comandos de Symfony o los scripts en Javascript. No hay límite, se puede construir lo que uno quiera pero para este ejemplo vamos a escribir una calculadora sencilla que acepta tres parámetros de entrada.

En el directorio en el que se encuentre nuestro workspace vamos a crear el siguiente fichero:

Vamos a explicar las líneas mas significantes del script:

  1. La primera línea, la declaración del ‘use strict’, sirve para indicar a los navegadores que en el momento de interpretar el código sean mas “estrictos” a la hora de permitir ciertas licencias al programador como por ejemplo el uso obligatorio en la declaración de variables o la captura de errores y excepciones. En definitiva, hacer que tu código sea mejor. Para mas información échale un vistazo a este enlace.
  2. Con la siguiente línea estamos capturando los argumentos pasados en la ejecución del script. Para ello invocamos al método process.argv.slice(2) y lo guardamos en una variable que será un array. El porqué del número 2 dentro de la función slice tiene significado. Piensa en arrays, cuando ejecutemos el script en la terminal, el primer nodo del array estará reservado para el interprete (node), el segundo nodo del array será para el script (calc.js) y el tercer nodo para los argumentos a pasar al script.
  3. El resto de líneas creo que no hace falta explicarlas, javascript y programación básica, asignaciones, casting de datos y sentencias de control. Primero de programación oye!

Para ejecutar este primer script tendremos que hacerlo de la siguiente forma:

$ node calc.js 1 + 4

Decir que los parámetros se tienen que pasar separados, es decir, primer parámetro un número, segundo parámetro un operador y tercer parámetro otro número.

Ah! y son recibidos como strings así que acuérdate siempre de hacer la conversión de tipos (si es que tu script lo necesita)

Hala a jugar! 😛

¿Qué es y cómo instalar Express en Node.js?

Otro tema interesante y necesario en el proceso de aprender Node.js es el uso de Express. ¿Pero qué es Express me preguntaréis…?

Bueno pues Express es una infraestructura para aplicaciones hechas en Node.js que nos provee un conjunto de utilidades como el enrutado de la aplicación, el uso del protocolo HTTP y la capacidad de crear APIs Restful entre otras cosas. A día de hoy no concibo una aplicación node sin express.

Para instalar Express en nuestro proyecto tendremos que echar mano de la terminal y del gestor de dependencias NPM, para ello escribimos lo siguiente:

$ npm install express --save

Y ya está, una vez terminé la instalación ya podremos utilizar Express en nuestro proyecto.

El flag –save indica a NPM que guarde una copia del paquete a instalar dentro del directorio del proyecto y que lo añada a la lista de dependencias. Util cuando le pasamos el proyecto a un nuevo miembro del equipo de desarrollo y tal…

Desde este enlace puedes consultar todas las referencias que nos provee este framework de desarrollo.

¿Qué es y cómo instalar BodyParser?

Es un middleware (es una capa que se ejecuta antes de nuestro código) que nos va a permitir manejar y parsear en objetos JSON las request que hagamos a nuestra aplicación.

Pero no solo va a convertir a objeto JSON la request sino que podemos configurarlo para que haga un parseo a RAW, a texto plano o a lo que en inglés se conoce como “URL-encoded form body” (vale, no se el equivalente en castellano xD)

En su repositorio de github tienes un montonazo de información útil, te recomiendo que le eches un vistazo y que lo utilices en tus proyectos si o si.

Para instalarlo hay que utilizar el gestor de dependencias NPM tal que así:

$ npm install body-parser

Y ya está!

¿Qué es y cómo instalar Nodemon?

¿Sigues queriendo aprender Node.js? Pues una de las utilidades que vas a necesitar en tu camino al zen es Nodemon. ¿Y qué es me preguntarás?

Pues Nodemon es un demonio (o un daemon tal y como se conoce en informática a este tipo de programas) que te permite recargar toda tu aplicación web al detectar un cambio en tus ficheros sin necesidad de tener que parar a mano el servidor y volver a levantarlo. Lo hace automáticamente!

Es muy sencillo de instalar como de utilizar, para ello tecleamos los siguiente en la terminal:

npm install -g nodemon

Cuando acabe la instalación y para añadirlo a nuestro proyecto podemos configurar la sección de scripts de nuestro package.json.

Esta sección nos permite definir nuestros propios comandos dentro de la aplicación. Me explico: si por ejemplo tenemos una suite de test unitarios que se ejecutan y generan un report de cobertura mediante tres comandos diferentes (por ejemplo) desde esta sección podríamos definir un “alias” para toda la secuencia de comandos y así lanzando uno solo se ejecutaría todos.

Pero vamos a ver el ejemplo de como añadir Nodemon para que se levante cada vez que arrancamos el servidor de nuestro proyecto:

"scripts": {
 "start": "nodemon index.js",
 "test": "echo "Error: no test specified" && exit 1"
 },

El primer comando que hemos definido es el start indicándole a nodemon que mire el entrypoint index.js y así pues cuando lancemos un npm start sobre la raíz de nuestro proyecto se levantará de manera automática este demonio 😉

Crear un servidor con Node.js

Ahora si que si. Ya estamos preparados para aprender Node.js de verdad. Hasta este punto hemos estado instalando lo básico para comenzar a trabajar pero a partir de aquí ya si que vamos a bajar al barro y vamos a codificar nuestra primera aplicación 🙂

Y lo primero que tenemos que hacer es lanzar el comando npm init para que se nos genere el fichero package.json. Este fichero es el que contiene el manifiesto de nuestra aplicación, algo así como un resumen. Aquí se define desde el autor, la versión, la licencia de la aplicación, las dependencias tanto de desarrollo como de producción entre otras cosas.

Uno de los puntos que nos va a preguntar la consola cuando lancemos el comando npm init es por el entrypoint, es decir, el punto de entrada que ejecutará el servidor web. Por defecto nos lo deja en index.js dentro de la raíz del proyecto pero si por cambios organizativos en el directorio de la aplicación este punto de entrada se encuentra en otro lugar podemos indicárselo perfectamente.

Se me ha olvidado decir que con Node.js no necesitamos instalar un Apache o un Tomcat como hacíamos con PHP o Java si no que ya nos ofrece métodos para crear y levantar un servidor web escribiéndolo con Javascript.

Mira el script anterior, es un ejemplo muy sencillo de servidor hecho con Node.js y la definición de una ruta GET. Pero vamos a explicarlo poco a poco.

  1. La primera línea es la declaración del modo estricto tal y como hemos comentado antes.
  2. La segunda línea es la inclusión de Express en el script. A partir de ahora podremos utilizarlo en toda la aplicación.
  3. Siguientes líneas vamos a obviarlas de momento.
  4. En la línea 13 del script definimos una ruta en la raíz principal. Esta ruta aceptará peticiones GET. Lo primero que hay que indicar es la URI de la ruta y después una función de callback a la que le pasamos los objetos request y response.
  5. En la línea 20 levantamos el servidor y hacemos que escuche por el puerto definido en su primer argumento. El segundo argumento es para la función callback que podemos utilizar para imprimir por consola el estado del servidor (o hacer otras cosas interesantes!)

Ahora si todo ha ido bien y nos dirigimos a http://localhost:3000 deberíamos ver lo siguiente.

Eso significa que tanto la instalación de Node.js como sus dependencias y que el proyecto están funcionando correctamente.

A partir de aquí nos queda ir aprendiendo el resto de componentes de esta tecnología pero será poco a poco en otros artículos

Si tienes algún tipo de preguntas o tan solo quieres ponerme a parir no dudes en hacerme llegar tus comentarios a través del siguiente banner de Twitter.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a cascarla!

Herencia en la programación orientada a objetos

Que pasa churritas!

Ya estamos a puntito de terminar los artículos dedicados al “curso”… si curso… sobre programación orientada a objetos y si has seguido todos y cada uno de los posts ya serás capaz de entender los conceptos de la programación y de desarrollar un programa to’ flama. En el artículo de hoy vamos a volver a ver la herencia.

Es verdad que ya hable de ella y bastante bien por cierto en este primer artículo pero como en este post estaba rankeando por otra palabara clave pues toca marcarme la del partner y hacer un artículo en el que la palabra clave sea la herencia. Yeah bitches!

Así que vamos a ellos!

¿Qué coño es la herencia?

Es la primera pregunta obligatoria que te tiene que pasar por la cabeza y no hace referencia a la dota que te deja la bruja de tu tía cuando muere.

La herencia en la programación orientada a objetos hace referencia a la habilidad que tiene una clase para derivarse de otra clase. Cuando digo derivarse quiero volver a decir herencia pero es que no veas lo que me esta costando explicar este concepto que con su nombre ya lo dice todo…

Tenemos una clase, a la que típicamente se le conoce como clase base o clase padre. Esta clase tiene sus propiedades, sus métodos y sus constantes ¿no? Pues justamente podemos hacer que otra clase diferente tenga acceso a esas propiedades, métodos y constantes haciéndolos suyos y sin tener que volver a escribirlos en esta nueva clase.

Es esta la gracia de la herencia y de un sistema basado en la jerarquía. Podemos organizar nuestro código para que unas clases cuelguen de otras pero que a su vez puedan utilizar los métodos de las clases superiores, ahí está la ventaja de la herencia, en poder reutilizar código ya existente.

Además si lo hacemos bien y a medida que vamos creando clases padres estaremos creando abstracción en la lógica de nuestro programa. ¿Y esto que significa? Pues que estaremos entendiendo cada vez mejor el problema que tratamos de solucionar y a su vez estaremos preparando el programa para enfrentarnos a nuevos requerimientos o problemas ya sean esperados o no.

Pasar de lo genérico a lo abstracto. Y esto siempre es mejor y ya 😛

Querer buscar la abstracción en tu programa no significa que nos pongamos a hacer clases padres y clases hijas a lo loco. Tiene que existir un sentido lógico o de lo contrario estaremos llenando de mierda el código.

Ese sentido lógico lo encontramos a preguntarnos si una clase “es un” de otra clase, es decir, ¿un bolígrafo es una herramienta de escritura? Si. ¿Y un lápiz? ¿Es también una herramienta de escritura? Pues también. Ahí hay herencia, ¿la veis? Pero.. ¿y una pelota es una herramienta de escritura? Pues hombre, podríamos untar la pelota en pintura y dar pelotazos en la pared hasta que salga alguna palabra pero por lo general no, no es una herramienta de escritura y por ende ahí no hay herencia.

Así pues mediante este ejemplo tendríamos una jerarquía en la que existiría una clase padre llamada HerramientaDeEscritura.class.php por ejemplo y dos clases hijas llamadas Bolígrafo.class.php y Lapiz.class.php. Estas dos últimas clases van a compartir ciertas propiedades y ciertos métodos que vienen directamente heredados de la clase padre, aunque hay que aclarar que es puede que nos encontremos con métodos o propiedades que no pueden ser heredados ya que aquí entra en juego la visibilidad y el acceso. Si te perdiste esa parte te dejo aquí el enlace para que le eches un vistazo 😉

¿Qué gano si aplico herencia?

¿Que qué ganas al hacer herencia? Pues muchas cosas, aunque ya he mencionado una arriba y posiblemente sea de las mas importantes. Entender mejor el problema que tratamos de solucionar. Y esto sirve para hacerte el chulo porque si eres el único que entiende el problema y tus compañeros te preguntan tu jefazo tendrá una mejor visión de ti.

Hago herencia pa haserme el shulo
Hago herencia pa haserme el shulo

Pero fuera de todo esto a nivel de código el utilizar herencia tiene bastantes ventajas:

  • Si no somos unos paquetes conseguiremos reutilizar el código de forma eficiente. Write Once Run Anywhere, mas o menos. Escribes un método en una clase padre y lo utilizas en todas las clases hijas que te de la gana. El cenit de la vaguería…
  • Propagación de los cambios. Si quieres cambiar el valor de una constante, lo cambias en la clase padre y se aplica en todas las clases heredadas, pero ten cuidado porque las cagadas también se propagan!
  • Poder heredar propiedades y métodos de todas las clases superiores. Hacer una mega clase con toooodo lo anterior incluido, hasta el infinito y mas allá. No sería raro llegar a encontrarnos una clase hija que pinte de la siguiente forma:

https://gist.github.com/gorkamu/f451e5d678c1b689363141fbffc4ddf4.js
Clase hija que tiene mucha herencia y que no hace nada.

Pero en PHP la herencia es una putada porque solo tenemos disponible la herencia simple. A diferencia de otros lenguajes como por ejemplo con Java que una clase hija puede heredar de tantas clases padres como les de la gana, PHP únicamente puede heredar de una sola clase padre. Por supuesto esto evita la complejidad del programa pero también es verdad que se pierden muchas características del polimorfismo y por supuesto se pierde un poquito el dinamismo en tiempo de ejecución.

Pero bueno, hay que sacrificar unas cosas para ganar otras. Yo la verdad es que hubiera preferido que existiera herencia múltiple en PHP pero que le vamos a hacer…

Podría hablar de muchas otras cosas que influyen y ayudan en la herencia como por ejemplo los constructores y destructores, la visibilidad de los métodos y propiedades y la sobrescritura pero esos temas ya los he tocado en artículos anteriores así que te recomiendo que si no los has visto eches un vistazo a este link en el que aparecen todos los posts pasados.

Y si tienes dudas o quieres aportar alguna sugerencia pues lo dejas en los comentarios y yo ya responderé cuando tal y sino puedes utilizar twitter a través del siguiente banner que en el fondo siempre es mas directo.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a chuparla!

Enlace estático en tiempo de ejecución en la programación orientada a objetos

Pues ya hemos llegado al final de los artículos dedicados a la programación orientada a objetos. A estas alturas ya comprenderás todos los conceptos de este tipo de programación. Obviamente me he dejado muchas cosas en el tintero pero siempre he intentado explicar las diferentes partes con un poquito de humor y con ejemplos fuera de los típicos que puedes encontrar por Internet. Para el último artículo he querido dejar la explicación sobre el enlace estático en tiempo de ejecución y es de lo que vamos a hablar, así que… let’s go madafakas!

Entendiendo el enlace estático en tiempo de ejecución

Para ser sinceros desconozco si otros lenguajes de programación implementan esta funcionalidad. Desde hace años mi carrera laboral ha ido por PHP en general y en los últimos años por Symfony en particular así que no estoy seguro, pero para el que no lo sepa, PHP incorporó la funcionalidad a partir de la versión 5.3 ea!

Básicamente el enlace en tiempo de ejecución consiste en poder hacer referencias a la clase en uso desde un contexto de herencia estática.

Da fuq?

WTF? Si la frase anterior te ha dejado con el culo torcido te recomiendo que le eches un vistazo a los links en los que hablo de herencia y sobre clases y métodos estáticos. Están un poquito atrás en el tiempo, tal vez un par de semanas pero por si acaso te has despertado con el vago puesto te dejo este y este link. De nada 😉

Antes de que metieran el enlace estático en tiempo de ejecución había problemas con la herencia y los métodos estáticos. Es decir, si una clase padre definía un método estático toda clase hija que heredase de esa clase obviamente iba a heredar ese método mágico pero cuando el motor de PHP intentaba resolver la palabra reservada self:: daba un pete porque la palabra reservada hacía referencia a la clase en la que se definía el método estático y no a las clases heredadas, con el ejemplo se va a ver mejor…
https://gist.github.com/gorkamu/c952a7a86a51e8123531b1844513eec3.js
Eso era antes claro y por lo tanto los desarrolladores nos sacamos de la manga un par de soluciones para resolver el problema:

  • Copiar y pegar los métodos estáticos de las clases padre en todas las clases hijas. Toma eficiencia claro que sí…
  • Convertir los métodos estáticos a métodos dinámicos. Toma parche claro que si…

Cuando el señor PHP se dio cuenta de este ‘error’ decidió implementar el enlace estático en tiempo de ejecución y para ello pensó en añadir una nueva palabra reservada pero viendo la realidad se decidió a utilizar otra técnica que ya tenemos bastantes palabras reservadas y meter una mas sería un follón.

Por eso la solución a toda esta película que os estoy contando fue ampliar el significado lógico de la palabra reservada static.

Si estas programando en PHP ya a partir de la versión 5.3 y con el enlace estático en tiempo de ejecución a tope de power, la palabra static permite obtener el valor de la clase desde donde se esta ejecutando en lugar de la clase base de la que hereda. Es como si la palabra reservada static se centrara y supiera donde se encuentra.

Así pues como vais a ver en el siguiente ejemplo, ya somo capaces de hacer referencia a la propia clase que ejecuta un método estático o accede a una propiedad estática sin tener que hacer malabares. Yeeaaah!! 😀
https://gist.github.com/gorkamu/f56a8d82a5ac4515eedc3978ae631d77.js

Y esto es todo muchachos, se acabó el último post sobre programación orientada a objetos. Ahora yo voy a descansar, que me metido un currazo en escribir todo el ‘curso’ y me voy a disfrutar de mis dolars ganados a las montañas del Pirineo junto a un par de buenas bitches.

Si tenéis dudas o sugerencias o simplemente queréis llorarme pidiendo que escriba algún curso nuevo hacédmelo saber en los comentarios o a través de twitter mediante el siguiente banner.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

A mamarla!

Sobrecarga en la programación orientada a objetos

Hoy dentro del ciclo de artículos sobre programación orientada a objetos vamos a ver otro concepto tan importante como la herencia o la sobrescritura de métodos. Hablo de la sobrecarga de métodos que en líneas generales se trata de re-definir el comportamiento de ciertos métodos para adaptarlos a tus necesidades.

Basta ya de introducciones y demosle ya chicha!

¿Qué es la sobrecarga?

Antes de explicarte a mi manera qué es la sobrecarga y poner un par de ejemplos vamos a ver cuál es la definición mas precisa que podemos encontrar en internet sobre el concepto. Según la definición de la wikipedia:

Sobrecarga es la capacidad de un lenguaje de programación, que permite nombrar con el mismo identificador diferentes variables u operaciones.

En programación orientada a objetos la sobrecarga se refiere a la posibilidad de tener dos o más funciones con el mismo nombre pero funcionalidad diferente. Es decir, dos o más funciones con el mismo nombre realizan acciones diferentes. El compilador usará una u otra dependiendo de los parámetros usados. A esto se llama también sobrecarga de funciones.

Bien, como dice el párrafo de arriba, es la posibilidad de tener varios métodos con el mismo nombre pero diferenciados entre ellos por el número de argumentos pasados, pero también es la posibilidad de alterar el comportamiento de otros tipos de métodos o propiedades.

Por ejemplo, si vienes del mundo de Java esto lo habrás visto ya muchísimo y si vienes del mundo de C/C++ te sonará la sobrecarga de operadores, cosa que me flipa muchísimo pero que por desgracia todavía no ha llegado a PHP.

A lo mejor te cuesta visualizar qué es el concepto de sobrecarga como para encima hablar de sobrecargar operadores pero es que el concepto es tan chulo que tengo que explicarlo.

Imagínate una suma de dos valores. Cada valor se encuentra entre un operador numérico ¿no? En este caso el operador es el símbolo de la suma (+) pero en otras operaciones el operador será otro obviamente. Pues bien, con C/C++ puedes hacer que cuando aparezca el operador de la suma se imprima un mensaje por consola y en lugar de hacer la suma, internamente se produzca una resta, por ejemplo.

Es el maximun trolling de la programación jejeje.

Como decía esto todavía no lo tenemos en PHP pero lo que si que tenemos y podemos utilizar desde ya es la sobrecarga de métodos.

Sobrecargando métodos en PHP

La sobrecarga en PHP nos ofrece herramientas para crear de una forma dinámica métodos y propiedades que después serán procesadas mediante alguno de los métodos mágicos que ya vimos en este artículo.

Básicamente el concepto va a ser el mismo en todos los lenguajes de programación pero PHP incluye la restricción de que no podemos tener varios métodos con el mismo nombre. Cada lenguaje tiene sus cosicas al igual que C/C++ tiene sobrecarga de operadores y Java no…

Cuando vamos a realizar sobrecarga de métodos en PHP nos tenemos que asegurar que aquellos métodos que queremos sobrecargar han de ser declarados como públicos y jamás de los jamases pasarle argumentos de estos métodos mágicos por referencia o de lo contrario hará un BUM Headshoot!

Para hacer esto se utilizan dos métodos mágicos en concreto:

  • __call(): se lanza cuando se invoca un método inaccesible desde un objeto.
  • __callStatic(): se lanza cuando se invoca un método estático inaccesible desde un objeto.

Ambos métodos mágicos van a recibir dos parámetros por narices, el primero de ellos corresponde al nombre del método que queremos sobrecargar y el segundo argumento es un array con los parámetros que pueda llegar a aceptar el método sobrecargado.
https://gist.github.com/gorkamu/f6c60c96029c7fbf81c1b2635de39c90.js
Decía antes que en PHP no existe la sobrecarga de métodos como se entiende en otros lenguajes, pues bueno, no es del todo así ya que como veis en el ejemplo se puede simular de cierta manera contando el número de argumentos que le llegan al método mágico __call() para después invocar una función u otra en función de esos argumentos.

Te recomiendo que te pilles el script, lo ejecutes y juegues con el para entenderlo bien 😉

Sobrecargando propiedades

Bien, toca el siguiente paso, aprender a sobrecargar las propiedades de una clase. Si con la sobrecarga de métodos utilizábamos los métodos mágicos __call() y __callStatic() con la sobrecarga de propiedades se utilizan los siguientes métodos mágicos:

  • __set(): se invoca cuando se escriben valores sobre propiedades inaccesibles.
  • __get(): se invoca cuando se consultan valores de propiedades inaccesibles.
  • __isset(): se invoca cuando se ejecutan los métodos isset() o empty() sobre propiedades inaccesibles.
  • __unset(): se invoca cuando se llama a unset() sobre propiedades inaccesibles.

Todos estos métodos mágicos van a esperar recibir un parámetro que represente el nombre de la propiedad sobre la que se quiere actuar pero, en el caso del método __set() recibe dos argumentos, uno con el nombre de la propiedad y otro con el valor que ha de asignarse.

Si declaras una propiedad como estática y después intentas sobrecargarla te pasará como con los métodos no públicos sobrecargados que también recibirás un bonito y elegante pete 😉
https://gist.github.com/gorkamu/8f3a9a320dcee5bfb9f83a5c4498dd96.js
Como perro que soy y rigiéndome siempre por la ley del mínimo esfuerzo este último ejemplo es el mismo que aparece en la documentación oficial de PHP pero eso no quita para que si tenéis dudas o queréis mas ejemplos me lo hagáis saber a través de los comentarios o por twittah mediante el siguiente banner.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Es importante que os bajéis los ejemplos del cada artículo del repositorio habilitado para ello y que probéis y juguéis con los scripts para que entendáis bien los diferentes conceptos…

Hala a cascarla!

Funciones anónimas en la programación orientada a objetos

Ya queda poquito para terminar con la serie de artículos del curso de programación orientada a objetos. Si has llegado hasta aquí sin desfallecer enhorabuena, tendrás ya una base solida para empezar a programar. Como queda poco es hora de ir metiendo la puntillita y contarte cosas que harán que tus scripts sean mas elaborados por eso hoy vamos a hablar de las funciones anónimas o closures.

¿Qué son las funciones anónimas?

Puedes llamarlas de diferentes formas y te vamos a entender igualmente. Desde funciones anónimas a clausuras o closures en el idioma de William Shakespeare pero todas estas formas hacen referencia a la habilidad de los lenguajes modernos para crear funciones sin un nombre definido.

Al no tener un nombre definido no vas a poder invocarlas todas las veces que te den la gana sino que su uso tradicionalmente ha sido utilizado para las llamadas de retorno o los conocidos callbacks aunque obviamente tienen muchos otros usos.

Ponte en la situación de que creas una conexión a una base de datos y que después de realizar cualquiera de las acciones típicas del CRUD quieres que automáticamente escriba en un fichero de log lo que acabas de hacer. Pues esa función de retorno después de atacar la base de datos la podrías montar perfectamente con una función anónima, por ejemplo…

Es importante conocer que el motor de PHP internamente convierte este tipo de expresiones a instancias de la clase Closure.

Pero no solo podemos utilizar las funciones anónimas como callbacks sino que también las podemos asignar a variables. Si, la función entera, no solo el valor devuelto mediante un return desde la función. Así cuando el motor del lenguaje encuentre una referencia a esa variable ejecutará automáticamente la función anónima.

Se podría decir que es como darle un alias a la función pero no para que me entiendas…
https://gist.github.com/gorkamu/ba7dda22ffcd8d4703561f97744db9ca.js
En este ejemplo se ve perfectamente lo que acabo de explicar de asignar funciones anónimas a las variables. Pero no nos quedamos solo ahí ya que las closures de vez en cuando cuando le sale de los huevos al desarrollador pueden heredar variables del ámbito padre para ser utilizadas dentro de las mismas.

Me explico, si defines una variable de tipo string con un mensaje y a continuación defines una función anónima, puedes pasarle como argumento la variable a la clausura, ya sea por referencia o por valor. Pero que no te confunda, que tu función herede variables del ámbito padre no es lo mismo que hacer uso de variables globales. Todo tiene que ver que con el scope.

Eso si, si vas a hacer que tus funciones anónimas hereden variables acuérdate de de utilizar la palabra reservada use o de lo contrario recibirás un bonito y elegante pete 😉
https://gist.github.com/gorkamu/42e54f569b26e5639e437e08c94e0d53.js
Es posible que no todavía no veas la diferencia entre heredar variables del ámbito padre y usar variables globales aunque realmente creo que por su nombre es fácil de entender.

En cualquier caso, usar una variable global implica que da igual desde dónde la uses, ya sea desde dentro de una función, el método de una clase o desde otro fichero que forme parte de la arquitectura de tu programa.

Por el contrario el ámbito padre de las funciones anónimas es la función en la que la closure fue declarada que no es necesariamente la función desde la que se le invocó.

Pero hay más porque lo mismo que pasa con las funciones “normales”, el lenguaje también nos permite crear funciones anónimas estáticas y que cuando las definimos en el contexto de una clase nos permite evitar que automáticamente la clase se vincule a la función. Es como romper el nexo de unión con la clase.

Lo malo de esta técnica es que al no estar la clase vinculada con la función anónima no podremos usar la palabra reservada $this para hacer referencia a la propia clase.
https://gist.github.com/gorkamu/1202dca9dae5dde8d5ba0fec560bca22.js
Ahora la decisión y el uso o no de funciones anónimas y funciones anónimas estáticas queda en tu mano. Por supuesto has de encontrar una finalidad justificada para usarlas ya que no es plan de que metas clausuras a muerte en todos tus scripts por que eso disminuye la optimización de tu código. Cuando compila el motor le asigna un nombre interno a esa función, si no es anónima y ya posee nombre le estarás quitando trabajo al compilador 😉

Pues nada chavales, a dejarme la dudas, peticiones y sugerencias en los comentarios o a través de twitter mediante el siguiente banner.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a cascarla!