martes, 9 de febrero de 2016

Clases abstractas

Supongamos una clase vehículo:
public class Vehiculo{

    int capacidad;
    double peso;
    double longitud;

}

Estos son atributos que pueden heredar sus clases hijas que podrían ser por ejemplo Tren, Avión o Moto. Cada uno tiene un peso, una longitud o una capacidad para llevar pasajeros. Pero ahora imaginemos un método moverse que diga cómo se desplaza el vehículo y por dónde:
    public class Vehiculo{

    int capacidad;
    double peso;
    double longitud;

//Método moverse
    public void moverse(){
    System.out.println("Navego por los mares");
    }

}

Esta claro que ese método no tiene sentido alguno si se trata de un avión, una moto o un tren. Todos ellos deben tener un método moverse pero el código dentro del método será distinto en cada uno. La clase vehículo en realidad nunca será instanciada. Es decir, no vamos a crear objetos de la clase vehículo. Lo que crearemos serán objetos de la clase moto, barco, avión, etc. Es decir, las clases hijas. Por tanto, el método moverse en la clase madre vehículo debe estar vacío. Ese método vacío que luego se "rellena" de forma distinta en cada hija, es un método ABSTRACTO. Y una clase madre que posee un método abstracto es a su vez una clase abstracta.
¿Está claro, no? Una clase abstracta es una clase que no va a ser instanciada. Si una clase pose un método abstracto la clase es abstracta. Y un método abstracto es un método vacío que se utiliza en las clases hijas de la clase abstracta. Hay circunstancias en las que una clase puede ser declarada abstracta, ya que no va a instanciarse, pero que en realidad no tiene un método abstracto. Pero no conozco aún esas circunstancias.
Una clase abstracta se declara así:

abstract class Cliente {

    
}
Dentro de ella el método abstracto moverse quedaría de esta forma:
abstract class Cliente {


    int capacidad;
    double peso;
    double longitud;

//Método moverse
    abstract void moverse()
    
}
El método moverse tiene dos características: Lleva la palaba abstract y no tiene llaves porque dentro no lleva código. Cuando crees la clase hija barco sí que el método tendrá código en su interior:
    public void moverse(){

    System.out.println("Navego por los mares");

    }

O en la clase hija avión:
    public void moverse(){

    System.out.println("Vuelo por los aires");

    }

Off-topic: El estilo del blog está feo porque he tenido que remodelarlo rápidamente para mostrar código fuente en las entradas. Ya lo iré puliendo poco a poco. Como siempre, espero que me corrijan cualquier posible error ya que el nombre lo indica este blog se escribe con conocimientos adquiridos desde cero.

lunes, 23 de noviembre de 2015

Funciones en MySQL

Una función es similar a un procedimiento almacenado pero retorna un valor. La estructura de la función en MySQL es así:

CREATE FUNCTION nombre_funcion() /* Entre los paréntesis irían los argumentos */
RETURNS TIPO_VARIABLE /* El tipo de variable que retorna, sea INT, VARCHAR, etc */
BEGIN /* Aquí comienza el juego */
DECLARE mi_variable TIPO_VARIABLE /*La variable con el mismo tipo de arriba*/
/*Ahora vamos a ejecutar las instrucciones que en este caso son un select. El comando INTO es para asignar elvalor de la consulta en la variable*/
SELECT columna_1 INTO mi_variable /* EL valor de la columna se almacena en la variable*/
FROM mi_tabla
WHERE columna_1 > 10; /*Por poner algún ejemplo*/
RETURN mi_variable; /* Devuelve el valor*/
END  /*Fin del juego*/
Vamos a hacer un ejemplo con la database ejemplo1 del tutorial anterior y la tabla ejemplo. Recordemos que habíamos guardado dos registros. Vamos a contar los nombres para saber cuántos registros hay.
Nuestra tabla es así:


