text:
layout: post
section-type: post
title: Internet
category:
tags: []
---

### Presentación electronica

[Pantalla completa](https://marcoc76.github.io/musical-pancake/internet.html "Presentación en pantalla completa")

Antecedentes
------------

El desarrollo de Internet, como casi todos los avances de la ciencia y
la tecnología, no se debe a una persona o a un grupo pequeño de
personas, sino que ha sido fruto de las ideas y del trabajo de miles de
personas. Sin embargo, en un repaso de la historia de Internet de unas
pocas páginas sólo se pueden nombrar a las personas más importantes.

Como reconocimiento al cambio que Internet ha producido en todos los
niveles de la sociedad, el 23 de mayo de 20021, Lawrence Roberts, Robert
Kahn, Vinton Cerf y Tim Berners-Lee fueron distinguidos con el Premio
Príncipe de Asturias de Investigación Científica y Técnica en
representación de las miles de personas y muchas instituciones que han
hecho posible este avance de nuestro tiempo. Según la resolución del
jurado, Se les otorga el premio por haber diseñado y realizado un
sistema que está cambiando el mundo al ofrecer posibilidades antes
impensables para el progreso científico y social.

A Lawrence (Larry) Roberts se le suele llamar el padre de Internet,
porque fue el director del equipo de ingenieros que crearon ARPANET, el
precursor de la actual Internet. A parte de ser el director, también fue
el diseñador principal de ARPANET.

En 1972, Robert Kahn fue contratado por Lawrence Roberts para trabajar
en ARPA. Trabajó en el desarrollo de un modelo de arquitectura de red
abierta, donde cualquier ordenador pudiera comunicarse con cualquier
otro, independientemente del hardware o el software particular de cada
uno de ellos. Este trabajo le llevó a desarrollar, junto con Vinton
Cerf, el protocolo Transmission Control Protocol/Internet Protocol
(TCP/IP). Vinton Cerf estuvo implicado desde los primeros años en el
desarrollo de ARPANET.

En 1973, se unió al proyecto de Robert Kahn de interconexión de redes.
Su mayor contribución ha sido el desarrollo, junto a Robert Kahn, de
TCP/IP, el protocolo que gobierna las comunicaciones en Internet y que
permite conectar distintas redes independientes entre sí.

Finalmente, Tim Berners-Lee es conocido como el padre de la Web. Él fue
quien creó HTML, el lenguaje empleado para crear los documentos de la
Web; HyperText Transfer Protocol (HTTP), el protocolo que emplean los
ordenadores para comunicarse en la Web, y Universal Resource Locator
(URL), como medio de localización de los distintos recursos que forman
la Web en Internet. Además, también desarrolló el primer servidor web y
el primer navegador/editor web.

Funcionamiento
--------------

La World Wide Web, WWW o Web se ha convertido en el principal servicio
de [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837785000)

La WWW, La [World Wide Web, WWW o
Web](https://www.google.com/url?q=http://www.hipertexto.info/documentos/web.htm&sa=D&ust=1535647837785000) se
ha convertido en el principal servicio
de [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837786000)

La WWW utiliza la estructura de comunicación existente
en [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837786000) y
comparte protocolos de comunicaciones comunes, estándares y otras
notaciones
de [protocolos](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23protocolos&sa=D&ust=1535647837786000) de
comunicación que permiten el acceso universal a los servicios de
información presentes en la Web a través del llamado modelo de
cliente-servidor, esto es, mediante la conexión remota entre una red
de [ordenadores](https://www.google.com/url?q=http://www.hipertexto.info/documentos/ordenador.htm&sa=D&ust=1535647837787000) o
máquinas llamadas servidores, y los ordenadores clientes.

En la red, la Web utiliza el [protocolo HTTP o HyperText Transfer
Protocol](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23HTTP&sa=D&ust=1535647837787000),
el [Protocolo](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23protocolos&sa=D&ust=1535647837787000) de Transferencia
de Hipertexto que permite el intercambio de información hipertextual de
las [páginas
web](https://www.google.com/url?q=http://www.hipertexto.info/documentos/diseg_web.htm&sa=D&ust=1535647837788000) y
que ha sido utilizado por los servidores World Wide Web desde su inicio
en 1990.
Estos [protocolos](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23protocolos&sa=D&ust=1535647837788000) de
comunicaciones estandarizados y, en concreto, el protocolo HTTP,
realizan las conexiones (el direccionamiento, la negociación entre
recursos y el control de transferencias). Por su parte, las páginas web
utilizan el lenguaje [HTML o Hypertext MarkUp
Language](https://www.google.com/url?q=http://www.hipertexto.info/documentos/html.htm&sa=D&ust=1535647837789000), el [lenguaje
de
marcas](https://www.google.com/url?q=http://www.hipertexto.info/documentos/lenguajes_h.htm&sa=D&ust=1535647837789000) de
hipertexto que hace posible la WWW

La WWW intercambia la información
vía [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837789000) y
reparte entre los ordenadores clientes y servidores las operaciones de
conexión. Por su parte, el navegador web o browser realiza la
presentación de las páginas web en la máquina u ordenador cliente, una
vez que éste ha consultado la información contenida en los servidores.

Una de las características principales de la Web es la independencia en
la visualización y presentación de la información, lo que permite que
los sistemas de hipertexto sean construidos independientemente del
desarrollo de nuevos avances en la representación de los datos. Para la
visualización sólo se precisa de un navegador web.

Todas estas características técnicas trabajan de manera ensamblada en la
World Wide Web.

Así pues, debemos tratar cuatro aspectos fundamentales en la tecnología
de la Web:

> Dominios y direcciones IP

> El modelo de la WWW basado en el [modelo
    cliente-servidor](https://www.google.com/url?q=http://www.hipertexto.info/documentos/web_tecnolog.htm%23servidores&sa=D&ust=1535647837791000)

> Los [protocolos
    web](https://www.google.com/url?q=http://www.hipertexto.info/documentos/web_tecnolog.htm%23protocolos&sa=D&ust=1535647837791000)

> Los [navegadores](https://www.google.com/url?q=http://www.hipertexto.info/documentos/web_tecnolog.htm%23navegador&sa=D&ust=1535647837792000) web

### Direcciones IP y dominios

#### Definición

Es una forma de identificación que está asociada a un grupo de
computadoras conectadas a Internet. El propósito de los nombres de
dominio de Internet y del sistema de nombres de dominio (DNS)
es traducir una dirección IP (Es una etiqueta numérica que identifica,
de manera lógica y jerárquica, a una interfaz de un dispositivo
habitualmente una computadora dentro de una red que utilice el protocolo
IP (Internet Protocol), que corresponde al nivel de red del protocolo
TCP/IP.) de cada computadora conectada a ellos a términos fáciles de
encontrar.

Este tipo de abstracción posibilita que cualquier servicio de red pueda
moverse de un lugar a otro en la red. Un dominio o nombre de dominio es
el nombre con que es identificado un sitio Web. Cada dominio tiene que
ser único en Internet. No está permitida la duplicidad, por ejemplo el
dominio http://www.hola.com , es diferente al dominio
http://www.hola.org. Un servidor único de la Web puede alojar y servir a
muchas páginas Web de diferentes dominios, pero un dominio puede apuntar
solo a un servidor.

Si no hubiese sido ideado el sistema de nombres de dominio, los usuarios
de Internet tendrían que acceder a la página Web tecleando la dirección
IP de la página Web. Cuando inicio el servicio de Internet, se tenía que
hacer de esta forma, puesto que no eran muchas páginas que estaban
activas en la Web. Un ejemplo de ello es en vez de utilizar
http://213.67.91.175 en lugar de http://www.prueba.com.Los dominios
están compuestos de tres partes. Las tres W que significan World Wide
Web, el nombre del dominio (HOLA) y el tipo de organización (.COM).

Existen diversos tipos de organizaciones, los más comunes son .com
(comercial), .net (Network), .edu (educación), .org (organización).
Internet se basa en direcciones IP y no de dominio, cada servidor Web
necesita de un servidor de nombres de dominio (DNS) para poder traducir
de los nombres de los dominios a direcciones IP. Un dominio tiene un
servidor de nombre de dominio primario y uno secundario.

#### Cómo Funcionan

Para que una red de ordenadores funcione correctamente tiene que
cumplirse una premisa esencial: cada ordenador conectado a la red tiene
que estar identificado de forma inequívoca con respecto al resto de
ordenadores para que no exista ninguna duda sobre el origen y el destino
de una transmisión de datos. Internet, como red de redes de ordenadores
que es, debe cumplir este mismo principio. Ten en cuenta que, aunque
hayamos formulado la premisa para las redes de ordenadores sería
aplicable para cualquier red por la que se mueva la información: ¿sería
posible comunicarnos telefónicamente si los números de teléfono
estuvieran repetidos?

Los ordenadores conectados a Internet se identifican mediante lo que se
denomina Dirección IP, única y exclusiva, lo que genera la necesidad de
que una autoridad se encargue de distribuir y mantener esta información
de forma que no se produzcan duplicados. Esta autoridad es, a escala
mundial, el InterNIC, encargándose diferentes gestores regionales de
asignar las direcciones IP en los diferentes dominios nacionales

Todos sabemos que los ordenadores manejan la información utilizando un
código binario cuya unidad mínima es lo que denominamos bit. Un bit es
capaz de indicarnos únicamente dos posibilidades, por lo que su valor
puede ser 0 o 1.

Si unimos dos bits igual que unimos las letras para formar palabras
conseguiremos transmitir cuatro posibilidades que serían las que
corresponden a combinar los dos posibles valores de cada uno de los
bits. Estas posibilidades serían 00, 01, 10 y 11

Con tres bits conseguiríamos ocho posibilidades 000, 001, 010, 011, 100,
101, 110 y 111. Como ves lo que estamos haciendo realmente es contar
utilizando un sistema numérico en base 2.

Con el objeto de conseguir un sistema de nombres más fácil de recordar y
que, además, nos brinde pistas sobre la localización o las funciones que
cumple una máquina se ha establecido un sistema de denominación al que
se denomina nombres de dominio. Los nombres de dominio se construyen de
acuerdo a una estructura jerárquica y están formados por palabras
separadas por puntos. El nombre de dominio del servidor web citado
anteriormente es el siguiente: www.educacion.gob.es

A veces el nombre de dominio no es tan simple y se compone de más
palabras separadas por puntos, como por ejemplo www.ite.educacion.es. En
nuestro caso "ite" sería un subdominio que a su vez está comprendido en
otro subdominio de alcance mayor "educación", y así hasta la última
palabra que corresponde al dominio principal o de primer nivel. En el
ejemplo, es corresponde al dominio principal.

Hay muchos nombres de dominio más largos, pero siempre siguen la misma
estructura. La primera palabra del nombre de dominio corresponde siempre
al nombre del ordenador servidor o es un indicativo de su función, y el
resto sigue la ordenación comentada anteriormente.

#### Dominios regionales y genéricos

Los nombres de los subdominios son generalmente arbitrarios y dependen
de los administradores de las redes locales. Los dominios principales y
también algunos subdominios amplios, responden sin embargo a unas reglas
establecidas. Los dominios principales constan de dos letras que indican
el país al que pertenece el ordenador. A continuación se ofrecen algunos
ejemplos de dominios principales:

![](http://consultorseovalencia.com/wp-content/uploads/2016/12/dominios-regionales.png)

En cuanto navegues un poco por la red te llamará la atención que
prácticamente no existen páginas del dominio us. Esto se debe a que
Internet tuvo su origen histórico en las redes nacionales de Estados
Unidos lo cual motivó que los dominios de primer nivel hicieran
referencia al tipo de organización al que pertenece el ordenador,
utilizándose en contados casos el dominio del país. Los dominios
utilizados originalmente, procedentes de la red ARPANET, son los
siguientes:

![](http://blog.baehost.com/wp-content/uploads/2015/08/dominios-.com-.net-.org-y-TLD.png)

Algunos países utilizan estos dominios como subdominios con el mismo
significado. También hay ordenadores no situados en Estados Unidos cuyos
dominios principales no corresponden con el del país sino con estos
últimos, especialmente en el caso de los dominios com.

Para conectarse con un ordenador remoto y utilizar un determinado
servicio de Internet es necesario conocer la dirección IP del mismo,
aunque después de la ensalada de números del principio del epígrafe
parece claro que no será este el sistema preferido por los usuarios para
nombrar a los ordenadores a los que nos dirigimos. Dado que existen
también los nombres de dominio que pueden considerarse mucho más
significativos desde el punto de vista del lenguaje humano lo único que
será necesario es que haya un mecanismo para traducir de uno a otro, de
forma que la red pueda funcionar con las direcciones IP
independientemente de que sea ese el dato que hayamos introducido para
designar a un ordenador o bien hayamos utilizado su nombre de dominio.
Este servicio se presta mediante una base de datos denominada DNS
(Domain Name System o Sistema de Nombres de Dominio) que se encuentra
distribuida de forma jerárquica por toda la red y que es consultada para
realizar la traducción.

En esquema, el funcionamiento cuando tecleamos la dirección
www.ite.educacion.es en nuestro navegador es que la petición se dirige
al servidor de nombres de dominio de nivel principal "es" para
interrogarle si dispone de un subdominio denominado "educación". En caso
afirmativo se le pasa la petición al DNS de segundo nivel que será
interrogado para ver si dispone, a su vez, de un subdominio denominado
"ite". Nuevamente, en caso afirmativo, se pasa la pregunta al DNS de
tercer nivel para que conteste si existe dentro de su ámbito una máquina
capaz de servir páginas web "www". Como también en este caso la
respuesta es afirmativa hemos conseguido que los sucesivos DNS hayan
traducido el nombre de dominio para encontrar una máquina concreta que
al ser contactada mediante el protocolo de transferencia de hipertexto
(http) enviará al peticionario el contenido de la página web que tiene
configurada como predeterminada.

Cómo ves, el DNS de cada dominio no conoce más que los nombres de los
subdominios que dependen directamente de él, por lo que su
funcionamiento puede ser muy rápido, pasando la consulta al siguiente
DNS en la jerarquía hasta llegar al que conoce la dirección del
ordenador de destino.

Lógicamente, para devolver la información al usuario que hizo la
petición el ordenador de éste tiene que estar también identificado con
su dirección IP única. Aunque hay ordenadores constantemente conectados
que disponen de una IP fija, cuando accedemos a Internet mediante un
módem que se conecta a un proveedor de acceso, lo que sucede es que el
proveedor de acceso le proporciona a ese ordenador de forma provisional
(para esa sesión) una dirección IP de un rango que se reserva para ese
fin. Cuando ese ordenador se desconecta, la dirección IP que se le
adjudicó queda libre y puede volver a asignarse a otro usuario.

### El modelo cliente-servidor

El modelo cliente-servidor se basa en los siguientes elementos:

>  Cliente: en una red cliente/servidor, se trata de un nodo de la red
    que emplea los recursos que proporciona un servidor.

>  Servidor: nodo de red que proporciona servicios a PCs cliente; por
    ejemplo, acceso a archivos, formación de trabajos de impresión o
    ejecución remota.

>  Nodo: cada uno de los ordenadores individuales u otros dispositivos
    conectados a la red.

>  Paquete: grupo de bits de datos de información asociada, incluidos
    la dirección de origen y de destino, formateadas para transmitirse
    de un nodo a otro.

>  Ruteador: dispositivo que conecta dos redes y que opera como un
    puente, pero que también puede elegir rutas a través de una red.

La World Wide Web utiliza las comunicaciones establecidas
en [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837822000) entre
"clientes" y "servidores" para el acceso y el intercambio de información
y recursos.

1.  La máquina u ordenador cliente se conecta a la máquina u ordenador
    servidor WWW para realizar una consulta y el servidor le devuelve
    una respuesta.
2.  Si, por ejemplo, pinchamos sobre
    un [enlace](https://www.google.com/url?q=http://www.hipertexto.info/documentos/enlaces.htm&sa=D&ust=1535647837822000) en
    el navegador, el programa de acceso a la WWW utiliza la dirección
    correspondiente
    al [enlace](https://www.google.com/url?q=http://www.hipertexto.info/documentos/enlaces.htm&sa=D&ust=1535647837823000) y
    se conecta al [servidor de nombres de dominio
    (DNS)](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23DNS&sa=D&ust=1535647837823000) que
    le permite enrutar la respuesta hacia el servidor WWW
    correspondiente.
3.  El servidor recoge la demanda y devuelve los archivos
    de[texto](https://www.google.com/url?q=http://www.hipertexto.info/documentos/texto.htm&sa=D&ust=1535647837823000), [imágenes](https://www.google.com/url?q=http://www.hipertexto.info/documentos/imagen.htm&sa=D&ust=1535647837824000),
    etc. al cliente. El protocolo HTTP (HyperText Transfer Protocol) es
    el que hace posible esta relación.
4.  El cliente recoge el documento y éste se visualiza a través del
    navegador. Así, la carga de trabajo se reparte entre el ordenador
    cliente (el demandante de información) y el servidor (quien ofrece
    la información).

### Los protocolos Web

Tres protocolos, definidos por
la [NCSA](https://www.google.com/url?q=http://www.ncsa.uiuc.edu/&sa=D&ust=1535647837824000) y
el [CERN](https://www.google.com/url?q=http://www.cern.ch/&sa=D&ust=1535647837824000),
gobiernan el funcionamiento de la Web. Son los estándares que permiten
generalizar los mecanismos de intercambio y presentación de archivos y
documentos y que proveen los mecanismos de direccionamiento universal.
Podemos definir
un [protocolo](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23protocolos&sa=D&ust=1535647837825000) como
cualquier conjunto definido de procedimientos, convenciones o métodos
que permiten inter-operar a dos dispositivos.

Estos 3 protocolos son:

>  La [URL o Universal Resource
    Locator](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23URL&sa=D&ust=1535647837826000):
    se trata de una definición única o dirección permanente
    de [localización](https://www.google.com/url?q=http://www.hipertexto.info/documentos/localiz.htm&sa=D&ust=1535647837826000) de
    un documento\

>  [HTML o HyperText Markup
    Languaje](https://www.google.com/url?q=http://www.hipertexto.info/documentos/html.htm&sa=D&ust=1535647837826000):
    es
    un [lenguaje](https://www.google.com/url?q=http://www.hipertexto.info/documentos/lenguajes_h.htm&sa=D&ust=1535647837827000) o
    sintaxis específica para la WWW que describe la estructura de los
    documentos a través de marcas y etiquetas, y que posibilita
    los [enlaces](https://www.google.com/url?q=http://www.hipertexto.info/documentos/enlaces.htm&sa=D&ust=1535647837827000) a
    otras páginas o informaciones. Actualmente, la Web ofrece numerosas
    funcionalidades como son el acceso a [bases de
    datos](https://www.google.com/url?q=http://www.hipertexto.info/documentos/b_datos.htm&sa=D&ust=1535647837827000) o
    el acceso a objetos de datos [ADO (ActiveX Data
    Objects)](https://www.google.com/url?q=http://www.hipertexto.info/documentos/b_datos.htm%23ADO&sa=D&ust=1535647837828000) y
    opera también con otros [lenguajes de
    marcado](https://www.google.com/url?q=http://www.hipertexto.info/documentos/lenguajes_h.htm&sa=D&ust=1535647837828000) estandarizados
    como [XML](https://www.google.com/url?q=http://www.hipertexto.info/documentos/xml.htm&sa=D&ust=1535647837828000),
    que permite la utilización de  gráficos vectoriales, transacciones
    de e-comercio, ecuaciones matemáticas, objetos
    de [metadatos](https://www.google.com/url?q=http://www.hipertexto.info/documentos/metadatos.htm&sa=D&ust=1535647837829000),
    servidores [APIs (Application Programming
    interface)](https://www.google.com/url?q=http://www.hipertexto.info/documentos/b_datos.htm%23API&sa=D&ust=1535647837829000) y
    otras muchas clases de aplicaciones e información estructurada.\

>  [HTTP o HyperText Transfer
    Protocol](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23HTTP&sa=D&ust=1535647837830000):
    es un [protocolo](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet_tegn.htm%23protocolos&sa=D&ust=1535647837830000) que
    permite la transferencia de archivos y documentos en múltiples
    plataformas. Fue inventado para que los ordenadores se comunicaran
    mientras intercambiaban documentos, agregando conectividad e
    interfaces. Si un ordenador usa el protocolo HTTP y pide un archivo
    a otro ordenador, éste último sabrá, al recibirlo, si se trata
    de [imagen](https://www.google.com/url?q=http://www.hipertexto.info/documentos/imagen.htm&sa=D&ust=1535647837831000), [vídeo](https://www.google.com/url?q=http://www.hipertexto.info/documentos/video.htm&sa=D&ust=1535647837831000), [texto](https://www.google.com/url?q=http://www.hipertexto.info/documentos/texto.htm&sa=D&ust=1535647837831000),
    etc. Esta funcionalidad que se agregó a HTTP permite
    que [Internet](https://www.google.com/url?q=http://www.hipertexto.info/documentos/internet.htm&sa=D&ust=1535647837831000) sea [hipermedia](https://www.google.com/url?q=http://www.hipertexto.info/documentos/hipermedia.htm&sa=D&ust=1535647837832000) a
    través de la Web. Bajo la [interfaz de
    usuario](https://www.google.com/url?q=http://www.hipertexto.info/documentos/interfaz.htm&sa=D&ust=1535647837832000),
    representada por los navegadores, se encuentran los protocolos. Los
    protocolos viajan a través de los cables que conforman la red hacia
    los servidores o motores que procesan los pedidos de información y
    devuelven los resultados. El protocolo de la World Wide Web es el
    protocolo HTTP y es el mecanismo base en el cual opera
    la [CGI (Common Gateway
    Interface)](https://www.google.com/url?q=http://www.hipertexto.info/documentos/b_datos.htm%23CGI&sa=D&ust=1535647837833000).

### Navegadores

Navegador o explorador web. Es un programa
o [Software](https://www.google.com/url?q=https://www.ecured.cu/Software&sa=D&ust=1535647837833000),
por lo general gratuito, que nos permite visualizar páginas web a través
de [Internet](https://www.google.com/url?q=https://www.ecured.cu/Internet&sa=D&ust=1535647837834000) o
en el propio ordenador, además posibilita acceder a otros recursos de
información alojados también en[Servidores
Web](https://www.google.com/url?q=https://www.ecured.cu/Servidores_Web&sa=D&ust=1535647837834000),
como pueden ser videos, imágenes, audio y
archivos [XML](https://www.google.com/url?q=https://www.ecured.cu/XML&sa=D&ust=1535647837835000).

El navegador interpreta el
código, [HTML](https://www.google.com/url?q=https://www.ecured.cu/HTML&sa=D&ust=1535647837835000) generalmente,
en el que está escrita la página web y lo presenta en pantalla
permitiendo al usuario interactuar con su contenido y navegar hacia
otros lugares de la red mediante enlaces o hipervínculos.

#### Historia

La lista que se puede ver a continuación, muestra en orden cronológico
los navegadores existentes a lo largo de la historia:

> WorldWideWeb. Tim Berners-Lee escribió el primer navegador en una
    computadora neXT, llamada WorldWideWeb, acabando la primera versión
    el día de Navidad de 1990. Entrego el programa a un número de
    personas en CERN en Marzo de 1991, extendiéndose el navegador por la
    Web.

> Libwww. Berners-Lee y un estudiante de CERN llamado Jean-Francois
    Groff llevaron la aplicación WorldWideWeb, del entorno neXT al
    lenguaje C en 1992, siendo este mas común. El nuevo navegador se
    llamó Libwww. Mas tarde, Groff comenzó la primera compañía de diseño
    Web, InfoDesign.ch.

> Line-Mode. Nicola Pellow, una estudiante de matemáticas interna en
    CERN, escribió un navegador que podía funcionar en cualquier
    dispositivo, incluso en un teletipo. En 1991, Nicola y su grupo
    llevaron el navegador el navegador a un rango de ordenadores, de
    UNIX a  Microsoft DOS, para que todos pudieran acceder a la Web,
    principalmente personal de CERN.

> Erwise. Después de una visita de Robert Calliau, un grupo de
    estudiantes de la universidad de tecnología de Helsinki se juntaron
    para hacer un navegador como Master para un proyecto. Nació Erwise.
    La versión final se publicó en Abril, 1992, pero se fue
    desarrollando posteriormente.

> Violawww. Pai Wei, un estudiante de la universidad de California en
    Berkeley, publicó el segundo navegador para UNIX en Mayo de 1992. Se
    llamóViolawww. El navegador se construyó sobre el lenguaje Viola que
    Wei desarrolló para ordenadores UNIX. Violawww tenia algunas
    funciones avanzadas que incluían la habilidad para mostrar gráficos
    y descargar applets.

> Midas. Durante el verano de 1992, Tony Jonson en SLAC, desarrolló un
    tercer navegador para sistemas UNIX, llamado Midas para ayudar a
    distribuir información a sus colegas.

> Samba. Robert Calliau empezó a desarrollar el primer navegador para
    Macintosh, el cual se llamó Samba. A este proyecto se unión Nicola
    Pellow y el navegador estaba en funcionamiento a finales de 1992.

> Mosaic. Marc Andreesen y Eric Bina, del NCSA, realizaron la primera
    versión de Mosaic para X-Windows en computadoras UNIX en Febrero,
    1993. Una versión para Macintosh fue creada por Aleks Totic y
    lanzada unos meses después. Mosaic introdujo soporte para sonido,
    video clips, formas, favoritos, historial, y enseguida se hizo el
    navegador de Internet no comercial mas popular. La NCSA detuvo el
    desarrollo de Mosaic en enero de 1997.

> Arena. En 1993, Dave Ragget en Dell , realizo un navegador
    llamado Arena, muy potente para posicionar tablas y gráficos.

> Lynx. La universidad de Kansas un navegador de hipertexto
    independiente de la Web llamado Lynx, usado para distribuir
    información por el campus universitario. Un estudiante llamado Lou
    Montulli añadió un interfaz gráfico al programa y publicó la versión
    de Lynx 2.0

> Cello. Tom Bruce diseñó el navegador Cello, el cual acabó el verano
    de 1993.

> Opera. En 1994, el navegador Opera fue desarrollado por un equipo de
    investigadores en una compañía de telecomunicaciones llamada Telenor
    en Oslo, Noruega. En los años siguientes, dos miembros del grupo -
    Stephenson von Tetzchner y Geir Ivarsoy, abandonaron Telenor para
    establecer la versión comercial de Opera. La versión de opera 2.1
    estuvo disponible en Internet en el verano de 1996.

> Internet in a box. En enero de 1994, O'Reilly y asociados anunciaron
    un producto llamado Internet in a box, algo así como Internet en una
    caja, que recolectaba todo el software necesario para acceder a
    Internet, de tal manera que solo había que instalar una aplicación
    en vez de descargarte e instalar varios programas.

> Navipress. En Febrero de 1994, Navisoft publicó un Internet browser
    para PC y Macintosh llamado Navipress. Este fue el primer navegador
    desde WorldWideWeb que incorporaba un editor, por lo que podías
    navegar y editar contenido al mismo tiempo. Navipress después se
    convirtió en AOLpress y todavía está disponible, aunque no se
    actualiza desde 1997.

> Mozilla. En octubre de 1994, Netscape publicó la primera versión
    beta de su navegador en Internet, el Mozilla 0.96b. En diciembre, la
    versión final ya estaba preparada, el Mozilla 1.0, convirtiéndose en
    el primer navegador Web comercial. Una versión de código abierto del
    navegador Netscape fue desplegada en 2002, y también llamado Mozilla
    en tributo a la mas temprana versión, y posteriormente publicada
    como Firefox en Noviembre de 2004.

> Internet Explorer. El 23 de Agosto de 1995, Microsoft lanzo su
    sistema operativo Windows 95, incluyendo un navegador Web llamado
    Internet Explorer. En 1996, tenía un terció del mercado absorbido, y
    sobrepasó a Netscape como líder de navegadores de Internet en 1999.

### Funcionamiento y características

Los navegadores se comunican con los servidores web por medio del
protocolo de transferencia de hipertexto
([HTTP](https://www.google.com/url?q=https://www.ecured.cu/HTTP&sa=D&ust=1535647837841000))
para acceder a las direcciones de Internet (URLs) a través de los
motores de búsqueda.

La mayoría de los exploradores web admiten otros protocolos de red
como [HTTPS](https://www.google.com/url?q=https://www.ecured.cu/HTTPS&sa=D&ust=1535647837841000) (la
versión segura de
HTTP), [Gopher](https://www.google.com/url?q=https://www.ecured.cu/Gopher&sa=D&ust=1535647837842000),
y [FTP](https://www.google.com/url?q=https://www.ecured.cu/FTP&sa=D&ust=1535647837842000),
así como los lenguajes de marcado o estándares HTML
y [XHTML](https://www.google.com/url?q=https://www.ecured.cu/XHTML&sa=D&ust=1535647837842000) de
los documentos web. Los navegadores además interactúan con complementos
o aplicaciones (Plug-ins) para admitir
archivos [Flash](https://www.google.com/url?q=https://www.ecured.cu/Flash&sa=D&ust=1535647837842000) y
programas
en [Java](https://www.google.com/url?q=https://www.ecured.cu/Java&sa=D&ust=1535647837843000) (Java
applets).

#### Tareas comunes de los navegadores

Todos los navegadores incluyen la mayoría de las siguientes
características: navegación por pestañas, bloqueadora de ventanas
emergentes, soporte para motores de búsqueda, gestora de descargas,
marcadores y atajos del teclado. Para mantener la privacidad casi todos
los navegadores ofrecen maneras sencillas de borrar cookies, cachés web
y el historial.

Las suites de Internet son aquellos exploradores web que incluyen
programas integrados capaces de leer noticias
de [Usenet](https://www.google.com/url?q=https://www.ecured.cu/Usenet&sa=D&ust=1535647837844000),
correos electrónicos,
e [IRC](https://www.google.com/url?q=https://www.ecured.cu/IRC&sa=D&ust=1535647837844000),
que son chats de texto en tiempo real a través de los
protocolos [IMAP](https://www.google.com/url?q=https://www.ecured.cu/IMAP&sa=D&ust=1535647837844000), [NNTP](https://www.google.com/url?q=https://www.ecured.cu/NNTP&sa=D&ust=1535647837844000) y [POP](https://www.google.com/url?q=https://www.ecured.cu/POP&sa=D&ust=1535647837845000).

Suelen utilizar el protocolo de seguridad HTTPS a través de los
protocolos criptográficos SSL/TLS para proteger los datos de intercambio
con los servidores web. También suelen contar con protección
antiphishing y antimalware.

Pasos

1.  Para empezar, cuando escribes la dirección de un sitio web, el
    navegador va "buscar" en un servidor de direcciones, el cual lo va a
    direccionar
    al [servidor](https://www.google.com/url?q=http://www.informatica-hoy.com.ar/historia-de-la-computadora/Los-creadores-de-internet.php&sa=D&ust=1535647837845000) donde
    están los archivos del sitio web en cuestión.
2.  Una vez en el servidor, el navegador va a buscar el archivo index, y
    va a comenzar a leer el código de este archivo.
3.  Una vez que comienza a leer el código, empezará a mostrar la página
    web en el panel visual, (aquel donde la página web se muestra) y
    a buscar los componentes que conforman el cuerpo de la página, como
    las imágenes y scripts externos.
4.  Al comenzar a mostrar la página web, el navegador va a guardar todos
    los archivos de esa página en una carpeta temporal y a ubicarlas en
    el cuerpo de la página, sólo que en vez de usar los archivos del
    servidor, va a utilizar los que bajó a la carpeta temporal; (es por
    esto que si entras regularmente al mismo sitio web, vas a notar que
    la primera vez va a demorar más que las siguientes, debido a que el
    navegador no necesita bajar los archivos de la página que bajó
    antes).
5.  Junto con el proceso de armado de la página, el navegador verifica
    los certificados y la homologación del sitio web, además, tu
    antivirus comienza a escanear los archivos que el navegador va
    bajando (los temporales) para verificar la existencia de virus y
    malwares, todo para proteger la seguridad.

### Navegadores más usados

Chrome supera a Internet Explorer como el navegador más utilizado por
periodos cortos, pero el número de usuarios de Chrome está en constante
crecimiento dibujando una curva ascendente, por el contrario, la curva
de usuarios de Internet Explorer esta en decrecimiento, así que es
sencillo inferir que el nuevo rey de los navegadores será Google Chrome
dentro de poco tiempo, y esto gracias a la enorme maquinaria
publicitaria que Google ha implementado para promocionar su navegador y
también a ciertos errores de los chicos de Mozilla al momento de lanzar
versiones de Firefox que después presentan problemas de rendimiento.

Este gráfico nos muestra la evolución del uso de navegadores desde Julio
del 2008 hasta Noviembre del 2012.

Es el momento de descargar navegadores de internet, pero no nos hemos
decidido por cual, mejor veamos cuales son las ventajas y desventajas de
cada uno de los competidores en esta pelea de navegadores. Así podremos
decidir cual nos conviene más.

Google Chrome

Uno de los grandes navegadores de internet gratis en el Mercado es
además el más joven y con más rápido crecimiento, desde su lanzamiento
en el 2008 ha tenido un meteórico ascenso en el mercado, con más de 300
millones de usuarios hasta la fecha se pelea usuario por usuario la
supremacía de entre los navegadores de internet con Internet Explorer.
Su crecimiento es gracias mayormente al enorme aparato de publicidad
implementado por Google que prácticamente nos invita por todos lados a
descargar y usar su navegador, por ejemplo cuando abrimos el buscador de
Google vemos un mensajito "invitándonos" a instalar[Google
Chrome](https://www.google.com/url?q=https://www.todoprogramas.com/programa/googlechrome/&sa=D&ust=1535647837847000),
si se trata de descargar navegadores de internet los chicos de Google
tienen muy claro dónde poner sus anuncios.

Una de sus ventajas es que está disponible para una gran cantidad de
sistemas operativos incluyendo Windows, Ubuntu, Debian, Chrome OS, entre
otros y para sistemas operativos orientados a dispositivos móviles como
Android y iOS.

En cuanto a seguridad Chrome utiliza un sistema de listas negras donde
incluyen sitios que contienen software dañino y manda advertencias a los
usuarios cuando intentan accederlos. En cuanto a estabilidad, Google
Chrome ha sido desarrollado aplicando el principio de arquitectura de
multiproceso, es decir que toma cada tarea como un proceso separado de
este modo si alguna pestaña o plugin tiene un mal funcionamiento se
puede terminar solo ese proceso mientras que los demás procesos
continúan activos y Chrome puede seguir trabajando con normalidad.

Chrome además implementa la opción de modo incognito, que es un gran
avance en el tema de privacidad ya que el navegador no registrará
ninguna actividad y borrará las cookies utilizadas.

Otras características de Google Chrome son que permite la instalación de
miles de extensiones de terceros que permiten una mayor personalización
del navegador además que no se requiere reiniciarlo después de instalar
alguna. Además está fuertemente ligado a Chrome OS el sistema operativo
de Google basado en la nube. Las últimas versiones permiten la
sincronización del navegador entre diferentes dispositivos.

Mozilla Firefox

Otro grande entre los navegadores de internet, actualmente ocupa el
tercer lugar detrás de IE y Chrome con una cuota del 23% del mercado,
este navegador es un proyecto de software libre desarrollado por la
fundación Mozilla es decir que su código fuente es libre y abierto.

Quizás su mayor ventaja respecto a los demás navegadores de internet
gratis es que es más seguro y personalizable de todos, con miles de
complementos desarrollados por terceros disponibles para descargar desde
el mismo navegador.

Durante mucho tiempo fue el mayor competidor de Internet Explorer hasta
la llegada de Chrome, al igual que este ultimo puede trabajar con
normalidad en una gran cantidad de sistemas operativos incluyendo los de
la familia Windows, Linux, Mac OS X, Sun, Solaris, y por supuesto en
sistemas para dispositivos móviles como Android.

Algunas versiones de Firefox presentaban deficiencias como por ejemplo
el excesivo uso de memoria al poco tiempo de ser lanzadas lo que
obligaba a lanzar nuevas actualizaciones en poco tiempo, los
desarrolladores de Mozilla han tomado nota de esto y las últimas
versiones han mejorado notablemente su rendimiento, además que se
anuncian nuevas mejoras para las siguientes versiones de
navegador [Mozilla
Firefox](https://www.google.com/url?q=https://www.todoprogramas.com/programa/mozillafirefox/&sa=D&ust=1535647837849000),
algunas de las cosas prometidas son el rediseño de la interfaz, la
reducción del uso de memoria, y la integración de un API para
aplicaciones de redes sociales.

El mercado de los dispositivos móviles se muestra bastante apetitoso
para los navegadores de internet, por ejemplo una de las mayores
apuestas de Mozilla con vistas a este mercado es el lanzamiento de su
propio sistema operativo Firefox OS claro que tendrá una dura
competencia con Android que está bajo el amparo de Google.

Internet Explorer

Hasta hace algunos años el líder indiscutible del mercado de navegadores
de internet gratis, después de derrotar a Netscape parecía que nadie lo
podría opacar, a pesar de sus evidentes fallos de seguridad y la
lentitud con que trabajaba. Es obvio que la principal razón de la
predominancia de [Internet
Explorer](https://www.google.com/url?q=https://www.todoprogramas.com/programa/internetexplorer/&sa=D&ust=1535647837850000) se
debe a que viene listo para usar en todos los sistemas operativos
Windows.

La versión 6 de este navegador se caracteriza por ser uno de los más
inseguros e inestables, fue durante mucho tiempo un dolor de cabeza para
desarrolladores y usuarios de internet, afortunadamente este navegador
se usa cada vez menos, incluso Microsoft ha dejado de darle soporte y se
ha enfocado en lanzar nuevas versiones que se superan una detrás de
otra.

Internet Explorer 10,  la versión 2012 del navegador, promete ser mucho
más rápida en comparación a sus competidores más cercanos (Firefox 14 y
Chrome 17) gracias a su aceleración por hardware. Además ofrece un
interfaz más sobria y sencilla claramente optimizado para su uso en
dispositivos táctiles; la seguridad es otro aspecto muy importante que
han mejorado para esta versión, Internet Explorer promete bloquear más
malware que sus competidores además de proteger el equipo contra
descargas malintencionadas. Hablando de privacidad, a ninguno de
nosotros nos gusta que se metan en nuestros asuntos, pensando en esto
los desarrolladores de Microsoft han implementado tecnologías conocidas
como Tracking Protection, InPrivate Browsing y Do Not Track que servirán
para evitar que algunas cookies molestas recopilen nuestra información
personal.

Con el nuevo IE10 la gente de Microsoft ha hecho una gran tarea, van por
buen camino en su intento de hacernos olvidar el desastre llamado
Internet Explorer 6.

Opera

Opera es usualmente catalogado como el Ferrari de los navegadores de
internet, uno de los más seguros, estables y rápidos del mercado,
extrañamente usado por una mínima cantidad de personas en comparación
con los enormes números de usuarios de IE, Chrome y Firefox.

Este navegador, que es desarrollado por la compañía noruega Opera
Software, es más que un simple navegador, es capaz además de gestionar
correo electrónico, sirve para descargar archivos .torrent, tiene un
cliente IRC para chatear, permite la lectura de RSS. Incluso Opera puede
jactarse de ser el primer navegador que popularizó e implemento en
algunos casos características hoy comunes en los navegadores como
pestañas múltiples, búsquedas integradas, y zoom.

En cuanto a
seguridad, [Opera](https://www.google.com/url?q=https://www.todoprogramas.com/programa/operaturbo/&sa=D&ust=1535647837851000) ofrece
protección anti-malware y anti-phishing, cifrado de datos al navegar,
además ofrece la posibilidad de eliminar todos los archivos que pueden
servir para rastrear nuestra actividad en Internet, es decir Opera
elimina archivos como cookies, datos de geolocalizaciòn, contraseñas,
etc.

Opera puede ser instalado en una gran variedad de sistemas operativos
como Microsoft Windows, Linux, Mac OS, y por supuesto en sistemas
operativos para dispositivos móviles, las versiones para móviles de
Opera (Opera Mobile y Opera Mini) cuentan con gran popularidad en el
mundo entero, se calcula que están instalados en cientos de millones de
teléfonos móviles alrededor del mundo. Opera también es el navegador
usado por Nintendo para sus consolas DS y Wii.

Las últimas versiones de Opera ofrecen mejoras como: vista previa en las
pestañas, widgets, speed dial, y opciones como Opera Turbo (que reduce
el peso de un sitio web comprimiendo el sitio antes de ser enviado al
usuario, mejorando la velocidad de carga) y Opera Link (que permite al
usuario sincronizar los contenidos de su navegador con otros
dispositivos).

Safari

Desarrollado por Apple, hasta hace algún tiempo solo era instalable en
sistemas operativos Mac OS e IOS, actualmente existe una versión para
Windows.

Las principales caracteristicas
de [Safari](https://www.google.com/url?q=https://www.todoprogramas.com/programa/safari/&sa=D&ust=1535647837853000) son
su corrector ortográfico y navegación por pestañas, integración con
redes sociales, las últimas versiones ofrecen la posibilidad de
almacenamiento offline (es decir que podemos almacenar sitios web
enteros y verlos en forma offline), integración total con iCloud lo que
significa que podemos ver las páginas web que dejamos abiertas desde
cualquier dispositivo de la familia Apple sin necesidad de sincronizar
nada ya que todo se guardará en la nube de Apple

Después de ver algunas de los pros  y contras de los principales
navegadores del mercado, ¿cuál es tu opción? Recuerda que siempre puedes
usar varios a la vez.

Buscadores
----------

Hoy en día la navegación por Internet cada vez se hace más complicada,
debido a la ingente cantidad de información que aparece continuamente.
Encontrar de forma rápida y sencilla algo que andamos buscando, puede
convertirse en un tarea ardua y, a veces, con resultados no deseados.

Es fácil, pues, deducir que se necesita algún mecanismo o dispositivo
que permita la clasificación, catalogación u organización de esta gran
cantidad de información, de tal forma que su localización sea más
sencilla.

Todas los usuarios de teléfonos conocemos los listines telefónicos o las
famosas "Páginas Amarillas" y conocemos su utilidad. Por otra parte,
estamos convencidos de que todos los navegantes hemos oído alguna vez
términos como "buscadores" o "motores de búsqueda", el equivalente en
Internet a las páginas amarillas o a las guías de teléfonos. La mejor
forma de encontrar información en la Web es utilizar alguno de estos
denominados buscadores o actualmente Portales.

Estos buscadores, o motores de búsqueda, no son más que aplicaciones
informáticas que rastrean la Web catalogando, clasificando y organizando
la información, para después ofrecérsela a los navegantes. Podrían
definirse como grandes bases de datos indexadas de páginas Web. Para
realizar la búsqueda hay que contactar con la página Web de una de estas
empresas.

Los buscadores funcionan:

1.  Mediante programas que buscan en bases de datos que se mantienen
    automáticamente por los denominados robots. En este tipo de búsqueda
    basta con introducir el término sobre el que deseamos encontrar
    información. \

2.  A través de índices, que catalogan la información por temas. Estos
    índices suelen estar organizados desde los temas más generales a los
    más específicos, existe una cierta jerarquía en su organización y el
    usuario es guiado en todo momento en su búsqueda.

Internet cuenta con decenas de millones de páginas web con lo que parece
difícil que entre semejante bomba de información podamos encontrar lo
que buscamos. Pues bien, para encontrar la página que nos interesa
tenemos que usar el buscador. Es una herramienta gratuita a la que se
tiene acceso con sólo teclear su dirección en el navegador. Una vez que
tenemos la página del buscador en el monitor, escribimos la palabra de
la que queremos información y le damos a buscar. ¡Así de fácil! En pocos
segundos, aparecerán en nuestra pantalla los datos solicitados.

### Tipos de buscadores

Los buscadores pueden ser clasificados de acuerdo a la manera en que
obtienen las direcciones ubicadas en su base de datos. Existen tres
tipos de buscadores:

ÍNDICES DE BÚSQUEDA: está organizado a partir de categorías, en función
de las cuales se divide la información de las páginas web. La
administración de los índices de búsqueda está a cargo de un equipo
humano, que se encarga de construir la base de datos del buscador. Yahoo
es uno de los ejemplos más conocidos de esta clase de buscador.

MOTOR DE BÚSQUEDA: aquí la recopilación de páginas web es realizada a
través de un programa llamado araña, el cual recorre de forma permanente
la web e introduce las direcciones en la base de datos. Éste vincula a
la página con las primeras 100 palabras que se pueden leer en ella.
Ejemplos son Google y Bing.

METABUSCADORES: la característica principal es que carecen de una base
de datos propia. Sino que utilizan la de otros motores de búsqueda. Su
objetivo principal es el de brindar eficiencia y facilidad en la
búsqueda de información. Dos de los metabuscadores más conocidos son
Metacrawler y Buscopio.

#### Índices de búsqueda

Es el primer tipo de buscador que surgió. En los índices de búsqueda, la
base de datos con direcciones la construye un equipo humano. Es decir,
un grupo de personas va rastreando la red en busca de páginas. Vistas
éstas son clasificadas por categorías o temas y subcategorías en función
de su contenido. De este modo, la base de datos de un índice de búsqueda
contiene una lista de categorías y subcategorías relacionadas con un
conjunto de direcciones de páginas web que tratan esos temas.

La consulta de un índice se realiza, pues, a través de categorías. Por
ejemplo, si buscamos información sobre el Museo del Prado deberemos
pinchar sobre una secuencia de categorías y subcategorías como la
siguiente: Arte / museos / pinacotecas y seguro que dentro de ésa última
subcategoría hay algún enlace que hace referencia al museo del Prado.

El primer índice de búsqueda que apareció fue Yahoo! que sigue
ofreciendo sus servicios. La ventana de su versión en castellano tiene
el aspecto de la imagen.

Se puede observar que, a pesar de tratarse de un índice de búsqueda,
ofrece también un espacio para introducir palabras clave (bajo el título
de la web). Esto se debe a que todos los buscadores que ofrecen
servicios en la red tienden a satisfacer al máximo las necesidades de
los navegantes, de forma que intentan abarcar toda la gama de
posibilidades.

#### Motores de búsqueda

Temporalmente, los motores de búsqueda son posteriores a los índices. El
concepto es diferente: en este caso, el rastreo de la web lo hace un
programa, llamado araña o motor (de ahí viene el nombre del tipo de
buscador). Este programa va visitando las páginas y, a la vez, creando
una base de datos en la que relaciona la dirección de la página con las
100 primeras palabras que aparecen en ella. Como era de esperar, el
acceso a esta base de datos se hace por palabras clave: la página del
buscador me ofrece un espacio para que yo escriba la ó las palabras
relacionadas con el tema que me interesa, y como resultado me devuelve
directamente un listado de páginas que contienen esas palabras clave.
Por ejemplo, si utilizo un motor de búsqueda para localizar información
sobre el Museo del Prado, simplemente tendré que escribir "Museo del
Prado" en el espacio de búsqueda y pinchar en el botón Buscar. A
continuación se me devolverá otra página con los resultados de la
búsqueda: un listado con enlaces a las páginas solicitadas.

Un buen ejemplo de motor de búsqueda es Google. En el apartado 2 de esta
unidad veremos con detalle cómo realizar búsquedas con él. De momento,
aquí tenemos el aspecto de su página principal.

Observando esta ventana vemos que, en la parte central-derecha hay una
pestaña con el nombre Directorio. Si hacemos clic sobre ella nos llevará
a otra página en la que se nos ofrece realizar la búsqueda por
categorías. Como en el caso de los índices, los motores también tienden
a ofrecer todos los servicios posibles al usuario, y le dan la
posibilidad de realizar una búsqueda por categorías.

#### Metabuscadores

Un metabuscador (Meta-Search) es un sistema informático que localiza
información en los[motores de búsqueda más
populares](https://www.google.com/url?q=http://buscadores-web.com/ranking-buscadores-internet/&sa=D&ust=1535647837859000).
Los metabuscadores no tienen base de datos propia, por ello arrojan la
combinación de las mejores páginas de los diferentes buscadores web. Una
definición para entenderso serría: un metabuscador es un buscador de
buscadores.

Como principal ventaja los metabuscadores proporcionan una mayor
cantidad de resultados, aunque esto provoca que la obtención de estos
sea más lenta.

Los metabuscadores se diferencian entre sí por forma de combinar los
resultados. Los Metabuscadores más populares son:

##### [Mamma](https://www.google.com/url?q=https://mamma.com/&sa=D&ust=1535647837859000)

Mamma es sin duda uno de los mejores metabuscadores de Internet. Este
metabuscador puede segmentar las búsquedas por web, imágenes,
video,noticias, conenido local y articulos de interés

##### [Ixquick](https://www.google.com/url?q=https://ixquick.com/&sa=D&ust=1535647837860000)

Cuando realiza una búsqueda con Ixquick, usted está utilizando, de
manera simultánea y anónima, los motores de búsqueda mas populares.
Combinados, estos buscadores Ixquick proporciona una busqueda muy
sencilla y de calidad. Sin duda el unos de los metabuscadores más
populares de la red.

Metasearch ixquick

##### Zoo

Zoo le permite buscar en múltiples motores de búsqueda a la vez ,
generando resultados muy completos y relevantes de forma rápida Sus
principales proveedores a la hora de realizar la búsquda son Google y
Yahoo!.\

##### Zuula

El Metabuscador Zuula esta en fase beta. Zuula es la las mejores maneras
para encontrar información Internet.

En resumen, los metabuscadores encuentran la información en
los [principales buscadores
web](https://www.google.com/url?q=http://buscadores-web.com/&sa=D&ust=1535647837862000),
la combinan y arroja al usuario la búsqueda consultada.

### Buscadores más usados

Por regla general cuando hablamos de un buscador pensamos en primera
instancia en el gran Google, pero existen más motores de búsqueda que
pueden adaptarse a tus propias necesidades. Lo más importante a tener en
cuenta siempre es tener claro el objetivo de qué es lo que queremos
buscar. Veamos una lista de los buscadores más populares de Internet.

• [Google](https://www.google.com/url?q=http://www.google.com/&sa=D&ust=1535647837863000)

Nadie tiene dudas que se trata del mejor y más popular buscador que
existe en la internet. Fue creado en el año 1997 y más del 90% de los
usuarios de la red utilizan su servicio. Además de ser un motor de
búsqueda, con el tiempo ha ido ampliando sus servicios hasta convertirse
en el líder absoluto.

• [Bing](https://www.google.com/url?q=http://www.bing.com/&sa=D&ust=1535647837864000)

Antes lo conocíamos con el nombre de Live Search. Es el buscador oficial
de Microsoft y se caracteriza por tener una imagen de fondo muy
atractiva. Su búsqueda se basa en el sistema Powerset2. Además de la
búsqueda tradicional te permite realizar una lista de búsquedas
relacionadas y personalizarlas de acuerdo a tus preferencias.

• [Yahoo](https://www.google.com/url?q=http://www.yahoo.com/&sa=D&ust=1535647837865000)

Es sin dudas el competidor nato de Google. Durante muchos años, fue el
líder en búsquedas y poco a poco se fue haciendo conocido como un
portal, en el que además de buscar contenidos obtenías servicios de alta
calidad como lo eran los desaparecidos grupos, directorios, noticias,
email y más. Creada en 1994, su motor de búsqueda se caracteriza por
brindar los resultados más ajustados y exactos a tus intereses.

### GOOGLE

#### Cómo buscar en Google

Obtén algunos trucos y sugerencias que te ayudarán a encontrar
información fácilmente
en [Google](https://www.google.com/url?q=https://www.google.com/&sa=D&ust=1535647837866000).

Sugerencia 1: No te compliques

Busques lo que busques, comienza con una búsqueda simple, como ¿dónde
está el aeropuerto más cercano? Puedes agregar unas palabras
descriptivas si es necesario.

Si estás buscando un lugar o un producto en una ubicación específica,
inclúyela. Por ejemplo, panadería seattle.

Sugerencia 2: Realiza búsquedas por voz

¿Te cansaste de escribir? Haz clic en el ícono del
micrófono en
la aplicación de Google o en el cuadro de búsqueda de Chrome
para [buscar por
voz](https://www.google.com/url?q=https://support.google.com/chrome/answer/1331723&sa=D&ust=1535647837867000).

Sugerencia 3: Elige las palabras con cuidado

Cuando estés pensando qué palabras escribir en el cuadro de búsqueda,
elige las que probablemente aparecerán en el sitio que estás buscando.
Por ejemplo, en lugar de decir me duele la cabeza, di dolor de cabeza,
porque esa es la frase que se usaría en un sitio médico.

Sugerencia 4: No te preocupes por lo que no tiene importancia

> Ortografía: el corrector ortográfico de Google usa de manera
    automática la ortografía más común de una palabra específica, sin
    importar si la escribiste correctamente.

> Mayúsculas: obtendrás los mismos resultados si buscas New York
    Times o new york times.

Sugerencia 5: Encuentra respuestas rápidas

Para muchas búsquedas, Google se encargará de mostrarte una respuesta a
tu pregunta en los resultados de la búsqueda. Algunos elementos, como la
información acerca de equipos deportivos, no están disponibles en todas
las regiones.

> Clima: busca clima para ver el tiempo en tu ubicación o agrega el
    nombre de una ciudad (por ejemplo clima Seattle) para ver el tiempo
    de un lugar específico.

> Diccionario: escribe definir delante de cualquier palabra para ver
    la definición.

> Cálculos: ingresa una operación matemática, como 3\*9123, o busca
    soluciones para ecuaciones gráficas complejas.
> Conversiones de unidades: ingresa cualquier conversión, como 3
    dólares en euros.

> Deportes: busca el nombre de tu equipo para ver un cronograma,
    resultados y más.

> Datos rápidos: busca el nombre de una celebridad, una ubicación, una
    película o una canción para encontrar información importante.

##### Buscar imágenes en Google que puedas reutilizar

Cuando haces una Búsqueda de Google, puedes filtrar los resultados para
encontrar imágenes, videos o texto cuyo uso esté permitido. Para eso,
tienes que usar un filtro de Búsqueda avanzada llamado "derechos de uso"
que te avisa si puedes utilizar, compartir o modificar un archivo que
encuentras en línea.

###### Buscar imágenes, texto y videos que puedes reutilizar

1.  Ve a [Búsqueda avanzada de
    imágenes](https://www.google.com/url?q=http://www.google.com/advanced_image_search&sa=D&ust=1535647837870000) para
    buscar imágenes o a [Búsqueda
    avanzada](https://www.google.com/url?q=http://www.google.com/advanced_search&sa=D&ust=1535647837871000) para
    otros tipos de archivo.
2.  En el cuadro de "todas estas palabras", escribe lo que quieres
    buscar.
3.  Desplázate hasta la sección de "derechos de uso".
4.  En el menú desplegable, elige qué tipo de licencia quieres que tenga
    el contenido.
5.  Haz clic en Búsqueda avanzada.

Antes de reutilizar el contenido que encontraste, comprueba que la
licencia sea legítima y consulta los términos de reutilización exactos
detallados en la licencia. Por ejemplo, muchas licencias requieren que
se le dé crédito al autor de la imagen cuando alguien la vuelve a usar.
Google no tiene manera de saber si la etiqueta de licencia es legítima,
por eso no hacemos ninguna declaración acerca de que el contenido sea
real o esté legalmente autorizado.

#### Filtrar resultados de búsqueda

Puedes filtrar y personalizar los resultados de búsqueda para encontrar
exactamente lo que quieres. Por ejemplo, puedes encontrar sitios
actualizados en las últimas 24 horas o fotos de un color determinado.

Nota: filtrar los resultados de la búsqueda no cambia la configuración
de búsqueda. Para cambiar las opciones de configuración, como
SafeSearch, los resultados por página, el idioma, la ubicación, o para
borrar las búsquedas anteriores, consulta la página [Configuración de
búsqueda](https://www.google.com/url?q=https://www.google.com/preferences&sa=D&ust=1535647837873000).

##### Formas de filtrar resultados de la búsqueda

> Tipo de resultado: En la parte superior o inferior de una página de
    resultados de búsqueda, verás una serie de formas de filtrar los
    resultados para ver un tipo de contenido. Por ejemplo, haz clic en
    Imágenes para que todos los resultados de búsqueda sean imágenes, o
    en Shopping para ver resultados de búsqueda que te ayudan a
    encontrar maneras de comprar las cosas que buscaste.

> Herramientas de búsqueda: después de decidir qué tipo de resultados
    quieres, puedes refinar los resultados aún más con Herramientas de
    búsqueda. Las herramientas de búsqueda incluyen, por ejemplo, la
    ubicación, el color, el tamaño y la fecha de publicación de una
    página.

#### Tipos de herramientas de búsqueda

Algunas herramientas de búsqueda no están disponibles en todos los
idiomas o solo se muestran si accediste a la cuenta de Google.

##### Herramientas de búsqueda que puedes utilizar para resultados de la Web {#h.xloehgvx375a .c1}

Las herramientas de búsqueda serán diferentes en función de los
resultados, pero pueden incluir, por ejemplo:

> Fecha de publicación: limita resultados según el momento en que se
    publicaron en la Web.

> Palabra por palabra: busca palabras o frases exactas.

> Diccionario: encuentra definiciones, sinónimos, imágenes y más para
    el término de búsqueda.

> Nivel de lectura: limita los resultados de búsqueda por nivel de
    comprensión de lectura.

> Privado: si accediste a tu cuenta de Google, puedes ver contenido
    compartido contigo en Google+ o Gmail.

> Nearby: permite ver resultados para tu ubicación actual.

> Videos: filtra según la duración, la calidad y el origen (por
    ejemplo, youtube.com) del video.

> Recetas: filtra por ingredientes, tiempo de cocción y calorías.

> Aplicaciones: elige el precio y el sistema operativo, o SO, para
    aplicaciones disponibles.

> Patentes: selecciona la fecha de presentación o publicación de una
    patente, la oficina de patentes en la que se presentó, el estado de
    la presentación y el tipo. También puedes hacer una búsqueda de
    patentes directamente
    en [patents.google.com](https://www.google.com/url?q=http://patents.google.com/&sa=D&ust=1535647837877000).

##### Herramientas de búsqueda que puedes utilizar para resultados de Imágenes

> Tamaño: elige entre los tamaños grande, mediano e ícono, o establece
    la dimensión exacta.

> Color: busca imágenes de un determinado color, en blanco y negro o
    transparentes.

> Tipo: ve solo imágenes que sean caras, fotos, imágenes prediseñadas,
    dibujos o GIF animados.

> Fecha: encuentra una foto publicada recientemente o publicada en una
    fecha determinada.

> Derechos de uso: ve fotos que puedas reutilizar o modificar. Más
    información sobre cómo [encontrar contenido para
    reutilizar](https://www.google.com/url?q=https://support.google.com/websearch/answer/29508&sa=D&ust=1535647837879000).

##### Búsqueda avanzada

Puedes usar la página Búsqueda avanzada para restringir los resultados
de las búsquedas complejas. Por ejemplo, puedes buscar sitios
actualizados en las últimas 24 horas o imágenes en blanco y negro.

Realizar una búsqueda avanzada

1.  Ve a la página Búsqueda avanzada.

> [Búsqueda avanzada para sitios
    web](https://www.google.com/url?q=http://www.google.com/advanced_search&sa=D&ust=1535647837880000)

> [Búsqueda avanzada para
    imágenes](https://www.google.com/url?q=http://www.google.com/advanced_image_search&sa=D&ust=1535647837880000)

2.  Ingresa los términos de búsqueda en la sección "Mostrar páginas que
    contengan".
3.  Selecciona los filtros que quieras utilizar en la sección "Luego
    restringe tus resultados por". Puedes utilizar uno o más filtros.
4.  Haz clic en Búsqueda avanzada.

Sugerencia: También puedes utilizar muchos de estos filtros en el cuadro
de búsqueda con [operadores de
búsqueda](https://www.google.com/url?q=https://support.google.com/websearch/answer/2466433&sa=D&ust=1535647837881000).


text:
package capstone.utility;

/**
 * A class for timing things.
 */
public class StopWatch
{
    /**
     * Default-constructs a non-running stopwatch.
     */
    public StopWatch() { }

    /**
     *
     * Constructs a StopWatch with the given timeout,
     * but does not start it yet.
     *
     * The timeout determines after how many milliseconds
     * the timeOut() method returns true.
     *
     * @param timeout The timeout for the StopWatch, in milliseconds.
     */
    public StopWatch(long timeout)
    {
        this(timeout, false);
    }

    /**
     *
     * Constructs a StopWatch with the given timeout
     * and starts if the second argument is true.
     *
     * The timeout determines after how many milliseconds
     * the timeOut() method returns true.
     *
     * @param timeout The timeout for the StopWatch, in milliseconds.
     *
     * @param start Whether to start the watch right away.
     */
    public StopWatch(long timeout, boolean start)
    {
        this.timeout(timeout);

        if (start) start();
    }

    /**
     *
     * Constructs a StopWatch and optionally starts it right away.
     *
     * @param start Whether to start the StopWatch right away.
     */
    public StopWatch(boolean start)
    {
        if (start) start();
    }

    /**
     *
     * Starts the StopWatch.
     *
     * The elapsed time can be sampled via the seconds/milliseconds etc.
     * methods an if there is a timeout set, the timeOut() method will
     * return true after the timeout has passed following a call to start().
     *
     * Note that the StopWatch must be stopped before it can be started.
     *
     */
    public void start()
    {
        assert(isStopped());

        _running = true;

        _start = _now();
    }

    /**
     * Stops the StopWatch.
     *
     * After the StopWatch has stopped, the time returned by the sampling
     * methods (seconds, milliseconds etc.) is always the time it was upon
     * end, i.e. the StopWatch really stops running.
     *
     * The StopWatch must be running to stop it.
     */
    public void stop()
    {
        assert(isRunning());

        _end = _now();

        _running = false;
    }

    /**
     *
     * Pauses the StopWatch.
     *
     * Pausing the StopWatch means the time between calls to pause()
     * and resume() does not contribute to the time returned by the
     * sampling methods.
     *
     * The StopWatch must be running to pause it.
     *
     */
    public void pause()
    {
        assert(isRunning());

        _pauseStart = _now();

        _paused = true;
    }

    /**
     *
     * Resumes the StopWatch, after having been paused.
     *
     * The StopWatch must have been paused earlier before a call to resume().
     *
     */
    public void resume()
    {
        assert(isPaused());

        _pausedTime += _now() - _pauseStart;

        _paused = false;
    }

    /**
     * Resets the starting point of the StopWatch to now.
     *
     * This affects the result of the sampling-methods
     * and the timeOut methods. Any paused time is discarded.
     */
    public void reset()
    {
        assert(isRunning());

        _start = _now();

        _pausedTime = 0;
    }

    /**
     * @return The timeout set for the StopWatch if one was set, else null.
     */
    public long timeout()
    {
        return _timeout;
    }

    /**
     *
     * Sets the timeout for the StopWatch.
     *
     * After starting the watch, the timeOut() method can be
     * used to check if the StopWatch has timed-out yet (i.e. if
     * the elapsed time since the start is greater than the timeout).
     *
     * @param timeout The new non-negative timeout in milliseconds.
     */
    public void timeout(long timeout)
    {
        assert(timeout >= 0);

        _timeout = timeout;
    }

    /**
     *
     * Returns whether the StopWatch has timed-out, i.e. if
     * the elapsed time since the start is greater than the timeout.
     *
     * The StopWatch must have had a timeout set first.
     *
     * @return True if the StopWatch has timed-out, else false.
     */
    public boolean timedOut()
    {
        assert(_timeout != null);

        return milliseconds() >= _timeout;
    }

    /**
     * @return The millisecond timestamp at which the StopWatch was started.
     *         The timestamp is invalid if the StopWatch was not
     *         actually started ever.
     */
    public Long startTime()
    {
        return _start;
    }

    /**
     * @return The time elapsed since the call to start(), in nanoseconds.
     */
    public Long nanoseconds()
    {
        return (_now() - _start) - _pausedTime;
    }

    /**
     * @return The time elapsed since the call to start(), in microseconds.
     */
    public Double microseconds()
    {
        return nanoseconds() / 1E3;
    }

    /**
     * @return The time elapsed since the call to start(), in milliseconds.
     */
    public Double milliseconds()
    {
        return nanoseconds() / 1E6;
    }

    /**
     * @return The time elapsed since the call to start(), in seconds.
     */
    public Double seconds()
    {
        return nanoseconds() / 1E9;
    }

    /**
     * @return The time elapsed since the call to start(), in minutes.
     */
    public Double minutes()
    {
        return nanoseconds() / 6E10;
    }

    /**
     * @return The time elapsed since the call to start(), in hours.
     */
    public Double hours()
    {
        return nanoseconds() / 36E11;
    }

    /**
     * @return The time elapsed since the call to start(), in days.
     */
    public Double days()
    {
        return nanoseconds() / 864E11;
    }

    /**
     * @return True if the StopWatch was started and is not paused, else false.
     */
    public boolean isRunning()
    {
        return _running && ! _paused;
    }

    /**
     * @return True if the StopWatch was stopped.
     */
    public boolean isStopped()
    {
        return ! _running;
    }

    /**
     * @return True if the StopWatch is currently paused.
     */
    public boolean isPaused()
    {
        return _paused;
    }

    /**
     * @return True if the StopWatch was paused previously, but not right now.
     */
    public boolean isResumed()
    {
        return _pausedTime > 0 && ! _paused;
    }

    /**
     * @return The system-time in nano seconds if the StopWatch is running, else
     *         the value of the system-time when the StopWatch was stopped (so
     *         that the sampling methods return the time between start and end
     *         once the StopWatch is stopped).
     */
    private long _now()
    {
        return _running ? System.nanoTime() : _end;
    }

    private long _start;

    private long _end;

    private long _pauseStart;

    private long _pausedTime;

    private Long _timeout;

    private boolean _running;

    private boolean _paused;
}

redpajama_set_name: RedPajamaGithub


text:
<!doctype html>

Params

<form>
  Cols:
  <input type="number" name="cols" placeholder="cols" value="40">

  Rows:
  <input type="number" name="rows" placeholder="rows" value="200">

  <button>Apply</button>
</form>

IV Largetable Benchmark

  <button id="destroyDom">destroyDom</button>
  <button id="createDom">createDom</button>
  <button id="updateDomProfile">profile updateDom</button>
  <button id="createDomProfile">profile createDom</button>

  <largetable id="root"></largetable>


text:
package org.elasticsearch.xpack.core.ml.utils;

import org.elasticsearch.Version;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesAction;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions;
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexAction;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.template.put.PutComposableIndexTemplateAction;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.support.master.MasterNodeRequest;
import org.elasticsearch.client.AdminClient;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.ClusterAdminClient;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.cluster.ClusterName;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.AliasMetadata;
import org.elasticsearch.cluster.metadata.ComposableIndexTemplate;
import org.elasticsearch.cluster.metadata.IndexMetadata;
import org.elasticsearch.cluster.metadata.IndexTemplateMetadata;
import org.elasticsearch.cluster.metadata.Metadata;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.node.DiscoveryNodes;
import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.util.concurrent.ThreadContext;
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.indices.TestIndexNameExpressionResolver;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.threadpool.ThreadPool;
import org.elasticsearch.xpack.core.ml.notifications.NotificationsIndex;
import org.elasticsearch.xpack.core.template.IndexTemplateConfig;
import org.junit.After;
import org.junit.Before;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.stubbing.Answer;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toMap;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.same;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

public class MlIndexAndAliasTests extends ESTestCase {

    private static final String TEST_INDEX_PREFIX = "test";
    private static final String TEST_INDEX_ALIAS = "test-alias";
    private static final String LEGACY_INDEX_WITHOUT_SUFFIX = TEST_INDEX_PREFIX;
    private static final String FIRST_CONCRETE_INDEX = "test-000001";

    private ThreadPool threadPool;
    private IndicesAdminClient indicesAdminClient;
    private ClusterAdminClient clusterAdminClient;
    private AdminClient adminClient;
    private Client client;
    private ActionListener<Boolean> listener;

    private ArgumentCaptor<CreateIndexRequest> createRequestCaptor;
    private ArgumentCaptor<IndicesAliasesRequest> aliasesRequestCaptor;

    @SuppressWarnings("unchecked")
    @Before
    public void setUpMocks() {
        threadPool = mock(ThreadPool.class);
        when(threadPool.getThreadContext()).thenReturn(new ThreadContext(Settings.EMPTY));

        indicesAdminClient = mock(IndicesAdminClient.class);
        when(indicesAdminClient.prepareCreate(FIRST_CONCRETE_INDEX)).thenReturn(
            new CreateIndexRequestBuilder(client, CreateIndexAction.INSTANCE, FIRST_CONCRETE_INDEX)
        );
        doAnswer(withResponse(new CreateIndexResponse(true, true, FIRST_CONCRETE_INDEX))).when(indicesAdminClient).create(any(), any());
        when(indicesAdminClient.prepareAliases()).thenReturn(new IndicesAliasesRequestBuilder(client, IndicesAliasesAction.INSTANCE));
        doAnswer(withResponse(AcknowledgedResponse.TRUE)).when(indicesAdminClient).aliases(any(), any());
        doAnswer(withResponse(AcknowledgedResponse.TRUE)).when(indicesAdminClient).putTemplate(any(), any());

        clusterAdminClient = mock(ClusterAdminClient.class);
        doAnswer(invocationOnMock -> {
            ActionListener<ClusterHealthResponse> actionListener = (ActionListener<ClusterHealthResponse>) invocationOnMock
                .getArguments()[1];
            actionListener.onResponse(new ClusterHealthResponse());
            return null;
        }).when(clusterAdminClient).health(any(ClusterHealthRequest.class), any(ActionListener.class));

        adminClient = mock(AdminClient.class);
        when(adminClient.indices()).thenReturn(indicesAdminClient);
        when(adminClient.cluster()).thenReturn(clusterAdminClient);

        client = mock(Client.class);
        when(client.threadPool()).thenReturn(threadPool);
        when(client.admin()).thenReturn(adminClient);
        doAnswer(invocationOnMock -> {
            ActionListener<AcknowledgedResponse> actionListener = (ActionListener<AcknowledgedResponse>) invocationOnMock.getArguments()[2];
            actionListener.onResponse(AcknowledgedResponse.TRUE);
            return null;
        }).when(client)
            .execute(
                any(PutComposableIndexTemplateAction.class),
                any(PutComposableIndexTemplateAction.Request.class),
                any(ActionListener.class)
            );

        listener = mock(ActionListener.class);

        createRequestCaptor = ArgumentCaptor.forClass(CreateIndexRequest.class);
        aliasesRequestCaptor = ArgumentCaptor.forClass(IndicesAliasesRequest.class);
    }

    @After
    public void verifyNoMoreInteractionsWithMocks() {
        verifyNoMoreInteractions(indicesAdminClient, listener);
    }

    public void testInstallIndexTemplateIfRequired_GivenLegacyTemplateExistsAndModernCluster() throws UnknownHostException {
        ClusterState clusterState = createClusterState(
            Version.CURRENT,
            Collections.emptyMap(),
            Collections.singletonMap(
                NotificationsIndex.NOTIFICATIONS_INDEX,
                createLegacyIndexTemplateMetaData(
                    NotificationsIndex.NOTIFICATIONS_INDEX,
                    Collections.singletonList(NotificationsIndex.NOTIFICATIONS_INDEX)
                )
            ),
            Collections.emptyMap()
        );

        IndexTemplateConfig notificationsTemplate = new IndexTemplateConfig(
            NotificationsIndex.NOTIFICATIONS_INDEX,
            "/org/elasticsearch/xpack/core/ml/notifications_index_template.json",
            Version.CURRENT.id,
            "xpack.ml.version",
            Map.of(
                "xpack.ml.version.id",
                String.valueOf(Version.CURRENT.id),
                "xpack.ml.notifications.mappings",
                NotificationsIndex.mapping()
            )
        );

        MlIndexAndAlias.installIndexTemplateIfRequired(
            clusterState,
            client,
            notificationsTemplate,
            TimeValue.timeValueMinutes(1),
            listener
        );
        InOrder inOrder = inOrder(client, listener);
        inOrder.verify(client).execute(same(PutComposableIndexTemplateAction.INSTANCE), any(), any());
        inOrder.verify(listener).onResponse(true);
    }

    public void testInstallIndexTemplateIfRequired_GivenComposableTemplateExists() throws UnknownHostException {
        ClusterState clusterState = createClusterState(
            Version.CURRENT,
            Collections.emptyMap(),
            Collections.emptyMap(),
            Collections.singletonMap(
                NotificationsIndex.NOTIFICATIONS_INDEX,
                createComposableIndexTemplateMetaData(
                    NotificationsIndex.NOTIFICATIONS_INDEX,
                    Collections.singletonList(NotificationsIndex.NOTIFICATIONS_INDEX)
                )
            )
        );

        IndexTemplateConfig notificationsTemplate = new IndexTemplateConfig(
            NotificationsIndex.NOTIFICATIONS_INDEX,
            "/org/elasticsearch/xpack/core/ml/notifications_index_template.json",
            Version.CURRENT.id,
            "xpack.ml.version",
            Map.of(
                "xpack.ml.version.id",
                String.valueOf(Version.CURRENT.id),
                "xpack.ml.notifications.mappings",
                NotificationsIndex.mapping()
            )
        );

        MlIndexAndAlias.installIndexTemplateIfRequired(
            clusterState,
            client,
            notificationsTemplate,
            TimeValue.timeValueMinutes(1),
            listener
        );
        verify(listener).onResponse(true);
        verifyNoMoreInteractions(client);
    }

    public void testInstallIndexTemplateIfRequired() throws UnknownHostException {
        ClusterState clusterState = createClusterState(Collections.emptyMap());

        IndexTemplateConfig notificationsTemplate = new IndexTemplateConfig(
            NotificationsIndex.NOTIFICATIONS_INDEX,
            "/org/elasticsearch/xpack/core/ml/notifications_index_template.json",
            Version.CURRENT.id,
            "xpack.ml.version",
            Map.of(
                "xpack.ml.version.id",
                String.valueOf(Version.CURRENT.id),
                "xpack.ml.notifications.mappings",
                NotificationsIndex.mapping()
            )
        );

        MlIndexAndAlias.installIndexTemplateIfRequired(
            clusterState,
            client,
            notificationsTemplate,
            TimeValue.timeValueMinutes(1),
            listener
        );
        InOrder inOrder = inOrder(client, listener);
        inOrder.verify(client).execute(same(PutComposableIndexTemplateAction.INSTANCE), any(), any());
        inOrder.verify(listener).onResponse(true);
    }

    public void testCreateStateIndexAndAliasIfNecessary_CleanState() throws UnknownHostException {
        ClusterState clusterState = createClusterState(Collections.emptyMap());
        createIndexAndAliasIfNecessary(clusterState);

        InOrder inOrder = inOrder(indicesAdminClient, listener);
        inOrder.verify(indicesAdminClient).prepareCreate(FIRST_CONCRETE_INDEX);
        inOrder.verify(indicesAdminClient).create(createRequestCaptor.capture(), any());
        inOrder.verify(listener).onResponse(true);

        CreateIndexRequest createRequest = createRequestCaptor.getValue();
        assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX));
        assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true))));
    }

    private void assertNoClientInteractionsWhenWriteAliasAlreadyExists(String indexName) throws UnknownHostException {
        ClusterState clusterState = createClusterState(Collections.singletonMap(indexName, createIndexMetadataWithAlias(indexName)));
        createIndexAndAliasIfNecessary(clusterState);

        verify(listener).onResponse(false);
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPointsAtInitialStateIndex() throws UnknownHostException {
        assertNoClientInteractionsWhenWriteAliasAlreadyExists(FIRST_CONCRETE_INDEX);
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPointsAtSubsequentStateIndex()
        throws UnknownHostException {
        assertNoClientInteractionsWhenWriteAliasAlreadyExists("test-000007");
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPointsAtDummyIndex() throws UnknownHostException {
        assertNoClientInteractionsWhenWriteAliasAlreadyExists("dummy-index");
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasAlreadyExistsAndPointsAtLegacyStateIndex() throws UnknownHostException {
        ClusterState clusterState = createClusterState(
            Collections.singletonMap(LEGACY_INDEX_WITHOUT_SUFFIX, createIndexMetadataWithAlias(LEGACY_INDEX_WITHOUT_SUFFIX))
        );
        createIndexAndAliasIfNecessary(clusterState);

        InOrder inOrder = inOrder(indicesAdminClient, listener);
        inOrder.verify(indicesAdminClient).prepareCreate(FIRST_CONCRETE_INDEX);
        inOrder.verify(indicesAdminClient).create(createRequestCaptor.capture(), any());
        inOrder.verify(indicesAdminClient).prepareAliases();
        inOrder.verify(indicesAdminClient).aliases(aliasesRequestCaptor.capture(), any());
        inOrder.verify(listener).onResponse(true);

        CreateIndexRequest createRequest = createRequestCaptor.getValue();
        assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX));
        assertThat(createRequest.aliases(), empty());

        IndicesAliasesRequest indicesAliasesRequest = aliasesRequestCaptor.getValue();
        assertThat(
            indicesAliasesRequest.getAliasActions(),
            contains(
                AliasActions.add().alias(TEST_INDEX_ALIAS).index(FIRST_CONCRETE_INDEX).isHidden(true),
                AliasActions.remove().alias(TEST_INDEX_ALIAS).index(LEGACY_INDEX_WITHOUT_SUFFIX)
            )
        );
    }

    private void assertMlStateWriteAliasAddedToMostRecentMlStateIndex(List<String> existingIndexNames, String expectedWriteIndexName)
        throws UnknownHostException {
        ClusterState clusterState = createClusterState(
            existingIndexNames.stream().collect(toMap(Function.identity(), MlIndexAndAliasTests::createIndexMetadata))
        );
        createIndexAndAliasIfNecessary(clusterState);

        InOrder inOrder = inOrder(indicesAdminClient, listener);
        inOrder.verify(indicesAdminClient).prepareAliases();
        inOrder.verify(indicesAdminClient).aliases(aliasesRequestCaptor.capture(), any());
        inOrder.verify(listener).onResponse(true);

        IndicesAliasesRequest indicesAliasesRequest = aliasesRequestCaptor.getValue();
        assertThat(
            indicesAliasesRequest.getAliasActions(),
            contains(AliasActions.add().alias(TEST_INDEX_ALIAS).index(expectedWriteIndexName).isHidden(true))
        );
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButInitialStateIndexExists() throws UnknownHostException {
        assertMlStateWriteAliasAddedToMostRecentMlStateIndex(Arrays.asList(FIRST_CONCRETE_INDEX), FIRST_CONCRETE_INDEX);
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButSubsequentStateIndicesExist() throws UnknownHostException {
        assertMlStateWriteAliasAddedToMostRecentMlStateIndex(Arrays.asList("test-000003", "test-000040", "test-000500"), "test-000500");
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButBothLegacyAndNewIndicesExist()
        throws UnknownHostException {
        assertMlStateWriteAliasAddedToMostRecentMlStateIndex(
            Arrays.asList(LEGACY_INDEX_WITHOUT_SUFFIX, "test-000003", "test-000040", "test-000500"),
            "test-000500"
        );
    }

    public void testCreateStateIndexAndAliasIfNecessary_WriteAliasDoesNotExistButLegacyStateIndexExists() throws UnknownHostException {
        ClusterState clusterState = createClusterState(
            Collections.singletonMap(LEGACY_INDEX_WITHOUT_SUFFIX, createIndexMetadata(LEGACY_INDEX_WITHOUT_SUFFIX))
        );
        createIndexAndAliasIfNecessary(clusterState);

        InOrder inOrder = inOrder(indicesAdminClient, listener);
        inOrder.verify(indicesAdminClient).prepareCreate(FIRST_CONCRETE_INDEX);
        inOrder.verify(indicesAdminClient).create(createRequestCaptor.capture(), any());
        inOrder.verify(listener).onResponse(true);

        CreateIndexRequest createRequest = createRequestCaptor.getValue();
        assertThat(createRequest.index(), equalTo(FIRST_CONCRETE_INDEX));
        assertThat(createRequest.aliases(), equalTo(Collections.singleton(new Alias(TEST_INDEX_ALIAS).isHidden(true))));
    }

    public void testIndexNameComparator() {
        Comparator<String> comparator = MlIndexAndAlias.INDEX_NAME_COMPARATOR;
        assertThat(Stream.of("test-000001").max(comparator).get(), equalTo("test-000001"));
        assertThat(Stream.of("test-000002", "test-000001").max(comparator).get(), equalTo("test-000002"));
        assertThat(Stream.of("test-000003", "test-000040", "test-000500").max(comparator).get(), equalTo("test-000500"));
        assertThat(Stream.of("test-000042", "test-000049", "test-000038").max(comparator).get(), equalTo("test-000049"));
        assertThat(Stream.of("test", "test-000003", "test-000040", "test-000500").max(comparator).get(), equalTo("test-000500"));
        assertThat(Stream.of(".reindexed-6-test", "test-000042").max(comparator).get(), equalTo("test-000042"));
        assertThat(Stream.of(".a-000002", ".b-000001").max(comparator).get(), equalTo(".a-000002"));
    }

    private void createIndexAndAliasIfNecessary(ClusterState clusterState) {
        MlIndexAndAlias.createIndexAndAliasIfNecessary(
            client,
            clusterState,
            TestIndexNameExpressionResolver.newInstance(),
            TEST_INDEX_PREFIX,
            TEST_INDEX_ALIAS,
            MasterNodeRequest.DEFAULT_MASTER_NODE_TIMEOUT,
            listener
        );
    }

    @SuppressWarnings("unchecked")
    private static <Response> Answer<Response> withResponse(Response response) {
        return invocationOnMock -> {
            ActionListener<Response> listener = (ActionListener<Response>) invocationOnMock.getArguments()[1];
            listener.onResponse(response);
            return null;
        };
    }

    private static ClusterState createClusterState(Map<String, IndexMetadata> indices) throws UnknownHostException {
        return createClusterState(Version.CURRENT, indices, Collections.emptyMap(), Collections.emptyMap());
    }

    private static ClusterState createClusterState(
        Version minNodeVersion,
        Map<String, IndexMetadata> indices,
        Map<String, IndexTemplateMetadata> legacyTemplates,
        Map<String, ComposableIndexTemplate> composableTemplates
    ) throws UnknownHostException {
        InetAddress inetAddress1 = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, (byte) 0, (byte) 1 });
        InetAddress inetAddress2 = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, (byte) 0, (byte) 2 });
        return ClusterState.builder(ClusterName.DEFAULT)
            .nodes(
                DiscoveryNodes.builder()
                    .add(new DiscoveryNode("foo", new TransportAddress(inetAddress1, 9201), Version.CURRENT))
                    .add(new DiscoveryNode("bar", new TransportAddress(inetAddress2, 9202), minNodeVersion))
                    .build()
            )
            .metadata(
                Metadata.builder()
                    .indices(ImmutableOpenMap.<String, IndexMetadata>builder().putAll(indices).build())
                    .templates(ImmutableOpenMap.<String, IndexTemplateMetadata>builder().putAll(legacyTemplates).build())
                    .indexTemplates(composableTemplates)
                    .build()
            )
            .build();
    }

    private static IndexMetadata createIndexMetadata(String indexName) {
        return createIndexMetadata(indexName, false);
    }

    private static IndexMetadata createIndexMetadataWithAlias(String indexName) {
        return createIndexMetadata(indexName, true);
    }

    private static IndexTemplateMetadata createLegacyIndexTemplateMetaData(String templateName, List<String> patterns) {
        return IndexTemplateMetadata.builder(templateName).patterns(patterns).build();
    }

    private static ComposableIndexTemplate createComposableIndexTemplateMetaData(String templateName, List<String> patterns) {
        return new ComposableIndexTemplate.Builder().indexPatterns(patterns).build();
    }

    private static IndexMetadata createIndexMetadata(String indexName, boolean withAlias) {
        Settings settings = Settings.builder()
            .put(IndexMetadata.SETTING_NUMBER_OF_SHARDS, 1)
            .put(IndexMetadata.SETTING_NUMBER_OF_REPLICAS, 0)
            .put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT)
            .build();
        IndexMetadata.Builder builder = IndexMetadata.builder(indexName).settings(settings);
        if (withAlias) {
            builder.putAlias(AliasMetadata.builder(TEST_INDEX_ALIAS).build());
        }
        return builder.build();
    }
}


text:
package ru.carabi.server.entities;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author sasha
 */
@Entity
@Table(name="USER_RELATION_TYPE")
@NamedQueries ({
	@NamedQuery(name = "getRelationTypesIds",
			query = "select RT.id from UserRelationType RT where RT.sysname in :relations"),
	@NamedQuery(name = "findRelationType",
			query = "select RT from UserRelationType RT where RT.sysname = :name")
})
public class UserRelationType implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name="RELATION_TYPE_ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	private String name;
	private String sysname;
	private String description;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSysname() {
		return sysname;
	}

	public void setSysname(String sysname) {
		this.sysname = sysname;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (id != null ? id.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are not set
		if (!(object instanceof CarabiUser)) {
			return false;
		}
		UserRelationType other = (UserRelationType) object;
		if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
			return false;
		}
		return true;
	}

}


text:
<!DOCTYPE html>

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Getting GitHub to Host Your Images - Josh Oldenburg
    </title>
    <link rel="stylesheet" href="/css/main.css"/>

          <button data-toggle="collapse" data-target=".navbar-collapse" class="navbar-toggle">Toggle navigation</button>Josh Oldenburg

Home

About

Open Source

Contact

Getting GitHub to Host Your Images
Written by Josh
           on
          July 20, 2014

On occasion, I've needed to put images in things like readmes and wikis on GitHub. I don't have a go-to image sharing website, but GitHub will host images for you if you drop them into the comment form on an issue. So, when I need to use an image elsewhere on their website, I drop it into the comment form. I let it upload, then copy the link. I don't post the comment, but I use the resulting URL (something like https://cloud.githubusercontent.com/assets/291371/3639183/ec126d50-1070-11e4-876f-e3cd692756ac.png) where it is needed. GitHub probably doesn't want you using these URLs elsewhere, though, so if you do, I didn't tell you to.

← Home

Copyright © 2014-2018 Joshua Oldenburg


text:
package uk.co.alt236.bluetoothlelib.util;

import java.nio.ByteBuffer;

import androidx.annotation.Nullable;

public class ByteUtils {

    /**
     * The Constant HEXES.
     */
    private static final String HEXES = "0123456789ABCDEF";

    private ByteUtils(){
        // TO AVOID INSTANTIATION
    }

    /**
     * Gets a pretty representation of a Byte Array as a HEX String.
     *

     * Sample output: [01, 30, FF, AA]
     *
     * @param array the array
     * @return the string
     */
    public static String byteArrayToHexString(@Nullable final byte[] array) {
        final byte[] safeArray = array == null ? new byte[0] : array;
        final StringBuilder sb = new StringBuilder();
        boolean firstEntry = true;
        sb.append('[');

        for (final byte b : safeArray) {
            if (!firstEntry) {
                sb.append(", ");
            }
            sb.append(HEXES.charAt((b & 0xF0) >> 4));
            sb.append(HEXES.charAt((b & 0x0F)));
            firstEntry = false;
        }

        sb.append(']');
        return sb.toString();
    }

    /**
     * Checks to see if a byte array starts with another byte array.
     *
     * @param array  the array
     * @param prefix the prefix
     * @return true, if successful
     */
    public static boolean doesArrayBeginWith(final byte[] array, final byte[] prefix) {
        if (array.length < prefix.length) {
            return false;
        }

        for (int i = 0; i < prefix.length; i++) {
            if (array[i] != prefix[i]) {
                return false;
            }
        }

        return true;
    }

    /**
     * Converts a byte array with a length of 2 into an int
     *
     * @param input the input
     * @return the int from the array
     */
    public static int getIntFrom2ByteArray(final byte[] input) {
        final byte[] result = new byte[4];

        result[0] = 0;
        result[1] = 0;
        result[2] = input[0];
        result[3] = input[1];

        return ByteUtils.getIntFromByteArray(result);
    }

    /**
     * Converts a byte to an int, preserving the sign.
     *

     * For example, FF will be converted to 255 and not -1.
     *
     * @param bite the byte
     * @return the int from byte
     */
    public static int getIntFromByte(final byte bite) {
        return bite & 0xFF;
    }

    /**
     * Converts a byte array to an int.
     *
     * @param bytes the bytes
     * @return the int from byte array
     */
    public static int getIntFromByteArray(final byte[] bytes) {
        return ByteBuffer.wrap(bytes).getInt();
    }

    /**
     * Converts a byte array to a long.
     *
     * @param bytes the bytes
     * @return the long from byte array
     */
    public static long getLongFromByteArray(final byte[] bytes) {
        return ByteBuffer.wrap(bytes).getLong();
    }

    /**
     * Inverts an byte array in place.
     *
     * @param array the array
     */
    public static void invertArray(final byte[] array) {
        final int size = array.length;
        byte temp;

        for (int i = 0; i < size / 2; i++) {
            temp = array[i];
            array[i] = array[size - 1 - i];
            array[size - 1 - i] = temp;
        }
    }
}