miércoles, 1 de octubre de 2014

Servidor Raíz - DNS

Servidor Raíz - DNS



Un Servidor Raíz de DNS es el servidor que tiene la información de dónde se encuentran los nombres para cada zona a nivel internet. De modo que cuando un usuario ingresa una página en su navegador primero consulta al servidor raíz quien le dice a dónde debe ir a consultar hasta llegar al dominio que busca.

El servidor raíz es la parte superior de la jerarquía de los dominios de internet, después sigue el segundo nivel (Ej. mx, es, us, etc.) y luego los dominios que están bajo estos como (uaemex.mx, nic,mx, etc.).

El funcionamiento de un servidor raíz
Dada una consulta de cualquier dominio, el servidor raíz proporciona al menos el nombre y la dirección del servidor autorizado de la zona de más alto nivel para el dominio buscado. De manera que el servidor del dominio proporcionará una lista de los servidores autorizados para la zona de segundo nivel, hasta obtener una respuesta razonable.

¿Cuántos servidores raíz hay en el mundo y dónde se encuentran?


Hasta el 2012 existían 13 servidores raíz en el mundo, de los cuales 10 servidores se encuentran en Estados Unidos y son administrados por dicho país, los otros tres restantes están en Europa y uno en Japón.

Los trece servidores están bajo el dominio root-servers.org y se pueden referenciar por una letra la cual va desde la A - M.

1. VeriSingn es el root-server A (192.41.0.4). Está ubicado en Dulles (Virginia, EEUU).

2. Instituto para la formación científica es el root-server B (192.225.79.201). Está situado en Marina del Rey (California).

3. Cogent Communications es el root-server C (192.33.4.12). Es una multinacional fundada en 1999 situada en Washington.

4. Universidad de Maryland es el root-server D (128.8.10.90) situado en la ciudad College Park.

5. Centro de investigación Ames de la NASA es el root-server E (192.203.230.10). El centro de investigación situado en Silicon Valley (California).

6. Consorcio de Sistemas de internet (ISC) es el root-server F (192.5.5.241), en realidad no es un sólo servidor físico, sino un sistema distribuido de varios servidores DNS a lo lago de diferentes ciudades como Ottawa, New York, Madrid, Roma, Paris, Barcelona, Buenos Aires, etc. Fue el primer servidor distribuido.

7. Departamento de Defensa de EEUU es el root-server G (192.112.36.4) y se encuentra en la capital Ahio.

8. Laboratorio de investigación de la Armada de EEUU es el root-server H (128.63.2.53).

9. Anutonomica/NORDUnet es el root-server I  (192.36.148.17), Es un servidor distribuido en diferentes ciudades.

10. VeriSing tiene un segundo servidor DNS, el root-server J (192.58.128.30), es un servidor distribuido.

11. Centro de Coordinación de Redes IP europeas es el root-server K (192.0.14.129). Es un servidor distribuido por ciudades como: Londres, Amsterdam, Frankfurt, etc.

12. Corporación de internet para la Asignación de Nombres y Números es el root-server L (192.7.83.42). se basa en un servidor distribuido entre los Angeles y Miami (Estados Unidos).

13. WIDE Project es el root-server M (202.12.27.33). Servidor distribuidos que se encuentra en varias ciudades de Tokyo, Seúl, Paris y San Francisco.

¿Qué pasa con los servidores raíz en México?

Como ya nos pudimos dar cuenta en México no contamos con un servidor raíz propiamente pero si tenemos con una replica del servidor raíz F y una copia del servidor raíz L, los cuales recordemos que son servidores distribuidos.

Ambas copias (F y L) están físicamente en la ciudad de Monterrey en este proyecto NIC México colabora y administra dicho servidor.




Acerca de NIC México
NIC México es una organización profesional independiente con la responsabilidad de administrar los nombres de dominio en Internet con terminación .MX. NIC México además de la administración del código territorial .MX, ofrece la asignación de recursos de Internet en México.

Acerca de ICANN
La Corporación para la Asignación de Nombres y Números de Internet (ICANN) es responsable de la administración y coordinación del Sistema de Nombres de Dominio de Internet (DNS). También se encarga de la asignación del espacio de direcciones del Protocolo de Internet (IP), así como de las funciones de gestión del sistema de Nombres de Dominio Genéricos de Primer Nivel (gTLDs) y también de los Nombres de Dominio de Código Territorial (ccTLDs), así como de la administración del sistema de servidores raíz (root servers).


Referencias consultadas (Recuperada el 01/10/2014)
http://www.root-servers.org/
http://www.ietf.org/
http://es.wikipedia.org/wiki/Servidor_ra%C3%ADz
http://www.nic.mx/es/NicMx.Comunicados?id=444
http://www.latinoamericann.org/?q=node/540
http://root-servers.org/
http://www.emezeta.com/articulos/rootservers-los-servidores-raiz-del-mundo

martes, 30 de septiembre de 2014

DNS

     DNS


uDefinición
Domain Name System o Sistema de Nombres de Dominio.
es un sistema de nomenclatura jerárquica para computadoras, servicios o cualquier recurso conectado a Internet o a una red privada.
Su finalidad es facilitar el manejo de direcciones IP.
www.uv.es es equivalente a 147.156.1.4
uTipos de Servidores DNS
- Servidor Primario
- Servidor Secuandario
- Servidor Master
uTipos de Registros de DNS
SOA, NS, A, CNAME, MX, TXT, etc.
uZona de Autoridad
Esta compuesta por un conjunto de dominios.