Ahora creamos la función en la misma terminal. Recuerden crear un delimitador antes de empezar:



 Y por último probamos que funcione. Como yo tengo dos registros en mi tabla (Carlos y Natalia), me debe retornar 2:




domingo, 22 de noviembre de 2015

Procedimientos almacenados (Parte 2): Select y cursores con Oracle

Aquí me estoy metiendo en camisas de once varas porque de este tema sólo se lo que aprendí entre ayer y hoy. Pero la idea es que estos apuntes me saquen de líos en algún momento y de paso, tal vez, sirvan como guía a alguien.
La primera sorpresa que me llevé fue que con los procedimientos almacenados un select no es tan sencillo como un insert. Hay que usar cursores para realizarlo, al menos en Oracle. MySQL sí que permite hacer un select en un procedimiento, por lo que de momento no necesito un cursor en MySQL y dejaré ese tema para más adelante.
¿Qué es un cursor? Pues si no entendí mal es una herramienta para recorrer datos cuando necesitamos varios de ellos en una sola consulta. Parecido a un ciclo donde interamos sobre una matriz en programación.
La explicación no es la mejor pero pueden encontrar mucha información en estos enlaces:

http://www.techonthenet.com/oracle/cursors/declare.php
http://stackoverflow.com/questions/1170548/get-resultset-from-oracle-stored-procedure
http://stackoverflow.com/questions/3535405/execute-an-oracle-function-that-returns-a-reference-cursor-in-c-sharp
http://elbauldelprogramador.com/plsql-cursores/
http://www.desarrolloweb.com/articulos/cursores-pl-sql-I.html
https://es.wikibooks.org/wiki/Oracle/PL/SQL/Cursores

Los últimos son en español si te preocupa el idioma :)

Vamos a volver en Oracle a nuestra base de datos ejemplo1 y vamos a crear la tabla mascota (Lo siento, no se me ocurrió otra cosa). Esta tabla tiene dos columnas: amo que será una clave foránea y se corresponde con el nombre de la persona en la tabla ejemplo, nombre_mascota y tipo_mascota que definen la mascota que corresponde a cada amo.



Una vez hemos creado la segunda tabla le insertamos algunos datos desde terminal o por la interfaz web, como prefieras. Si no sabes cómo mira el tutorial anterior:

(Sí, Natalia tiene un rinoceronte llamado Mimosín :P ).


Ahora que tenemos dos tablas para trabajar, vamos a crear un procedimiento almacenado que nos muestre el amo con la edad y el nombre de la mascota.
Para eso vamos a necesitar un cursor y yo les voy a mostrar la forma que conozco yo de momento para hacerlo en Oracle, pero no es la única. Nuevamente les remito a los enlaces de arriba.

La sintaxis sería esta (He puesto unos signos -- con notas aclaratorias):

create or replace procedure "amos_mascotas" --Nombre del procedimiento
is
cursor curs is  --curs es el nombre del cursor. Pueden poner cualquiera.
select nombre, edad, nombre_mascota -- Los datos que queremos ver 
from ejemplo join mascota --Las tablas que unimos con join
on nombre = amo; --on es lo mismo que where :)
begin -- Aquí comienza el procedimiento almacenado
for resultado in curs loop --Resultado es el iterador
dbms_output.put_line ('Nombre: '|| resultado.nombre ||' Edad: '|| resultado.edad ||'  Mascota: '|| resultado.nombre_mascota);
end loop; --Aquí termina de iterar
end;

¨Una forma de crearlo es yendo a create, procedure y desmarcar la opción include arguments. En la ventana que nos queda colocamos:

Podemos ejecutarlo en terminal usando execute o en la interfaz web poniendo el procedimiento entre begin y end, nuevamente si no sabes de qué hablo debes ir al tutorial anterior.

El resultado es este:




Y eso es todo con Oracle, para MySQL no necesitamos tanto lío para hacer un select  así que el tutorial anterior les sirve. Más adelante cuando la base esté conectada a un programa sí que vamos a necesitar cursores en MySQL para iterar línea por línea los registros.






