Bienvenida

Como todo en la vida, la innovación es la clave del éxito por lo que nos hemos visto en la necesidad de "evolucionar" este blog para abarcar muchos otros temas que estaban quedando de lado en nuestros cursos "oficiales".

Si deseas aprender o profundizar algunos temas en particular, no dudes en contactarnos.


sábado, 24 de septiembre de 2016

A propósito de los Bots

Este post es parte de mi tarea en el curso "Tendencias de la Educación en Línea y Herramientas Avanzadas".

Un estilo de arquitectura es el de "Máquina Virtual basada en reglas". Una máquina virtual sirve para proporcionar la funcionalidad necesaria para la ejecución de una aplicación, sin
hacer detalles específicos del hardware y/o software del sistema en el que la aplicación se ejecute.

Este estilo habilita y potencia el atributo de calidad "Portabilidad".
Los elementos que conforman el estilo son:

  • Componentes: interfaz de usuario, motor de inferencia, base de conocimientos
  • Conectores: Los componentes están estrechamente inter conectados, con llamadas a procedimientos directos y/o memoria compartida.
  • Elementos de datos: Datos y consultas.


Una desventaja aparece cuando existe un gran número de reglas: la comprensión de las interacciones entre múltiples reglas afectadas por los mismos hechos puede llegar a ser muy difícil.

Últimamente se han puesto de moda los famosos robots también conocidos como bot dedicados a sustituir a las personas en una conversación. Pues resulta que los bots están basados en éste estilo de arquitectura.

¿ Ah ? ... ¿ y que tan complicado es ?. En realidad el motor de inferencia lo proporciona un tercero y nosotros debemos encargarnos de armar todas las reglas. Veamos un ejemplo aquí.




martes, 2 de diciembre de 2014

CherryPy - A Minimalist Python Web Framework

Existe una nueva corriente de los tradicionales "applications servers" (AS) versus los "micro servers" tambien conocidos como "Web Frameworks".  Si usas JavaEE habrás escuchado mencionar a Spark Framework y si usas javaScript a Node.js por ejemplo.

¿ Cual es la diferencia ?. Mientras que muchas aplicaciones se despliegan en un AS, un "web framework" permite desarrrollar y desplegar rapidamente una aplicación dado que el servidor está "embebido" en ella. 

CherryPy permite a los desarrolladores crear aplicaciones web de la misma manera que construirían cualquier otro programa Python orientado a objetos. Esto se traduce mayor producitividad. 


 Para instalar CherryPy (usando Windows):
1) Verificar que se tiene instalador Python ( la versión 3.x).
1) Ir a la página de descarga (la versión vigente a la fecha es 3.6.0) y descargar el archivo .zip.
2) Descomprimir el ZIP
3) Abrir una ventana de comandos ( CMD) y cambiar al directorio donde se ha descomprimido el archivo.
4) Ejecutar:   python setup.py install
Aparecerán una serie de mensajes en la pantalla indicando que se están copiando archivos a la carpeta "lib" de la instalación de Python.


5) Si todo termina bien, verificar la instalación con el siguiente comando:
python -c "import cherrypy"

De ser correcto, el comando no debería mostrar nada.
6) Creamos la clásica aplicación de "Hola Mundo" para web. Editar un archivo "Hola.py" y escribir:


7) Para ejecutar la aplicación escribir : python Hola.py
Se debe activar el "servidor" y debe ser accesible desde un navegador como se muestra en la figura:



¡ Hasta la próxima !

sábado, 20 de septiembre de 2014

Documento Histórico

Un documento sobre la historia del Centro de Cómputo de la UNI (Universidad Nacional de Ingeniería).

Otra  reseña en este link

martes, 17 de junio de 2014

Lo de moda: Analitycs

Una maestría con bastante proyección Master in Data Science

