sábado, 25 de noviembre de 2017

JUnit


JUnit es un marco de pruebas unitarias para el lenguaje de programación Java. Juega un papel crucial en el desarrollo impulsado por pruebas, y es una familia de marcos de pruebas unitarias conocidas colectivamente como xUnit.

JUnit promueve la idea de "primero probar y luego codificar", que hace hincapié en la configuración de los datos de prueba para una pieza de código que se puede probar primero y luego implementar. Este enfoque es como "prueba un poco, codifica un poco, prueba un poco, codifica un poco". Aumenta la productividad del programador y la estabilidad del código del programa, lo que a su vez reduce el estrés en el programador y el tiempo dedicado a la depuración.

Para su implementación se dará como ejemplo el siguiente código.
Las pruebas de software son uno de los procesos y actividades más importantes a la hora de desarrollar proyectos relacionados con la ingeniería de software, pues de estas depende la calidad que el proyecto posea. Por tanto, la utilización de métodos que faciliten, optimicen y sobretodo automatice dicho proceso de pruebas supone una gran mejoría en el desarrollo del proyecto y su calidad final.

Crear un nuevo archivo llamado Calculator.java
public class Calculator {
public int evaluate(String expression) {
int sum = 0;
for (String summand: expression.split("\\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
Crear una prueba:
import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}
Ejecutar con la siguiente línea:
javac -cp .;junit-4.XX.jar;hamcrest-core-1.3.jar CalculatorTest.java

Es necesario hacer múltiples pruebas en las que incluyan resultados fallidos.


Las pruebas de software son uno de los procesos y actividades más importantes a la hora de desarrollar proyectos relacionados con la ingeniería de software, pues de estas depende la calidad que el proyecto posea. Por tanto, la utilización de métodos que faciliten, optimicen y sobretodo automatice dicho proceso de pruebas supone una gran mejoría en el desarrollo del proyecto y su calidad final.

Referencias:
Anónimo. (2009). Unit Testing and JUnit. 25/11/2017, de Indraprastha Institute of Information Technology Sitio web: https://www.iiitd.edu.in/~jalote/jalotesebook/JaloteSEbook/tmp/UnitTesting.pdf

Augusto, F. (2012). Getting started. 25/11/2017, de GitHub Sitio web: https://github.com/junit-team/junit4/wiki/getting-started

domingo, 19 de noviembre de 2017

RMI

Existen una gran cantidad de mecanismos ofrecidos por java que simplifican y optimizan tareas en las aplicaciones en gran medida. Dentro de los sistemas distribuidos, unos de los más importantes es el Remote Method Invocation (RMI),  en el cual se puede invocar un método de manera remota. Es una manera sencilla para la comunicación de servidores de aplicaciones distribuidas que estén basados en Java.

Debido a que esta basado exclusivamente en java, su uso resulta de gran facilidad, pues proporciona el paso de objetos por referencia, el cual no esta permitido en otros métodos similares, recolección de basura distribuida y el paso de tipos arbitrarios.

El uso de RMI supone exportar un objeto el cual estará disponible en la red con un programa que permanecerá en espera en un puerto. El cliente puede invocar los métodos que tenga dicho objeto en la red de acuerdo a los siguiente pasos: encapsulamiento, invocación del método, regreso del valor de retorno en caso de que haya y por último el cliente recibe la respuesta y continúa como si la invocación hubiera sido local.

La arquitectura del RMI se divide en cuatro capas. La primera capa es la de aplicación y se corresponde con la implementación real de las aplicaciones cliente y servidor. La segunda capa es la correspondiente al proxy, interactúa con la capa de aplicación y es en donde están todas las llamadas a objetos remotos. La tercer capa es la de referencia remota y es la responsable de la semántica de las invocaciones. Por último, la capa de transporte se encarga de llevar la información de una máquina a otra mediante el protocolo JRMP. 

Es así como se lleva a cabo uno de los mecanismos más fáciles de implementar y cuyo utilidad es muy basta, pues el cliente tiene el acceso de objetos y sus métodos de un servidor, ejecutándolo como si fuera local.

domingo, 12 de noviembre de 2017

Kerberos


La expansión de las utilidades de las redes ha permitido que hayan ciertas actividades cuya ejecución resulte mucho más rápida que si se hiciera personalmente. El uso de la web para realizar pagos y transacciones es uno de los usos más importantes dentro de estas redes, sin embargo, en siempre resultaba inseguro llevarla a cabo, por esta razón se implementó el sistema de kerberos, un protocolo de autenticación de redes de ordenador creado por el MIT que permite a dos ordenadores en una red insegura demostrar su identidad mutuamente de manera segura.

El sistema de kerberos no utiliza varios servicios para autenticar por medio de usuario y contraseña, si no que implementa un cifrado asimétrico o asimétrico y a un tercero para realizar dicha tarea de autenticación. Esta petición puede ser enviada por el programa de conexión para que sea transparente al usuario o puede ser enviada por otro programa después de que el usuario se registre.

El funcionamiento es el siguiente: el cliente se autentica a sí mismo contra el AS, así demuestra al TGS que está autorizado para recibir un ticket de servicio (y lo recibe) y ya puede demostrar al SS que ha sido aprobado para hacer uso del servicio kerberizado.

Sin embargo, Kerberos se vuelve vulnerable cada vez que un usuario en la red se valida contra un servicio no kerberizado y envía una contraseña en la red en texto plano. Por lo tanto no se recomienda el uso de servicios no kerberizados. Estos servicios incluyen Telnet y FTP. Se acepta el uso de otro tipo de protocolos encriptados, tales como SSH o servicios seguros SSL, pero no es ideal.


Kerberos es uno de los sistemas más utilizados por su versatilidad y seguridad a la hora de autenticar e un usuario y darle los servicios que necesite sin que, en las mayoría de las ocasiones, sea inseguro realizar alguna transacción por Internet. Este es el objetivo de todos los sistemas parecidos a este, garantizar la seguridad de la información de aquellos que utilizan estos servicios.

domingo, 5 de noviembre de 2017

Socket Stream

El uso de sockets permite a dos programas ( ya sea entre dos o más computadoras) intercambiar un flujo de datos, constituyen el mecanismo para la entrega de paquetes de datos provenientes de la tarjeta de red a los procesos o hilos apropiados. 

Un socket queda definido por un par de direcciones IP local y remota, un protocolo de transporte y un par de números de puerto local y remoto.


Un Socket Es una interfaz de entrada ­salida de datos que permite la intercomunicación entre procesos. Los procesos pueden estar ejecutándose en el mismo o en distintos sistemas, unidos mediante una red. 

Existen dos tipos de sockets, por una parte, Sockets Stream, los más utilizados, hacen uso del protocolo TCP, el cual nos provee un flujo de datos bidireccional, secuenciado, sin duplicación de paquetes y libre de errores, los datos se transfieren sin encuadrarlos en registros o bloques. Si se rompe la conexión entre los procesos, éstos serán informados. A diferencia de los socket datagrama,  donde se transmiten paquetes individuales de información y no garantiza que los paquetes llegarán en alguna forma en particular.

el siguien es un ejemplo del uso de sockets stream en un servidor:


String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);

try (
    Socket echoSocket = new Socket(hostName, portNumber);
    PrintWriter out =
        new PrintWriter(echoSocket.getOutputStream(), true);
    BufferedReader in =
        new BufferedReader(
            new InputStreamReader(echoSocket.getInputStream()));
    BufferedReader stdIn =
        new BufferedReader(
            new InputStreamReader(System.in))
)


Los sockets Stream y los datagrama tienen usos muy similares, mientras que uno notifica siexiste algún error a costa de mayor procesamiento, el otro es mucho más rápido y no garantiza que el destinatario reciba los paquetes.

 Cada uno de estos sockets pueden ser utilizados según las necesidades y funciones que vayan a desarrollar dentro de la red.





martes, 17 de octubre de 2017

Reporte visita INEGI

Reporte visita

El pasado viernes 13 de 2017 realizamos una visita escolar a el Instituto Nacional de Geografía y Estadística, con sede en la ciudad de Aguascalientes.

Salimos de la escuela el jueves 12 a las 11:00pm para llegar por la mañana del día siguiente. Arribamos a un lado del inmueble, autorizaron nuestra entrada, nos colocaron los gafetes de visitantes y empezó dicha visita guiada.

Primero nos llevaron a una habitación en la que se crean mapas con relieve, calentando una lámina de plástico con el mapa impreso y dándole el relieve con un molde debajo. Nos obsequiaron un mapa de la República Mexicana, con el relieve de las montañas, montes, valles, llanuras y el del océano.

Proseguimos a una exposición de seguridad web. Desafortunadamente, los expositores no estaban preparados y se notaba un cierto nerviosismo, por lo que dicha exposición no fue para nada atractiva, pero no menos importante por los temas de los que hablaron.

Tras un breve receso  tuvimos una exposición en la que un experimentado trabajador de la institución nos explicó cómo era todo lo relacionado a la informática en INEGI, tales como las herramientas de programación, las tecnologías, los procesos y algunos consejos para los que tenemos en mente trabajar en este ámbito.

Al salir del salón de usos múltiples nos llevaron hacia el edificio de informática, en donde nos mostraron, detrás de una ventana, los servidores que la institución empleaba para las enormes cantidades de información que aquí se procesa, ademas de una breve explicación de la beta de la nueva página web del INEGI y de un mapa interactivo.

Aquí concluyó la visita a la institución, devolvimos los gafetes y regresamos al camión. Comimos en un establecimientos a unos minutos de aquel lugar y partimos el viaje de regreso a la escuela.

domingo, 8 de octubre de 2017

Sockets

Hoy en día, gracias al desarrollo de la tecnología se ha podido crear métodos de comunicación cada vez más sofisticados y accesibles. Uno de los métodos más utilizados son los protocolos TCP/IP  y en menor medida UDP. Estos protocolos de comunicación han permitido que el envío y recibo de información sea mucho más rápida y eficiente que los pasados métodos, ahora obsoletos. Tanto el protocolo TCP, como el UDP tienen una característica en común, el uso de sockets.


Un socket de red es un punto de inicio o final del flujo de la información entre dos procesos regularmente desde dos computadores distintos. Estos tienen dos diferentes usos de acuerdo a su función; puede ser un socket de cliente, que busca al otro tipo de socket, el de servidor para establecer una conexión y así, permitir el flujo de la información.
Su implementación en JAVA incluye la biblioteca Java.net que proporciona tanto los sockets TCP como UDP.


Para el protocolo TCP existen dos clases: la clase Socket, la cual implementa los sockets de cliente y la ServerSocket, que implementa los sockets de servidor. Por su parte, el protocolo UDP cuenta con las clases DatagramPacket, la clase que representa un paquete datagrama y DatagramSocket, clase representa un socket para enviar y recibir paquetes datagrama.

El siguiente es un ejemplo sencillo de la implementación de sockets y crear una conexión  mediante el protocolo TCP:

public class Conexion { private final int PUERTO = 1234; //Puerto para la conexión private final String HOST = "localhost"; //Host para la conexión protected String mensajeServidor; //Mensajes entrantes (recibidos) en el servidor protected ServerSocket ss; //Socket del servidor protected Socket cs; //Socket del cliente protected DataOutputStream salidaServidor, salidaCliente; public Conexion(String tipo) throws IOException //Constructor { if(tipo.equalsIgnoreCase("servidor")) { ss = new ServerSocket(PUERTO) cs = new Socket(); } else { cs = new Socket(HOST, PUERTO); } } }
--------------------------------------------------------------------------------------------------------------------------
Para crear una clase para el servidor se implementa el siguiente código:

public class Servidor extends Conexion { public Servidor() throws IOException{super("servidor");} public void startServer()//Método para iniciar el servidor { try { System.out.println("Esperando..."); cs = ss.accept(); System.out.println("Cliente en línea"); salidaCliente = new DataOutputStream(cs.getOutputStream()); salidaCliente.writeUTF("Petición recibida y aceptada"); BufferedReader entrada = new BufferedReader(new InputStreamReader(cs.getInputStream())); while((mensajeServidor = entrada.readLine()) != null) { //Se muestra por pantalla el mensaje recibido System.out.println(mensajeServidor); } System.out.println("Fin de la conexión"); ss.close(); } catch (Exception e) { System.out.println(e.getMessage()); } } }

Así es como se crea una conexión simple mediante sockets con el protocolo TCP.