jueves, 15 de diciembre de 2011

Proyecto Cristiano - "La vida"

Autor: Sebastian Caro
Competencia: Comunicación Oral y Escrita
Nivel 1: Expresa eficaz y correctamente sus ideas, sentimientos, opiniones, en situaciones formales e informales, tanto en forma oral como escrita, de manera de provocar una comunicación efectiva
Palabra Clave: Proyecto Cristiano - " La Vida".
Descripción:  Representar ya sea actuando, presentación o a través de un vídeo los distintos tipos de discriminación que existen en torno a las religiones y la vinculación que tienen las personas que integran una religión.
Solución: se elabora un vídeo en base a nuestros sentimientos y pensamientos de cada uno de los integrantes para rescatar recursos  e evidenciar la actividad y trasmitir por medio de este el mensaje que quisimos plantear.
se adjunta el vídeo de la actividad.
http://www.youtube.com/watch?v=tvS6LtDdHno&feature=g-all-u&context=G1b8cfFAAAAAAAALAA
Reflexión: a través de esta actividad queda evidenciado la competencia en equipo, tratando de mostrar y comunicar las ideas, sentimientos y opiniones que quisimos dar a conocer y trasmitir el mensaje.

Head First MySQL: Capitulo 10

Autor: Sebastian Caro
Competencia: Comunicación Oral y Escrita
Nivel 1: Expresa eficaz y correctamente sus ideas, sentimientos, opiniones, en situaciones formales e informales, tanto en forma oral como escrita, de manera de provocar una comunicación efectiva.
Palabra Clave:  Capitulo 10 Outer joins, Self - joins and Union.
Descripción:  esta presentación le daremos a ver los distintos usos del join. Mostraremos los casos de join, Union y Self - Join con sus respectivos ejemplos para la mayor compresión del tema.
Join:
Esta sentencia nos permite combinar registros de dos o mas tablas en una base de datos.
Tenemos 3 tipos de JOIN:
-Interno
-Externo
-Cruzado
Tipos de JOIN:
-Interno: devuelve las filas de ambas tablas, donde hay una coincidencia.
-Externo: devuelve las filas que no tiene sus correspondientes contra partes en la otra tabla.
-Cruzada: es el regreso de todos los registros posibles.
Combinacion externa Outer Join:
Para realizar una combinación hay que saber que tabla esta a la izquierda y que tabla esta a la derecha. esta operación se puede utilizar de tres formas:
-de la tabla izquierda(Left Outer Join)
-de la tabla derecha(Right Outer Join)
-combinación completa(Full Outer Join)
Left Outer Join:
El resultado de esta combinación se contendrá en la tabla de la izquierda, aun cuando no halla un registro correspondiente en la tabla de la derecha para uno de la izquierda.
Sintaxis:
Select* from (tabla A) Left Outer Join(tabla B) On (Columna A) = (Columna B);
ejemplo:
Select * from empleado Left Outer Join departamento on IDDepartamento = IDDepartamento;
Right Outer Join:
Esta operación es al revés de la anterior (las tablas cambian de posición), la tabla de la derecha pasa a la izquierda, y lo mismo con la izquierda.
Sintaxis:
Select* from (tabla B) Right Outer Join (tabla A) On (Columna B) = (Columna A);
Ejemplo:
Select* from empleado Right Outer Join departamento On IDDepartamento = IDDepartamento;
Full Outer Join:
Esta combinación nos presenta la union de las dos tablas, es decir, que tendrá los registros de ambas tablas y sin presentar valores nulos para registros de ambas tablas y sin presentar valores nulos para registros sin pareja.
Sintaxis: Select*From (tabla A) Full Outer Join (tabla B) On (Columna A) = (Columna B);
Ejemplo:
Select* from empleado Full Outer Join departamento On IDDepartamento = IDDepartamento;
Union:
La union se utiliza para combinar los resultados de varias instrucciones Select en una tabla. Las columnas seleccionadas que figuran en las posiciones correspondientes de cada comando Select deben tener el mismo tipo de dato.
Sintaxis:
Select * from (tabla1) where (condicion1) Union Select* from (tabla2) where (condicion2);
Ejemplo:
Select * from tabla1 UNION Select * from tabla2;

Reflexión: a través de este capitulo hemos aprendido los distintos tipos de Join y a la vez la funcionalidad que presentan esto al momento de establecer una combinación de nuestras tablas en la Base de Datos.

