viernes, 12 de septiembre de 2014

Mikrotik SwOS: Creación de VLANs

Creación de las VLAN

Lo primero que hay que hacer es entrar en la pestaña de VLANs y crear todas las que necesitemos en el switch. Marcar los puertos que necesitemos y dejar el resto como not in group.

Reglas de aceptación

En la pestaña VLAN definimos el modo de aceptación de los paquetes, podemos:
1. Aceptar los tageados.
2. Drop los no tageados.
3. Remarcar los paquetes con una VLAN diferente.
4. Aceptar los no tageados en una VLAN.

Crear puerto de trunk

  1. Definit todas las VLANs que tengan que pasar en la pestaña VLANs.
  2. En la pestaña VLAN poner el puerto como enable o algún derivado.

Crear puerto access (para tagear)

  1. Setear la Default VLAN ID a la VLAN con la que queramos tagear.
  2. Poner el modo como strict.
  3. Poner el VLAN headercomo add if is missing.

Fuentes:
Wiki mikrotik
Greg Sowell

miércoles, 10 de septiembre de 2014

Mikrotik SwOS: Traducción del manual VLAN

El manual de mikrotik es un poco críptico en el caso de la pestaña de configuración de puertos y VLAN del SwOS. Tal vez esta traducción sirva de ayuda en caso de duda.

Cuando se menciona tabla VLAN se refiere a la pestaña VLANs donde debemos crear cada una de las VLANs que queremos usar en el switch. La política básica será dejar leave as is en los puertos de trunk y en los que queramos dejar pasar los paquetes marcados y not a member en el resto.

VLAN

Ingress (Entrada de paquetes)

VLAN Mode

Disabled

  1. La tabla VLAN no se usa.
  2. Ignora la VLAN de los paquetes marcados.

Optional

  1. Si la VLAN del paquete no está en la tabla de VLANs, estos se tratan como si no tuvieran VLAN.

Enabled

  1. A los paquetes que llegan sin VLAN se les pone el Default VLAN ID.
  2. De los que llegan con VLAN, borra aquellos con una VLAN que no esté presente en la tabla de VLANs.

Strict

  1. A los paquetes que llegan sin VLAN se les pone el Default VLAN ID.
  2. De los que llegan con VLAN, borra aquellos con una VLAN que no esté presente en la tabla de VLANs.
  3. Borra los paquetes con VLAN y puerto que no estén en la tabla de VLANs.

VLAN Receive

Esta regla va después del mode. Define si el paquete debe ser aceptado según sea any / only tagged / only untagged.

Default VLAN ID

Los paquetes que lleguen sin tag serán tratados como si estuvieran marcados con esta VLAN (sirve para conectar dispositivos que no tageen tales como ordenadores, tablets, etc).
Esta VLAN ID será añadida al paquete saliente sólo si está marcada la opción add if is missing especificada en el puerto de salida.

Force VLAN ID

Si deben marcarse con la Default VLAN ID todos los paquetes en la entrada.

Egress (Salida de paquetes)

VLAN Header

Define qué debemos hacer con la cabecera de los paquetes a la salida. En la cabecera es donde marcamos la pertenencia a una VLAN.

leave as is

Si el paquete viene marcado con VLAN, lo dejamos tal y como está.

always strip

Si el paquete viene marcado, se quita la VLAN de la cabecera.

add if missing

Si la VLAN no está marcado con VLAN, se añade la Default VLAN ID a la cabecera.

Preparado por:
Pere Vilás
Víctor Valverde

Javascript herencia con factoría de objetos

Javascript no tiene un soporte claro para la herencia. Tal vez sea debido a que no existe el concepto de clase. En los lenguajes tradicionales, solemos definir la clase como una plantilla de cómo debe ser el objeto y después instanciamos a partir de esa definición.

Además, en Javascript todo es un objeto dinámico. En cualquier momento podemos añadir, quitar o cambiar cualquier propiedad de un objeto sin preocuparnos de la pertenencia a una clase o la necesidad de convertir entre clases.