PRESENTACIÓN
Power Point:
PDF:




D sobre linux

miércoles, 3 de septiembre de 2014

SPANNING TREE PROTOCOL & BROADCAST STORM CONTROL

Spanning Tree Protocol & Broadcast storm control

Spanning Tree Protocol (STP)
Introducción
EL STP es un protocolo que trabaja a en la capa 2 (enlace de datos) del modelo OSI y por lo tanto su principal función es encontrar la ruta adecuada para comunicación a un bajo costo, claro está que como internet también las redes utilizan redundancia de rutas con el único fin de asegurar que los paquetes siempre lleguen a su destino aun cuando algunas rutas se hayan perdido.

El problema que se presenta cuando se tiene redundancia de rutas es cuando utilizamos puentes de red (bridge, dispositivos que interconectan segmentos de red permitiendo la transferencia de paquetes entre los segmentos interconectados) o un conmutador de paquetes (retransmite la información por varias vías hasta que lleguen a su destino).

Los puentes de red o conmutadores de paquetes pueden ocasionar que se generen bucles en la red lo  cual provoca que los paquetes estén circulando un sin número de veces por la red intentando encontrar su destino  y en consecuencia generando trafico basura en la red, en otras palabras, lo anterior implica lentitud en la red que dicho sea de paso es detestado por cualquier usuario actual.

Para que todo lo anterior no suceda es que existe STP el cual permite que sólo haya una ruta activa (aquella de menos costo, es decir, más cercana) y las rutas alternas las deshabilita parcialmente, en caso de que la ruta principal no esté disponible entonces intentará por alguna ruta alterna. La clasificación de las rutas se hace en forma de árbol.

Funcionamiento
El protocolo de STP primeramente identifica cada puente para después elegir el de mayor prioridad en base al menor costo. Una vez elegido este se convierte en la raíz del árbol y por lo tanto será la ruta principal o puente raíz puesto que tiene el menor costo. Después se elige el puerto raíz considerando el puerto que tiene el menor costo hacia el puente raíz.

Luego de elegir el puerto raíz ahora sigue elegir los puertos designados los cuales son elegidos en base al puerto que ofrezca la ruta con menor costo hacia el puerto raíz. Todas las demás rutas o puertos son bloqueados para evitar bucles.
Es importante mencionar que los puentes se comunican a través de mensajes llamados Bridge Protocol Data Units (BPDU), los cuales son los que comunican los segmentos de red y son los que pueden hacen posibles los bucles.

 Broadcast Storm Control
Su objetivo es justamente tener un control sobre el número de tramas de difusión envidadas por el switch, esto para evitar que estas tramas circulando afecten el rendimiento de la red de tal manera que consuman recursos de forma significativa.

Esta función que normalmente esta desactivada en los dispositivos administrables puede protegernos de un ataque de paquetes broadcast que saturen el switch y si a esto le agregamos que no tenemos implementado el Protocolo Spanning Tree esto sería un caos.

Existen 3 niveles de control:

        * Alto: 3.000 paquetes de difusión por segundo

        * Medio: 500 paquetes de difusión por segundo

        * Baja: 100 paquetes de difusión por segundo




Referencias
http://aprenderedes.com/2006/11/protocolo-de-arbol-de-extensionstp/

http://www.cisco.com/c/en/us/td/docs/switches/datacenter/sw/4_1/nx-os/security/configuration/guide/sec_nx-os-cfg/sec_storm.html#wp1109566

http://migerson.blogspot.mx/2012/02/spanning-tree-control-y-broadcast-storm.html

http://enredandoconredes.com/2012/06/20/trafico-broadcast/


miércoles, 27 de agosto de 2014

Web Semántica

Web semántica

Para entender lo que es web semántica primero empecemos revisando el significado de estos dos conceptos por separado.

Sabemos entonces que la web nos permite la distribución de documentos de hipertexto que son accesibles a través de la red de redes  llamada internet medio en el cual podemos visualizar páginas web estáticas o dinámicas y que esta red de redes la podemos “materializar” a través de un navegador web, es decir, podemos saber que existe la comunicación vía internet cuando a través de un navegador visualizamos dicha comunicación.

La web es eso que nos permite visualizar contenido multimedia como imágenes y video a través de una página web y que nos permite ir navegando a través de hiperenlaces.

Semántica lo relacionamos al significado o sentido de las palabras, esto es, que tenga coherencia lo que queremos decir y para hacerlo considera más de un par de palabras.

La web semántica es la distribución de contenidos a través de internet que se alojan en una página web estática o dinámica en la cual podemos ir navegando de un lugar a otro a través de hipertextos o buscadores que tienen por objetivo entender el significado de lo que nosotros escribamos en  lenguaje natural.

La web semántica pretende entender lo que el usuario escribe en un formulario simple como si estuviera pidiéndoselo a otra persona y no a una máquina que le tienes que dar demasiadas especificaciones para que encuentre coincidencias en páginas web y le muestre resultados que no era para nada lo que buscábamos.
Algunos relacionan todo lo anterior con las funcionalidades que debe o tiene la web 3.0, en realidad existe todavía una gran discusión si la web semántica es distinta a la web 3.0 o es que la web semántica es parte de la web 3.0

