Sebastian Durandeu Blog

  • Visitantes

Node.js: Estrategia de Passport.js para MercadoLibre

Posted by sebastiandurandeu on November 24, 2013

logo-ml

Passport.js es actualmente el standard de facto para autenticación en aplicaciones Node.js que utilizan Express (gracias @eugenio_pace). Lo interesante es que se puede configurar fácilmente para que los usuarios se puedan autenticar con distintos ‘autentication providers’ (como GitHub, Google, Facebook, etc.). Esta configuración e integración se realiza a través del uso de estrategias – la lista completa de estrategias disponibles esta acá (son +140).

Esta vez, utilizando el código que armé para éste post anterior, cree una estrategia de autenticación que permite que los usuarios se autentiquen con sus cuentas de MercadoLibre en aplicaciones Node.js. Esto a su vez, es necesario si queremos utilizar las partes seguras de la API de MercadoLibre.

La estrategia la pueden encontrar en:

Sino acá abajo dejo los pasos para utilizarla con Express:

1. Primero debemos registrar una app en la plataforma para desarrolladores de MercadoLibre acá.

2. Instalar el paquete con npm en la aplicación Node.js.

npm install passport-mercadolibre

3. Configurar la estrategía con Passport.js. Para esto tenemos que:

  • Agregar la estrategía a Passport, utilizando passport.use(), pasando el client id y secret que se obtiene de MercadoLibre.
  • Junto con esto, proveer una ‘verify callback’ que recibe la información del usuario de MercadoLibre (profile), incluyendo información como el el nickname, first_name, last_name, etc. y los tokens (accessToken y refreshToken), con la cual si necesito, podría ir mi base de datos a verificar si usuario ya esta registrado o traer mas información del mismo.
  • Dos funciones passport.serializeUser()passport.deserializeUser() para serializar y deserializar el usuario en la cookie de autenticación que maneja Passport.js.
var MercadoLibreStrategy = require('passport-mercadolibre').Strategy;

passport.use(new MercadoLibreStrategy({
    clientID: 'YOUR_CLIENT_ID',
    clientSecret: 'YOUR_CLIENT_SECRET',
    callbackURL: 'http://www.example.com/auth/mercadolibre/callback',
  },
  function (accessToken, refreshToken, profile, done) {
    // + store/retrieve user from database, together with access token and refresh token
    return done(null, profile); 
  }
));

passport.serializeUser(function (user, done) {
  done(null, user);
});

passport.deserializeUser(function (user, done) {
  done(null, user);
});

4. Posteriormente debemos definir las rutas de autenticación (asumiendo que estamos utilizando Express).

app.get('/auth/mercadolibre',
  passport.authorize('mercadolibre'));

app.get('/auth/mercadolibre/callback', 
  passport.authorize('mercadolibre', { failureRedirect: '/login' }),
  function(req, res) {
    // Successful authentication, redirect home.
    res.redirect('/');
  });

5. En este punto ya tenemos la estrategia configurada, y lista para requerir autenticación en las rutas de Express. Por ejemplo en la ruta ‘/’ de abajo nos aseguramos que el usuario este logeado con MercadoLibre antes de dejarlo acceder.

app.get('/', ensureAuthenticated, 
  function(req, res) {
    res.send("Logged in user: " + req.user.nickname);
  }
);

function ensureAuthenticated(req, res, next) {
  if (req.isAuthenticated()) { 
    return next(); 
  };
  res.redirect('/auth/mercadolibre');
};

passport-mercadolibre-usage
Tener en cuenta que el objecto user tiene la información del perfil del usuario de MercadoLibre, incluye las siguientes propiedades pero se pueden obtener mas utilizando la propiedad _json. Ver la lista completa acá.

  • provider (mercadolibre)
  • nickname
  • first_name
  • last_name
  • email
  • accessToken
  • _raw (raw server response)
  • _json (JSON object with server response)

WARNING

Momentáneamente, debido a un bug (creo) de una de las dependencias de Passport.js, para que la estretegia funcione correctamente hay que hacer una modificación manual en un archivo. Vean la modificación acá.

Posted in Node.js | Leave a Comment »

LESS en Node.js y Express

Posted by sebastiandurandeu on October 14, 2013

Rima, no? Bueno, si quieren ir directo al código, vayán a ‘Lo Importante‘.

Como escribir en wordpress es gratis, quería tomarme la libertad de dar una opinión primero. Cuando lees la documentación de los módulos de Node.js, TODOS te la venden de que si querés hacer ‘cosa-nueva‘, tenés que hacer:

  1. npm install cosa-nueva
  2. var cosaNueva = require('cosa-nueva');
  3. app.use(cosaNueva({...}));
  4. Leesto, ya está!

Fácil, no? Bueno, MINGA! (para los amigos de Latam es una expresión de lunfardo Argentino que representa incredulidad). O sea tampoco es que sea mucho mas difícil, pero siempre aparece ‘ese detalle’ que te la complica. Por eso no se pierdan mis aclaraciones abajo🙂

Lo Importante