Tomado del Blog (Analitica en Serio)  del diario Gestión:

 Para encontrar información, utilizamos algoritmos estadísticos y programas informáticos como SASPython y R. Así mismo, utilizamos herramientas de visualización, programas geo-espaciales, información pública en redes sociales. La analítica es una combinación de estadística, programación, visualización y presentación de información. Ésta es la diferencia con una carrera tradicional en Estadística. Analytics es una mezcla de varias áreas. Es muy importante que la información se presente de una manera clara y sencilla, que permita la toma de decisiones.

lunes, 16 de junio de 2014

Usando Web Services SOAP con JPA (EclipseLink)

El objetivo de esta guía paso a paso es comprender el funcionamiento de un servicio web con mecanismo de persistencia basado en JPA.

Herramientas de software:
  •          Netbeans IDE 7.3.x o superior
  •          GlassFish 4 con EclipseLink y JAX-WS (SOAP)
  •          La base de datos es MySQL 
    Crearemos dos aplicaciones: una que contiene el servicio Web y la otra que contiene la pagina y el servlet. El mismo caso puede ser generalizado a más operaciones dentro del Web Service o a más Web Services.

hasta la próxima !


PD: Un casito de prueba con Microsoft ( vehttps://www.youtube.com/watch?v=JBxR2KThAFE&feature=autoshare )

martes, 25 de marzo de 2014

Brevisima historia del Cloud Computing


Larry Ellison (CEO de Oracle Corp.) tenia razón cuando dijo: “The interesting thing about cloud computing is that we’ve redefined cloud computing to include everything that we already do. ..."

Tenía razón porque IBM hizo todo eso muchos años antes ...  A brief history of cloud computing


jueves, 6 de marzo de 2014

Tipos de Storage

Muy ilustrativa la explicación de lo que es un DAS vs. SAN  vs. NAS
Aunque está en inglés, se entiende muy bien.

DAS : Direct Attached Storage
SAN : Storage Area Network
NAS : Network-attached storage

Ver video aqui

domingo, 2 de febrero de 2014

Explorando nuevas cosas ...

“Esta es la historia de la Nave espacial Enterprise. Su misión: avanzar el conocimiento, contactar con vida alienígena y defender la ley intergalactica. Explorar extraños mundos desconocidos donde nadie ha ido jamás”.



¿ a qué viene la introducción de "Star Treek" en esto ?

Bueno, pues tenemos muchos post y varios años construyendo y dando soporte a la plataforma Java EE, pero el mundo ha evolucionado más allá de lo que esperabamos. Por tanto se hace imperativo explorar nuevas tendencias mas allá de nuestra zona de confort.

Es así que iniciamos nuestras publicaciones, investigaciones y proyectos con Python (que hace tiempo debimos hacerlo como Netflix ).

Pronto tendremos novedades, pero por mientras dejamos este enlace: Dive into Python 3

lunes, 16 de septiembre de 2013

Eventos en Perú

V Congreso Iberoamericano - Soporte al Conocimiento con la Tecnologia
SOCOTE 2013
http://www.usmpvirtual.edu.pe/socote2013/#wrapper-content

Congreso Internacional de Computación y Telecomunicaciones
COMTEL 2013
http://www.comtel.pe/

II Congreso Internacional de Sistemas y Computación
Lima UPC
http://www2.upc.edu.pe/html/0/documentos/2-congreso-esc-2013.pdf

I Congreso Internacional de Ingeniería de Software (CIIS) 2013
Arequipa
http://ulasalle.edu.pe/index.php/eventos/prox-eventos/ciis2013

2013-II : Práctica Calificada 1 (Programación Java)

¿ Qué tan complicado te parece esto ?

PREGUNTA #1 
Escribir un programa Java que ejecute lo siguiente:
a)    Lea una cadena desde el teclado. Debe validar que todos los caracteres sean ‘0’ ó ‘1’ (es una cadena binaria). Si existieran blancos, deben ser removidos por el programa.
b)    Luego debe convertir el valor en sistema binario al sistema decimal y mostrarlo en pantalla.
c)    El programa se debe ejecutar hasta que se ingrese un ‘0’.