Programación de Robots - "La cancha de fútbol"

Autor: Sebastian Caro
Competencia: Aprendizaje Autónomo.
Nivel 1: Conoce y utiliza estrategias de aprendizaje y hábitos de estudio y trabajo, seleccionando los que le son útiles según sus necesidades de aprendizaje.
Palabra Clave: Laboratorio n°2 "la cancha de fútbol".
Descripción: La actividad consiste en  cortar el pasto (como supuesto) de una cancha de fútbol a escala con las medidas de 100 cm de ancho y 150 cm de largo, dos veces.



La estrategia de trabajo consistía en: 
El “goma en conjunto al secretario terminaron de armar el robot con el diseño básico del manual LEGO, mientras tanto el jefe de grupo y el editor multimedia comenzaban a realizar el software que permitiera la perfecta realización del procedimiento (“cortar dos veces todo el pasto de la cancha.”).
La creación del software fue planeada con el propósito de que avanzara a una potencia de 60% del motor B y un 62% del motor C por un tiempo de 6050 milisegundos de avance luego que se apagaran los motores, por consiguiente se consideraba un giro hacia la derecha a un 60% del motor C con un tiempo de avance de 1590 milisegundos , seguido comenzaban a funcionar ambos motores con la misma potencia y tiempo de avance, al momento de terminar este avance se detienen los motores al mismo tiempo al través de la función Off (OUT_BC), para luego realizar un giro hacia la izquierda a un 60% del motor B y un tiempo de avance de 1590 milisegundos.
                El mismo procedimiento se realiza seis veces, para así poder podar completamente la cancha de futbol, es decir en términos de programación cumplir de manera plena el desarrollo Completo de la actividad propuesta.
                Al momento de probar nuestro software nos dimos cuenta que la arquitectura del robot presentaba una pequeña desviación hacia la derecha lo que impedía que siguiera una trayectoria recta como se le ordenaba a través del software. La primera solución que fue expuesta para resolver el problema fue desarmar el robot y rearmarlo con un diseño diferente (modificación del modelo base). Una vez realizado este procedimiento nuestro robot comenzó a mostrar mejorías en cuanto a su rendimiento presentando un  leve reposo en la acción del motor A (el puerto A murió por qué no funciono mas.) como solución cambiamos de puerto el motor A al puerto B.
                También nos enfrentamos a un problema con el programa base que nos permitía diseñar el software, ya que no cargaba el programa a la CPU del robot o solo nos tiraba errores en todas las líneas (aunque no había ninguno).



Diagrama de flujo: 



Código Programa:

Task main ()
{    repeat(6){  // repite la acción 6 veces
  OnFwd (OUT_B,60);                                        //potencia de los motores.
  OnFwd (OUT_C,62);
  Wait (6050);           // tiempo de avance recto
  Off (OUT_BC);  // apagado de motores
  OnFwd (OUT_B,60);  //avance de un motor para proporcionar giro
  Wait (1590);  // tiempos actividad de motor.
  Off (OUT_BC);    // apagado del motor
  OnFwd (OUT_B,60);
  OnFwd(OUT_C,62);
  Wait (6050);
  Off (OUT_BC);
  OnFwd (OUT_C,60);
  Wait (1590);
  Off (OUT_C);
 }
}


Enlace del vídeo resultados de la actividad:



Reflexión: podemos decir que hemos aprendido que las mayores dificultades no están siempre en el desarrollo del software, a veces las arquitecturas de los robots o maquinas para los que se diseñan los programas no funcionan de la forma esperada y modifican el proceso del software, para lo cual hay que modificar el programa o analizar detalladamente la arquitectura del robot.
                Además que no solo debemos aprender a crear “súper programas con millones de aplicaciones” para los robots sino que debemos aprender cómo funcionan, su desempeño. 

Programación I - Conversión de Unidades de Velocidad

Autor: Sebastian Caro
Competencia: Aprendizaje Autónomo.
Nivel 1: Conoce y utiliza estrategias de aprendizaje y hábitos de estudio y trabajo, seleccionando los que le son útiles según sus necesidades de aprendizaje.
Palabra Clave: Conversión de unidades de Velocidad.
Descripción: Analice y desarrolle un programa para pasar de una unidad a otra la conversión de unidades de velocidad, como las siguientes: Km/h<>cm/seg<>pie/seg<>nudos<>mts/min<>mts/seg<>millas/h.