Muy resumidamente LESS extiende la sintaxis de CSS para facilitar la organización y mantenimiento del código. Lo que sigue son los pasos para usar LESS en una app Node.js que usa Express, usando el módulo less-middleware.

1. Como siempre:

npm install less-middleware

2. En el server.js de la app:

var lessMiddleware = require('less-middleware');
...
var app = express(); // express app initialization
...
app.use(lessMiddleware({
    src : __dirname + "/static/less",
    dest : __dirname + "/static/css",
    prefix : "/css",
    force : true,
    compress : 'auto'
}));
app.use(express.static(__dirname + '/static')); // static-middleware de express
app.use(app.router); // router de express

3. La organización que propone el código de arriba es tener una carpeta ‘static’ en el root de la app con el siguiente contenido:

less-folder-structure

4. Si tengo un archivo ‘styles.less en la carpeta ‘less’, Los estilos los puedo incluir ahora desde HTML de la siguiente manera. Notesé que apuntamos al archivo con extensión CSS directamente.

<link rel='stylesheet' href='/css/styles.css' type='text/css' />

Aclaraciones

El código de arriba tiene varias lineas de más, expresamente, para aclarar algunas cosas:

  • express.static() tiene que estar SI o SI después de app.use(lessMiddleware(...)). Esto se debe a que less-middleware utiliza el express.static() middleware para servir los archivos compilados.
  • src es la ruta a donde less-middleware va ir a buscar los archivos LESS para compilarlos. No necesariamente tiene que estar dentro de la ruta de express.static() (o sea, ‘/static’).
  • dest es la ruta donde less-middleware va dejar los archivos CSS compilados. Tiene que estar dentro de la ruta de express.static() (e.g. si express.static() apunta a la carpeta ‘/static’, dest tiene que estar dentro de esta carpeta).
  • prefix Aún no entiendo bien para que sirve. Pero la regla práctica es que si src y dest son distintos, tiene que tener el valor de la porción distinta del path, en este caso ‘/css’. Esta mejor explicado en el post que menciono al final.
  • compress Setearlo en auto hace que si utilizamos las extensiones ‘.min.css’, o ‘-min.css’ al referenciar los archivos CSS, less-middleware va generar el archivo minificado.
  • force En true hace que se recompilen los archivos LESS en cada request. Útil durante desarrollo, desactivar para producción.
  • app.use(app.router). OJO QUE NO es lo mismo configurar el router de express, antes que después de de express.static(). Sobre todo si tienen configurada una ruta del tipo app.get('/*',...). Depende si está antes o después, less-middleware puede funcionar o no. Inclusive puede tener impacto el la performance. No me voy a meter en detalle porque un genio lo explica muy bien acá: http://stackoverflow.com/questions/12695591/node-js-express-js-how-does-app-router-work

El siguiente artículo explica bastante bien varias cosas de estas: http://blog.dylants.com/2013/03/16/less-middleware-using-less-with-node-js/

Feedback abajo🙂

Posted in Node.js | Leave a Comment »

Node.js: OAuth 2.0 con la API de MercadoLibre

Posted by sebastiandurandeu on October 2, 2013

Estuve haciendo unas pruebas con la API de MercadoLibre desde Node.js. En particular, quise probar como autenticar contra la API usando OAuth 2.0, siguiendo los pasos descriptos acá.

Los módulos de Node que voy a utilizar en este código son:

1) El primer paso es definir una ruta para comenzar el flow de OAuth (en este caso ‘/auth/mercadolibre’) y obtener el authorization code. En este paso tengo que hacer un redirect al authorization endpoint de la API enviando los siguientes datos:

  • client_id: El app id de mi aplicación,que puedo obtener acá.
  • redirect_uri: Una URL a donde mi app va a recibir el authorization code y procesarlo (AKA redirection endpoint). En este caso es ‘/auth/mercadolibre/callback’.

En este paso el usuario va a ver el dialogo de login de Mercado Libre y va a autorizar a nuestra app a acceder a sus datos.

app.get('/auth/mercadolibre', function (req,res) {
    var authCallback = GetBaseUrl() + '/auth/mercadolibre/callback';
    var redirectUrl = util.format('https://auth.mercadolibre.com.ar/authorization?response_type=code&client_id=%s&redirect_uri=%s',
    config.clientId, authCallback);
    res.redirect(redirectUrl);
});

2) El segundo paso es utilizar el access code del paso anterior para obtener un access token que finalmente me va a permitir realizar requests a la API. Para esto tengo que hacer un HTTP POST al Token Endpoint de la API (‘/oauth/token’) para finalmente obtener el access token. Los parámetros de este request son:

  • client_id: El app id de mi aplicación, que puedo obtener acá
  • client_secret: El app secret de mi aplicación, idem
  • code: El access code obtenido en el paso 2
  • redirect_uri: La misma redirect_uri que pasamos en el paso 2