Si lo que deseamos es la funcionalidad que nos otorga la herencia y preferimos el estilo de construcción de factoría de objetos, es decir, un objeto Function que nos retorna otro objeto con sus propiedades es muy fácil implementar la herencia y la sobreeescritura.

Pongo un ejemplo que se explica por si mismo:

"use strict";

// el objeto base
var Familia=function(fam) {
        var obj={};
        obj.familia=fam;

        // Function en el objeto base
        obj.tienePatas=function() {
                return (obj.familia==="Hominidae")? true: false;
        };

        // sobreescritura de Object.toString()
        obj.toString=function() {
                console.log("FAMILIA ============");
                console.log("Familia:", obj.familia);
        };

        return obj;
};

// objeto que hereda 
var Genero=function(fam, gen) {

        // obj es una Familia
        // "heredamos" en Genero sus propiedades...
        var obj=Familia(fam);

        // ... y añadimos una propiedad nueva
        obj.genero=gen;

        // sobreescribimos (otra vez) toString
        obj.toString=function() {
                console.log("FAMILIA Y GENERO ============");
                console.log("Familia:", obj.familia, "Genero:", obj.genero);
        };

        return obj;
};

// creamos nuevo objeto Familia
var monos=Familia("Hominidae");
monos.toString(); // Hominidae
console.log(monos.tienePatas()); // true

// creamos nuevo objeto Genero
var hombre=Genero("Hominidae", "Homo");
hombre.toString(); // Hominidae Homo
console.log(hombre.tienePatas()); // true

Este método es muy fácil y cómodo pero si tenemos que crear grandes cantidades de objetos es preferible usar prototype ya que ahorra gran cantidad de espacio en memoria.

Written with StackEdit.

Parámetros por defecto en Javascript

Ya sabemos que las funciones en Javascript no son otra cosa que un objeto Function. El resultado de la evaluación del cuerpo de ese objeto es lo que en otros lenguajes llamamos el resultado de la ejecución de la función.

También sabemos que los “parámetros” del objeto Function son, a su vez, objetos. Esto es tan cierto que podemos pasar otra función (otro objeto Function) como parámetro.

Un pequeño inconveniente de esta falta de tipado es que si no pasamos ningún argumento la referencia al objeto pasado queda con el valor especial undefined. Para dar un valor por defecto al objeto pasado podemos hacer:

function myFunction(param) {
    // comprobamos que el objeto param esté definido
    if (param === undefined) {
        param = 0; // le asignamos la primitiva int con valor cero
    }
}

o bien, más corto:

function myFunction(param) {
    param = param || 0;
}

Written with StackEdit.

martes, 9 de septiembre de 2014

Fundamentos de objetos javascript

En javascript, la tarea de crear objetos se deja al programador el cuál escogerá la mejor estrategia según sus intereses.

Javascript no es Java en el sentido de que es un leguaje basado en objetos donde estos son la entidad fundamental. Difiere de Java en que tiene su propia filosofía acerca de la creación y uso de objetos.

Estas diferencias pueden causar problemas a los programadores que vienen de otros lenguajes y se pierden al intentar aplicar la misma filosofía que Java, o C++ a Javascript. En este sentido, la filosofía de JS se parece más a SmallTalk.

Características de javascript

Javascript no tiene ni clases ni tipos. En JS todo es un objeto (con las excepciones de null y undefined).

Un objeto JS es un contenedor que puede contener una colección de otros objetos.

Primera forma de crear un objeto

El punto de partida es el objeto vacío {}. {}significa que es un objeto y puede contener otros objetos.

Dentro de un objeto se pueden definir los miembros como nombre:objeto separados por una coma. Los nombres se conocen generalmente como las propiedades del objeto.

Por ejemplo:

{
    prop1: object1, 
    prop2: object2, 
    prop3: {}
};

Nótese que prop3 es el objeto vacío.

Segunda forma de crear un objeto

new Object(); tiene el mismo efecto (casi) que {}, i.e. crea un objeto vacío.

Acceso a las propiedades

Tenemos dos métodos equivalentes para el acceso a las propiedades de un objeto:

