Permalink

1

Taller: Hacking con Node.js #nodejs

Hacking con Node.js es una serie de 3 videos que conforman el taller dictado en la comunidad gr2dest, el fin de estos fue integrar y enseñar a las personas a integrar node.js en su vida cotidiana mostrando lo fácil que es desarrollar programas de red escalable orientados a procesos y/o técnicas utilizadas comúnmente en el hacking, tales como escaneo de puertos, ataques DDoS, así como también desarrollo de servidores web, paginas web sobre node.js y hasta una APIRestFul. Talleres como este se pretenden ir dictando en distintas plataformas y comunidades para el entendimiento de node.js en toda la comunidad de habla hispana.



Autor del articulo:

Luis f. Betancourt U. Desarrollador Front-end y desarrollador especializado en Node.js. Entusiasta de la seguridad informática, Fundador de NodeVE, primera comunidad de node.js en Venezuela, programador de herramientas hacking, estudiante de bachillerato y todo esto con tan solo 14 años

Twitter: @goalkeeper112

Facebook: https://www.facebook.com/Barra.Frente.Guarenas

github: https://github.com/goalkeeper112

NodeVE: https://www.facebook.com/groups/398491103624287/

Permalink

0

SmartComments, genera comentarios automáticamente al código JavaScript

Captura de pantalla 2014-04-15 a la(s) 10.16.21

Resumen

SmartComments es un módulo de Node.JS que puede ser útil a la hora de automatizar el proceso de generación de documentación, ahorrándonos horas de esfuerzo, y permitiendo que nuestra documentación siempre esté actualizada con los últimos cambios en el código fuente.

Introducción

Según estudios realizados por una prestigiosa agencia más del 90% de los programadores prefieren documentar el código fuente a escribirlo. ¿Qué?

Mi primera reacción fue pensar, ¿Es posible que el mundo haya cambiado tan rápido sin que me haya dado cuenta? Le pregunté a otros programadores del equipo si creían que el misterioso titular fuera cierto, y muy serios asintieron. Me inquietaba lo tedioso que resultaba para mí, comentar el código fuente que había escrito, sobre todo aquellas funciones que con solo leer el nombre ya se sabía lo que hacían. Además de tener que actualizar la documentación cada vez que se realizaba algún cambio.

¿Por qué yo no lo disfrutaba y otras personas si? De ese dilema salí sólo tras las carcajadas de mis compañeros de equipo… Uff, menos mal que era una broma.

 

Desarrollo

Muchos utilizamos herramientas como YUIDocs, o JSDocs, entre otras para generar la documentación de nuestros proyectos. Estas necesitan una serie de parámetros de entrada que deben ser escritos de manera explícita, por los programadores como por ejemplo:

/**

 * Descripción

 * @method Nombre de la función

 * @param Parámetro A

 * @param Parámetro B

 * @return Valor que retorna

 */

Este proceso puede resultar algo tedioso, sobre todo si tenemos en cuenta que cuando ocurre un cambio en alguno de estos parámetros, como el nombre de la función por ejemplo, tenemos que actualizar la documentación correspondiente.

También muchas veces hay partes de la documentación que pueden ser redundantes e innecesarias, es obvio que la función getNombre() devuelve el atributo nombre de la clase que la implemente, por tomar un ejemplo.

Estos fenómenos toman proporciones significativas cuando nos tenemos que hacer cargo de proyectos bastante avanzados y que tienen una escasa documentación.

Según @evangoer en la conferencia “Thinking of Documentation as Code”, al documentar el código fuente es útil hacerse 3 preguntas:

  • ¿Qué es lo que hace el código?
  • ¿Cómo es que lo hace?
  • ¿Por qué lo hace?

SmartComments, es una herramienta de código abierto escrita en JavaScript y corre sobre Node.js mediante la que se puede automatizar y acelerar así considerablemente el proceso de generación de documentación. Sobre todo respondiendo las preguntas (¿Qué? y ¿Cómo?). En la siguiente imagen se muestran las partes del ejemplo anterior que pueden ser generadas por SmartComments.

/**

 * Descripción

 * [@method Nombre_de_la_función] ——- SmartComments

 * [@param Parámetro_A] —————– SmartComments

 * [@param Parámetro_B] —————– SmartComments

 * [@return Valor_que_retorna] ———- SmartComments

 */

Básicamente solo tendríamos que poner la descripción de nuestra función. O alguna otra explicación más detallada de ser necesario.