app.get('/auth/mercadolibre/callback', function (req,res) {
    var code = req.query.code;
    var authcallback = GetBaseUrl() + '/auth/mercadolibre/callback';
    var accessTokenUrl = util.format('https://api.mercadolibre.com/oauth/token?grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&redirect_uri=%s',
    config.clientId, config.clientSecret, code, authcallback);
    request.post(accessTokenUrl, function(error, response, body) {
        res.send(body);
    });
});

Bien, ahora si corro mi app y browseo a ‘/auth/mercadolibre’, pasado el login y los redirects, debería obtener un JSON con el access token. Algo parecido a lo siguiente.

authComplete

3) Para mantener la explicación simple, el siguiente código muestra como se puede usar manualmente en un request el access token obtenido para obtener la dirección de un usuario de mercado libre.

app.get('/:user/address', function (req, res) {
    var userId = req.params.user;
    var apiUrl = util.format('https://api.mercadolibre.com/users/%s/addresses?access_token=%s', userId, '{copiar_el_access_token_acá}');
    request.get(apiUrl, function(error, response, body) {
        res.send(body);
    });
});

Tengan en cuenta que no toda la funcionalidad de la API requiere que estemos autenticados. Por ejemplo las búsquedas, se pueden realizar sin necesidad de autenticación.

LA MAGIA

Por algún motivo desconocido aún por mi (y un poco de vago) nada de esto anda si no configuro el módulo HTTPS de la siguiente manera:

https.globalAgent.options.secureProtocol = 'SSLv3_method';

Para mas info de OAuth 2, me gustó el diagrama que tiene la RFC acá. Como siempre el feedback es bienvenido🙂

Posted in Node.js | 2 Comments »

Algunos Tips de CSS

Posted by sebastiandurandeu on March 24, 2012

Definitivamente el contenido de este blog es demasiado variado. Marketing –> NLTK –> CSS ?? Y bueno, probablemente tenga que postear mas seguido!

Lo que sigue a continuación son una serie de tips que junté últimamente para utilizar hojas de estilos (CSS). Muchos no son la gran ciencia, pero a mi me suelen ser útiles y los quería compartir. Algunas cosas de las que están acá las aprendí de un libro llamado Bulletproof Web Design de Dan Cederholm (muy recomendable!) y otros los aprendí haciendo el trabajo práctico final de mi carrera.

Crear una Stylesheet desde Cero

Al comenzar una nueva app web desde cero me apareció la pregunta, y ahora como arranco con el CSS del sitio? Y buscando, encontré que una buena practica es usar un set de estilos para resetear los estilos default del browser a un valor conocido. Para esto se pueden bajar código de ‘Reset CSS’ de varios sitios, en particular yo utilicé http://meyerweb.com/eric/tools/css/reset/ de Eric Mayer. Uno de los objetivos de esto es evitar inconsistencias entre distintos browsers, haciendo nuestro sitio cross-browser compatible.

Self-Clearing Floats

Si duda el float puede ser de gran ayuda al momento de armar el layout de un sitio (acá se explica muy bien que es y como funciona). Sin embargo, manejar bien los floats puede ser difícil, especialmente utilizar bien el clear para que un elemento se ubique siempre debajo de una serie de elementos flotados. Un truco, entre varios que existen, que leí en el libro que comenté arriba, es usar self-clearing floats con la propiedad overflow.

Siguiendo el código de abajo, la idea es que al tener 2 elementos flotados en su interior, el #contenedor no va a tener tamaño propio y el #contenido-separado se va a posicionar por la derecha de los #contenido-flotado.

Markup:

<div id=”contenedor”>
    <div id=”elemento-flotado1”></div>
    <div id=”elemento-flotado2”></div>
</div>
<div id=”contenido-separado”>Esto quiero que se siempre se muestre abajo de los elementos flotados</div>

CSS:

#contenedor {
    overflow: hidden;
}
#elemento-flotado1 {
    float: left;
    background-color: Blue;
}
#elemento-flotado2 {
    float: left;
    background-color: Green;
}

Sin ‘overflow:hidden’:

image

Con ‘overflow:hidden’:

image

Eso sí, asegurarse que el contenedor no tenga contenido que sobresalga (en overflow) que querramos mostrar!

Centrado Horizontal de Elementos

Este es un tip que uso muy muy seguido para centrar elementos horizontalmente: definir los márgenes izquierdo y derecho de un elemento en auto, de la siguiente forma:

#elemento {
    margin-left: auto;   
    margin-right: auto;
}

Claramente si lo que quieren es alinear texto dentro de un elemento pueden usar text-align: center, que es bastante mas cómodo. Lo mismo si tienen que centrar una imagen pueden asignarla como background de un elemento y usar la propiedad background-position.

Centrado Vertical de Texto

Otro tip simple que puede ayudar algunas veces, es usar la propiedad line-height para centrar texto verticalmente. La idea es definir el valor de line-height exactamente al mismo tamaño del elemento contenedor de la siguiente forma.

#elemento {
    height: 30px;   
    line-height: 30px;
}

Este tip no sirve si el texto ocupa mas de una línea.

Como Nombrar los Elementos en CSS: Structural Naming Conventions