object.property;
o
object[property];

La ventaja del segundo es que la propiedad puede ser un String y por lo tanto ser determinada dinámicamente. Por otra parte, la primera versión es más rápida por que se determina en tiempo de compilación.

También podemos formar cadenas de propiedades como

object.property1.property2;
o
object[property1][property2];

Asignar el valor de una propiedad o crear una nueva propiedad

object.property1={}; // asignar
object.property3={}; // crear y asignar una nueva propiedad

Todos los objetos javascript son dinámicos y por lo tanto podemos crear nuevas propiedades en cualquier momento.

La variable de objeto global

Para poder usar las variables tenemos que tener un método para seguirles la pista una vez creadas. Pero en Javascript la idea de variable es un tanto sutil.

JavaScript proporciona un objeto estándar llamado global object

En general, este objeto global es llamado this, aunque si estamos ejecutando en un navegador es llamado window.

Atención: this se refiere al objeto global siempre que esté fuera de una función.

Podemos crear propiedades de alcance (scope) global sencillamente dando propiedades a this fuera de una función:

this.myObject={};

Diferentes formas de crear variables globales

  1. myObject={};
  2. var myObject; myObject={};
  3. var myObject={};

Todas ellas se traducen en
this.myObject={};

En Javascript no existen las variables globales, sólo propiedades del objeto global.

Recodar que this dentro de una función tiene un significado distinto.

Hoisting

Para hacer las cosas un poco más interesantes, hay una sutil diferencia entre:

this.property=value;
y
var property=value;

La segunda versión en realidad hace que podamos usar property antes de ser declarada. La forma en que JS hace esto es muy sencilla:

  1. Escanea todo el código en busca de declaraciones var.
  2. Lleva automáticamente la declaración al principio del código con lo que todas las variables dentro del contexto quedan declaradas y por tanto podemos usarlas en cualquier punto del programa.
  3. Cuando la ejecución llega a la línea var property=value; le asigna el valor.

Semántica de las referencias a objetos

var myObject1={};
var myObject2=myObject1;

Tanto myObject1 como myObject2 referencian exactamente al mismo objeto. Un cambio en uno será visible en el otro.

Objetos que vienen con el lenguaje

Hay una serie de objetos que ya vienen con Javascript, uno de ellos es el objeto String.

new String("Hola que tal");

Crea un nuevo objeto cada vez que es llamado. Por ejemplo, podríamos tener un objeto tal como:

var myAddress={
    Name: new String("Pere");
    Address: new String("Eivissa");
};
console.log(myAddress.Name);
console.log(myAddress['Address']);

El objeto String es tan importante que podemos abreviar su creación llamando sencillamente a
alert('hola');
en vez de
alert(new String('hola'));

Pero en realidad Javascript está usando la segunda versión en todo caso.

El objeto Number

Podemos usar tanto

var num= new Number(3);

como

var num=3;

Lo que ocurre es que la segunda versión está ligeramente optimizada (sería un tipo primitivo en otros lenguajes) pero en el mismo momento en que hacemos esto

num.toString();

Se convierte automáticamente al objeto Number.

No se pueden añadir propiedades a un objeto primitivo.

En cambio, podemos añadir nuevas propiedades al objeto Number sin mayor problema.

Number.prototype.porDos=function() {
        return this*2;
};
var num=new Number(3);
console.log(num.porDos()); // 6

Expresiones e inmutabilidad

Una expresión toma datos y los combina para producir nuevos datos.

var res=2*3+4; // res=10

pero

var n1= new Number(2);
var n2= new Number(3);
n2.age=13;
var n3=n1+n2;
console.log(n3); // 5
console.log(n3.age); // undefined

Esto ocurre porque las expresiones que combinan objetos siempre devuelven un nuevo objeto del tipo original (Number).

Disclaimer

Esta entrada es resultado de apuntes tomados al vuelo leyendo la serie de artículos de javascript escrita por Ian Elliot en i-programmer. No pretende ser una traducción al español ni nada parecido, es un simple registro para mi uso personal. Debe referirse al original para su lectura.