Algunas de las funcionalidades de SmartComments son:

  • Generar la meta información necesaria para la generación de documentación a ficheros completos, de manera individual, o que se encuentren dentro de una jerarquía de directorios determinada.
  • Plugin para (sublime text), que da acceso a las funciones de la aplicación a través de este editor y que además permite generar comentarios a una selección de texto, lo cual es una funcionalidad bastante útil.
  • Personalización mediante plantillas para la generación de documentación a eventos, clases, atributos, entre otros. Y en dependencia del estilo de codificación de nuestra empresa o framework.
  • Versión online a modo de demostración que puede ser utilizada para la generación de meta información si no se desea instalar la aplicación.

Un caso de uso interesante planteado por Mr. Rich Kilgore es la utilización de SmartComments es el siguente:

  1. Se comentan se forma explícita solamente las funciones que son relevantes y se realizan los commit al control de versiones de esa manera.
  2. Usando una tarea de Grunt Se copia todo el código fuente a una carpeta temporal, y se ejecuta SmartComments para generar la meta información de las funciones que tienen menos relevancia.
  3. Luego se ejecuta YUIDocs, para generar la documentación API.

Esto ocurre de forma automatizada cada vez que se construye y se despliega el proyecto. La ventaja de esta filosofía de trabajo es que siempre la documentación API estará actualizada con los últimos cambios del código fuente.

Hay que señalar que SmartComments es solo una herramienta, y como herramienta al fin solo puede hacer (por ahora) una parte del proceso. Siempre existen casos que necesitan de la intervención humana. Sobre todo a la hora de querer expresar la verdadera semántica de determinado código.

 

Conclusiones

SmartComments es de mucha utilidad a en el proceso de generación de documentación, ya que mediante el mismo podemos ahorrarnos horas de esfuerzo, y fomentamos que nuestra documentación siempre esté actualizada con las últimas modificaciones en el código fuente. Si quieres colaborar con este proyecto open source, puedes hacerlo mediante github.

Sobre el Autor

Dariel Noel, desarrollador FrontEnd. Co-fundador de aquinama.com, thincss.github.io, SmartComments. Colaborador de web2021.blogspot.com.

Twitter: @dariel_noel

Blog Personal: darielnoel.github.io

GitHub: https://github.com/darielnoel

Permalink

0

Ocho de los más reconocidos programadores web en el JSConf Colombia 2013

jsconfcol13

Ocho de los más reconocidos programadores web del mundo, con experiencia en distintas técnicas y herramientas en el desarrollo de aplicaciones interactivas se reunirán por primera vez en Colombia. Se trata de un encuentro que se llevará a cabo en Medellín el 18 y 19 de Octubre.