Cuando no saben que nombre usar para identificar las clases (.miClase) o los elementos del sitio (#miElemento), prueben esta convención: nombrar las cosas por su función y no por su ubicación en el sitio o como se ven. El ejemplo típico es que en vez de usar #top-div, #left-col y #right-col, usar #header, #mainContent, #secondaryContent.

Si en un futuro queremos cambiar la posición de los elementos o como estos se ven, no necesitamos modificar los nombres de clases o identificadores de elementos. Al mismo tiempo, estamos aumentando la separación entre el markup (código HTML) y la presentación.

Este no es un tema nuevo y hay muchos artículos al respecto, pero acá dejo algunos:

Y si quieren ver como los sitios mas populares llaman a los elementos principales del markup, prueben: http://www.stuffandnonsense.co.uk/archives/naming_conventions_table.html (Andy Clarke).

Resumir Valores para Top-Bottom y Left-Right

Esto es muy simple, pero lo aprendí hace poco! Al definir los valores de margin o padding, podemos definir los valores top y bottom juntos, así como los de left y right. Por ejemplo el elemento siguiente va a tener un valor 0 de margen superior y inferior, y un valor de 15px para los márgenes de izquierda y derecha.

#elemento {
    margin: 0 15px;
    padding: 10px 5px;
}

Uso de Definition Lists <dl>, <dt> y <dd>

Siempre es importante darle significado al markup que escribimos, utilizando los tags que mas representen la “función o sentido” del elemento. Por ejemplo, si definimos un título, usar un elemento <h1>, si definimos la descripción de un input, utilizar un <label>. Pero dentro de los elementos disponibles, uno que no se suele usar mucho son las definition lists. Por ejemplo, si tenemos una lista de productos con su descripción e imagen, podríamos armar cada producto dentro de un <dl>, con el nombre del producto dentro de un <dt> y la imagen y la descripción en un <dd> cada uno.

<dl>
    <dt>Mi Producto</dt>    <dd>La descripción del producto</dd>
    <dd><img src="…" alt="imagen de mi producto"></dd>
</dl>

Otro uso propuesto por W3C es para mostrar diálogos entre actores:

Another application of DL, for example, is for marking up dialogues, with each DT naming a speaker, and each DD containing his or her words.

Propiedad CSS Text-Transform

Esta es una propiedad que nunca había usado, pero puede llegar a ser útil. Text-transform permite formatear texto en mayúscula (uppercase), minúscula (lowercase) o con la primera letra mayúscula y el resto minúscula (capitalize) desde la hoja de estilos. Lo interesante de esta propiedad es que permite ajustar el formato del texto desde la hoja de estilos, sin necesidad de modificar el markup.

.texto-en-mayuscula {
    text-transform: uppercase;
}

Arial vs. Helvetica

Por último un artículo que a mi me pareció bastante interesante sobre la historia de una a las fuentes mas famosas de todos los tiempos – Arial – y su relación con Helvetica, Apple y Microsoft: http://www.ms-studio.com/articles.html

Posted in CSS, Programming, Web | Leave a Comment »

Utilizar NLTK desde IronPython 2.7 y Visual Studio

Posted by sebastiandurandeu on September 13, 2011