sábado, 21 de noviembre de 2015

Procedimientos almacenados (Parte 1)

El procedimiento almacenado es un código que se almacena y ejecuta directamente en la base de datos, por lo que accede directamente a la información y por tanto resuelve más rápidamente la petición.
Los ejercicios del laboratorio 13 deben realizarse en Oracle y en MySQL y aunque ambos están basados en el estándar de lenguaje SQL cada uno tiene sus particularidades (Especialmente Oracle con PL/SQL).
Un procedimiento almacenado sencillo es el que se realiza para agilizar la inserción de datos

En MySQL: Creamos primero la base de datos ejemplo1 y le añadimos una tabla con dos columnas (nombre y edad).

Como pueden ver metí la pata e intenté crear la tabla sin haber especificado que database iba a usar :)

Una vez creada la tabla donde vamos a insertar datos mediante un procedimiento almacenado podemos crear el procedimiento.
Vamos a darle argumentos, los cuales deben ser del mismo tipo que los valores de la tabla y además serán argumentos de entrada.
Primero colocamos un delimitador, que puede ser el símbolo que nos de la gana aunque suele usarse // o $$. SI no ponemos eso al dar enter se va a ejecutar donde vea un ";" aunque no hayamos terminado con nuestro procedure.
Create procedure insertar_ejemplo le dice a MySQL que quiero crear un PA con ese nombre. Luego pongo los argumentos que pueden tener el nombre que quieras pero respetar los tipos de las columnas que quieres insertar.
Begin marca dónde comienzan las instrucciones. Dentro de begin y antes del end colocamos el código que debe ejecutarse.
Normalmente para insertar datos hacemos un insert into mi_tabla(columna_1, columna_2...) y en values ponemos entre paréntesis los datos que queremos insertar. En este caso en values pondremos los parámetros. Quedaría así:


Ese sería nuestro procedure ya listo para uso mediante el comando call. Lo llamamos y le damos argumentos:


Y como pueden ver al hacer un select, el procedimiento ha almacenado la información.

Ahora toca hacer lo mismo con Oracle. Ya les digo que si lo hacen en la interfaz web de Oracle y si lo hacen en la terminal, el proceso es igual. Pero el llamado del procedimiento sí que es distinto.

En Oracle la terminal no me parece tan amistosa como la de MySQL, por lo que me voy a la interfaz web Get Started.

Creamos un nuevo workspace que en este caso llamé nuevamente ejemplo 1 y en el creamos nuevamente nuestra tabla ejemplo con sus columnas nombre y edad. Para el caso no hace falta crearle clave primaria y desde luego no lleva foráneas ya que no hay más tablas, pero deben crearle la clave primaria porque nos servirá en el próximo ejercicio. La clave primaria sera nombre.


Una vez que hayas creado tu tabla (No expliqué eso en detalle porque supongo que esa parte sabes hacerla si estás aquí, pero cualquier cosa pregunta), vamos nuevamente a la opción create y esta vez no escogemos table sino procedure. Le daré el mismo nombre al procedimiento y a los argumentos que en el ejemplo con MySQL. Si quieres hacerlo en MySQL en una interfaz amigable como la de la aplicación de Oracle puedes usar MySQL workbench y verás que es muy parecido.




Ahora escribimos nuestro procedimiento. Oracle creará automáticamente el delimitador, el begin, el end y todo lo demás así que sólo dale el insert con los argumentos.

Tú sólo le das las sentencias que van entre el begin  el end.


El crea el procedimiento con la sintaxis correcta.

El llamado desde la interfaz web de oracle se hace así:


Si haces el llamado desde la terminal se usa el comando execute:


Ahí están los dos datos. El que metí por la intefaz web y el que hice por terminal.