Base Teórica.

El problema nos arroja la conversión de unidades de velocidad lo cual deberá ser entregada según el enunciado anterior, por lo tanto debemos realizar la siguiente operación:
Lo primero es analizar el proceso de trasformación según las formulas de física, para poder realizar la conversión de unidades.
1m à 100cm.
1 km  à 1000m.
1 km à 1000 * 100 = 100.000 cm.
1 km à 3280.84 pies.
1 km à 0,62137 millas.
1 nudo à 0.5400 km/h.
1 hora à 3600 seg.
1 hora à 60 min.
1 min à 60 seg.
Km/hr à cm/seg= (1*100.000)/3600
Km/hr à pie/seg= (1*3280.84)/3600
Km/hr à nudos= (1*0.5400)/1
Km/hr à mts/min= (1*1000)/3600
Km/hr à millas/hr= (1*0.62137)/1
Una vez definidos los valores con sus respectivas equivalencias, podemos acceder al siguiente paso.
Se le dará elegir la opción por pantalla al usuario, seleccionando alguna de las 6 opciones disponibles, luego se le pedirá ingresar el valor a convertir y obtendrá el resultado según la unidad de conversión seleccionada.

Análisis.
Las entradas son las siguientes según el problema planteado:
-x.
-km.
Estas son almacenadas como variables doublé.
Las salidas son:
-km/hr.
-Cm/seg.
-Pie/seg.
-Nudos.
-Mts/min.
-Mts/seg.
-Millas/horas.
Por pantalla se le pedirá seleccionar una opción de conversión de unidades, luego ingresar el valor a convertir y obtendrá  como salida el resultado transformado según la opción elegida.

Ejemplo Numérico.
-cm= (1Km * 100000)/3600=27.778
- pie= (1Km * 3280.84)/3600=0,9113
- mtn=(1Km*1000)/60=16.667
- mts= (1Km*1000)/3600=0.2778
- millas=(1Km*0.62137)/1=0.6214
- nudos=(1Km*0.5400)/1=0.5400

Proceso.
Se selecciona por pantalla la opción de conversión, después se pide ingresar el valor a convertir el cual es almacenado, para luego transformar el valor según la unidad seleccionada, pasando por una multiplicación y una división.
 Se imprimirá el valor de las respectivas unidades de velocidad por pantalla.

Pantalla Salida de ejecución.
Elija conversion:
1. km/h --> cm/seg
2. km/h --> ft/seg
3. Km/h --> mts/min
4. km/h --> mts/seg
5. km/h --> millas/h
6. Km/h --> Nudos
1
ingrese el valor a convertir: 1
El valor de Km/h a Cm/s =27.77777777777778





Diagrama:



Código Programa:
import java.util.*;
public class Conversion{
static void main(){
//VARIABLES:
 double x;
 double Km;
 Scanner leer= new Scanner(System.in);
 System.out.println("Elija conversion:");
 System.out.println("1. km/h --> cm/seg\n"+"2. km/h --> ft/seg\n"+"3. Km/h --> mts/min\n"+"4. km/h --> mts/seg\n"+"5. km/h --> millas/h\n"+"6. Km/h --> Nudos\n");
 x= leer.nextDouble();//numero de la opcion

 System.out.print("ingrese el valor a convertir: ");
 Km= leer.nextDouble();//valor que se quiere convertir...
  if(x==1){
    double cm= (Km * 100000)/3600;
    System.out.println("El valor de Km/h a Cm/s =" + cm);}
else
 if(x==2){
    double pie= (Km * 3280.84)/3600;
    System.out.print("El valor de Km/h a Pie/s= " + pie);}   
 if(x==3){
     double mtn=((Km*1000)/60);
   System.out.print(" De Km/h a Mts/min= " + mtn );}
if(x==4){
 double mts= (Km*1000)/3600;
System.out.println(" De Km/h a Mts/s ="+ mts);}
 if(x==5){
 double millas=(Km*0.62137)/1;   
 System.out.println(" De Km/h a Milla/h"+ millas);}
if(x==6){
 double nudos=(Km*0.5400);
    System.out.println(" De Km/h a Nudos= "+ nudos);}
}//fin de main
}//fin de la clase