Fuente: i-programmer.info
Written with StackEdit.

Construcción de objetos en javascript

Construcción de objetos

Podemos construir un objeto con

var myPoint{ x:0; y:0};

Pero, por supuesto, esto sólo nos daría un copia del objeto. ¿Cómo creamos más de una instancia?, pues usando un object factory:

Point=function() {
    return {x:0; y:0};
};
var myPoint= Point();

Sin embargo, así como el objeto va creciendo y se va sofisticando, es complicado de mantener; Una mejor alternativa es usar:

Point=function() {
    var obj={};
    obj.x=x;
    obj.y=y;
    return obj;
};
var myPoint= Point(1,2);

Acceso a los miembros de un objeto

Recordamos cómo dar acceso público o privado a los miembros de un objeto, aunque sabemos que en javascript no existen métodos, sólo referencias a objetos (tales como el objeto Function).

Point=function(x,y) {
    var obj={};

    // variables públicas
    obj.x=x;
    obj.y=y;

    // variable privada
    var privada = 10;

    // este "método" es privado
    function resta() {
        return obj.x-obj.y;
    };

    // este "método" es público
    obj.add=function() {
        return obj.x+obj.y;
    };

    return obj;
};
var myPoint=Point(1,2);
console.log(myPoint.add()); // 3
myPoint.x=4;
console.log(myPoint.add()); // 6
  • add es público por que se devuelve con el objeto.
  • obj no existe fuera de myPoint.
  • obj es una variable privada para la instancia de objeto que hemos creado.
  • cualquier variable local declarada dentro del factory es tratada como privada.

Métodos de construcción

Diferencias entre new y var

Los dos métodos de construcción existentes son igualmente correctos: Usando la palabra clave new o creando un object-factory, pero posteriormente haremos una precisión respecto al uso de new y this.

new

Point=function(x,y) {
    this.x=x;
    this.y=y;
    this.add=function() {
        return this.x+this.y;
    };
    // no es necesario devolver this.
};
var myPoint=new Point(1,2);
console.log(myPoint.add()); // 3
myPoint.x=4;
console.log(myPoint.add()); // 6

var

Point=function(x,y) {
    var obj={};
    obj.x=x;
    obj.y=y;
    obj.add=function() {
        return obj.x+obj.y;
    };  
    return obj;
};
var myPoint=Point(1,2);
console.log(myPoint.add()); // 3

¿Cuál es la diferencia entre los dos?. La diferencia fundamental es que la versión con new devuelve el objeto this automáticamente.

Atención

Cuando nos referimos a this, estamos hablando del contexto de ejecución actual (la closure actual) dentro de una función.

this fuera de una función se refiere al objeto global this.
this dentro de una función se refiere al contexto de ejecución (la closure) actual.

Cuidado con las confusiones.

this como objeto global fuera de una función no es lo mismo que el contexto raiz.

x=3;
this.x=5;
console.log('x es',x,'y this.x es', this.x); 
// x es 3 y this.x es 5

Es como si al principio del programa tuviéramos el objeto llamado this instanciado de la siguiente manera:

var this={};

y cada vez que creamos un objeto con new se nos añadiera dicha línea al principio del objeto de forma automática.

Mejor estilo

Según el artículo de Ian, la versión con new suena mejor al programador que viene de otros lenguajes, pero la versión con variable es más javascript.

Disclaimer

Esta entrada es resultado de apuntes tomados al vuelo leyendo la serie de artículos de javascript escrita por Ian Elliot en i-programmer. No pretende ser una traducción al español ni nada parecido, es un simple registro para mi uso personal. Debe referirse al original para su lectura.

Fuente: i-programmer.info
Written with StackEdit.

lunes, 25 de agosto de 2014

Fibra óptica: Tipos de conectores y de cables

Documento de blackbox en el que describe los diferentes tipos de conectores para fibra óptica así como las características de las fibras.

Otra guía de referencia es The blackbox guide to structured cabling.


Fuente: Blackbox Technical Reference