No olvides salir tecleando exit en la terminal para que se guarden los datos. Si cierras la terminal sin hacerlo no se guardará la inserción de datos o lo que hayas hecho (Yo aprendí a las malas jejeje).
Espero que le sirva a alguien y más adelante publicaré otro tutorial sobre procedures, funciones, triggers, etc.

jueves, 20 de agosto de 2015

Perspectiva sobre cultura y sociedad

La palabra cultura define el cúmulo de conocimientos, creencias, pautas de conducta y códigos éticos de un grupo social.
Todos hemos oído alguna vez hablar de "música culta" o hemos escuchado cómo llamaban a alguien inculto. Este concepto de lo que es la cultura es errado ya que no existen personas sin cultura.
Existen culturas distintas a la nuestra, personas con una cultura más primitiva o menos sofisticada (Al menos si nos miramos a nosotros mismos como punto de referencia), pero no incultos. Después de todo culturas existen incluso entre animales.


Entre los chimpancés se ha observado que hábitats cercanos pueden albergar culturas distintas: La cultura de los que rompen nueces con una piedra y la cultura de los que lo hacen con un palo, por ejemplo.
Experimentos con chimpancés en cautiverio nos han mostrado que si enseñas a un miembro del grupo cómo extraer un premio de un dispositivo que tiene varias formas de obtenerlo y a un miembro de otro grupo le enseñas otro método, pronto todos los miembros de un grupo lo harán de un modo y los del otro del modo alternativo. Habrás creado dos culturas distintas y habrás visto un ejemplo de transmisión cultural.
¿Es una cultura mejor que la otra? Eso es subjetivo. Como humanos tenemos tendencia a considerarnos el estándar adecuado para medir a los demás.
En nuestra sociedad cuando dices que alguien es muy alto no te refieres a que su altura sobrepasa un estándar universal establecido. Lo que quieres decir habitualmente es que es más alto que tú o en el mejor de los casos que es más alto que el promedio de estatura de tu grupo social.
Por tanto calificar un grupo cultural como mejor o peor que el nuestro es algo relativo y probablemente inútil. Seguramente para mí sea un auténtico infierno vivir en un grupo cultural como los amish totalmente ajenos a la tecnología y ellos a su vez verán mi modo de vida como una esclavitud a los gadgets. Al mismo tiempo dentro de su grupo muchos querrán venir a probar mi estilo de vida y otros que viven como yo querrían ir a buscar una vida más simple.


Personalmente detesto el reggaeton en todas sus formas y los reguetoneros piensan que el heavy metal es música de locos. ¿Es mejor mi música? Aunque yo diga que sí lo cierto es que no es que sea la mejor. Simplemente es la mía.
Vivimos en una época fantástica en que gracias a las nuevas tecnologías el mundo se ha hecho un lugar más pequeño. Distintas culturas y sociedades pueden compartir impresiones y debatir opiniones en tiempo real. Sin embargo hasta ahora no parece que hayamos aprendido mucho y seguimos matándonos mientras intentamos imponer a otros nuestras creencias o pretendemos que vivan de acuerdo a nuestros códigos morales.
La foto de abajo me encanta: Una manifestación en Texas, año 1983. Se producen serios disturbios y un joven policía negro protege a un miembro del Ku klux klan.
Puede que no esté tan lejano el día en que la gente se de cuenta que a pesar de todas las diferencias culturales en el fondo sólo existe una clase de persona: Las personas.



miércoles, 21 de enero de 2015

Actividad: Mi programa de formación

Siguiendo con el proceso de inducción del Sena en su modalidad virtual, presento mi infografía sobre el programa de análisis y desarrollo de sistemas de información.
Para realizarlo originalmente había planeado utilizar la herramienta piktochart, pero me dejé seducir por la idea de convertirlo en un video con animaciones y recurrí a Powtoon.
El video dura un minuto y creo que cumple con los requerimientos de la actividad.
Espero que les guste.