Programa Corriendo:



Reflexión:  que da demostrado la solución del problema de conversión de velocidades aplicando conocimientos sobre física.

Foro de Actuación Ética

Autor: Sebastian Caro.
Competencia: Actuación Ética.
Nivel 1: Descubre dilemas éticos en la vida cotidiana personal y social, describiendo sus causas y consecuencias así como los valores éticos en juego.


Palabra Clave: Preguntas de Actuación Ética.


Descripción: Profesor inicia el foro con la interrogante si es ético utilizar software pirata.


Preguntas:


-¿Que es ética para ti?


R: es la manera de evaluar los actos humanos en el ámbito de la voluntad y libertad absoluta de la persona.


-Eres el responsable del servidor de correo de la empresa ¿leerías correos de gerentes?


R: no. Ya que estaría burlando la privacidad de la empresa y la de mis compañeros de trabajo.


-Te integras a un  nuevo equipo, en una empresa importante del país, tu rol permite tener acceso a informacion privada.Si el gerente de la empresa te solicita información de este tipo, ¿la darías?


R: no. Porque si fui seleccionado para pertenecer a un equipo importante debo actuar con responsabilidad con mi rol y hacerlo lo mejor posible. Por lo tanto si me solicitan información privada a si no sea el dueño de la empresa no lo haría, prefiero el despido y no quedar con mi curriculum manchado.


-¿Es ético que un diputado del congreso no se presente a las reuniones?


R: no. Pero se debe evaluar el motivo existente ya que se puede interpretar de dos maneras, una la simple irresponsabilidad y la otra puede ser causada por un taco vehicular, accidente, etc.


-Es ético que, en el marco del desarrollo de un trabajo en clases o reuniones de proyecto de su carrera que se realiza en equipo, no se presente? ¿Hay alguna diferencia con respecto al trabajo de los diputados que lo haga mas o menos ético?


R: no porque afecta en la manera de trabajo grupal ya que los demás integrantes deberán cubrir su ausencia y además si se repite este hecho se provocaría una mala convivencia en el equipo.


-Imagine que usted crea un sistema que le permite crear una red social, en la cual se  comparten miles de datos (tanto públicos como personales), pero al pasar el tiempo, aunque la red es popular, no genera suficientes recursos ¿ Vendería informacion estadística de sus usuarios a empresas para  análisis de mercado y/o ofrecimiento de productos localizados, si esta fuera la única forma de sustentar la empresa que usted mismo creo y que no vaya a quiebra?


R: no. Por que al principio podría ser lucrativo para mi empresa pero de alguna otra forma saldría al aire los comentarios provocando la perdida de la red social ya que no se vería como un beneficio sino un mal negoció, incluso me expondría ir a un juicio.


-¿Es ético piratear software (por ejemplo, un sistema operativo de pago)? ¿Se justifica en algún caso? ¿como?


R: no ya que iría contra la originalidad y no sería una creación propia aunque se diera la oportunidad de hacerlo. Esto también me podía traer problemas judiciales. 




Reflexión: el objetivo de esta actividad es analizar la actuación etica y la relevancia de esta para tu profesional, ademas de identificar elementos importantes del curso de mantencion y administración de sistemas que se vinculan directamente con la competencia. en base, lo que debe hacer es: dar su opinión y debatir en torno a las preguntas dentro del foro.
 

martes, 6 de diciembre de 2011

Regresion Lineal por Swing

Autor: Sebastian Caro.

Competencia: Creatividad e innovación. Nivel1 identifica respuestas novedosas para resolver mejor las demandas del entorno cotidiano.

Descripción: La problematiza se ve reflejada en el hecho de querer modelar el ajuste de una curva a través del cálculo de regresión lineal, mediante el uso de vistas que nos entreguen los valores de sumatoria, promedio, coeficiente a, coeficiente b y r2 que representa la recta. Para ello es necesario utilizar tres niveles (como se menciono anteriormente) que son servidor, software y cliente. En este caso especifico se desarrollara a través de swing, en donde veremos una interfaz grafica o GUI mucho más amigable que en la solución 1.