Mientras lo expertos y la historia se ponen de acuerdo alucinaremos que es lo mismo y por lo tanto la web 3.0 pretende desaparecer la búsqueda por palabras clave  para sustituirlo por búsquedas en forma de expresión humana natural.

La idea de la web semántica o web 3.0 es agregarle un plus a la web 2.0 para lograr entender a una persona en su lenguaje cotidiano y en consecuencia mostrarle resultados personalizados.

Los algoritmos de búsqueda han cambiado significativamente ya que el enfoque de búsqueda como explicábamos anteriormente también ha cambiado, en esta versión de la web, es necesario de algoritmos inteligentes que permitan la consulta o deducción de las necesidades del usuario.

Considero que aunque hay buscadores muy eficientes como google o inclusive bing aún no se ha logrado por completo los deseos de la web 3.0 en su totalidad por que actualmente siguen equivocándose en lo que yo busco cuando navego en internet aunque debo decirlo cada día son más eficientes y cercanos a entender mis necesidades.

Un ejemplo de lo anterior es el hecho de hacer predicciones sobre lo que escribo en relación al contexto y poderme ayudar a completar más rápidamente mis ideas o bien a predecir que canciones serán exitosas mediante un análisis de los contenidos que los usuarios publican o comentan en sus páginas web o en las redes sociales que últimamente están de moda y en donde ciegamente publicamos nuestros sentimientos, gustos, disgustos, etc.

Esta información puede ser analizada inteligentemente para identificar aspectos personales y de este modo enviarte publicidad que tu estarás interesado o bien ayudarte a encontrar algo rápidamente porque los buscadores empiezan a entender más a tu corazón más de lo que  tu cerebro lo conoce.

La web semántica incluye varias cosas interesantes que poco a poco se irán concretando mejor para ofrecernos y sorprendernos cada día tanto así que cuando alguien quiera saber lo que incluye la web semántica pueda llegar a este blog y confundirse quizá un poco más.

Referencias

miércoles, 13 de agosto de 2014

Python, ciclos, if, elif, etc.

Ciclos, if, elif, if en Python

Como ya sabemos para hacer un programa los ciclos son en ocasiones necesarios y nos ahorran mucho código y tiempo, en Python podemos usarlos también.

Ciclo While

cicloWhile.py

# Esto es un comentario en python
# Veremos el ciclo while

b = 1
while b < 11:
        print b
        b = b + 1

Análisis del programa
Como ya sabemos Python es un Lenguaje débilmente tipificado lo cual significa que no es necesario establecer de que tipo de dato cada función, variable, etc. En el programa anterior podemos ver que se crea una variable de tipo b que guarda un entero 1. Después tenemos un ciclo while que como se puede ver tiene una condición para repetirse mientras que b sea menor a 11 es decir imprimirá del 1 al 10 y luego sumará uno a b cada vez que itere.

Es importante recordar también que en Python no existen llaves como en C o Java ya que Python lo sustituye mediante el ordenamiento del código. 

Otra versión del programa anterior es la siguiente 

Utilizando if

b = 1
while b < 11:
        if b == 5:
                print "b = " + str(5)
        print b
        b = b + 1

En donde agregamos un if solamente.

Utilizando elif y else
En Python no existe el swith en donde nos permitía tener varios casos (case) en lugar de eso tenemos el elif el cual funciona me manera similar a un case ya que verifica que cumpla la condición y entra en ese caso, para el else lo que pasa es que actúa como la opción por default.


a = 5
b = 4

if a == 4:
        print a
elif a == 5:
        print "a es igual a " + str(a)


if b == 5:
        print b
elif a == 3:
        print "b es igual a " + str(b)
else :
        print "b debe ser 4"

El resultado debe ser:
a es igual a 5
b debe ser 4





      

Aprendiendo un poco de Python

En esta ocasión veremos un poco del lenguaje de programación Python el cual me parce muy bueno y fácil de usar.

Hola Mundo en Python
Para hacer el hola mundo veremos dos formas (No son las únicas)
     1. A través del Shell de Python.
     2. Compilando un archivo de Pyhon

Con la primera sólo hace falta abrir el Shell y escribir

print "Hola Mundo"

Para usar la segunda opción una forma de hacerlo es abrir el Shell después nos vamos a la pestaña File/New Window una vez que ya se ha abierto guardamos el archivo (File/Save as/Save) con extensión .py  y en ese mismo archivo escribimos

print "Hola Mundo"

Para correr el código y ver nuestro super programa corriendo sólo hace falta ir al menú de la ventana y seleccionar Run/Run Module o bien presionar solamente la tecla F5.






lunes, 14 de julio de 2014

Modulo 3: Paso de parámetros

En java puedes pasar parámetros por valor o por referencia.

Paso por valor: significa que le pasas un copia del valor que tiene una determinada variable y esto sólo es posible para tipos de datos creados por java (int, Integer, String, short, Short, etc. ).

Paso por referencia: Este existe para los tipos de datos creados por java y los de usuario, sólo que se comportan de forma un tanto diferente. En general consiste en pasar la referencia (dirección) dónde se encuentra el objeto creado, es decir, es pasar el *control total del objeto para que éste pueda ser modificado.

*En el caso de los tipos de datos de java no se ofrece el control total, sino que se se le pasa una copia de la referencia y se tiene su propia copia, cuando el objeto cambia no se ve afectado en la variable anterior.
Ejemplo:

//En el main
int x = 5;
int y;
suma(x, y); //se pasa una copia de la referencia de x y de y.
System.out.println(x); //el resultado no se afecto y es 5

suma(5, 4); se pasa directamente el valor.

//fuera del main
static void suma (int x, int y){ /
x++;
System.out.println(""+(x + y));

}

De alguna manera podemos decir que en los datos nativos de java sólo existe el paso por valor aunque hay dos formas de hacerlo como ya lo pudimos ver.

* Para el caso de los tipos de datos creados por el usuario ahí sólo existe en paso por referencia y es precisamente lo que explicaba anteriormente.
Ejemplo :

class Persona{
private String nombre;

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

}

class TestPersona{
    public static void main(String[] args) {
        Persona p = new Persona(); //se crea un objeto de la clase persona
        p.setNombre("Pedro"); //le pone un nombre a la persona.
        System.out.println(""+p.getNombre());// vemos que ya tiene nombre
        cambiaNombre(p);
        System.out.println(""+p.getNombre()); //nos muestra el nombre
    }
   
    public static void cambiaNombre(Persona p){
        p.setNombre("Juan");
    }
}

Como se puede ver se le paso el control total del objeto para que lo modificara.














viernes, 11 de julio de 2014

SQL Server
Es una base de datos que ofrece Microsoft útil para almacenar grandes cantidades de registros y muy fácil de usar.

Copiar el contenido de una tabla a otra
 INSERT INTO polizasCopia11072014 SELECT * FROM polizas

En polizasCopia11072014 se copia todo lo que hay en polizas

martes, 8 de julio de 2014

Modulo extra: Codigo de la API

La clase String genera objetos inmutables, que no pueden cambiar de estado

La clase string utiliza un mecanismo para ahorrar memoria

La clase String es final y no  puede sobreescribir objetos.

String
        //equalsIgnoreCase: este metodo verifica el valor sin considerar minusculas o mayusculas
        System.out.println("metodo equalsIgnoreCase " + exit.equalsIgnoreCase("EXIT"));
        System.out.println("metodo equalsIgnoreCase " + exit.equalsIgnoreCase("exit"));

System.out.println("metodo notPool.subString(11): "+notPool.substring(30, 32)); //incluye el 30 pero 32 no



Expresiones Regulares
. cualquier dato
\d digito del 0 -9
\s un caracter de espacio en blanco
\w un caracter [a-zA-Z_0-9]



Uso de Date







viernes, 4 de julio de 2014

Modulo 15: Hilos

Se puede crear hilos de dos formas
- Por herencia a través de la clase Thread
- implementando, con la interfaz de Runnable (Recomendable y más usada)


Es dificil ejecutar cuál hilo se ejecuta primero , es decir se necesitan ver el código de la máquina virtual y del SO para saber.

Todos los hilos se crean con una prioridad y se determina con un valor, el cuál no necesariamente necesita que se ejecute primero, la máxima prioridad es 10 y la mínima es 1, y la media es 5 y es por default, AUN CUANDO SE LE ASIGNE UNA PRIORIDAD -NO- Los va a ejecutar primero de acuerdo a la prioridad.

Constructores
Thread()
          Allocates a new Thread object.
Thread(Runnable target)
          Allocates a new Thread object.
Thread(Runnable target, String name)
          Allocates a new Thread object.
Thread(String name)
          Allocates a new Thread object.
información desde: http://docs.oracle.com/javase/6/docs/api/

Métodos
run() -> El código de nuestro hilo
start() -> invoca el código del hilo, es decir ejecuta a run pero lo ejecuta en un nuevo subproceso (Hilo)
stop()

Si te es un objeto de una clase que extiende de Thread y que dicha clase tiene el método hilo.
t.run(); // ejecutaría un método run.
t.star(); // ejecuta el método run, pero como un subproceso

Para un hilo se necesita, debe de tener las tres para tener un hilo
CPU - son las invocaciones de los hilos ua, ua1.
Codigo (todo lo que tengamos en run)
Date


No se debe tener dos start() en un mismo hilo, porque manda un error de inicialización.

Siempre existe al menos un hilo el del main

Los hilos se lanzan casi al mismo tiempo, la máquina virtual y el SO lo definen, solo que hay que tener cuidado.
Ejemplo de dos personas que quieren con dos tarjetas en diferentes tarjetas y diferente cajero utilizan su tarjeta 

join(): lo que hace es decir espera a que termine el hilo que se esta ejecutando, se lo dice al que quiere entrar.

otra manera de obtener los mismo, es usar el método para sincronizar
















jueves, 3 de julio de 2014

Modulo 13: Fechas, numeros y monedas

public class EjCD {
    public static void main(String[] args) {
        Date d = new Date();
        System.out.println("Fecha actual del sistema: "+d);
     
        Date d1 = new Date(2014 -1900, 06,2);
        System.out.println(""+d1);
        //año 1900
        // mes desde el 0 al 11
     
        Date d3 = new Date(30000000L); //milisegundos que han transcurrido desde 19970
        System.out.println("d2= "+d3);
    }
}

poner atención a estos métodos
getDateInstance();








Para la localidad puedes ir a
The language argument is a valid ISO Language Code. These codes are the lower-case, two-letter codes as defined by ISO-639. You can find a full list of these codes at a number of sites, such as: 
http://www.loc.gov/standards/iso639-2/englangn.html