NLTK (Natural Language Toolkit – http://www.nltk.org/) es una suite de bibliotecas para realizar procesamiento de lenguaje natural (NLP – Natural Language Processing) en Python, publicado bajo licencia GPL. El campo del procesamiento del lenguaje natural permite realizar procesamiento de texto utilizando técnicas de aprendizaje automático, por ejemplo, clasificación de documentos, búsqueda de documentos relevantes en base a un tema, traducción automática, entre otras cosas.

Mas concretamente yo estoy utilizando NLTK desde IronPython para realizar análisis de sentimiento para saber si un texto sobre un tema en particular representa una opinión positiva o negativa. Hay algunos ejemplos en este otro artículo: http://streamhacker.com/2010/05/10/text-classification-sentiment-analysis-naive-bayes-classifier/

Una fuente muy, muy completa sobre aplicaciones de NLTK al procesamiento de texto se puede encontrar en el siguiente libro Python Text Processing with NLTK 2.0 Cookbook. Sino, como referencia general pueden revisar este libro online: http://www.nltk.org/book

Para utilizar NLTK desde IronPython y Visual Studio deben seguir lo siguientes pasos:

  1. Si aún no lo tienen instalado, instalar IronPython desde http://ironpython.codeplex.com/releases/view/54498. Por default se va a instalar en “C:\Program Files\IronPython 2.7”.
  2. Descargar PyYAML (3.10) en su versión zip desde http://pyyaml.org/wiki/PyYAML y descoprimirlo en cualquier carpeta.
  3. Abrir una consola (con permisos de administrador) donde descomprimieron el zip de PyYAML y ejecutar el siguiente lo siguiente desde una consola (suponiendo que IronPython esta instalado en la carpeta default).
    "C:\Program Files\IronPython 2.7\ipy.exe" setup.py install
  4. Ejecutar los siguientes pasos para instalar Expat (se pueden ver los pasos orginales en http://code.google.com/p/robotframework/issues/detail?id=154):
    1. Descargar el Python 2.7.2 compressed source tarball desde http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz. Extraer el contenido. Esto lo hacemos para obtener algunos archivos que no se incluyen por default con IronPython.
    2. Copiar expatbuilder.py desde la carpeta Lib\xml\dom de los archivos de Python descomprimidos a C:\Program Files\IronPython 2.7\Lib\xml\dom
    3. Copiar expat.py desde la carpeta Python\Lib\xml\parsers de los archivos de Python descomprimidos a C:\Program Files\IronPython 2.7\Lib\xml\parsers
    4. Descargar el siguiente archivo https://fepy.svn.sourceforge.net/svnroot/fepy/trunk/lib/pyexpat.py y copiarlo a C:\Program Files\IronPython 2.7\Lib
  5. Descargar el instalador de NLTK (msi o exe) desde http://www.nltk.org/download.
  6. Instalar NLTK, pero como no tenemos instalado Python, el instalador va a crear una carpeta Lib en la misma carpeta donde lo descargamos.
  7. Abrir la carpeta Lib donde se instalo NLTK y copiar el contenido a C:\Program Files\IronPython 2.7\Lib.

Tengan en cuenta que una vez que instalaron NLTK, puede ser que necesiten descargar manualmente alguno de sus módulos usando el NLTK Downloader. Para esto abran una consola de IronPython desde C:\Program Files\IronPython 2.7\ipy.exe y ingresen:

>>> import nltk

>>> nltk.download()

Posted in Uncategorized | Leave a Comment »

Algo de Marketing

Posted by sebastiandurandeu on December 20, 2010

Este es un resumen sobre algunos conceptos de marketing que armé, basado en una clase de la materia Administración y Control de Proyectos II de FIUBA. La clase fue dada por Mariano Stampella, de FDV Solutions.

Intro

Def: Maximizar el beneficio por la venta. Satisfacer necesidades.

+ algunos conceptos:

  • Necesidad: Carencia
  • Deseo: Expresión de satisfacer necesidad
  • Demanda: Suma de deseos
  • Valor: Beneficios – Costos de compra
  • Satisfacción: Grado de cumplimiento de expectativas
  • Direct Marketing: Comunicarse directamente con el cliente, no usar publicidad (ej. e-mailing campaigns)
  • Online Marketing: Marketing a través internet.
  • Buzz Marketing: “The strategic use of word of mouth.”
  • 4p’s del Marketing ó Marketing Mix (herramientas – acción de marketing):
    • Producto. Matriz de Ansoff. Posicionamiento del producto (imagen mental de producto).

clip_image001

    • Precio
    • Plaza
    • Promoción
Algunos Conceptos de Ventas
  • Sales Funnel: Proceso de Ventas
  • Sales Lead: Potencial cliente. Simplemente un contacto. Entry point for sales funnel.
  • Sales Prospect (siguiente al lead): Potencial cliente que mostró interés en el producto que ofrece la empresa.
    • Prospecting: Generación de demanda. Prospecting is simply discarding all the unqualified leads and retaining the "gold".
    • What is a prospect? For most salespeople, a prospect is someone that is currently looking for the kinds of products or services that their organization provides. (http://www.solutionsellingblog.com/)
Algunos Conceptos de Modelos de Negocio + Planificación Estratégica
  • Long Tail
    • Vender poco de muchos productos distintos (vs. vender mucho de pocos productos – hits- iguales). Es muy barato producir cosas diferentes que se ajusten a cada comprador. Se puede tener un inventario casi infinito. Ejemplos Amazon – Netflix
    • El contrario es el clásico principio de Pareto donde el 80% de los ganancias viene del 20% de los productos

clip_image002

  • Bricks and Clicks (AKA click-and-mortar): Modelo de negocio en el cual se tiene presencia física – un local- (bricks) y presencia online (clicks).
  • Mercado –> Segmento –> Nicho
    • "Por ejemplo, las personas que eligen viajar en avión, para trasladarse de un país a otro, representan un segmento de mercado. Por su parte, aquel grupo de personas que eligen la clase ejecutiva (business class) representan un nicho de mercado. En todo caso, el segmento de personas que eligen viajar en una línea aérea son claramente identificadas y diferentes del segmento de personas que deciden viajar en bus o tren" (http://intelectiva.blogspot.com/2009/07/diferencias-entre-mercado-y-nichos.html )
    • Un nicho de mercado ideal es aquel que tiene el tamaño necesario como para ser rentable (Philip Kotler)

  • Integración Vertical vs. Integración Horizontal
    • Vertical: Comprar proveedores y clientes. Para controlar desde la producción hasta la venta al consumidor final.
    • Horizontal: Comprar para expandirse a otros mercados y ser proveedores también en estos.

  • Core Competences
    • Que puedo hacer mejor que el resto? Que es lo que mejor hago? Que te diferencia? Obtener ventaja competitiva con esto.
    • Introducido por C.K.Prahalad and Gary Hamel
    • Que no puede se imitado por competidores.
    • Puede ser también una relación con un cliente, no solo know-how
    • Si no tenés core competences, solo podes competir en precio.
    • La las competencias esenciales son la base de la ventaja de mi negocio
    • Concentrarme en mis core competences e intentar tercerizar el resto.
    • (http://www.mindtools.com/pages/article/newTMC_94.htm)
  • Cadena de Valor (value chain)
    • La serie de actividades de mi negocio que terminan generando valor al cliente.
    • Introducida por M. Porter

Con que seguir? Social Media Marketing: http://bizthoughts.mikelee.org/biz-idea-social-media-market-research-app.html#disqus_thread

Posted in Business, FIUBA, Marketing | Leave a Comment »

Clojure: Links de Introducción

Posted by sebastiandurandeu on November 15, 2010

Clojure es un lenguaje dinámico y funcional que se puede ejecutar sobre la JVM (Java Virtual Machine) desarrollado por Rich Hickey. Es parte de la familia de lenguajes “herederos” de LISP.

El lenguaje trabaja con datos inmutables, con lo cual no puedo modificar los valores que defino. Si digo que “a” vale 10, para hacer que  valga 11, necesito volver a crear “a” con valor 11. Otra característica que me llamó la atención, esta la homoiconicidad (si, un poco largo, en inglés “homoiconic”). Esto quiere decir algo así como “el código también es un dato”; en algún sentido esto facilita que los programas creados en Clojure generen fácilmente código ejecutable.

Por ultimo, una recomendación personal para los que nunca programaron en un lenguaje funcional antes (como yo…)  empiecen por entender como se usan los paréntesis en el código:

Si en C# una función es: void MiMetodo(string miValor) { … } y se llama MiMetodo(“Hola”)

En Clojure es (defn MiMetodo [mivalor] (…) ) y se llama (MiMetodo “Hola”)

A continuación les dejo una serie de links que me fueron útiles para introducirme a la programación funcional en Clojure:

Posted in Clojure, FIUBA, Programming | 1 Comment »

Fearless Change by Mary Lynn Manns and Linda Rising

Posted by sebastiandurandeu on October 30, 2010

fearlessChangeConocí este libro por Juan Gabardini, en la materia Administración y Control de Proyectos II de la FIUBA.

Fearless change: Patterns for Introducing New Ideas es un libro sobre patrones; patrones sobre como impulsar un cambio en una organización, ya sea desde lograr un reemplazo de la maquina de café, hasta modificar por completo la forma de trabajo de la organización.

Los patrones están basados en el estudio del comportamiento humano y las interacciones. Si bien el libro parece tener una clara orientación ágil (no lo leí aún), los patrones son genéricos y y pueden ser aplicados a cualquier tipo de organización o grupo de personas en cualquier contexto.

Recomiendo mucho mirar la entrevista de InfoQ a una de las autoras, Linda Rising, en la cual presenta el libro a través de claros ejemplos de como convencer a sus compañeros de trabajo de empezar a trabajar de forma agil. Quedé impresionado en las cualidades de presentadora de Linda Rising y cuan naturalmente introduce los patrones en su discurso.

Para darnos una mejor idea, dentro de los patrones que el libro explica están:

  • Do Food (o Brown Bag): Llevar comida siempre es una buena opción para atraer gente.
  • Just Do It: Arrancar por casa. Si quiero introducir un cambio probarlo yo primero.
  • Ask for Helper: Solo se complica, no olvidar que se puede pedir ayuda a otros, en particular a los Innovators (otro patrón), que son los compañeros a los cuales les suelen gustar las nuevas ideas.
  • Piggyback: Siempre es mas fácil sumarse a algo existente, tratar de introducir las prácticas nuevas como mejoras a prácticas existentes en la organización.
  • Local Sponsor: Si tengo el apoyo de algún jefe también es mas fácil introducir nuevas ideas.

Posted in Agile, Libros, Project Management | Leave a Comment »

Introduccion a los Sistemas Distribuidos – Frame Relay y ATM

Posted by sebastiandurandeu on August 10, 2010

En esta serie de posts, voy a publicar algunos resumenes que tengo sobre temas de la materia Introducción a los Sistemas Distribuidos de FIUBA (el profesor es José Ignacio Alvarez Hamelin).

En este post incluyo los temas de Frame Relay y redes ATM.

Introducción

  • Frame Relay y ATM son switched communications network. La data es switcheada de nodo a nodo.
  • Dos modos: Circuit Switching vs Packet Swithcing
  • Frame Relay es un ejemplo de Packet Switching.
  • Una red puede ser connection-mode (virtual circuit) o connectionless-mode (datagram). En connection-mode se establece una conección logica entre el transmisor y el receptor. En connectionless-mode los paquetes son ruteados del origen al destino
  • IP es connection-less.
  • ATM sería como la evolución de Circuit + Packet.

Circuit Switched Networks

  • El canal de comunicación se establece previo al envio de datos y es dedicado. Una vez establecido no se puede usar para otra comunicación, entonces se desperdician recursos si el canal no se usa un 100%.
  • Los links entre nodos (puntos intermedios) tienen multiplexación. With circuit switching, time on a node-to-node link is preallocated using synchronous time-division multiplexing.
  • Redes telefónicas.

Packet Switched Networks

    • Buenas para conectar puntos lejanos. El objetivo es mejorar las limitaciones de las redes conmutadas de circuitos, aprovechando mejor los tiempos en los que la linea no se usa.
    • El data rate puede no ser constante como en Circuit Switched.
    • Data is transmitted in short packets.
    • Si el paquete es mas grande, se fragmenta. Cada nodo toma una decisión de switching.
    • Most packet-switched and frame relay networks carry non-real-time data traffic.
    • Approaches de ruteo:
      • Datagram (connectionless mode): Cada paquete es ruteado independientemente. Los paquetes tienen la dirección de destino. No se asegura el orden.
      • Virtual Circuit (connection mode): La ruta es fijada antes de establecer la comm. Cada paquete tiene un identificador de VC y en base a eso se rutea. No significa que hay un dedicated path.
  • clip_image001

X.25

  • Usa virtual circuits. Cada terminal puede establecer muchos circuitos virtuales con diferentes destinos.
  • Virtual Call (dinámico en cada comm) vs Permanent Virtual Circuit (fijo).
  • Mantiene un quality of service.
  • Hay chequeo de errores hop-by-hop. Baja velocidad.

Frame Relay (Virtual Circuit Packet-Switching)

  • Es la evolución de X.25. Originalmente pensado para ISDN.
  • TCP/IP puede correr sobre Frame Relay, no así sobre X.25.
  • X.25 is a reliable protocol, based on node-to-node automatic repeat request, while Frame Relay is a non-reliable protocol.
  • Elimina el overhead de corrección de errores y flow control de X.25 para hacer communicaciones mas rápidas.
  • As with X.25, frame relay supports multiple connections over a single link. In the case of frame relay, these are called data link connections, and each has a unique data link connection identifier (DLCI).
  • Anda bien para el tráfico en ráfagas.
  • Es mas barato que una conexión punto a punto. Corre sobre DS1.

ATM

    • Pensado para usarse en muchos contextos: LAN, WAN, etc. Hoy en dia solo se usa en WANs.
    • Pensado para transportar tanto voz como datos (rango de servicios / B-ISDN):
      • Telephone networks supports a single quality of service and is expensive to boot.
      • Internet supports no quality of service but is flexible and cheap.
    • La especificación quedó muy cara.
    • Usa FIBRA OPTICA.
    • La data se divide en fixes-size cells (53 bytes: 5 de header + 48 de datos). Las celdas se transmiten asincrónicamente. Su orden está garantizado. Las celdas son chicas para hacer switching rápido.
    • Toma mucho de frame relay. Es connection oriented, hay que establecer la comunicación antes de empezar a trasnmitir. Todas las cells usan el mismo camino.
    • Se reservan recursos. Puede transmitir muchos tipos de tráfico seteando end-to-end quality of service.
    • Las direcciones ATM tienen 20 bytes.
    • Es asincrónico!
    • Control Signaling: Es lo que se usa para establecer una conexión con otro nodo ATM, usando la ATM address. Se usa un Virtual Channel aparte.
      • Para comunicarse con un nodo remoto, un host debe solicitar a su switch local el establecimiento de una conexión con el destino. Estas conexiones pueden ser de dos naturalezas: Switched Virtual Circuits (SVC) o Permanent Virtual Circuits (PVC). (http://www.angelfire.com/wi/ociosonet/29.html)
      • En vez de usar la dirección origen y destino, se usan los VPI y los VCI.
    • Por el cable van varios Virtual Path (origen y destino fijos) que a su vez se dividen en varios virtual channels. To set up a virtual channel, there must first be a virtual path connection to the required destination node with sufficient available capacity to support the virtual channel, with the appropriate quality of service.
    • El VPI, junto con el VCI, se utiliza para identificar el próximo destino de una celda a medida que atraviesa una serie de switches ATM hasta llegar a su destino.
      • VCI (Virtual Channel Identifier)
      • VPI
    • La función del VPI es similar a la del DLCI en Frame Relay.
    • Puedo hacer ATM sobre SDH o SDH sobre ATM. ATM no especifica el medio de transmisión.

QoS

    • Traffic parameters can be negotiated between a user and the network for each VCC.
    • CBR: Constante. Videoconferencing, telephony services, and television broadcast. CBR can send cells at peak cell rate (PCR) at any time and for any duration.
      • PCR como la máxima
      • CDV
      • CTD
    • VBR: Entre un mínimo y un máximo. Modern Video Codecs. A veces se necesita mucho, a veces poco. Bandwidth for VBR applications varies within a specified range. Delay and delay variance requirements are not fully defined. Ejemplos: video-on-demand (VOD) and voice-over-IP (VoIP) – Comprimido!
      • PCR
      • SCR
      • MBS
      • Opcionales –> CDV / CTD
    • ABR: Solo un mínimo. The Available Bit Rate (ABR) Class of Service requires the use of flow control mechanisms for ensuring allocation of bandwidth on-demand for non-real-time, mission-critical applications. With ABR applications, guaranteed minimum transmission rates are specified for the duration of the connection. Ejemplos: LAN-to-LAN
      • PCR
      • MCR
    • UBR: Nada.Puede tardar todo lo que sea o perderse lo que sea. The Unspecified Bit Rate (UBR) Class of Service is equivalent to best-effort delivery in IP networks. Delay-tolerant UBR applications include Web browsing and IP transmissions.
      • PCR (solo para información, no asegura nada).
    • Parámetros
      • Peak cell rate (PCR): The peak cell rate is the maximum rate at which the source can transmit.
      • Cell-delay variation (CDV): Defines the jitter or variation in the delay that might be experienced by any particular cell.
      • Cell transfer delay (CTD): Defines the largest expected cell delay between entrance into and exit from the ATM network.
      • Sustainable cell rate (SCR): Average rate of cell generation rather than to a peak rate
      • Burst Tolerance (MBS – Maximum Burst Size?): Defines the amount of time or the duration at which the router sends at PCR.
      • Minimum Cell Rate (MCR): Rate at which a source router can always send.
      • Cell Loss Ratio (CLR)

AAL

    • Transforma los datos a ser enviados en celdas ATM. The ATM Adaptation Layer (AAL) facilitates cell segmentation and reassembly by dividing media streams received from upper protocol layers into 53-byte ATM cells for transmission over the physical link.
      • AAL Type 1 supports constant bit rate (CBR), synchronous, connection oriented traffic. Examples include T1 (DS1), E1, and x64 kbit/s emulation.
      • AAL Type 2 supports time-dependent Variable Bit Rate (VBR-RT) of connection-oriented, synchronous traffic. Examples include Voice over ATM. AAL2 is also widely used in wireless applications due to the capability of multiplexing voice packets from different users on a single ATM connection.
      • AAL Type 3/4 supports VBR, data traffic, connection-oriented, asynchronous traffic (e.g. X.25 data) or connectionless packet data (e.g. SMDS traffic) with an additional 4-byte header in the information payload of the cell. Examples include Frame Relay and X.25.
      • AAL Type 5 is similar to AAL 3/4 with a simplified information header scheme. This AAL assumes that the data is sequential from the end user and uses the Payload Type Indicator (PTI) bit to indicate the last cell in a transmission. Examples of services that use AAL 5 are classic IP over ATM, Ethernet Over ATM, SMDS, and LAN Emulation (LANE). AAL 5 is a widely used ATM adaptation layer protocol. This protocol was intended to provide a streamlined transport facility for higher-layer protocols that are connection oriented.
  • clip_image002

    (de ATM rincon del Vago)

ATM LAN

  • LANE (LAN Emulation): Emulación de LAN (LANE) ofrece interoperabilidad entre las redes heredadas y modo de transferencia asincrónica (ATM). Con LANE, redes Ethernet y Token Ring pueden interconexión con redes ATM.
  • The three primary LANE services are the LAN emulation configuration server (LECS), the LAN emulation server (LES), and the Broadcast and Unknown server (BUS). The LECS distributes configuration information to clients, allowing them to register on the network. The LES manages one or more Emulated LANs (ELANs); it is responsible for adding members to the ELAN, maintaining a list of all the ELAN’s members, and handling address resolution requests for the LANE clients. The BUS handles broadcast and multicast services.
  • Un mismo LECS sirve para varias ELANs.

  • Cuando se quiere establecer una conexión, el cliente (LEC) hace una consulta LANE ARP al LES y este le devuelve la dirección del destino. Al mismo tiempo, el LEC se conecta con el BUS y le manda los datos a este hasta que pueda establecer una conexión directa con el destino.
  • clip_image003

  • IP over ATM: La idea es la misma que LANE, usar un servidor central. Usa un servidor ATMARP para resolver las direcciones.
  • Pure ATM LAN:
  • clip_image004

Links

Posted in FIUBA, Networking | Leave a Comment »

Ejemplo de Trazabilidad en un Proyecto de Software

Posted by sebastiandurandeu on June 27, 2010

Si bien la palabra Trazabilidad no existe en el diccionario castellano. Según la Wikipedia se puede especificar como “seguimiento del producto” y según ISO:

La trazabilidad o rastreabilidad es la "aptitud para rastrear la historia, la aplicación o la localización de una entidad mediante indicaciones registradas".

En el caso del Software se refiere a la capacidad de relacionar los requerimientos hacia “atrás” con las necesidades de negocio que originaron estos requerimientos y hacia “adelante” con los componentes de código, pruebas y defectos que se generaron a partir de estos requerimientos.

En el trabajo práctico que realizamos para la materia Taller de Desarrollo de Proyectos II uno de los objetivos era poder mantener la Trazabilidad de todos los puntos del proyecto. El siguiente gráfico intenta explicar como logramos este objetivo, utilizando como elemento central las User Stories.

image

Posted in Uncategorized | Leave a Comment »