La BD lleva por nombre “consolalineal”, en ella encontraremos la tabla principal llamada Valores, en la cual debemos ingresar los datos para calcular dicha regresión(debido a que se encuentra siempre vacía), además de poseer todas las vistas que permiten realizar el cálculo de cada función. De esta manera la BD es genérica.
La GUI es una aplicación swing, en ella se maneja la aplicación completa a través de dos pestañas, la primera de inserción de datos y verificación de la tabla y la segunda de verificación de cálculos de cada vista. Cuando la aplicación es finalizada, los valores de la tabla son eliminados, lo que nos permite calcular cualquier tipo de regresión en nuestra base de datos mediante esta aplicación swing.
El cliente se encarga de llevar a cabo el proceso final de la solución, donde el ingresa sus valores y los modela a su antojo, gracias a que al finalizar la aplicación, esta elimina los registros ingresados por el usuario. De esta manera, la aplicación se vuelve bastante genérica y abierta a distintos cálculos de regresión lineal basándose en los valores propios ingresados por el cliente.
Además de poder analizar los valores que ingresa ya que los puede ir comprobando de manera visual.
De esta manera creemos que podemos solucionar la problemática de calcular una regresión lineal mediante tres capas de forma genérica.


Diseño de Procesos
Cuando hablamos de procesos, nos queremos referir directamente a que parte de la solución, realiza acciones que son importantes a nivel de código y ejecución. En este caso, los procesos más importantes, se ven reflejados en el ajuste de la curva médiate regresión lineal a través de distintitos cálculos específicos. Es por ello que analizaremos las vistas creadas en la tabla que nos entregan la sumatoria, promedio, coeficiente a, coeficiente b y r2. Además del ingreso de valores y verificación de estos.

Cada proceso corresponde a una vista, ellas se alimentan de lo que el usuario ingresa a la tabla y mediante esos valores crean sus cálculos, debido a que las vistas son tablas temporales que hacen un select a la tabla principal y estas se actualizan mediante el movimiento de valores en la tabla.

Ingreso de datos:
El ingreso de datos para la solución dos consta de utilizar un statement muy parecido al 1, que no crear una conexión a la BD para realizar una Query. Luego realiza la inserción ero consulta los datos ingresados mediante los TextField, medicando el set y pasando a Doublé, para el correcto funcionamiento del ingreso de datos.


Verificación de ingreso:
Para verificar el correcto ingreso de los valores, se añade un botón que nos realice un select a la tabla y nos presenta los datos almacenados.


Diseño de la Base de Datos
La BD se diseño de una manera bastante básica, en donde encontramos una tabla que lleva por nombre valores, que maneja los datos de una nube de puntos ingresados por el cliente.


Donde los atributos X e Y son de tipo Doublé y NULL.
Dentro de la BD también encontramos la Vistas ya presentadas en desarrollos anteriores.
Cada una realiza un cálculo específico y espera el ingreso de datos hacia la tabla “Valores” para realizar su tarea.
Desc de cada Vista:
Sabemos que cada vista corresponde a una tabla temporal, por tanto los datos que maneja para su posible solución, siempre dependerán de la tabla en la que obtiene los valores, es decir, la tabla principal “Valores”.

Modelo Relacional:
 El modelo relacional, se basa en como es el funcionamiento de la solución en las tres capas de aplicación, para ello presentaremos un esquema que nos da a conocer dicho análisis.
[1] = El usuario ingresa los datos mediante la capa del Software
[2] = Los datos son ingresados desde el Software hacia la tabla en la BD 
[3] = Se procesan los datos y cada vista realiza sus cálculos gracias a los datos ingresados 
[4] = se almacenan estos cálculos en cada tabla (vista) de la BD 
[5] = la capa de software pide ver los cálculos, aquí la BD envía las tablas (vistas) con sus previos resultados [6] = las tablas están disponibles y son entregadas al cliente

Esquema o Diseño de GUI e interacción
Su funcionamiento es manejado mediante el uso de botones, que realizan las acciones necesarias para consultar a la BD, además de dividir su presentación en pestañas de ingreso y verificación de cálculos.


En la pestaña ingresar se piden los valores para la tabla, estos son obtenidos mediante el textfield y espera a que el cliente presione el botón ingresar para hacer la consulta a la BD. El botón ver realiza un select a la tabla y muestra los nuevos valores ingresados.

Se comunica con la BD a su vista específica y nos entrega en el recuadro, los cálculos pertinentes a cada vista. El botón salir no desconecta de la BD y al mismo tiempo elimina todo valor almacenado en la Tabla de la BD.