The country argument is a valid ISO Country Code. These codes are the upper-case, two-letter codes as defined by ISO-3166. You can find a full list of these codes at a number of sites, such as: 
http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html

Modulo 12: Objetivos Fundamentales (classpath)

Las classpaths realizan la búsquedas de izquierda a
derecha:
> -classpath /com:/foo:.  
• No es lo mismo que:
> -classpath .:/foo:/com

El punto (.) significa que busque en el directorio actual y el : en linux o ; en windows significa busca en otro lado es como el o lógico


Archivos jar

miércoles, 2 de julio de 2014

MODULO 11: Consola I/O

Salida con formato

public class SFO {
    public static void main(String[] args) {
        double nd = 123.4567;
        System.out.printf("%08.2f %n", nd);
        //Son 8 por todos los caracteres incluyendo el punto
        // 2 significa que son dos digitales a la derecha.
        //f -> flotantes, double. %g -> Notacion cientifica
        //%d %o %x Entero, decimal, octal, o hexadecimal.
        //%n nueva linea al igual que \n
        //%s String
    }
}

Preguntas en evaluación lo siguientes métodos
 StringreadLine()
          Reads a single line of text from the console.
LOS MÉTODOS ESTÁN SOBRECARGADOS
 char[]readPassword()
          Reads a password or passphrase from the console with echoing disabled

OBSERVACIÓN: RedLine en cualquiera de sus formas regresa un STRING y readPassword  regresa un arreglo de caracteres char[].

Ejemplo de preguntas:
QUESTION NO: 1

Given:
5. import java.io.*;
6. public class Talk {
7. public static void main(String[] args) {
8. Console c = new Console();
9. String pw;
10. System.out.print("password: ");
11. pw = c.readLine();
12. System.out.println("got " + pw);
13. }
14. }

If the user types the password aiko when prompted, what is the result?

A. password:
got
B. password:

got aiko
C. password: aiko
got aiko
D. An exception is thrown at runtime.
E. Compilation fails due to an error on line 8.

Answer: ?

.
.
.
.

Answer E

Console no se puede instanciar porque su constructor es privado, para instanciarlo se utiliza:
Console c = System.Console();

QUESTION NO: 2

Given that c is a reference to a valid java.io.Console object, which two code fragments read a line of text from the console? (Choose two.)

A. String s = c.readLine();
B. char[] c = c.readLine();
C. String s = c.readConsole();
D. char[] c = c.readConsole();
E. String s = c.readLine("%s", "name ");
F. char[] c = c.readLine("%s", "name ");

Answer: ?

.
.
.

Answer: A, E

QUESTION NO: 3

Given that c is a reference to a valid java.io.Console object, and:
11. String pw = c.readPassword("%s", "pw: ");
12. System.out.println("got " + pw);
13. String name = c.readLine("%s", "name: ");
14. System.out.println(" got ", name);
If the user types fido when prompted for a password, and then responds bob when prompted for a name, what is the result?

A. pw: got fido name: bob got bob
B. pw: fido got fido name: bob got bob
C. pw: got fido name: bob got bob
D. pw: fido got fido name: bob got bob
E. Compilation fails.
F. An exception is thrown at runtime.

Answer: ?
.
.
.
.
.

Answer: E
Error en linea 11 porque readPassword regresa un arreglo de caracteres


-- Parentesis -----------------------------------------------------------------------------------------------
boolean assert = true; //En la versión 6, 5 y 4 de java es palabra reservada pero en las versiones anteriores es una palabra normal.
------------------------------------------------------------------------------------------------------------

Clase Scanner

public class EjCS {
 
    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
//         int i = sc.nextInt(); //Solo recibe enteros, si es otra cosa marca error
//         System.out.println("Leí: "+i);
         String s="";
     
         while(sc.hasNext()){
           
             if(sc.nextLine().equals("x") ){
             break;
            }
           
             s += sc.nextLine();
             System.out.println("Leí: "+s);
         }
       
    }

}

Entrada y Salida de archivos
Para esto podemos leer y escribir de un archivo y una forma de hacerlo es así:

------------------------------------------------------------------------------------------------------------
public class CFD {
    public static void main(String[] args) {
        //crear objeto File para directorio
        try {
            File md = new File("MiArchivo");
            File f = new File(md, "file_1.txt");
            md.mkdir();
            try {
                f.createNewFile();
             
                //Leer desde el teclado y escribir en el archivo creado.
                InputStreamReader isr = new InputStreamReader(System.in);
                //crear buffer de lectura
                BufferedReader br = new BufferedReader(isr);
             
                //Escribir en el archivo
                PrintWriter pw = new PrintWriter( new FileWriter(f, true) ); //El true es para que agregue
                System.out.println("Ingresa texto!");
             
                String s="";
                //Leer lineas
                while ( (s=br.readLine()) != null && !s.equals("x")) {
                    pw.println(s);
                }
                br.close();
                pw.close();
             
                //Fase 2
                //Leer el texto del archivo creado y mostrarlo por consola
                BufferedReader br2 = new BufferedReader(new FileReader(f));
                String s2 ="";
                while ( (s2=br2.readLine()) != null ) {
                    System.out.println("Lectura--  "+s2);
                }
                br2.close();
             
            } catch (IOException ioe) {
                System.err.println("No se puede crear un archivo");
            }

        } catch (Exception e) {
        }
    }
}

-----------------------------------------------------------------------------------------------------------