PREGUNTA #2 
Se le pide desarrollar un programa que genere la secuencia de Fibonacci.
La secuencia comienza en 0 y 1 . Los números siguientes son el resultado de la suma de los dos números previos.
La secuencia debe continuar hasta llenar una matriz de 5 x 5

Se le solicita que imprima la matriz original y la matriz transpuesta.

miércoles, 22 de mayo de 2013

1416 - Curso de Programación - Examen Parcial 2013-I



CASO: La Universidad es una cosa de Locos
Como parte de un estudio sobre el desempeño de los alumnos en determinado curso de la Facultad de Ingeniería de Sistemas, se requiere hacer cierta simulación en el cálculo de promedios. Para ello se le entrega un archivo de texto conteniendo  los datos de los alumnos de un curso así como las notas obtenidas (Descargalo aquí). Usted debe desarrollar una aplicación que permita ingresar las ponderaciones de cada nota para poder calcular el promedio final del curso.

PREGUNTA # 1 : 
Desarrolle un menú de opciones que permita:
a)     Opción 1: Ingresar las ponderaciones (pesos).
b)     Opción 2: Leer archivo de datos.
c)     Opción 3: Calcular promedios.
d)     Opción 4: Listar información estadística.
e)     Opción 5: Salir

Recuerde que la suma de ponderaciones de Examen Parcial (EP), examen final (EF) y tarea académica (TA) debe sumar 100. Tome en cuenta que la tarea académica se divide en  práctica 1 (PC1), práctica 2 (PC2), Proyecto  de curso (PROY) y otros (OTR), cuya suma también debe dar como resultado 100.

Debe validar que se ingresen todos los datos, que sean correctos, etc. Puede controlar el error  utilizando la excepción NumberFormatException por ejemplo.

PREGUNTA #2: 
En esta pregunta debe desarrollar una Interface Java y  una clase DAO que implemente la interface que:
a) Permita leer los datos desde un archivo. La ruta y nombre del archivo debe ser ingresada por teclado.
b) Permita calcular los promedios finales en base a las ponderaciones ingresadas. Para calcular el promedio debe eliminarse (o no tomarse en cuenta)  la menor nota del rubro “otros”.
c)   Permita calcular los promedios por cuartil y sexo.
d)  Permita buscar el mejor o peor promedio

Determine usted la mejor estructura para almacenar  los datos obtenidos.
La estructura de cada línea del archivo es la siguiente:
ID, nombre, ep, ef, pc1, pc2, sexo, proyecto, otro1, otro2

La interface tiene los métodos siguientes:

public List<AlumnoBean> leerArchivo(String rutaArchivo);
public List<AlumnoBean> calculaPromedio(int pesoEP, int pesoEF, int pesoTA, 
int pesoPC1, int pesoPC2, int pesoPRO, 
int pesoOTR, List<AlumnoBean> ele );
public void calculaPromedioCuartil_x_Sexo(float rango1, float rango2, 
                                  String sexo, List<AlumnoBean> ele) ;
public void buscaPromedio(boolean mayor, List<AlumnoBean> ele) ;

En el caso del método “buscarPromedio”, el parámetro “mayor” es TRUE cuando se desea buscar el mejor promedio y FALSE cuando se desea el peor promedio.

PREGUNTA #3:
Ejecute su aplicación con las siguientes ponderaciones:
EP = 30; EF = 40; TA = 30
PC1 = 20 ; PC2 = 20 ; PROY=50; OTR = 10;

En base a los resultados  indique el promedio de nota para Hombres y Mujeres en cada Cuartil:

CUARTIL
PROMEDIO “H”
PROMEDIO “M”
CUARTIL 1 : de 00.0 a 25.00


CUARTIL 2 : de 25.01 a 50.00


CUARTIL 3 : de 50.01 a 75.00


CUARTIL 4 : de 75.01 a 100.00



Indique el ID, nombre y promedio del mejor alumno de la clase
ID
Nombre
PROMEDIO