Implementación de Clases.
La implementación realizada en la Clase Aplicación es la siguiente: Conexión: el diseño de la conexión es simple y obligatorio, esta se realiza cuando se ejecuta la aplicación y finaliza cuando el cliente desea salir del programa mediante la opción creada en el menú. Su código java es el siguiente: 



Insert:
La inserción de datos se maneja para este caso, de una manera distinta a la vista en consola.
Iniciamos nuestra conexión luego creamos una un objeto de tipo conexión para despues  implementar una consulta, esta se llena con valores ingresados mediante jtextField, desde allí se agrega a la consulta y con capturados como tipo doublé.



Luego se muestra un mensaje de aviso o alerta, que nos verifica que la operación fue un éxito.
Por ejemplo: PUNTOS GUARDADOS CORRECTAMENTE!.

O en el caso de que se haya producido un error se activara el rollback, como se muestra en la imagen.





Verificar:
Si presionamos ver, se realizara una consulta de tipo select a la tabla, esta nos entregara automáticamente los valores que ya existen en la tabla de la forma en la que se refleja la imagen
Este proceso o implementación especifica de la clase, realiza su consulta a la BD y captura lo que entrega la query mediante el uso de Resulset. Luego obtiene el nombre de las columnas recorriendo la tabla y agregando su nombre en la tabla defaul, en este caso sería X e Y.



Código  Ver:



Luego obtenemos las filas de la tabla, esto se realiza gracias a lo que captura el resulset.
De esta manera en un arreglo se almacena el contenido del Resultset.




Para luego darle ciertas separaciones a los datos mediante el recorrido de las columnas y añadiendo este carácter “|”, lo que nos entrega valores mucho mas ordenados.

Vistas:
En la pestaña de vistas podemos ver una serie de botones y una tabla defaul, cada uno de esos botones realiza una consulta ala BD y llama a los valores pedidos de dicho calculo mediante select.








El resultado de las imágenes se produce mediante lo siguiente:

Como ya sabemos que al ingresar datos a la tabla valores, las vistas se actualizan automáticamente estando sujeta a cambios si se ingresan mas valores, es por ello que en cada botón de cada operación para el cálculo de regresión lineal solo nos falta realizar una consulta de tipo select + el nombre de la vista y llamar al método llenar tabla, quien se encarga de recorre fila por fila y añadirla y columna por columna y añadirla a la tabla default.
El método llenar tabla obtiene el select que el cliente quiere ver mediante el botón que selecciona y este toma esa consulta y comienza a estructurar la tabla.
Primero obtiene los nombres de las columnas y los guarda en un arreglo, luego obtiene la cantidad de filas de la consulta y las comienza a agregar a la matriz con separaciones de datos.


Al final agrega a la tabla creada en el panel de swing el arreglo y lo hace visible.

Salir:
El botón salir, tal como lo dice su nombre,, nos permite huir de la aplicación, pero este no solo cierra la ventana de swing y hace una desconexión a la BD, sino que además nos elimina los valores de la tabla valores, de esta manera, cada vez que se vuelve a ejecutar la aplicación, esta está preparada en un 100% para los cálculos ingresados por el usuario.


Y verificamos que los valores ya no están en la tabla valores.
Básicamente lo que hace posible esto son tres o cuatro líneas de código, se arma de esta manera:


En donde utilizo una conexión a la BD y le envió una consulta que me elimine todos los valores que tenga la tabla, luego cierro conexión con la BD y me retiro de la ventana jframe.

Implementación de GUIs.

El desarrollo de la GUI se hace por medio de las herramientas ofrecidas por netbeans, la cual como se ha mencionado anteriormente cuenta con 2 pestañas para el ingreso de puntos en la ecuación lineal y la vista de los que se han ingresados, y la pestaña para ver el resultado de las operaciones matemáticas.


Se inicializa con el siguiente código:


Pestaña de vistas

Se inicializa con el siguiente código:



Reflexión:Al termino del informe nos damos cuenta del enorme esfuerzo realizado y satisfechos con poder resolver el problema de una manera más avanzada, aunque puede ser mejorado, ya tenemos el conocimiento para que en el futuro al realizar problemas similares solo tenemos que optimizar la funcionalidad de todas las técnicas aprendidas hasta el momento.