MODULO 10:  I/O Fundamentales

Construir un programa con argumentos y linea de comandos
Para pasarle valores a los argumentos desde consola

public class UnoDC {

public static void main(String[] args) {
       /* for (String stg : args) {
            System.out.println("arg["+stg +"]= " + stg);
        }*/
        for (int i = 0; i < args.length; i++) {
            System.out.println("arg["+i +"]= " + args[i]);
        }
       
    }

}

C:\Users\Samuel\Desktop\Mod10C>javac UnoDC.java
C:\Users\Samuel\Desktop\Mod10C>javac UnoDC.java

Si se debe almacenar en otro lado de pone -d (con minúscula) y luego y se puede especificar que se ponga en otro con ../otra : esto sirve para decir que se encuentra atrás.



Examinar las propiedades de clase

Poner atención en estos métodos, revisar los metodos que regresan estos métodos (getProperties)

static Map<String,String>getenv()
          Returns an unmodifiable string map view of the current system environment.
static Stringgetenv(String name)
          Gets the value of the specified environment variable.
static PropertiesgetProperties()
          Determines the current system properties.
static StringgetProperty(String key)
          Gets the system property indicated by the specified key.
static StringgetProperty(String key, String def)
          Gets the system property indicated by the specified key.


Dos tipos de propiedades
   Del sistema
   Del entorno


Agregar una propiedad al sistema desde comandos
javac A-java
java -Dminombre=SamuelC A

desde Netbeans se hace desde Propiedades/Run/ VM-Option
y luego:
 -DnombreAlumno=S.C.S

Es la opción -D para agregar una propiedad.

Construir nodos y flujos de procesamiento, y propiedades
java.io.InputStream
java.io.Reader


Serializable y deserializable de objetos
Serialización de Objetos


Para serializar ademas de utilizar
 try {
         FileOutputStream fos = new FileOutputStream("NoVemosSUSCaricaturas");
         ObjectOutputStream oos = new ObjectOutputStream(fos); //hace la serializacion por medio de writeObject
         oos.writeObject(ae); //serializa el objeto aerolinea
       
         oos.close();
       
     } catch (Exception e) {
         System.out.println("Error");
     }

debemos de implementar la interfaz Serializable en cada una de las clases usadas A MENOS que sean hijas, si son hijas NO ES NECESARIO, puesto que si en la clase padre se implementa con eso basta.

Si NO QUIERES QUE un objeto sea serializable puedes quitar la implementación de esa clase y marcarlo como no serializable a traves de la palabra reservada: transient

Deserialización
 //Deserealizar Aerolinea
     ae = null;
     System.out.println("Antes de deserializar: "+ae);
   
     try {
         FileInputStream fis = new FileInputStream("NoVemosSUSCaricaturas.txt");
         ObjectInputStream ois = new ObjectInputStream(fis);
         ae = (Aerolinea) ois.readObject();
         
         System.out.println("Deserealizado: "+ae);
       
     } catch (Exception e) {
         System.out.println("Error al deserealizar");
     }
   






lunes, 30 de junio de 2014

MODULO 9: Colecciones
Una colección es la representación de un objeto que administra o maneja un conjunto de objetos conocidos como elementos.

Las colecciones representan estructuras de datos con cierta implementación (Arboles, Pilas, Listas, Colas).

Los arreglos son estáticos.

asList

public static <T> List<T> asList(T... a)
Returns a fixed-size list backed by the specified array. (Changes to the returned list "write through" to the array.) This method acts as bridge between array-based and collection-based APIs, in combination withCollection.toArray(). The returned list is serializable and implements RandomAccess.This method also provides a convenient way to create a fixed-size list initialized to contain several elements:
     List<String> stooges = Arrays.asList("Larry", "Moe", "Curly");
Parameters:
a - the array by which the list will be backed
Returns:
a list view of the specified array
Cuando se convierte un arrays (que son estático) a una lista, ya no se pueden agregar más puesto que son estáticos
public class TestArrays {
 
    public static void main(String[] args) {
        String [] sa = {"Rojo", "Naranja", "Verde", "Blanco", "Azul"};
     
        List sl = Arrays.asList(sa);
        sa[0]="Amarillo";
        sl.add("Rosa");   // Error porque los array son estáticos aun cuando las listas no lo son.
        for (String s : sa) {
            System.out.println(" "+s);
        }
        System.out.println("sa= "+sa);
        System.out.println("sl = "+sl);
     
    }
 
}


Arrays.sort(sa);
        int a = Arrays.binarySearch(sa, "Aaa");

La búsqueda binaria regresa la posición en donde se encuentra siempre y cuando se encuentre (Se recomienda que este ordenado para un mejor funcionamiento) en caso de que no lo encuentre nos trae el valor de la posición donde debería estar -1.

Colecciones
al.set(0, "Robben");
al.add(0, "Marquez");

set: Set reemplaza lo que hay en esa determinada posición.
add: inserta en la posición específica y recorre lo que hay ahí.

List al = new ArrayList();
       
        al.add(0, "Marquez");
        al.set(0, "Robben");
        al.add(0, "Marquez");
        
        System.out.println(""+al);

--- Output ---
[Marquez, Robben]


Si ponemos primero set en el primer add marcaría error porque el set reemplaza y si esta vacío, no hay nada que reemplzar.

Listas doblemente Ligada
peeak - regresa el primier elemento pero no lo elimina.
poll: - regresa el primer elemento y lo elimina.

