Apuntes-JavierEspigares-26_Febrero

Inicio de los apuntes
La ventaja de los sitemas distribuidos es que hacer un computador por ejemplo con ocho cores es caro en el hardware mientras que el precio de tener ocho computadores cada uno con un procesador tiene un gasto de hardware mucho menor ya que son componentes más usuales. Esto es lo que explica en un principio el temario. Otra ventaja es que se consiguen prestaciones superiores ese tipo de configuraciones cluster (de hecho los grandes supercomputadores hoy en día son sistemas de este tipo como por ejemplo el Mare Nostrum de Barcelona), (otro ejemplo es el Rendering en equipos gráficos, por la mañana se diseña y por la noche cuando no se trabaja se hace el cálculo del rendering con los ordenadores de la oficina). Una ventaja adicional es que son sistemas redundantes o independientes, si uno de los computadores muere no es fatal para el sistema completo sino que el resto puede seguir trabajando (**Ejemplo:** Sitios con mucho tráfico como [|El País] o [|Google] tienen una serie de servidores que distribuyen el tráfico para hacerlo más llevadero)

Primer bloque de evaluación

 * Sistemas P2P conocidos:** (Aparte de eMule y cia) [|Joost] para Mac era para distribución de videos y televisión que usa P2P. Napster, no era P2P puro. Los sistemas de mensajería instantánea son también P2P, por ejemplo el Jabber al hablar entre personas la comunicación es directa entre ellos.
 * Clusters conocidos:** Suse es usado en estos sistemas, openMOSIX es un sistema con un kernel alterado especialmente para estos temas.
 * Sistemas grid:** Son sistemas middleware, el único conocido por el profesor es gridsystems.

Caracterísiticas de computación distribuida
No hableremos sobre computación paralela sino que nos centraremos en computación distribuida masiva. Existe una serie de ideas sobre la computación distribuida que son mentira (Viene de un artículo de SUN). En los apuntes se enumeran todas ellas:
 * La red es fiable.
 * La latencia no existe: Claro que existe y ni siquiera es homogénea sino que varía, conclusión no se puede hacer nada síncrono. (Curioso que un modem clásico tenga menos latencia que una línea ADSL
 * El ancho de banda es infinito: Eso es imposible, siempre habrá una saturación cuando se aumenta el número de nodos.
 * La red es segura: No es segura ni a nivel de red, ni a nivel de cliente. La red siempre miente.
 * La topología no cambia: Eso es lo interesante de los sistemas distribuídos que no se encuentra esencialmente en sistemas paralelos. Si esto fuese cierto podría haber problemas a la hora de encontrar caminos alternativos pudiendo llegar a paráisis. Un ejemplo es DNS que son sistemas masívamente paralelos, muchos ataques a DNS ni siquiera se notan por la robustez que les proporciona el hecho de que la red cambie.
 * Hay un solo administrador:
 * El coste de transporte es nulo: Enviar algo siempre tiene alguna repercusión, hay que tener en cuenta prámetros a la hora de enviar algo. Ya hemos visto que no podemos suponer red homogénea.
 * La red es homogénnea: El hecho de que sea heterogéneas implica que haya distintos costes de un lugar a otro, hay heterogeneidad en varios niveles. Son cosas que hay que tener en cuenta.

Teniendo todo esto en cuenta se debe tener los siguientes puntos en cuenta (Copiado directamente de los apuntes oficiales):

Teniendo en cuenta lo anterior y la definición de sistemas distribuidos, lo que se intenta conseguir con los mismos es:
 * //Transparencia//: el acceso a un recurso debe ser independiente de su situación física; el sistema debe proveer una capa que identifique uniformemente recursos locales y remotos.
 * //Apertura//: los sistemas distribuidos deben de estar definidos por protocolos que permitan añadir fácilmente nuevos sistemas. (Se tiende a usar en todos los sitemas una parte de protocolos libres)
 * //Escalabilidad//: Deben de permitir añadir un número indeterminado de nodos a la conexión, y las prestaciones que se obtengan deben de escalar de un modo razonable con el número de nodos, siendo ideal el escalado lineal.
 * //Tolerancia a fallos//: la desaparición de uno o varios nodos no debe acabar con la estructura de la red, y la degradación de prestaciones debe ser razonable.
 * //Seguridad//: la regulación de la pertenencia a la red debe ser tal que las demás características sean posibles, y que se dificulte la apropiación de recursos por parte de un usuario (autorizado o no). (En el sentido de que no haya intrusiones y que haya una cierta calidad de servicio para los usuarios).

RPC
Nos dedicaremos a este tipo de utilidades en un tema. Usar este tipo de utilidades se denomina serialización (a veces también marshalling, o inflado y desinflado). Su inconveniente es que suelen tener un API basado en un estándar, como siempre pasa con los estándares siempre hay cientos de estándares diferentes. Algunos de los más usados en este compo son CORBA (que en principio era independiente del lenguaje, para ello tenía un lenguaje intermedio que usaban brokers para llevar, crear y tratar objetos. Estos objetos se pueden llevar a otros lenguajes superiores. Existe un problema de incompatibilidad de estos objetos entre distintos lenguajes.)

¿Cómo funciona bittorrent
El descrubrimiento del recurso está centralizado, una vez descubierto el recurso si hay una comunicación pura entre pares.

Idea
Los sistemas P2P pueden tener clasificaciones distintivas aunque todos se meten dentro del mismo saco. Realmente los sistemas P2P puros son más extraños suele existir siempre una parte centralizada en el proceso.

Perl
code format="perl"
 * 1) !/usr/bin/perl

use LWP::Simple; # LibrerÃ­a web, el :: es equivalente al. en JAVA use URI::Escape; # CodificaciÃ³n en URI
 * 1) Busca pueblos de Granada y devuelve la long/lat
 * 2) Esto son como los includes en Java

my $pueblo = uri_escape( shift ); 	# shift coge el primer el elemento de la lista de comandos, lo pasa como # y lo convierte en variable

my $resultado = get("http://ws.geonames.org/search?q=$pueblo&country=Spain"); # Hace un get y coge el resultado

my ($lat, $lng) = ( $resultado =~ m{ ([\d\-\.]+) \s+ ([\d\-\.]+) }gs );
 * 1) Expresión regular coge los resultados, lo copia y los guarda

print "La latitud y longitud de $pueblo es $lat:$lng\n"; code

Ruby
code format="ruby"
 * 1) !/usr/bin/ruby

require 'net/http' require 'uri'

pueblo = ARGV[0] respuesta = Net::HTTP.get( URI.parse( URI.escape('http://ws.geonames.org/search?q='+pueblo+'&country=ES') ) ) respuesta =~ / ([^<]+)<\/lat>\s+ ([^<]+)<\/lng>/ print "Las coordenadas de #{pueblo} son latitud=#$1 y longitud=#$2" code

Comienzo del siguiente tema: Javascript
Hemos empezado a dar las bases de Javascript. Como comentario acabo de instalar en el MacOs un intérprete Javascript para el terminal de la siguiente manera:

Ejecutando: code cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot login

code se introduce //anonymous// como password y luego: code cvs -d :pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot co -l mozilla/js/src mozilla/js/src/config mozilla/js/src/editline mozilla/js/src/fdlibm

code Se bajará el programa nos metemos en el directorio mozilla/js/src y hacemos: code make -f Makefile.ref

code Hecho esto deberemos ir al directorio de salida (depende del sistema) y desde alli copiar el ejecutable js a /usr/bin como superusuario.