JSConf.co 2013 es el primera conferencia de programadores de JavaScript en el que los desarrolladores nacionales tendrán la posibilidad de ponerse a la vanguardia mundial en la programación de aplicaciones web. Como todo en nuestro mundo, esta conferencia también está a tan sólo un clic! Basta con darse una vuelta por la página de la conferencia (http://jsconf.co) para inscribirse y conocer la red de oportunidades que ofrece JSConf.co.

JSConf es un evento internacional que se ha realizado durante cinco años en diferentes países del mundo y esta vez, con JSConf.co 2013, el evento por fin llega a Colombia. Uno de nuestras prioridades es poner en contacto a programadores experimentados con nuevas generaciones de ingenieros de software. El fin: compartir conocimiento y construir un ecosistema de emprendimiento tecnológico local, elemento crucial en un territorio donde se ha hecho mucho énfasis en la inversión de capital pero muy poco en el desarrollo técnico en general.

JSConf.co 2013 cuenta con el apoyo de Ruta N, una corporación fundada por la Alcaldía de Medellín, EPM y UNE, que tiene como principal objetivo promover el desarrollo de negocios innovadores vinculados con tecnología para mejorar la competitividad de la ciudad y la región en este aspecto.

Es importante resaltar que JSConf.co es un evento sin ánimo de lucro, organizado por voluntarios y cuyo único objetivo es el fortalecimiento de la comunidad de desarrollo web en Colombia. A su vez, se espera que este encuentro permita generar un vínculo permanente entre los programadores nacionales y los mejores en su campo alrededor del mundo, permitiendo que el país se ponga a la cabeza en el desarrollo de aplicaciones web en la región.

Dentro de los conferencistas internacionales para JSConf.co 2013 se encuentra:  

Angelina Fabbro, actualmente técnica de Firefox OS en Mozilla. Fabbro es reconocida por su basta experiencia programando tanto en JavaScript como ObjectiveC, conocimiento que le permite ser profesora en la Universidad de San Francisco (SFU) y mentora en la iniciativa Ladies Learning Code. Es también experta en ciencias cognitivas y adicionalmente tiene un interés muy especial por elementos como Shadow DOM, Customs Elements y HTML Imports.

Glenn Block quien hace parte del equipo de ingenieros Windows Azure de Microsoft. En esta división, Block se encarga de que esta sea una plataforma sobresaliente en el desarrollo de tecnología Open Source al mismo tiempo que lidera el soporte en Node.js y Node SDK para Microsoft.

Charlie Robbins, otro reconocido ingeniero. Tras varios años de trabajar como consultor para Microsoft y varias instituciones financieras de renombre, Robbins decidió fundar la empresa Nodejitsu en el año 2010, la cual ofrece una plataforma como servicio (PaaS) para el despliegue de aplicaciones Node.js y un sistema de administración y configuración de infraestructura tecnológica llamado OpsMezzo.

Joe McCann, director de tecnología creativa en la empresa Mother, en Nueva York. McCann viene, desde hace un tiempo, utilizando su experiencia en móviles y multi- plataformas para ayudar a los clientes de su compañía en temas relacionados con publicidad, diseño experimental y digital. Este programador también lidera Circle Media, una iniciativa vinculada a Mother Ventures que se enfoca en recolección y análisis de métricas en tiempo real.

Guillermo Rauch. Rauch es CTO y cofundador de LearnBoost, una compañía con base en San Francisco enfocada en la optimización y administración automatizada de instituciones educativas. Además de esto, Guillermo Rauch es autor de Socket.IO y co-autor de Mongoose Node.js, un Object Data Manager para MongoDB.

Finalmente, JSConf.co también contará con las charlas del belga Mathias Bynens y los estadounidenses Sarah Chipps y James Halliday (substack).

Apoyan:

jsconf2013-auspiciantes

Permalink

0

Creando aplicaciones Node.js con TypeScript – Parte 2 #nodejs

Accediendo a la base de datos

Editamos el fichero db.ts y añadimos aquí el código que accede a nuestra base de datos MongoDB. Para ello, importamos el módulo de mongodb y creamos una instancia de la clase mongodb, establecemos la conexión con la base de datos y la abrimos:

import mongodb = module('mongodb');
var server = new mongodb.Server('localhost', 27017, {auto_reconnect: true}, {})
var db = new mongodb.Db('highscores', server);
db.open(function() {});

Una vez abierta la conexión, definimos una clase que describe los objetos que esperamos enviar/recibir de la colección “highscores”. Esta es una de las ventajas de utilizar TypeScript, que nos permite definir y trabajar con clases, e indicar el tipo de los parámetros de nuestras funciones.

export class Score {
    _id: string;
    user: string;
    score : number;
}

Ahora podremos definir las funciones que expone este módulo. Veremos que hay ciertos elementos nuevos con respecto a una definición en JavaScript.

export function getScores(callback: (scores: Score[]) => void) {

    db.collection('scores', function(error, scores_collection) {
        if(error) { console.error(error); return; }
        scores_collection.find({}).toArray(function(error, scoresobj) {
           if(error) { console.error(error); return; }
           callback(scoresobj);
        });
        
    });
}

La primera la vemos en los parámetros, estamos indicando que tendremos un callback, que será de tipo void (esto es, que no devuelve nada) la cual recibirá una lista de objetos de tipo Score (la clase que acabamos de definir). Este callback será la función anónima que acabamos de definir en el módulo index:

(scores) => {
        res.render('index', { title: 'Highscores', scores: scores })
}

El resto de una función es la típica que provee el módulo de mongoDB. Pero ya podemos ver la facilidad con la que podríamos cambiar el servidor al que nos conectamos o incluso el repositorio de datos…

Definiendo las vistas

Gracias a JadeJS podemos cambiar el aspecto de la UI de una forma muy sencilla. En nuestro caso sólo vamos a definir una vista en la que mostrar la lista de puntuaciones. Para ello creamos 2 ficheros: layout.jade para tener unos elementos comunes e index.jade para mostrar la lista:

layout.jade

!!!
html
  head
    title ImageBoard
    link(rel='stylesheet', href='http://cachedcommons.org/cache/960/0.0.0/stylesheets/960.css')
    link(rel='stylesheet', href='/stylesheets/style.css')
  body
    #header.container_12
      script(src='http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.min.js')
    #container.container_12!= body

index.jade
h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + " " + score.score

index.jade

h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + " " + score.score

No es intención de este artículo explicar cómo utilizar Jade, pero vemos que podemos recorrer de una forma muy sencilla una lista de elementos, en nuestro caso la clasificación de puntuaciones, y mostrarlas en una página.

Si desde SublimeText compilamos el fichero app.ts podremos ver cómo se generan todos los ficheros JavaScript que serán los que utilice nuestra aplicación. Gracias a la Build Definition que hemos creado anteriormente, no es necesario hacerlo por cada fichero .ts, sino que se hace automáticamente para todos los que necesitamos. Y ya podemos arrancar la aplicación:

node app.js

y abrimos un navegador para ver el resultado:

tuto_3

Podemos ver que la página se renderiza correctamente pero no nos muestra ningún resultado, esto es normal puesto que no tenemos ningún registro en nuestra colección MongoDB. Vamos a hacer una página para insertar registros.

Añadiendo más funcionalidades

Siguiendo el mismo proceso que antes, lo primero que hacemos es modificar nuestro fichero de aplicación (app.ts) para añadir dos métodos nuevos, un GET que cargue un formulario y un POST para insertar los datos:

app.get('/scores/newscore', (req, res) => {
    routes.newscoreget(req, res);    
});

app.post('/scores/newscore', (req, res) => {
   routes.newscorepost(req, res);
});

Definimos los nuevos métodos en nuestro fichero index.ts:

export function newscoreget(req: express.ExpressServerRequest, res: express.ExpressServerResponse){
     res.render('newscore',{});   
};

export function newscorepost (req: express.ExpressServerRequest, res: express.ExpressServerResponse){
    var newscore = new db.Score()
    newscore.user = req.param('user');
    newscore.score = req.param('score');
     db.addScore(newscore, (r) => {
        res.redirect('/');
    });
};

Como vemos, el primero únicamente renderiza el formulario y es el segundo método el que llamará a nuestro módulo de acceso a datos. En este segundo método utilizamos un objeto de la clase Score que hemos definido en otro módulo, que será lo que pasemos como parámetro al método addScore. Veamos cómo implementamos este método:

export function addScore(newscore : Score, callback: (result: any)=> void){
    db.collection('scores', function(error, scores_collection) {
        if (error) { console.error(error); return; }
        scores_collection.insert({"user" : newscore.user, "score" : newscore.score },
            (error, result) => {
                if(error) { console.error(error); return; }
                callback(result);
            })
        });
}

Gracias a que utilizamos una clase de TypeScript, podemos ver sus propiedades cuando las necesitemos:

tuto_4

Y por último, creamos la vista newscore.jade con el formulario en el que añadimos el usuario y la puntuación:

form( method="post")
   div
       br
       div
           span.inputtitle User name :
           input(type="text", name="user")
       br
       div
           span.inputtitle Score :
           input(type="text", name="score")
       br
       #editScoreSubmit
           input.button(type="submit", value="Save Score")

Y modificamos nuestra vista principal para añadirle un botón que llame a nuestra recién creada vista:

h1= title
p Welcome to #{title}

ul
- each score in scores
  li
    b= score.user + " " + score.score
br
form( action="/scores/newscore/", method="get")
    div
        #newScoreSubmit
            input.button(type="submit", value="New Score")

Volvemos a compilar el fichero app.ts y arrancamos la aplicación, si todo ha ido bien ya podremos acceder al formulario para añadir puntuaciones:

tuto_5Y ver el resultado en la página principal:

tuto_6

RESUMIENDO

Este pequeño ejemplo nos ha servido para ver cómo se puede hacer una aplicación web con NodeJS y TypeScript con una buena estructura, el código bien organizado y siguiendo el patrón MVC. Esto nos permite que, si la aplicación es muy grande, el trabajo se pueda repartir entre diferentes personas/grupos de manera muy sencilla. Además, podemos tener definidos módulos de prueba (fakes) que simulen funcionalidades que no están desarrolladas.

Autor de éste Artículo

Pablo Bouzada, desarrollador especializado en .NET y otras tecnologías Microsoft. Consultor en Pasiona Consulting y divulgador tecnológico en Techdencias. Colaborador de programandonet.com y otros grupos de usuarios de España.

Twitter: @pbousan

Slideshare: http://www.slideshare.net/pbousan

GitHub: https://github.com/pbousan?tab=repositories