Indique el ID, nombre y promedio del último  (peor) alumno de la clase
ID
Nombre
PROMEDIO






jueves, 28 de marzo de 2013

Android : Scanner de medios

Al desarrollar aplicaciones que requieren mostrar la galería de imagenes es preciso "copiar" (o hacer push ) de archivos hacia el emulador para poder efectuar las pruebas. 

Sin embargo, me ha ocurrido que sale un mensaje de error en el Android Debug Monitor :



En primera cuenta, olvidé crear el emulador con una SDCard. Para ello, en el Editor del AVD, debe indicarse explícitamente el uso de una SDCard como en la figura:

Luego nos damos con la sorpresa que el scanner de medios está desactivado por defecto ( dado que consume recursos ). Entonces, se debe activar manualmente ( por lo menos en la version Jelly Bean ).

Para activarlo se ingresa a la aplicación que dice "Dev Tools".








Luego se presiona el botón de Scan SD Card:


Cuando termina el proceso aparece en la pantalla la ruta :

Esa es la ruta donde se debe copiar los archivos para hacer las pruebas:


En este caso, copiamos 4 archivos de ejemplo ( pueden ser otros archivos ):


Y finalmente, podemos acceder a la galería:


¡ Hasta la próxima !

sábado, 9 de marzo de 2013

Solución al "casito" de Programación

Bien, he aquí "una" de las  soluciones: obviamente no hay 2 personas que piensen igual por lo tanto los algoritmos pueden variar, pero el resultado debería ser el mismo.

La pregunta #1 es sencilla:
Codificaremos  la interface:


package com.ejemplo.jdbc;

import java.util.List;

public interface AlumnoIF {

public List<AlumnoDTO> calculaPromedio();

public void calculaPromedioCuartil_x_Sexo(float rango1, float rango2, String sexo);

public void calculaPromedioCuartil(float rango1, float rango2);

}


Luego necesitamos un DTO llamado "AlumnoDTO" :


package com.ejemplo.jdbc;

import java.io.Serializable;

public class AlumnoDTO implements Serializable {
private int id;
private String nombre;
private float ep;
private float ta;
private float pc;
private float promedio;

No olvidarse de generar lo getter/setter.

La pregunta #2 implica generar un DAO con la lógica de cada  método definido en la interface:


package com.ejemplo.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class AlumnoDAO implements AlumnoIF {
private final String url = "jdbc:mysql://localhost:3306/1416examenfinal?user=root&password=mysql";
public Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(url);
} catch ( Exception e) {
System.out.println("* * * Ocurrio un ERROR " + e.getLocalizedMessage() );
e.printStackTrace();
}
return con;
}

Para calcular el promedio :

