Programación

UML Casos de Uso (Use Case)

Fuente: http://users.dcc.uchile.cl/~psalinas/uml/casosuso.html#actor
Introducción

El diagrama de casos de uso representa la forma en como un Cliente (Actor) opera con el sistema en desarrollo, además de la forma, tipo y orden en como los elementos interactuan (operaciones o casos de uso).

Un diagrama de casos de uso consta de los siguientes elementos:

Elementos

  • Actor

     

    Una definición previa, es que un Actor es un rol que un usuario juega con respecto al sistema. Es importante destacar el uso de la palabra rol, pues con esto se especifica que un Actor no necesariamente representa a una persona en particular, sino más bien la labor que realiza frente al sistema.

    Como ejemplo a la definición anterior, tenemos el caso de un sistema de ventas en que el rol de Vendedor con respecto al sistema puede ser realizado por un Vendedor o bien por el Jefe de Local.

  • Caso de Uso

     

    Es una operación/tarea específica que se realiza tras una orden de algún agente externo, sea desde una petición de un actor o bien desde la invocación desde otro caso de uso.

  • Relaciones

    • Asociación 

      Es el tipo de relación más básica que indica la invocación desde un actor o caso de uso a otra operación (caso de uso). Dicha relación se denota con una flecha simple.

    • Dependencia o Instanciación 

      Es una forma muy particular de relación entre clases, en la cual una clase depende de otra, es decir, se instancia (se crea). Dicha relación se denota con una flecha punteada.

    • Generalización 

      Este tipo de relación es uno de los más utilizados, cumple una doble función dependiendo de su estereotipo, que puede ser de Uso (<<uses>>) o de Herencia (<<extends>>).

      Este tipo de relación esta orientado exclusivamente para casos de uso (y no para actores).

      extends: Se recomienda utilizar cuando un caso de uso es similar a otro (características).

      uses: Se recomienda utilizar cuando se tiene un conjunto de características que son similares en más de un caso de uso y no se desea mantener copiada la descripción de la característica.

      De lo anterior cabe mencionar que tiene el mismo paradigma en diseño y modelamiento de clases, en donde esta la duda clásica de usar o heredar.

Ejemplo:

Como ejemplo esta el caso de una Máquina Recicladora:

Sistema que controla una máquina de reciclamiento de botellas, tarros y jabas. El sistema debe controlar y/o aceptar:

  • Registrar el número de ítemes ingresados.
  • Imprimir un recibo cuando el usuario lo solicita:
    1. Describe lo depositado
    2. El valor de cada item
    3. Total
  • El usuario/cliente presiona el botón de comienzo
  • Existe un operador que desea saber lo siguiente:
    1. Cuantos ítemes han sido retornados en el día.
    2. Al final de cada día el operador solicita un resumen de todo lo depositado en el día.
  • El operador debe además poder cambiar:
    1. Información asociada a ítemes.
    2. Dar una alarma en el caso de que:
      1. Item se atora.
      2. No hay más papel.

Como una primera aproximación identificamos a los actores que interactuan con el sistema:

Luego, tenemos que un Cliente puede Depositar Itemes y un Operador puede cambiar la información de un Item o bien puede Imprimir un informe:

Además podemos notar que un item puede ser una Botella, un Tarro o una Jaba.

Otro aspecto es la impresión de comprobantes, que puede ser realizada después de depositar algún item por un cliente o bien puede ser realizada a petición de un operador.

Entonces, el diseño completo del diagrama Use Case es:

Modelo de Clases UML

  • admin 

Fuente: http://users.dcc.uchile.cl/~psalinas/uml/modelo.html y http://www.seas.es/blog/content/agregacion-vs-composicion-en-diagramas-de-clases-uml
Introducción

Un diagrama de clases sirve para visualizar las relaciones entre las clases que involucran el sistema, las cuales pueden ser:

  • asociativas,
  • de herencia,
  • de uso y
  • de contenimiento.

Un diagrama de clases esta compuesto por los siguientes elementos:

  • Clase: atributos, métodos y visibilidad.
  • Relaciones: Herencia, Composición, Agregación, Asociación y Uso.