Actualización: Aprovechando la ampliación de plazos para entrega de actividades que se produjo por los cambios en las fechas, desarrollé una infografía alternativa en Piktochart.

Actividad: Mis derechos y deberes como aprendiz Sena.

La actividad nos permite escoger dos casos. He tomado los casos 1 y 2 para desarrollarlos.
En el primer caso, Federico descubre que no se le permite el acceso a una actividad práctica por no tener carnet del Sena. Federico se encuentra consternado porque lo ha solicitado dos veces y la líder de bienestar le ha dicho que el carnet es para estudiantes presenciales y el es de modalidad virtual.
El planteamiento a desarrollar es este:

De acuerdo con el Reglamento de Aprendices en lo que respecta a los derechos, proporcione una respuesta argumentada a los siguientes cuestionamientos:
 1.¿Qué respuesta la daría usted a Federico y en qué capítulo del Reglamento se basaría?
 2.En relación con la líder de bienestar, ¿qué opina acerca de la respuesta que le dio la funcionaria al aprendiz? ¿Fue acertada o equivocada? Expliqué por qué.
Desarrollo del caso 1-



El punto cuatro de los derechos del aprendiz Sena (capítulo 2°, artículo 7°) es claro: Toda persona matriculada en el Sena tiene derecho a su Carnet. Así debió haberlo resaltado Federico al recibir una respuesta negativa por parte de bienestar.
La respuesta de la líder fue claramente equivocada. Seguramente hubiera podido, asesorándose mejor, explicarle a Federico cómo obtener su carnet desde el punto geográfico en el que se encuentre. Hay que tener en cuenta que a efectos prácticos para el Sena, un aprendiz de la modalidad virtual tiene los mismos derechos que uno presencial.
La líder con este error ha hecho a su vez que Federico incurra involuntariamente en una falta ya que al no permitírsele el acceso al lugar, ha caído en una de las prohibiciones (Capítulo 4°) ya que no ha cumplido con las actividades planteadas por el Sena (Artículo 3°); creando así un trauma en el desarrollo del proceso educativo.
Federico debe radicar una solicitud por escrito para que el centro de formación le solucione su problema. Para eso debe ampararse en sus derechos tal como se ha mencionado anteriormente y en el capítulo sexto, artículo 15 que explica como la rama administrativa del centro formativo tiene diez días para darle una respuesta al aprendiz si realiza su solicitud de la forma adecuada.

SEGUNDO CASO.

El caso dos nos muestra a un preocupado Nicolás que no ha podido obtener de su tutor una respuesta sobre sus calificaciones para poder saber en qué situación se encuentra académicamente. No sólo eso, ha recibido una respuesta claramente inadecuada de un tutor que está por retirarse del Sena y muestra poco interés en el problema del aprendiz.

El planteamiento a desarrolla es este:


¿En qué capítulo, artículo e ítems del Reglamento de Aprendices, se debe amparar Nicolás para hacer dicha solicitud de manera respetuosa y formal?
Desarrollo del caso 2-



El punto 11 de los derechos del aprendiz que citábamos en el caso anterior, establece el derecho de Nicolás a ser evaluado y a recibir en un plazo no mayor a ocho días hábiles las calificaciones, precisamente para evitarse esas “sorpresas” que se teme Nicolás.
No sólo ese derecho ha vulnerado el tutor de Nicolás, sino que su respuesta ha sido maleducada e inapropiada ante una petición correcta en sus formas y basada en derechos irrenunciables.
El tutor ha vulnerado además el derecho establecido por el punto 15, que tiene todo aprendiz a ser tratado de una forma digna y respetuosa por el personal de la comunidad Sena.
Nicolás está en todo su derecho a pedir por escrito que se le califiquen sus actividades y dado que el Sena cuenta con una plataforma moderna, si el instructor había evaluadoa Nicolás, las notas estarán disponibles aunque él se vaya.