public List<AlumnoDTO> calculaPromedio() {
Connection con = getConnection();
String sql = "SELECT * FROM TBALUMNOS ORDER BY ID";
List<AlumnoDTO> lista = new ArrayList<AlumnoDTO>();
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// Borrar tabla
String sql0 = "DELETE FROM TBRPTA";
pstmt = con.prepareStatement(sql0);
pstmt.executeUpdate();
pstmt = con.prepareStatement(sql);
rs  = pstmt.executeQuery();
while ( rs.next() ) {
String sql2 = "INSERT INTO TBRPTA VALUES(?,?,?,?,?,?,?)";
pstmt = con.prepareStatement(sql2);
pstmt.setInt(1, rs.getInt(1) );
pstmt.setString(2, rs.getString(2) );
pstmt.setFloat(3, rs.getFloat(3) );
pstmt.setFloat(4, rs.getFloat(4) );

float pc1 = rs.getFloat(5);
float pc2 = rs.getFloat(6);
float pcMayor = 0;
if ( pc1 > pc2) {
pstmt.setFloat(5, pc1 );
pcMayor = pc1;
} else {
pstmt.setFloat(5, pc2 );
pcMayor = pc2;
}
float promedio = (float) (rs.getFloat(3) *0.3 + rs.getFloat(4) *0.4 + pcMayor *0.3);
pstmt.setFloat(6, promedio );
pstmt.setString(7, rs.getString(7).trim() );
pstmt.executeUpdate();

}

// Leer los resultados
String sql1 = "SELECT * FROM TBRPTA ORDER BY PROMEDIO ASC";
pstmt = con.prepareStatement(sql1);
rs  = pstmt.executeQuery();
while ( rs.next() ) {
AlumnoDTO a = new AlumnoDTO();
a.setId( rs.getInt(1) );
a.setNombre( rs.getString(2) );
a.setEp( rs.getFloat(3) );
a.setTa( rs.getFloat(4) ) ;
a.setPc( rs.getFloat(5) ) ;
a.setPromedio(rs.getFloat(6));
lista.add(a);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return lista;
}

Para calcular el promedio por Cuartil :

public void calculaPromedioCuartil(float rango1, float rango2) {
Connection con = getConnection();
String sql = "SELECT promedio FROM TBRPTA WHERE promedio > ? AND promedio <= ?";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement(sql);
pstmt.setFloat(1, rango1);
pstmt.setFloat(2, rango2);
rs  = pstmt.executeQuery();
int contador = 0;
float suma = 0;
while ( rs.next() ) {
contador = contador + 1;
suma = suma + rs.getFloat(1);
}

System.out.println("CUARTIL : de " + rango1 + " a " + rango2 +  " --> " + (suma/contador) ) ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Y para calcular el promedio por cuartil y sexo:

public void calculaPromedioCuartil_x_Sexo(float rango1, float rango2, String sexo) {
Connection con = getConnection();
String sql = "SELECT promedio FROM TBRPTA WHERE promedio > ? AND promedio <= ? AND sexo = ? ";
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement(sql);
pstmt.setFloat(1, rango1);
pstmt.setFloat(2, rango2);
pstmt.setString(3, sexo);
rs  = pstmt.executeQuery();
int contador = 0;
float suma = 0;
while ( rs.next() ) {
contador = contador + 1;
suma = suma + rs.getFloat(1);
}

System.out.println("CUARTIL : de " + rango1 + " a " + rango2 + " Sexo : " + sexo + " --> " + (suma/contador) ) ;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
rs.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

La pregunta #3 implica crear el programa principal :

package com.ejemplo.pregunta02;

import java.util.List;

import com.ejemplo.jdbc.AlumnoDAO;
import com.ejemplo.jdbc.AlumnoDTO;
import com.ejemplo.jdbc.AlumnoIF;

public class Respuesta02 {

public static void main(String[] args) {
Respuesta02 r02 = new Respuesta02();
r02.calcula();
}
public void calcula() {
AlumnoIF dao = new AlumnoDAO();
List<AlumnoDTO> l = dao.calculaPromedio();
for (int i=0; i < l.size(); i++) {
System.out.println( l.get(i).getId() + "\t " + l.get(i).getNombre() + "\t " + l.get(i).getPc() + "\t" + l.get(i).getPromedio() );
}
// Promedio x Cuartiles
System.out.println("===> Primer Cuadro <====");
dao.calculaPromedioCuartil(0F, 25.00F);
dao.calculaPromedioCuartil(25.01F, 50.00F);
dao.calculaPromedioCuartil(50.01F, 75.00F);
dao.calculaPromedioCuartil(75.01F, 100.00F);
System.out.println("");

// Promedio x Cuartiles x Sexo
System.out.println("===> Segundo Cuadro <====");
dao.calculaPromedioCuartil_x_Sexo(0F, 25.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(0F, 25.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(25.01F, 50.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(25.01F, 50.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(50.01F, 75.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(50.01F, 75.00F,"F");
dao.calculaPromedioCuartil_x_Sexo(75.01F, 100.00F,"H");
dao.calculaPromedioCuartil_x_Sexo(75.01F, 100.00F,"F");

}

}

Al ejecutar este programa salen todos los datos necesarios para llenar los cuadros.

¿ Fácil ?