Elementos

  • Clase

    Es la unidad básica que encapsula toda la información de un Objeto (un objeto es una instancia de una clase). A través de ella podemos modelar el entorno en estudio (una Casa, un Auto, una Cuenta Corriente, etc.).

    En UML, una clase es representada por un rectángulo que posee tres divisiones:

     

    En donde:

    • Superior: Contiene el nombre de la Clase
    • Intermedio: Contiene los atributos (o variables de instancia) que caracterizan a la Clase (pueden ser private, protected o public).
    • Inferior: Contiene los métodos u operaciones, los cuales son la forma como interactúa el objeto con su entorno (dependiendo de la visibilidad: private, protected o public).

    Ejemplo:

    Una Cuenta Corriente que posee como característica:

    • Balance

    Puede realizar las operaciones de:

    • Depositar
    • Girar
    • y Balance

    El diseño asociado es:

     

     

    Atributos y Métodos:

    • Atributos:

      Los atributos o características de una Clase pueden ser de tres tipos, los que definen el grado de comunicación y visibilidad de ellos con el entorno, estos son:

      • public (+,): Indica que el atributo será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados.
      • private (-,): Indica que el atributo sólo será accesible desde dentro de la clase (sólo sus métodos lo pueden accesar).
      • protected (#,): Indica que el atributo no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de las subclases que se deriven (ver herencia).

       

    • Métodos:

      Los métodos u operaciones de una clase son la forma en como ésta interactúa con su entorno, éstos pueden tener las características:

      • public (+,): Indica que el método será visible tanto dentro como fuera de la clase, es decir, es accsesible desde todos lados.
      • private (-,): Indica que el método sólo será accesible desde dentro de la clase (sólo otros métodos de la clase lo pueden accesar).
      • protected (#,): Indica que el método no será accesible desde fuera de la clase, pero si podrá ser accesado por métodos de la clase además de métodos de las subclases que se deriven (ver herencia).

  • Relaciones entre Clases:

    Ahora ya definido el concepto de Clase, es necesario explicar como se pueden interrelacionar dos o más clases (cada uno con características y objetivos diferentes).

    Antes es necesario explicar el concepto de cardinalidad de relaciones: En UML, la cardinalidad de las relaciones indica el grado y nivel de dependencia, se anotan en cada extremo de la relación y éstas pueden ser:

    • uno o muchos: 1..* (1..n)
    • 0 o muchos: 0..* (0..n)
    • número fijo: m (m denota el número).

    1. Herencia (Especialización/Generalización): 

      Indica que una subclase hereda los métodos y atributos especificados por una Super Clase, por ende la Subclase además de poseer sus propios métodos y atributos, poseerá las características y atributos visibles de la Super Clase (public y protected), ejemplo:

      En la figura se especifica que Auto y Camión heredan de Vehículo, es decir, Auto posee las Características de Vehículo (Precio, VelMax, etc) además posee algo particular que es Descapotable, en cambio Camión también hereda las características de Vehiculo (Precio, VelMax, etc) pero posee como particularidad propia Acoplado, Tara y Carga.

      Cabe destacar que fuera de este entorno, lo único «visible» es el método Caracteristicas aplicable a instancias de Vehículo, Auto y Camión, pues tiene definición publica, en cambio atributos como Descapotable no son visibles por ser privados.

       

    2. Agregación: 

      Para modelar objetos complejos, n bastan los tipos de datos básicos que proveen los lenguajes: enteros, reales y secuencias de caracteres. Cuando se requiere componer objetos que son instancias de clases definidas por el desarrollador de la aplicación, tenemos dos posibilidades:

      • Por Valor: Es un tipo de relación estática, en donde el tiempo de vida del objeto incluido esta condicionado por el tiempo de vida del que lo incluye. Este tipo de relación es comunmente llamada Composición (el Objeto base se contruye a partir del objeto incluido, es decir, es «parte/todo»). «tiene un»
      • Por Referencia: Es un tipo de relación dinámica, en donde el tiempo de vida del objeto incluido es independiente del que lo incluye. Este tipo de relación es comunmente llamada Agregación (el objeto base utiliza al incluido para su funcionamiento).

      Un Ejemplo es el siguiente:

      En donde se destaca que:

      • Un Almacen posee Clientes y Cuentas (los rombos van en el objeto que posee las referencias).
      • Cuando se destruye el Objeto Almacen también son destruidos los objetos Cuenta asociados, en cambio no son afectados los objetos Cliente asociados.
      • La composición (por Valor) se destaca por un rombo relleno.
      • La agregación (por Referencia) se destaca por un rombo transparente.

      La flecha en este tipo de relación indica la navegabilidad del objeto refereniado. Cuando no existe este tipo de particularidad la flecha se elimina.

       

    3. Asociación

      La relación entre clases conocida como Asociación, permite asociar objetos que colaboran entre si. Cabe destacar que no es una relación fuerte, es decir, el tiempo de vida de un objeto no depende del otro.

      Ejemplo:

      Un cliente puede tener asociadas muchas Ordenes de Compra, en cambio una orden de compra solo puede tener asociado un cliente.

    4. Dependencia o Instanciación (uso): 

      Representa un tipo de relación muy particular, en la que una clase es instanciada (su instanciación es dependiente de otro objeto/clase). Se denota por una flecha punteada.

      El uso más particular de este tipo de relación es para denotar la dependencia que tiene una clase de otra, como por ejemplo una aplicación grafica que instancia una ventana (la creación del Objeto Ventana esta condicionado a la instanciación proveniente desde el objeto Aplicacion):

      Cabe destacar que el objeto creado (en este caso la Ventana gráfica) no se almacena dentro del objeto que lo crea (en este caso la Aplicación).

  • Casos Particulares:
    • Clase Abstracta

      Una clase abstracta se denota con el nombre de la clase y de los métodos con letra «itálica». Esto indica que la clase definida no puede ser instanciada pues posee métodos abstractos (aún no han sido definidos, es decir, sin implementación). La única forma de utilizarla es definiendo subclases, que implementan los métodos abstractos definidos.

    • Clase parametrizada

      Una clase parametrizada se denota con un subcuadro en el extremo superior de la clase, en donde se especifican los parámetros que deben ser pasados a la clase para que esta pueda ser instanciada. El ejemplo más típico es el caso de un Diccionario en donde una llave o palabra tiene asociado un significado, pero en este caso las llaves y elementos pueden ser genéricos. La genericidad puede venir dada de un Template (como en el caso de C++) o bien de alguna estructura predefinida (especialización a través de clases).

      En el ejemplo no se especificaron los atributos del Diccionario, pues ellos dependerán exclusivamente de la implementación que se le quiera dar.

Ejemplo:

Supongamos que tenemos tenemos un el caso del Diccionario implementado mediante un árbol binario, en donde cada nodo posee:

  • key: Variable por la cual se realiza la búsqueda, puede ser generica.
  • item: Contenido a almacenar en el diccionario asociado a «key», cuyo tipo también puede ser genérico.

Para este caso particular hemos definido un Diccionario para almacenar String y Personas, las cuales pueden funcionar como llaves o como item, solo se mostrarán las relaciones para la implementación del Diccionario:

Una duda que se plantea frecuentemente a la hora de modelar diagramas de clases con UML (Unified Modeling Language), es el uso de las relaciones estructurales de agregación y composición. Se trata de dos tipos de especialización de la relación de asociación entre clases.
Vamos a intentar mediante algunos ejemplos muy simples y esclarecedores, ver las diferencias que existen entre la composición fuerte y la composición débil, conocida habitualmente como agregación.

Agregación

La agregación es un tipo de asociación que indica que una clase es parte de otra clase  (composición débil).  Los componentes pueden ser compartidos por varios compuestos (de la misma asociación de agregación o de varias asociaciones de agregación distintas). La destrucción del compuesto no conlleva la destrucción de los componentes. Habitualmente se da con mayor frecuencia que la composición.
La agregación se representa en UML mediante un diamante de color blanco colocado en el extremo en el que está la clase que representa el “todo”.

Veamos un ejemplo de agregación:

• Tenemos una clase Empresa.
• Tenemos una clase Cliente.
• Una empresa agrupa a varios clientes.

Composición

Composición es una forma fuerte de composición donde la vida de la clase contenida debe coincidir con la vida de la clase contenedor. Los componentes constituyen una parte del objeto compuesto. De esta forma, los componentes no pueden ser compartidos por varios objetos compuestos. La supresión del objeto compuesto conlleva la supresión de los componentes.
El símbolo de composición es un diamante de color negro colocado en el extremo en el que está la clase que representa el “todo” (Compuesto).

Veamos un ejemplo de composición:

 

• Tenemos una clase Empresa.
• Un objeto Empresa está a su vez compuesto por uno o varios objetos del tipo empleado.
• El tiempo de vida de los objetos Empleado depende del tiempo de vida de Empresa, ya que si no existe una Empresa no pueden existir sus empleados.

Diferencias entre Composición y Agregación

La siguiente tabla intenta resumir algunas diferencias entre agregación y composición.

Y en código…

Para traducir ambas relaciones a código, podemos utilizar un atributo en la clase contenedora o compuesta donde almacenaremos una colección de los objetos que la componen, y por otro lado declararemos un método para agregar elementos a la colección. Dependiendo del lenguaje de programación empleado, podemos utilizar diferentes estructuras de datos que nos permitan almacenar esa colección de objetos, aunque generalmente se utilizan arrays (arreglos) para este fin.

Veamos un ejemplo:

Como podemos apreciar, es tan simple como crear en la clase Empresa un atributo clientes (colección de clientes) que sea un array, luego creamos un método addCliente donde recibiremos objetos de tipo Cliente y los agregaremos dentro del array.

Concluyendo…

En líneas generales, como hemos visto, se podría decir que la diferencia entre agregación y composición es conceptual, no se diferencia por código, o al menos, en el mayor de los casos y en la mayoría de los lenguajes de programación (como Java o PHP). De todas maneras, en el caso de la composición, si quisiéramos ser más estrictos con los diagramas de clases modelados con UML, deberíamos destruir de alguna manera el objeto componente (empleado) una vez que se desasociaran del objeto compuesto (empresa).

En definitiva, UML nos permite la posibilidad de diferenciar este tipo de asociaciones con el fin de que, aquella persona que le interese, pueda estipular de una u otra manera que se trata de una composición o una agregación, aunque en términos de implementación no se diferencie tan apenas su uso ni tenga tanta relevancia. UML propone muchas posibilidades y debe ser el analista y/o desarrollador quien decida y haga un uso correcto del mismo, con el fin de visualizar, especificar, construir y documentar adecuadamente los artefactos (modelos) de un sistema software.

SQL92 Joins, INNER JOIN, FULL OUTER JOIN, LEFT OUTER JOIN.

Una simple ayuda

El lenguaje SQL es aveces el gran olvidado por los desarrolladores, cada vez abundan mas los frameworks que abstraen al desarrollador del contacto con el modelo de negocio.

He escrito este documento, basándome en otros similares para ayudar a entender con un diagrama de Vann, los diferentes tipos de Join’s que SQL92 soporta.

Existen tecnologías que abstraen completamente del modelo de negocio, para el desarrollador funcionan creando una serie de clases de Dominio que define el modelo, sin importar qué base de datos o de qué fabricante sea esta. Por ejemplo Ruby on Rails, GRails, … usando un conjunto de tecnologías, como Hibernate configuradas por convencióndentro del propio framework.

También es muy extendido el uso de aplicaciones que permiten modelar el negocio de forma gráfica, ERM (como DBSchema), y normalmente después se usa un ORM’s que les hacen el trabajo sucio de forma elegante y segura.

Todo vale, pero la realidad de las empresas TIC es que necesitan profesionales serios y conscientes que entiendan y controlen todas las capas para que un sistema funciona como se espera y está diseñado, y no se deje nada al azar.

El desarrollador, muy frecuentemente recurre a activar trazas o aplicaciones de monitorización de actividad que nos desvelen, qué está haciendo nuestro framework con nuestro modelo de negocio. Existen aplicaciones que esnifan directamente de la base de datos esta información para que podamos analizarla, el obsoleto Profile y Analyzer que incluía Microsoft SQL Server es un ejemplo de ellos.

Finalmente cuando tenemos delante la query sucede que hace tanto tiempo que no trabajamos con SQL que no entendemos qué hace exactamente, sobre todo si está trabajando con tablas relacionadas y nos encontramos con una consulta que afecta a varias entidades.

Espero que este documento ayude a reducir el tiempo invertido a descubrir porqué se comporta una SQL de un modo u otro.

Convenciones

Este documento asume que siempre que la «TABLA A» esta a la izquierda y la «TABLA B» a la derecha de las sentencias.

Para los ejemplos vamos a utilizar 2 tablas que van a contener los siguientes datos:

id name | id name
1 Roberto | 1 Alex
2 Juan | 2 Carlos
3 Rubén | 3 Juan
4 Carlos | 4 Saúl

 

INNER JOIN

SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name

id name | id name
2 Juan | 2 Carlos
4 Carlos | 3 Juan

El resultado son solo el conjunto de registros que coinciden en ambas tablas.

Inner Join

FULL OUTER JOIN

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos
null null | 1 Alex
null null | 4 Saúl

El resultado es el conjunto total de registros de ambas tablas, coincidiendo aquellos registros cuando sea posible. Si no hay conicidencias, se asignan nulos.

Full Outer Join

FULL OUTER JOIN WHERE

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null
null null | 1 Alex
null null | 4 Saúl

El resultado es un conjunto de records únicos en la TablaA y en la TablaB, hacemos el Full Outer Join y excluimos los registros que no queremos con el Where

Full Outer Join con Where

LEFT OUTER JOIN

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name

id name | id name
1 Roberto | null null
2 Juan | 3 Juan
3 Rubén | null null
4 Carlos | 2 Carlos

El resultado son todos los registros de la TablaA, y si es posible las coincidencias de la TablaB. Si no hay coincidencias, el lado derecho mostrará nulos.

Left Outer Join

LEFT OUTER JOIN WHERE

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null

id name | id name
1 Roberto | null null
3 Rubén | null null

El resultado es un conjunto de registros que solo están en la TablaA, no en la TablaB. Hacemos lo mismo que en un Left Outer Join, pero eliminamos los registros que no queremos de la TablaB con el Where

Left Outer Join con Where

CROSS JOIN

Existe también la posibilidad de cruzar todos los registros con todos (producto cartesiano), imposible de dibujar con undiagramas Venn

SELECT * FROM TableA CROSS JOIN TableB

Imaginarse el resultado de todos los registros por todos es muy fácil, si tenemos 4 registros en cada tabla 4 x 4 = 16.

Cross Join
¡Ojo al hacer esto en tablas con muchos registros!

 

 

SQL Joins

Source: http://www.w3schools.com/sql/sql_union.asp

 

SQL joins are used to query data from two or more tables, based on a relationship between certain columns in these tables.


SQL JOIN

The JOIN keyword is used in an SQL statement to query data from two or more tables, based on a relationship between certain columns in these tables.

Tables in a database are often related to each other with keys.

A primary key is a column (or a combination of columns) with a unique value for each row. Each primary key value must be unique within the table. The purpose is to bind data together, across tables, without repeating all of the data in every table.

Look at the «Persons» table:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

Note that the «P_Id» column is the primary key in the «Persons» table. This means that no two rows can have the same P_Id. The P_Id distinguishes two persons even if they have the same name.

Next, we have the «Orders» table:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 15

Note that the «O_Id» column is the primary key in the «Orders» table and that the «P_Id» column refers to the persons in the «Persons» table without using their names.

Notice that the relationship between the two tables above is the «P_Id» column.


Different SQL JOINs

Before we continue with examples, we will list the types of JOIN you can use, and the differences between them.

  • JOIN: Return rows when there is at least one match in both tables
  • LEFT JOIN: Return all rows from the left table, even if there are no matches in the right table
  • RIGHT JOIN: Return all rows from the right table, even if there are no matches in the left table
  • FULL JOIN: Return rows when there is a match in one of the tables

 

SQL INNER JOIN Keyword

The INNER JOIN keyword returns rows when there is at least one match in both tables.

SQL INNER JOIN Syntax

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name

PS: INNER JOIN is the same as JOIN.


SQL INNER JOIN Example

The «Persons» table:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

The «Orders» table:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 15

Now we want to list all the persons with any orders.

We use the following SELECT statement:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

The result-set will look like this:

LastName FirstName OrderNo
Hansen Ola 22456
Hansen Ola 24562
Pettersen Kari 77895
Pettersen Kari 44678

The INNER JOIN keyword returns rows when there is at least one match in both tables. If there are rows in «Persons» that do not have matches in «Orders», those rows will NOT be listed.

 

SQL LEFT JOIN Keyword

The LEFT JOIN keyword returns all rows from the left table (table_name1), even if there are no matches in the right table (table_name2).

SQL LEFT JOIN Syntax

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

PS: In some databases LEFT JOIN is called LEFT OUTER JOIN.


SQL LEFT JOIN Example

The «Persons» table:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

The «Orders» table:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 15

Now we want to list all the persons and their orders – if any, from the tables above.

We use the following SELECT statement:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

The result-set will look like this:

LastName FirstName OrderNo
Hansen Ola 22456
Hansen Ola 24562
Pettersen Kari 77895
Pettersen Kari 44678
Svendson Tove

The LEFT JOIN keyword returns all the rows from the left table (Persons), even if there are no matches in the right table (Orders).

 

SQL RIGHT JOIN Keyword

The RIGHT JOIN keyword returns all the rows from the right table (table_name2), even if there are no matches in the left table (table_name1).

SQL RIGHT JOIN Syntax

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

PS: In some databases RIGHT JOIN is called RIGHT OUTER JOIN.


SQL RIGHT JOIN Example

The «Persons» table:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

The «Orders» table:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 15

Now we want to list all the orders with containing persons – if any, from the tables above.

We use the following SELECT statement:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

The result-set will look like this:

LastName FirstName OrderNo
Hansen Ola 22456
Hansen Ola 24562
Pettersen Kari 77895
Pettersen Kari 44678
34764

The RIGHT JOIN keyword returns all the rows from the right table (Orders), even if there are no matches in the left table (Persons).

 

SQL FULL JOIN Keyword

The FULL JOIN keyword return rows when there is a match in one of the tables.

SQL FULL JOIN Syntax

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name

 


SQL FULL JOIN Example

The «Persons» table:

P_Id LastName FirstName Address City
1 Hansen Ola Timoteivn 10 Sandnes
2 Svendson Tove Borgvn 23 Sandnes
3 Pettersen Kari Storgt 20 Stavanger

The «Orders» table:

O_Id OrderNo P_Id
1 77895 3
2 44678 3
3 22456 1
4 24562 1
5 34764 15

Now we want to list all the persons and their orders, and all the orders with their persons.

We use the following SELECT statement:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName

The result-set will look like this:

LastName FirstName OrderNo
Hansen Ola 22456
Hansen Ola 24562
Pettersen Kari 77895
Pettersen Kari 44678
Svendson Tove
34764

The FULL JOIN keyword returns all the rows from the left table (Persons), and all the rows from the right table (Orders). If there are rows in «Persons» that do not have matches in «Orders», or if there are rows in «Orders» that do not have matches in «Persons», those rows will be listed as well.

Selenium – Realización Pruebas Software

Uno de los proyectos más interesantes para la realización de pruebas unitarias que deben iniciarse y finalizar en la interfaz de usuario es SELENIUM. Su uso puede ser muy simple (quedándonos con SELENIUM IDE en alguno de los navegadores soportados) o integrándolo con frameworks de pruebas para los principales lenguajes de programación.

Podeis descargar SELENIUM IDE o los oyros móculos el software desde este enlace:

http://docs.seleniumhq.org/download/

Leer en este enlace

http://docs.seleniumhq.org/docs/

los apartados de:

– Introducción

– Selenium-IDE

Scrum – Libro interesante.

En este enlace:

http://www.infoq.com/minibooks/scrum-xp-from-the-trenches

Podeis descargar el libro «SCRUM desde las trincheras». Es un libro excelente (fácil y rápido de leer) de como los autores del mismo han puesto en práctica SCRUM en su organización y las lecciones aprendidas.

SCRUM es ya una de las metodologías más usadas hoy en día en las organizaciones dedicadas al desarrollo del software. Curiosamente es una metodología que no fue concebida inicialmente para desarrollar software (quizás de ahí su potencia). Para este curso debeis leer los siguientes capítulos (aunque os recomiendo la lectura completa):

– CÓMO HACEMOS PILAS DE PRODUCTO

– CÓMO HACEMOS LA PLANIFICACION DE SPRINT

– CÓMO HACEMOS PILAS DE SPRINT

– CÓMO HACEMOS LA DEMO DE SPRINT.

BoxPlot

  • admin 

Un diagrama de caja (BoxPlot) es un gráfico, basado en cuartiles, mediante el cual se visualiza un conjunto de datos. Está compuesto por un rectángulo, la «caja», y dos brazos, los «bigotes».

Boxplot

 

Es un gráfico que suministra información sobre los valores mínimo y máximo, los cuartiles Q1, Q2 o mediana y Q3, y sobre la existencia de valores atípicos y la simetría de la distribución. Primero es necesario encontrar la mediana para luego encontrar los 2 cuartiles restantes

Cómo expresarlo gráficamente

                            +-----+-+    
  *           o     |-------|     | |---|
                            +-----+-+    

+---+---+---+---+---+---+---+---+---+---+---+---+
0                   5                   10      12
  • Ordenar los datos y obtener el valor mínimo, el máximo, los cuartiles Q1, Q2 y Q3 y el Rango Inter Cuartilico (RIC)
En el ejemplo:

  • Valor 7: es el Q1 (25% de los datos)
  • Valor 8.5: es el Q2 o mediana (el 50% de los datos)
  • Valor 9: es el Q3 (75% de los datos)
  • Rango Inter Cuartilico RIC (Q3-Q1)=2
  • Para dibujar los bigotes, las líneas que se extienden desde la caja, hay que calcular los límites superior e inferior, Li y Ls, que identifiquen a los valores atípicos.
Para ello se calcula cuándo se consideran atípicos los valores. Son aquellos inferiores a Q1-1.5*RIC o superiores a Q3+1.5*RIC.
En el ejemplo:

  • inferior: 7-1.5*2=4
  • superior: 9+1.5*2=12
Ahora se buscan los últimos valores que NO son atípicos, que serán los extremos de los bigotes.

  • En el ejemplo: 5 y 10
  • Marcar como atípicos todos los datos que están fuera del intervalo (Li, Ls).
En el ejemplo: 0.5 y 3.5
  • Además, se pueden considerar valores extremadamente atípicos aquellos que exceden Q1-3*RIC o Q3+3*RIC.
De modo que, en el ejemplo:

  • inferior: 7-3*2=1
  • superior: 9+3*2=15

Utilidad

  • Proporcionan una visión general de la simetría de la distribución de los datos; si la mediana no está en el centro del rectángulo, la distribución no es simétrica.
  • Son útiles para ver la presencia de valores atípicos también llamados outliers.
  • Pertenece a las herramientas de las estadística descriptiva. Permite ver como es la dispersión de los puntos con la mediana, los percentiles 25 y 75 y los valores máximos y mínimos.

Como evitar que mis correos sean catalogados como Span

  • admin 

El SPAM no sólo es un problema para los usuarios de Internet que reciben diariamente en sus buzones docenas de e-mails no deseados en los que se les oferta variados artículos para aumentar su potencia sexual o conseguir una tupida melena. También es un problema muy serio para las empresas que ven cómo sus correos publicitarios o comerciales por algún misterioso motivo son catalogados como SPAM y no llegan a sus clientes.

Recuerdo el caso de una empresa que tras varios años realizando inadecuadas campañas de e-mailings para captar y fidelizar clientes, acabó consiguiendo que el 75% de sus correos fueran catalogados como SPAM y nunca llegaran a su destino. Los responsables de marketing se reunieron y tomaron una decisión: había que comprar un ordenador con una capacidad 100 veces mayor de envío de correos. Por supuesto aquello no funcionó.

Lo primero que debe conocer son los dos motivos principales por los que sus correos pueden ser catalogados como SPAM:

  1. Los destinatarios de sus correos no deseaban recibirlos o no son capaces de visualizarlos correctamente y realizan una denuncia de SPAM en las listas RBL (listas negras publicas internacionales).
  2. Sus correos son detectados automáticamente como SPAM por un filtro Bayesiano.

1. Filtre su base de datos de e-mails para evitar envíos innecesarios.

  • Elimine e-mails incorrectos de su base de datos. Los correos del tipo aa@aa.es son fácilmente descartables.
  • Ofrezca un servicio para que sus clientes puedan actualizar sus correos: Más del 30% de sus clientes podrán cambiar de correo a lo largo de un año.
  • Utilice servicios de list hygiene: Más del uno por ciento de sus correos serán direcciones mal formadas del tipo johngmail.com que claramente deberían ser john@gmail.com. Las aplicaciones de list hygiene son capaces de corregir este tipo de errores de sus bases de datos.
  • Elimine de su base de datos direcciones de correo “Spam flag: Se trata de direcciones de correo que se han añadido de manera malintencionada y que pueden hacer que su empresa se autodenuncie en listas negras. Por ejemplo: abuse@somedomain.

2. Tenga presente la siguiente guía de Buenas prácticas para obtener el permiso de las personas que recibirán sus e-mails.

  • Realice el sistema de suscripciones más conservador que pueda permitirse: Antes de incluir una dirección de correo en su base de datos, la mayoría de las empresas envían a sus suscriptores un correo de confirmación en el que se solicita que confirmen su interés en recibir información comercial por correo.
  • Conserve la dirección IP de sus suscriptores: Le permitirá cubrirse las espaldas en el caso de que se vea en la necesidad de conversar con ISPs y Listas negras.
  • Evite comprar listas de e-mails, y si lo hace, investigue la fuente de estas listas. Puede recurrir a un trustworthy list
    broker
     para que le asesore en la adquisición de una lista de calidad.
  • Permita que sus clientes puedan desuscribirse de manera clara, sencilla y rápida.

3. Elija el ISP de su servidor de correo cuidadosamente.

Si su ISP ha sido denunciado a una blacklist, los correos que envía a través de sus servidores serán catalogados como SPAM. Puede apuntarse a la siguiente lista de discusión sobre SPAM http://peach.ease.lsoft.com/archives/spam-l.html donde podrá buscar ISP de confianza.

4. Cuide minuciosamente el contenido del Subject y cuerpo de sus correos para evitar los filtros anti-spam por contenido o filtros Bayesianos.

Los filtros Bayesianos aunque representan la última técnica en la lucha contra el SPAM se basan en un método estadístico descubierto en el siglo XVIII, por el clérigo y matemático Thomas Bayes, (1701-1761). La estadística bayesiana es una herramienta muy eficaz para poder calcular la probabilidad de que ocurra un suceso determinado, en nuestro caso que un e-mail sea SPAM. Para realizar este cáculo estadístico nos basamos en la experiencia de lo ocurrido anteriormente en casos semejantes.

Para evitar que nuestros e-mails sean catalogados como SPAM por un filtro Bayesiano es importante que conozcamos cómo funcionan: Cuando un ISP recibe un email y una persona determina manualmente que se trata de un caso de spam, se observa la frecuencia relativa de cada una de las palabras del mensaje, se calcula su probabilidad de ocurrencia y se actualiza el filtro Bayesiano con esta información. También se hace exactamente lo mismo con los mensajes que se reciben y son considerados como no spam.

Cuando ya hemos entrenado a nuestro filtro Bayesiano con muchas palabras asociadas a la práctica de spam y no-spam, podemos pedirle que calcule de manera automática la probabilidad de que cada e-mail que se reciba sea o no sea spam en función de las palabras que contiene, por ejemplo “viagra” ó “gratis”, “enlarge”. Así se calcula la probabilidad de que el mensaje sea spam. A esta cifra se le llama “spamicidad” y cuando supera un umbral (por ejemplo el 90%), se puede clasificar de manera segura como spam.

Una vez entrenado, un filtro Bayesiano ofrece muy pocos falsos positivos, ya que a diferencia de otros filtros, ataca la esencia del problema del spam: el contenido del mensaje. Recuerde que el método bayesiano es multilingüe e internacional, un filtro anti-spam bayesiano, al ser adaptable, puede utilizarse con cualquier idioma.

Por tanto, para evitar los filtros Bayesianos debe prestar especial atención al contenido y redacción de sus e-mails:

  • Evite utilizar un estilo demasiado comercial en la redacción de sus contenidos.
  • Evita las expresiones y palabras demasiado agresivas como “FREE”, “GRATIS“, “COMPRE AHORA” o “DESCUENTOS“.
  • No escriba nunca en mayúsculas en el Subject.
  • Evite el uso excesivo de signos de admiración o símbolos como $$.
  • Evite la utilización de la frase “haga click aquí ”.
  • Evite las frases redundantes y las instrucciones poco concisas.

Además, las más avanzadas soluciones en materia anti-spam incluyen un motor de filtro bayesiano de segunda generación, lo que supone no sólo un simple análisis de texto, sino también un amplio exámen de la forma y los atributos de los archivos adjuntos.

Si tiene curiosidad por ver cómo funcionan los filtros bayesianos, puede descargarse el programa gratuito anti SPAM K9 desde esta dirección.

5. Cuide el código HTML de sus e-mails:

  • Evite las imágenes de fondo, en muchos webmails no se visualizarán.
  • No ponga texto editable sobre las imágenes de fondo, pues al desaparecer la imagen perderán su contexto.
  • Todas las imágenes deben tener la etiqueta “ALT” y “TITLE” con su correspondiente texto descriptivo.
  • No utilice hojas de estilo CSS externas, ni declare los estilos en la cabecera pues algunos webmails los eliminan.
  • Aplique los estilos CSS directamente sobre los tags (style=”…”).
  • Utilice tablas para la maquetación de sus contenidos.
  • Evite los layouts líquidos .
  • Evite siempre incluir controles ActiveX
  • No utilice imágenes animadas ni flash.
  • Incluya siempre el charset para la definición de los caracteres en el idioma correspondiente.

6. Configure correctamente su infraestructura de envío de e-mails:

  • Mantenga Activado la resolución inversa de DNS: Muchos filtros de correo utilizan la resolución inversa para asegurarse que la compañía que se supone está enviando los e-mails es realmente el emisor. En el caso de que no esté activa, sus correos no se enviarán.
  • Compruebe si mantiene Relays abiertos en su servidor de correo y ciérrelos: Los Spammers a menudo buscan relays abiertos para enviar sus correos a través de los servidores de correo de otras compañías.
  • No haga relay entre servidores antes de enviar los correos: Los correos de algunas empresas suelen viajar entre varios servidores internos antes de entregarlos al destinatario final; ésto podría ser irrelevante si no fuera porque el relay entre servidores es una práctica habitual entre los Spammers para intentar ocultar la procedencia de sus correos. Tenga en cuenta que cuanto menos relay haga, menos dudas habrá sobre la procedencia de sus correos.
  • Utilice un formMail seguro en su página web: Un agujero de seguridad en su formulario de envio de correos puede ser una puerta abierta para que los Spammers envíen información desde su servidor de correo.

7. Monitorice constantemente su sistema para saber si está ocurriendo un problema. Hay varias formas de saber cuándo hay un problema en la entrega de los correos:

  • Monitorice los ratios de entrega por dominio: De esta manera puede comprobar por ejemplo si hay una caida en los ratios de entrega de correos de GMail.
  • Monitorice sus campañas de e-mails antes de comenzarlas: Antes de lanzar una campaña es importante asegurarse que nuestros correos serán aceptados por los principales ISP (en la práctica los 15 ISPs principales representan el 60% del mercado). Existen empresas de seguridad que ofrecen servicios de chequeo automático de e-mails para saber si sus campañas pasarán los filtros antispam de los principales ISPs.
  • Monitorice las blacklists: Compruebe si su servidor de correo está dentro de alguna lista negra. Algunos sistemas de seguridad ofrecen un servicio de Blacklist Alert que le alerta si su servidor de correo se encuentra en más de 300 blacklists.

8. Mantenga buenas relaciones con los ISPs.

Siempre es de ayuda saber a quién dirigirse cuando hay un problema, pero recuerde que para mantener una buena relación es importante dedicarle mucho tiempo y recursos.

9. Y por supuesto, no haga SPAM.

El envío masivo e indiscriminado de e-mailings a personas que no los han solicitado, no le harán incrementar sus ventas. Por el contrario dañara la imagen de su empresa y tarde o temprano acabará originándole serios problemas.

Espero que con la ayuda de estos consejos sus campañas de e-marketing acaben llegando siempre a buen puerto.