Ejemplo de uso
public class TestLLL {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();
        ll.add("Manzana");
        ll.add("Mango");
        ll.add("Uva");
        ll.add("Fresa");
        ll.add("Pera");
        ll.add("Uva");
        System.out.println(""+ll);
        ll.peek();
        ll.poll();
        
        System.out.println("" + ll.poll());
        System.out.println(""+ll);
    }  
}

-- Output --
[Manzana, Mango, Uva, Fresa, Pera, Uva]
Mango
[Uva, Fresa, Pera, Uva]

Clase set
public class TestHS {
    public static void main(String[] args) {
        Set hs = new HashSet();
        
        hs.add(15);
        hs.add(2);
        hs.add(3);
        hs.add(3); //No permite repetidos pero si compila, pero al mostrarlo no lo muestra
        hs.add(78);
        hs.add(1);
        
        System.out.println(""+hs); //No los ordena 
        
    }
}

Este método utiliza el método equals.

TreeSet
Son ordenados, no duplicados.


Colas con prioridad
Es como un árbol que va buscando el balance, en caso de que el hijo sea menor que el padre, el padre le deja el lugar al hijo y el padre toma el lugar que el hijo.

Empieza de izquierda a derecha.
si tenemos 5, 8 ,23, 2, 8
El árbol sería de la siguiente forma

                   2
                   ^
             5       23
             ^
          8     8


Ejemplo
package EjCPQ;

import java.util.PriorityQueue;

public class EjPQ {
    public static void main(String[] args) {
        PriorityQueue pq = new PriorityQueue();
        pq.add(5);
        pq.add(8);
        pq.add(23);
        pq.add(2);
        pq.add(8);
        pq.add(8);
        pq.poll(); //Elimina el elemento padre, en este caso luego de la eliminación se recorren los elementos
        pq.peek(); //Sól muestra el valor del padre principal.
        pq.poll();
       
        System.out.println(""+pq);
    }
}

-- output --
[8, 8, 8, 23]

Interfaz MAP
Similares a las colecciones (es una colección pero no extiende de colecctions) pero permiten tener clave, valor, la clave es única. Sirven como diccionarios.
LOS MAPAS NO EXTIENDEN DE COLECCIONES POR LO TANTO NO TIENEN EL MÉTODO ADD

NO ORDENA, sin embargo casi salen ordenados porque los acomoda de tal forma que los va comparando para no aceptar claves repetidas.

Pero tiene otros métodos:
  - put(k,v):  Sirve como el add en las colecciones, se ingresa la clave + valor, las llaves no son repetidas            pero los valores pueden ser repetidos.
  - 

Ejemplos de la interfaz map<k,q>

package EjIM;

import java.util.HashMap;
import java.util.Set;
import java.util.TreeSet;

public class TestM {
    public static void main(String[] args) {
        HashMap ma = new HashMap();
        ma.put("uno", 12);
        ma.put("cinco", 54);
        ma.put("tres", 23);
        ma.put("uno", 84); //esta clave esta duplicada, pero este valor (84) actualiza al 12 que ya estaba
                                    // porque no acepta claves duplicados, solo actualiza
        ma.put(null, 12);   //en algunas implementaciones acepta llaves NULAS        


        Set s =  ma.keySet(); //el método keySet() regresa el conjunto de llaves dentro del mapa
                                         // y como regresa un set pues por eso el s de tipo Set.
Collection tv =  ma.values(); //obtenemos los valores
        
        System.out.println(""+ma); 
        System.out.println(""+s);
        System.out.println(""+tv);

//#        

    }
}
-- output --
ma_ {null=12, tres=23, cinco=54, uno=84}
s_ [null, tres, cinco, uno]
tv_ [12, 23, 54, 84]

TreeMap
La diferencia con treeSet es la forma en como compara y ordena los numeros, los treeSet NO ordena los numeros y permite arboles balanceados, en el caso de los treeMap si ordena las claves. 

Ejemplo:

Si en //# agregamos los siguientes

TreeMap tm = new TreeMap();
        //Los treeMap es parecido al treeSet
        tm.put(1, "ferrari");
       // tm.put(null, "bocho"); //Error. Los arboles no permiten claves nulas
        tm.put(45, "nissan");
        tm.put(2, "ford");
        tm.put(6, "mercedez");
        tm.put(14, "combi");
        
        System.out.println("tm_ "+tm);

-- output --
ma_ {null=12, tres=23, cinco=54, uno=84}
s_ [null, tres, cinco, uno]
tv_ [12, 23, 54, 84]
tm_ {1=ferrari, 2=ford, 6=combi, 45=nissan}  //Se puede ver que estar ordenados por clave

Comparable vs Comparator




Genericos
habilidad de crear una clase donde el usuario final puede decidir de que tipo de dato quiere trabajar.

Así se define una clase generica, donde el usuario decide que tipo de dato.
package Genericos;
public class MiGenerica<T> {
    
}

También se puede hacer lo siguiente
public class MiGenerica<T,E> {} //Se definen dos tipos de datos.

... continuando con el ejemplo

package Genericos;


public class MiGenerica<T> {
    private T variable;
    public T m(T j){
        return j;
    }
}

package Genericos;

import java.util.ArrayList;
import java.util.List;


