Saturday, November 22, 2014

Panama: Educar emprendimiento en nuestra generacion

He estado involucrado en las tecnologías de la información desde 1995. He visto como la tecnología cambia sociedades y como el énfasis en el recurso humano y la integración de maquinas y software orientan la economía de países. Al tener alrededor de 18 años me acuerdo que al dejar el país donde pase gran parte de mi juventud le dije a mi papa que la programación es universal, era lógica, lo que aprendería en Panamá me iba servir en cualquier parte del mundo.

Estuve ciertamente en lo correcto, desde 2006 he liderado equipos de desarrollo de software para una empresa con raíces en lo que suelen llamar Sillicon Valley. Mas sin embargo, a pesar del contraste tecnológico, sofisticación financiera y cultura emprendedora, he siempre tratado de buscar como replicar ese éxito en otros emprendedores y empresas locales. Esto ha sido un descubrimiento de políticas erradas, de varios actores, llámese estatal o privado. Ejemplos hay muchos, uno que resalta, estudios realizados por CAPATEC y Senacyt donde vaticinan que para 2018 se van a requerir miles de plazas en las TICs (Tecnología, Información y Comunicación) (Ver http://www.capatec.org.pa/proyectos/estrategia-nacional/). Como vamos a suplir la demanda ? No generamos suficientes egresados de las universidades. La migración de personal calificado es onerosa para empresas que inician ("startups") y el 10% (1 por cada 10 panameños) para empresas fuera de clusters (como la Ciudad del Saber y Panamá Pacifico) complica mas el panorama.

Mientras tanto en Estados Unidos, el presidente Obama, en su mas reciente plan de política migratoria de Noviembre de 2014, dedica varias pautas para abrir el compas a mas mano de obra tecnológica calificada. Otros  países como Canadá y Australia tienen facilidades similares, orientado a las TICs. En América Latina, Chile tiene uno de los planes mas exitosos, con StartupChile http://www.startupchile.org/.

Este es un pilar entre otros de la economía del conocimiento. Yo veo mas al futuro la evolución económica y me atrevo a decir que la economía del conocimiento va a convertirse en la economía del emprendedor. Todos seremos emprendedores tarde o temprano. Panamá no es ajeno a las tendencias actuales. Es por tal razón, un grupo de conocedores jóvenes en el tema, estamos por lanzar los lineamientos, o manifiesto de como educar, evangelizar y motivar a futuras generaciones. Nuestra zona búfer es desde la secundaria. Tan obsesionados estamos en el tema, que descubrimos cuando los jóvenes llegan a la universidad, la mayoría están sin rumbo de que quieren lograr.

El Manifiesto de Panama StartupWay (https://github.com/Startup-Panama/manifiesto/wiki) es un primer paso. Estos diez puntos brindara las pautas generales. Pretendemos incluir un Kit de 'Como iniciar un startup en Panamá?', potencialmente clínicas y charlas y mas que nada, invitamos a otros luminarios expertos que colaboren con nosotros para de una vez por todas, educar emprendimiento que tanto se requiere y que veamos los frutos en nuestra generación. Este no es un plan de 5 años (no somos un plan de gobierno). Ni es un plan de lucro instantáneo (ni somos un plan corporativo). Es simplemente la visión que necesitamos lograr si queremos seguir adelante como nación de servicios al mundo.

Saturday, September 27, 2014

AngularJS - Por que es AngularJS tan complejo ?

Introducción

Hace unos dias conversaba con un amigo sobre AngularJS y la razon de su complejidad. En si no es complejo del todo, tiene que ver mas bien con previas experiencias que el equipo de AngularJS obtuvo en proyectos anteriores (por ejemplo Google Closure, quizas GWT). Pero mis puntos claves que he descubierto son los siguientes.

Tiempo de curva de aprendizaje vs tiempo al mercado

Yo estuve en un proyecto de 24 a 28 meses usando Backbone, jQuery y Bootstrap. Al principio seguiamos todos los patrones y mejores practicas. El codigo era escalable. Pero fallamos en varios aspectos que a continuacion describo:

Entrenamiento y divulgacion interna

Eramos malos documentando el API recien creado. Otros equipos encontraron dificultad en adaptarse.

Obsolesencia

A los seis meses, el mismo Backbone de nuestro framework nunca lo actualizamos.

Tiempo al mercado (Time to Market)

Cuando finalmente llego AngularJS al cliente, la entrega de los otros equipos de algun modo era mas rapida que la nuestra. Seguramente porque evitaron el sindrome NIH (Not Invented Here).

La curva

Obsolesencia y divulgacion son dos puntos claves. Pero no explica por si solo el "Time to Market". Es aqui la diferencia de "Angular Way" vs tu framework con librerias. AngularJS "normaliza" el conocimiento, al tener directivas como la forma para interactuar con jQuery y factorias/servicios como la forma de creacion de objetos. Esto permite desarrollar sumamente rapido con los mismos conceptos entre equipos. De tal modo que con 100 horas (casi un mes solo en Angular) obtienes un conocimiento intermedio al que obtendrias con la misma cantidad que con Backbone, jQuery y todo lo relacionado (templates, grunt, requirejs, stickit, marionette, thorax, etc)

La curva de aprendizaje siempre va ser importante como tambien el time to market. Yo lo veo como un Ying Yang. Hay un balance entre estos dos.

Realmente debo usar AngularJS para todo emprendimiento?

La respuesta es facil, todo va depender de tu escenario, en las habilidades de tu equipo, el presupuesto y la crema, que tanto "edgy" o en boga quieran usar tecnologia innovadora (Polymer WebComponents, ES6 transpiler, ClojureScript/Om)

En las siguientes entregas tocare brevemente el tema del empleo y los informales, despues continuo con mas AngularJS y posteriormente un poco de HapiJS y Joi

Hasta la siguiente entrega




Tuesday, September 9, 2014

AngularJS - Validaciones de formularios #1

Introducción

En este articulo explicamos brevemente ciertas cualidades de AngularJS 1.3.x

Validar debería ser fácil con Angular

Sin embargo, hay flujos de validaciones que no son soportados, por ejemplo:
  • Cargar formulario con campos "required": En Angular, siempre son mostrados. No hay forma sencilla de decirle después que salga del foco.
  • Validaciones cuando haces clic el botón de submit o un botón cualquiera.

Usando Angular 1.3 ngMessages

Yearofmoo describe ngMessages de una manera correcta. Lo esencial es que ngMessages lee el $error del campo (ejemplo form.campo.$error) y toma el primer key/value y presenta este error en caso de estar activo.
Lo cual funciona de perfectamente bien. Hasta que queremos resolver los dos casos extremos mencionados (que en Backbone son fáciles de implementar ciertamente).

Caso #1 - Solo debe mostrarme requerido al perder el foco


Mi solución rudimentaria fue usar un combo de ng-blur y ng-change, mantener el required message en el conjunto de ng-messages y tener una simple función en el controller. Esto se puede mejorar mucho mas con un Angular Directive.




Ahora, al cargar el formulario, solo se muestra requerido al perder el foco (blur). Lo bueno de esto es que reusamos ngMessages tal como esta.

En la próxima entrega explicaremos como resolver el Caso #2 con el submit.

Correciones: En vez de setear invalid = true, debe usarse $setValidity

Hasta la siguiente entrega
Rogelio Morrell




Wednesday, August 27, 2014

HapiJS - View Partials con UnderscoreJS

Introducción

En este articulo explicamos el uso de "view partials" o vistas parciales, que son en esencia pedazos de HTML.

Para que usamos parciales

Son utiles cuando tienes una plantilla maestra (master template) y quieres por ejemplo generar la barra de navegacion que contiene el enlace de perfil de usuario.

Configurando parciales en HapiJS

En la variable partialsPath se agrega donde residen las plantillas parciales.

Usando parciales con Underscore

Por medio de server.render logramos obtener el parcial generado. Estoy pensando en que seria posible precargar los parciales y posteriormente sean accedidos para ser usados, como un tipo de precompilacion. Otra forma es usar promises para cuando se requieran generar mas de un partial y usarlos en una vista.

Usando LoDash

Con LoDash debe funcionar igualmente y podriamos usar el imports para los parciales precargados. De tal modo que se podria llamar a la funcion desde la plantilla, en vez de enviar el HTML como otra variable a la plantilla maestra. Esta tarea se la dejo a los seguidores del blog para que investiguen.

Hasta la siguiente entrega
Rogelio Morrell



Thursday, August 21, 2014

HapiJS - Autenticacion REST con hapi-auth-bearer-token plugin

Introducción

En este articulo explicamos el uso de Bearer token plugin para HapiJS.

API  publico o privado?

Un REST API recurso puede ser privado si por medio de routing lo podemos crear  de uso exclusivo para una aplicacion de server. En este caso cada llamado debe ser de HapiJS UI server page a REST API. Dado que Rutha utiliza ambos, y nuestra aplicacion es un SPA (Single  Page Application), la opcion de API privado no es factible. En este caso optamos por utilizar autenticacion a nivel de REST.

Modelo ideal segun Twitter de autenticacion 'Application Only'

Segun Twitter, son tres pasos que se requieren:
  • Una aplicacion codifica la llave y secreto del usuario (consumer key and secret) en un set de credenciales. Esto es lo que adquieres en la mayoria de los OAuth APIs y el cual debes incluir en tus aplicaciones.
  • Una aplicacion crea una llamada POST a un recurso o 'endpoint' OAuth2/token para intercambio de token (bearer token o token al portador).
  • Para acceder al API REST, la aplicacion utiliza el token al portador para autenticar.

Usando HapiJS

En este ejemplo no explicaremos completame el flujo, solo nos enfocamos en el punto #3, en donde autenticamos llamados al API REST. El punto 1 y 2 para aplicaciones no publicas como Twitter, es posible con la autenticacion del usuario generar un token al portador permitiendo al usuario acceder el API REST que requiere ser autenticado.

En el bootloader de HapiJS

Registramos el plugin de 'hapi-auth-bearer-token' y la estrategia con validateFunc, que contiene la logica del token. Esto se puede reemplazar por un datastore en Redis o MongoDB que almacene la sesion, o algun otro metodo criptografico.

Rutas

En las rutas, toda ruta que requiera previa autenticacion, le asignamos en config.auth el nombre de la estrategia a utilizar.

Consumidor del API

Finalmente, en el cliente nos aseguramos de enviar el header de autorizacion con el token al portador.


Hasta la siguiente entrega
Rogelio Morrell


Friday, August 15, 2014

Rutha Stack - Ambiente de desarrollo web con AngularJS y HapiJS (y como no reinventar la rueda)

Introducción

Iniciar a desarrollar aplicaciones front end, ya sea Angular, Backbone, Ember y otras requiere de lo que llamamos un 'developer workflow' o 'stack'. Hay diversos stacks como MEAN y generadores como Yeoman, inclusive otros Github repos como Angular-Seed. Yo buscaba algo que tuviera tanto HapiJS y AngularJS. Y no encontré algo existente. De este modo surgió "Rule Them All HapiJS AngularJS" o Rutha.

Reinventar la rueda?

Mis requerimientos para un stack ideal con lo cual Rutha contiene:

A nivel de server

REST

Debe solo enfocarse en REST y tener validación de usuarios, validación de cada REST route y tener health check. Con HapiJS Joi y hapi-auth-bearer esto es posible.

Módulos

HapiJS soporta plugins, lo cual se basan en npm.

Documentación

El API debe ser capaz de documentarse. Usando HapiJS Joi, el modulo de HapiJS Lout auto genera la documentación.

Test Driven Development con Jasmine 2.0

Por medio de server.inject de HapiJS, integramos Jasmine 2.0 y obtenemos uno de los mejores TDD engine en el mercado. Porque no HapiJS Lab? Simplemente necesitaba Jasmine 2.0. Lab todavía no utiliza la ultima versión de Jasmine.

Errores predeterminados

HapiJS tiene incluido una forma de errores predeterminados que siguen la definición HTTP. No mas json generados a manos.

A nivel de UI

Mismo ambiente de desarrollo que en producción

Puedo asumir que esto es lo mas revolucionario. En modo de desarrollo, empaquetamos todos los activos o 'assets' en la carpeta 'dist' (o la puedes cambiar a tu nombre preferido) con la excepción de minificacion. En modo de producción, ocurre el mismo proceso incluyendo en este caso la minificacion. A continuación los procesos que ocurren.

Generación por medio de ngTemplates

Compacta los templates de AngularJS dentro de funciones Javascript.

Concatenación

Todo el contenido de javascript se concatena y se crean dos archivos: app.js y templates.js

Generación de anotaciones de los módulos de Angular con ngAnnotate

Los módulos de Angular necesitan anotación antes de la minificacion para evitar problemas con la ofuscación.

Uglify (conocido como minificacion que es  una forma de ofuscar el código)

En modo de desarrollo, solo genera el sourcemap del código para permitir depuración. En modo de producción, permite sourcemap y minificacion. El sourcemap no se distribuye como tal a la hora de publicación.

Enlazar con el HTML de inicio

Se enlaza y renueva referencias basadas en la configuración de Bower. Esto permite siempre tener los módulos utilizados enlazados al HTML de desarrollo en el SPA (Single Page Application).

BrowserSync

Tanto como LiveReload y fb-flo me parecieron complicado configurar. BrowserSync fue super sencillo. Esto permite que cada cambio en tu editor (Vim, Sublime, etc) sea refrescado automáticamente en tu browser preferido.

Otras tecnologías

Grunt JIT realiza precompilacion o precargado de ciertos pasos de Grunt, lo cual ejecutar los grunt tasks sean mas rápido que antes.

Adoptamos el modelo de 'dev stack' con código de demostración. Esto es la clave y lo herede de la época de .NET y VS.NET.

De tal modo, usamos una variación de patrones de AngularSeed, PacktPub Mastering Web Application Development with AngularJS y la guía de estilo o patrones de AngularJS por Todd Motto.

Que vendrá a continuación

Tengo un conjunto de cosas que agregar, pueden esperar el siguiente roadmap:

  • 0.2.x:
    • Patrones de HapiJS para Autenticación de UI y API
  • 0.3.x:
    • Definir si nos vamos con Restangular o angular-restmod
    • CSS (LESS O SCSS), esto necesitare tiempo y ayuda. Se aceptan contribuciones.
  • 0.4.x:
    • Instanbul para code coverage
  • 0.5.x:
    • Abierto a ideas. Puede ser desde generadores hasta soporte a React en el server. Pero seguramente sean rutha-contrib-* modulos y no parte del main branch.

Hasta la siguiente entrega
Rogelio Morrell






Wednesday, August 13, 2014

Panama - Zona de Certificados

Introduccion

La primera vez que estudie para certificarme en una tecnologia o producto fue cuando me aceptaron en Copa Airlines en 2005. Realice 3 examenes en 3 meses. Fue una ardua labor de estudiar y repasar conceptos que ya logras por experiencia adquirida.

La pregunta es: Realmente tiene un beneficio todo este tema de certificaciones?

Despues de mucho aprender como funciona la dinamica del mercado es un si y no, mas cerca del si, pero en ciertas geografias.

El efecto de oferta y demanda vs amateur y profesionales

Especificamente para Panama, pero puede aplicarse a otras regiones similares, existe mas demanda de profesionales (empleos) que profesionales disponibles (oferta). Esto tiende a clasificar el espectro de candidatos. Los mas jovenes solo pueden tener chance en posiciones 'entry level' y los mas pros ha varios (gerentes, supervisores, lideres de equipo). Mas sin embargo, los primeros tienen mas 'hits' por cobrar mas barato que los pros.

Todo esto esta bien, pero imaginate si contrato un pro y me baso solamente en su experiencia y resulta que tanto sus referencias como su experiencia no dan la talla. Es un caso extremo por cierto, y vale destacar que generalizar el tema de recursos humanos es complejo.

He aqui el auge de las certificaciones. Esto se puede dar tanto como de 'certificar' que la persona es idonea, como por regulaciones del mercado (bancario, finanzas, gubernamental, etc) como de metodologia (PMI, CMMI) y normas (ISO).

Con tan diversas industrias en Panama, es logico que esto de certificarte es casi como una religion, en el termino que existe evangelizacion por certificar mas personas.

Es asi en todas partes?

Mientras tanto, en lugares como Sillicon Valley, no es factible por la dinamica del mercado, certificarte en Ruby, Adobe, Oracle, etc ... es un buen punto en tu CV, pero es un ambiente de pura innovacion. Detenerte u obligarte a certificarte no es algo de mayor relevancia. Al menos que tu mercado este regulado, ejemplo, tu empresa esta en la industria financiera o deba  ingresar a la bolsa, entonces es necesario tener profesionales que sepan aplicar normas como SSAE-16 y otras por el estilo.

Y en ese punto Sillicon Valley adopta el rigor por las certificaciones.

Hasta la siguiente entrega
Rogelio Morrell

Saturday, August 9, 2014

Buscando trabajo con yoworkeo - De a idea a concepcion

Que es exactamente Yoworkeo?

Es una idea despues de escuchar amigos necesitando ingenieros de software y no encontrarlos. Suma toda la experiencia que he tenido personalmente reclutando personal para Admios. He probado todo: reclutadores, Konzerta, Computrabajo.com.pa, Estascontratado.com, LinkedIn y las redes sociales. Cada uno de estos canales tienen ventajas y desventajas.

Yoworkeo va mas que la parte del simple reclutamiento. Es ingenieria de software aplicando conceptos de planificacion de software, 'gamification' y MOOCs al problema de recurso humano. Suena multidisciplinario y complejo. Pero la idea es poderosa.

Cual es el plan con el blog?

Ademas de promover el eventual lanzamiento de la version beta de Yoworkeo, nos sirve para conectar con los usuarios, documentar como se crea un producto de software, la vida de un producto (si vive o fracasa) y para tambien tener visibilidad al resto del mundo.

Eres un startup?

No, Yoworkeo es un producto desarrollado y conceptualizado en mis horas libres.

En que tecnologia esta Yoworkeo?

Netamente en NodeJS y JavaScript. Este blog explicara como usamos el dev stack que se creo para Yoworkeo llamado Rutha. Rutha usa HapiJS como tecnologia de servidor web y AngularJS como tecnologia de cliente. Es algo como:


  • Rutha (stack de desarrollo)
    • REST API (HapiJS)
    • UI App      (HapiJS/AngularJS)
    • DB            (MongoDB)

Es Rutha open source?

Si, la razon de esto es mi experiencia en mi ultimo cliente. Se creo un stack en Ruby/Sinatra/Backbone y nunca lo lanzamos open source. Como eventualmente me enamore de NodeJS, probe por mi cuenta un stack en mi tiempo libre con ExpressJS/AngularJS. Aparte de aprender estas tecnologias, me di cuenta que al igual que el stack de Ruby/Sinatra/Backbone, las integraciones y procesos intermedios eran los puntos desventajosos. Algunos son:


  • Compilacion de JavaScript
  • Patrones
  • Logs, configuracion y depuracion
Y aun mas, mi preferencia fue usar HapiJS que es robusto y tiene todo lo que ExpressJS le falta y crear un dev stack que simplemente estuviera listo de clonear desde Github.

Es tu primer producto?

Yoworkeo es un plan en progreso.  Mi primer producto se llamo 'Ecyware GreenBlue Inspector' y aparecio en Technet Magazine hace un tiempo atras. Era un web pen tester automatizado en C#. El fuente esta aqui. Por cierto, solo vendi 1 licencia a una empresa de Nueva Zelandia. Nunca lo logre vender en Panama.

En 2012 PanamaLotto fue la primera app en el Play Market de Android relacionado a la loteria de Panama. Estuvo un tiempo hasta que mantener el API que leia el HTML de la Loteria (lnb.gob.pa) era un proceso tedioso. Y sin formar de monetizar ya era hora de bajarlo.

Eventualmente cree un servicio que por el momento no vera la luz del dia: recuerdamepagar.com. Simplemente, se encargaba de recordarte tus cuentas de ENSA, CW e Idaan. Este proyecto fue interesante,  porque fracase temprano. Lo mas importante es 'fail fast' para despues 'pivot' otra idea. Quizas saque algo liviano, pero desde que ENSA dejo de enviar PDFs (asumo que alguien utilizaba el PDF y lucraban, ENSA se dio cuenta) y ahora envían imagenes en JPGs.

Eso es todo?

Me certifique recientemente en PMI Agile. Asi que la idea de todo esto es reforzar y seguir entrenando en ser un buen practicante de todo lo Agile y Scrum. La idea es usar Trello y ir iterando.

Hasta la siguiente entrega
Rogelio Morrell

Rutha Stack - Como crear un REST API con Rutha 0.2.0


Creando REST controllers con Rutha y HapiJS

HapiJS permite crear REST API siguiendo las tendencias actuales, asi adaptamos a HapiJS dentro del Rutha stack para que se asemeje a un Rails MVC.

Dentro de service/lib tenemos
  • controllers: Contiene los controllers utilizando el formato de HapiJS plugin.
  • hapi: Contiene el server de HapiJS y configuración de rutas y plugines
  • models: Rutha es similar a MEAN, utiliza MongoDB por medio de MongooseJS para modelar los datos.

Hapi Server

El server contiene los utilitarios esenciales que necesitas para mantener adecuadamente un servidor de aplicaciones web.

El modulo rutha-utils contiene un conjunto de utilidades.

Configuración

rutha-utils/config contiene una instancia de nconf, donde se asigna la ruta donde residen los diferentes archivos de configuración (ej. development.json, test.json, etc) en RuthaUtils.createConfig({ path: './config' }). Para leer una variable de configuración, usamos config.get('key:subkey').

Logs

rutha-utils/logger retorna una instancia de winston. Agregamos la configuración del logger y llamamos RuthaUtils.createLogger({ filename: '',  level: '' }).

Mongoose (NodeJS API para MongoDB)

rutha-utils/mongoose_client se encarga de conectarse a una instancia de MongoDB y de cargar todos los modelos encontrados, el model a su vez espera el siguiente patron:



Para crear una instancia:
RuthaUtils.createModels({ client: 'mongoose', connectionString: '',  models: '' });

Esta interfaz algo generica para en el futuro expandir a otros tipos de clientes.

Y mejor no seria un Hapi Plugin?

Considerando que necesitamos reusar la instancia de config, es mas factible y algo visual, a lo AngularJS, que el developer observe las instancias de config, logger y mongoose como se inyectan. Usando server.pack.app como un tipo de 'dependency injection' es util, nos permite que cada Rutha Stack plugin que quiera las instancias predeterminadas las use sin preocupaciones.

Registrando plugins

Hapi Plugins es un tipo de decoupling a nivel de modulos, llamados plugin. Es posible que un equipo, diversos programadores trabajen en diferentes modulos, y estos a su vez usen los modelos compartidos (shared models). Para agregar tal modulo al server en común, agregamos el plugin y cualquier opciones que requiera.

Cada plugin  obtendrá una ruta padre establecida, esta es 'api' para definir todas las rutas REST del service pertenecen al 'api'.

Adicionamos el plugin de HapiJS Lout para generar documentación del REST API. Es importante usarlo conjuntamente con HapiJS Joi, este ultimo decorar la documentación basado en el esquema de validación de cada ruta REST.

Estado del servidor (Health check)

Incluimos una ruta 'api/health' que es un tipo de patron muy comun. Simplemente retorna el texto OK.

Versiones

Cada plugin a su vez contiene sus versiones. Podemos tener dentro de users plugin, una carpeta v1, v2 y asi sucesivamente. En el index.js, asignamos las rutas que queremos el Hapi server publique.

De este modo, cada modulo mantiene las versiones requeridas para el funcionamiento adecuado del API.

Pruebas

Usamos Jasmine 2.0 en vez de HapiJS Lab. Como Rutha es un stack altamente pragmatico, Jasmine 2.0 nos permite enfocarnos en test y mocking a una velocidad increible.