public class TestGen {
    public static void main(String[] args) {
        MiGenerica<String> mg = new MiGenerica<String>();
        
        List<Integer> l = new ArrayList<Integer>();
        l.add(34);
        
    }
   
}

En Genéricos vienen los conceptos 
      Invarianza
      Covarianza
      Contravarianza 


Estudiar Para los Simuladores
método hasCode
interfaces y clases con metodos largos (asfnsk{ sd fs};)
para que sirve el write de archivos
DateFormat (dayFormat existe ?, getDay ?)
No puede iniciar dos hilos vivos t.star(); t.start(); //error en tiempo de ejecución
si se pone un ; solo es correcto









viernes, 27 de junio de 2014

MODULO 8: Excepciones
Porque todos comentemos errores, existen las excepciones :-)

Definir Excepciones, Usar try, catch, and finally
                                                        --------
                                                       | Object |
                                                       ---------
                                                             ^
                                                 ->         |                 <¬
                                           Error                           Exception



Los errores se pueden personalizar por las diferentes que ofrece java pero siempre van de lo especifico a lo general

public class TestA {
    static Integer i;
    public static void main(String[] args) {
        A a = new A();
        try{
        a.cociente(100, i);
        }catch(ArithmeticException ae){ //mas especifico
            System.err.println("No puedes dividir por cero");
        }catch(NullPointerException npe){
            System.out.println("Variable null");
        }catch(Exception e){ //más general
         
        }
    }
}

Los errores no son tratados en el try{}catch(Exception e){}

public class TestA {
    static Integer i=5;
    public static void main(String[] args) {
        A a = new A();
        try{
        throw new ClassFormatError(); //Esto no es atrapado por ninguno porque no es exception es un                                                                   // ERROR.
     
        }catch(ArithmeticException ae){
            System.err.println("No puedes dividir por cero");
        }catch(NullPointerException npe){
            System.out.println("Variable null");
        }catch(Exception e){
            System.out.println("Error no identificado ");
        }
    }
}

Por lo tanto lanza un error.
Las exception NO son atrapados pero si se pone Error como lo siguiente
public class TestA {
    static Integer i=5;
    public static void main(String[] args) {
        A a = new A();
        try{
        a.cociente(100, i);
        throw new ClassFormatError();
     
        }catch(ArithmeticException ae){
            System.err.println("No puedes dividir por cero");
        }catch(NullPointerException npe){
            System.out.println("Variable null");
        }catch(Error e){ //                                               Error
            System.out.println("Error no identificado ");
        }
    }
}


Cuando nadie se hace responsable de una Eception al final la maquina virtual de java (JVM)  se hace responsable y lo único que hace es matar todo.

finally
El finally siempre se ejecuta y va con:
try{
}finally{

}

o bien
try{ }catch(Exception e){}finally{}




Describir categorias de excepciones
 - Excepciones lanzadas por la máquina virtual
 - Excepciones de programación

Para la certificación es importante aprenderse una tabla de 12 excepciones y quien las lanza si la máquina virtual o el programador


Otra forma de lanzar Excepciones
es a travez del throws es decir sólo lanza pero no se hace responsable.


package EjCTC;

public class A {
 public void cociente(int a, int b)throws ArithmeticException{
     System.out.println(" "+a+"/"+b+" = "+a/b );
 }  


}
Con lo anterior aun truena en donde se llamo, solo se le dice que es un código peligroso

Ahora bien si hacemos lo siguiente:
import java.io.IOException;

public class A {
 public void cociente(int a, int b)throws IOException {               //Linea 3
     throw new IOException();                                                   // Linea 5
     //System.out.println(" "+a+"/"+b+" = "+a/b );
 }  


}

Si la linea 3 no se pone pero si la linea 5 marca error porque tu estas enviando algo identificado por lo tanto o TE RESPONSABILIZAS (try catch) o la LANZAS (throws)

Con lo anterior no quiere decir que ya no truene ya que debemos tener cuidado en donde lo llamamos que es ahí donde dará problemas puesto que ahí llega la excepcion identificada y lanzada. Ahí es donde podemos atraparla con un try y un catch.

Si en el padre estas lanzando una Excepcion en el método hijo tienes que sobrescribirla 

Si queremos crear nuestras exception, sólo hay que extender (Extends Exception) de la clase Exception, pero tu tienes que definir los mensajes.

Aserciones
Sirven para depurar código, se pueden habilitar o deshabilitar. Verificamos cierto valor. Nos sirve como desarrolladores, una vez terminada la aplicación la puedes quitar.
Es una especie de un if.

Es una expresión boleana, en caso de que se verdadera la condición se va a ejecutar normalmente, pero si el resultado es false, entonces produce un ERROR. Entonces vas al código y lo corriges.


Usos inapropiados (si funcionan, pero no debería usarse para eso) -> Pregunta de examen
Métodos públicos

Las aserciones por default esta deshabilitadas para no consumir recursos, esa es la diferencia entre una aserción y un if. Las aserciones aunque esten estan deshabilitadas.

¿Cómo se hablitan?
Se configura en las propiedades del proyecto y en la forma VM Option: -ea

Por consola:
javac nomArchivo.java
java -ea nomArchivo

Las assert te mandan el error pero no corrigen el problema, es solo que te avisa.

USO:
public class A {
 public void cociente(int a, int b) {
   
     assert(a>0):"a no es mayor a 0";  
   
     System.out.println(" "+a+"/"+b+" = "+a/b );
 }  
   


}