miércoles, 24 de abril de 2013

Relaciones Multiples en Access


EJEMPLO DE UNO A UNO:
Primer paso: en la pantalla de relaciones agregamos las dos tablas que vamos a relacionar (puedes descargar la base de datos empleado-tablas.mdb, la cual contiene las tablas sin relaciones que puedes ver en la imagen de abajo) . Los dos campos a relacionar son N_EMPLE que aparecen en negrita ya que son clave pricipal...


Segundo paso: arrastramos N_EMPLE de EMPLEADO_PERSONAL hacia N_EMPLE de EMPLEADO_LABORAL. Aparecerá un pequeño cursor como éste ( ) que colocamos encima del campo de destino y soltamos...
Es importante el sentido del arrastre: en toda relación hay siempre una tabla principal y una tabla relacionada (incluso en la relación uno uno). La tabla principal se sitúa en la parte 1 y es la que arrastramos. La tabla relacionada se sitúa en el lado muchos (o el segundo lado 1 en una relación uno a uno) y es donde soltamos el cursor.


Tercer paso: al soltar el cursor en el campo destino, aparce automáticamente la pantalla "modificar relaciones". En la parte superior izquierda aparece el título " Tabla o consulta ", debajo el nombre de la tabla o consulta principal y más abajo el campo (o campos) de relación. En la parte superior centro aparece el título "Tabla o consulta relacionada" que indica tabla y campo relacionado... El botón "Exigir integridad referencial" debe activarse. Con ello Access controlará la coherecia de los datos que existan o introduzcamos en las tablas. En la parte inferior Access indicará automáticamente el tipo de relación que se va a crear.


Una tabla principal (con integridad referencial) tendrá un comportamiento distinto a una tabla relacionada. En nuestro ejemplo EMPLEADO_PERSONAL es la tabla principal, EMPLEADO_LABORAL es la tabla relacionada. Podemos insertar nuevos registros (altas) en EMPLEADO_PERSONAL sin que existan registros relacionados en EMPLEADO_LABORAL. Pero no podemos insertar ningún registro en EMPLEADO_LABORAL sino existe un registro en EMPLEADO_PERSONAL con el que se pueda relacionar. La lógica es la siguiente: puedo insertar los datos personales de un nuevo empleado sin que todavía tenga asignado SALARIO, DEPART, etc. Pero no puedo insertar datos como SALARIO, DEPART, etc de un empleado que tadavía no existe...
Cuarto paso: queda pulsar el botón Crear del paso anterior. Si todo fué correcto la relación se habrá establecido como muestra la imagen siguiente...

EJEMPLO DE UNO A VARIOS:
Para crear una relación de uno a varios se procede de la misma manera. Supongamos que tenemos la tabla DEPARTAMENTO que contiene los nombre de los departamentos de la empresa. El campo COD es un código arbitrario (texto o numérico) que es clave principal, puesto que no hay dos departamentos con el mismo código. El campo Departamento puede ser una descripción del departamento. La relación se establece entre COD y DEPART. La tabla principal es DEPARTAMENTO y tendrá el lado 1. La relacionada es EMPLEADO_LABORAL y tendrá el lado muchos (símbolo de infinito)...

Insertamos la tabla DEPARTAMENTO

Arrastramos COD sobre DEPART

Activamos integridad referencial

Resultado de la relación

INDEFINIDA o INDETERMINADA:
Este tipo de relación aparece cuando no hay coherencia de tipos de datos. Access no puede determinar el tipo de relación que existe entre las tablas. Los datos relacionados de esta manera normalmente son incoherentes y por tanto debe evitarse... Consulta relación indeterminada para explicación detalla. Puedees publicar dudas en el enlace anterior...

Velocidad de internet en el mundo

Velocidad de internet en el mundo



VELOCIDAD-INTERNET-MUNDO



 
Atencion al precio por Mega JApon. Realmente espectacular

Las 50 herramientas de seguridad más utilizadas

Las 50 herramientas de seguridad más utilizadas
Según una encuesta hecha por Insecure.com a 1200 usuarios del NMAP en su lista de correo, las herramientas de seguridad preferidas e independientemente de la plataforma, son las siguientes:  Ordenadas empezando por la más popular, se agrupan utilidades como scanners, sniffers y demás programas de seguridad. Se incluye el enlace para descargarlas y una breve explicación sobre su uso y/o utilidad teniendo en cuenta que hay algunas que no conocía.
* Nessus (http://www.nessus.org): este programa es un scanner de seguridad empleado para hacer más de una auditoría en busca de vulnerabilidades. Consta de dos partes, cliente y servidor (nessusd) con versiones para Windonws, Java y Unix (la parte cliente) y sólo para Unix el servidor. El servidor /daemon realiza los ataques mientras que el cliente interactúa con el usuario a través de un interface gráfico. Pros: desarrolla una completa exploración de todos los puertos y servicios y presenta los puntos vulnerables que encuentra y sus posibles soluciones. Contras: es un poco lento. Como comentario decir que es comparable al Retina.
* Netcat (http://www.atstake.com/research/tools/nc11nt.zip): esta sencilla utilidad para Windows y Unix sirve para escuchar y analizar las conexiones de red usando los protocolos TCP o UDP. Se ha usado bastante para explotar el bug del Isapi en los servidores IIS (ref. Desbordamiento de búfer en el IIS del 21 de junio).
* TCPDump (http://www.tcpdump.org): este sniffer para Unix sirve para monitorizar todo el tráfico de una red, recolectar toda la información posible y detectar así posibles problemas como ataques ping. Combinado con SNORT se convierte en una poderosa herramienta solventando las carencias que ambos porgramas tienen por separado. Es curioso porque podemos servirnos del propio TCPDump para evadir IDSs de los que forma parte porque presenta una vulnerabilidad en las capacidades de decodificación de DNS y puede entrar en un loop infinito que nos permita saltarnos ese IDS (Sistema de Detección de Intrusos).
* Snort (http://www.snort.org): sniffer/logger, Snort sirve para detectar intrusiones y ataques tipo búfer overflows, CGI, SMB, scanneo de puertos, etc. Snort puede enviar alertas en tiempo real, enviándolas directamente al archivo de Unix syslog o incluso a un sistema Windows mediante SAMBA. Las versiones anteriores a la 1.8.1 presentan una vulnerabilidad en la codificación Unicode que posibilita que un atacante evada dicha detección.
* Saint (http://www.wwdsi.com/saint): Security Administrator’s Integrated Network Tool (SAINT) es una evolución del conocido SATAN para plataformas Unix que sirve para evaluar toda la seguridad de un sistema recibiendo incluso múltiples updates desde el CERT y CIAC.
* Ethereal (http://ethereal.zing.org): este sniffer de red para Unix tiene un entorno gráfico y soporta decodificación de diversos protocolos pero presenta una vulnerabilidad de búfer overflow (versiones anteriores a la 0.8.14).
* Whisker (http://www.wiretrip.net/rfp/bins/whisker/whisker.zip): buen scanner de vulnerabilidades CGI.
*
ISS (http://www.iss.net): Internet Security Scanner es una herramienta comercial de análisis de vulnerabilidades para Windows.
* Abacus Portsentry (http://www.psionic.com/abacus/portsentry): demonio de Unix para detectar scanneos de puertos contra nuestros sistemas capaz de bloquear al atacante mediante host.deny, filtrar las rutas o reglar el firewall.
* DSniff (http://naughty.monkey.org/~dugsong/dsniff): el nombre ya lo dice todo… este es un sniffer para buscar passwords y el resto de información de una red incluyendo técnicas sofisticadas para defender la “protección” de los switchers de red.
* Tripwire (http://www.tripwire.com): esta es una utilidad para el análisis de red que sirve de gran ayuda a los adminsitradores de red.
* Cybercop (http://www.pgp.com/products/cybercop-scanner/default.asp): este es un scanner de agujeros de seguridad comercial que tiene versiones para Windows y Unix y que es capaz de auditar servidores, estaciones de trabajo, hubs, routers, firewalls, etc.
* Hping2 (http://www.hping.org): este programa basado en el comando ping de Unix sirve para enviar paquetes ICMP,UDP y TCP hechos a medida para mostrar las respuestas del obejtivo como replicas ICMP echo (ping). Con hping conseguimos testar firewalls, scannear puertos, etc. Nota: ICMP (Protocolo de Mensajes de Control Internet).
* SARA (http://www-arc.com/sara): Security Auditor’s Research Assistant es la tercera generación de herramientas para el análisis de seguridad en plataformas Unix. La primera fue el SATAN (Security Administrator’s Tool for Analizing Networks) y la segunda el SAINT.
* Sniffit (http://reptile.rug.ac.be/~coder/sniffit.html): otro sniffer de paquetes TCP/UDP e ICMP capaz de obtener información técnica muy detallada.
* SATAN (http://www.fish.com/satan): hace falta decir algo sobre el más famoso scanneador de vulnerabilidades y analizador de red.
* IPFilter (http://coombs.anu.edu.au/ipfilter): este es un filtro de paquetes TCP/IP indicado para el uso con un firewall en plataformas Unix. Puede trabajar como un módulo cargable del kernel o incorporado en él directamente. Curiosamente, las versiones previas a la 3.4.17 presentan una vulnerabilidad que permite alcanzar puertos TCP y UDP teóricamente protegidos.
* IPtables/netfilter/ipchains/ipfwadm (http://netfilter.kernelnotes.org): herramientas para filtrar los paquetes IP bajo Linux.
* Firewalk (http://www.packetfactory.net/Projects/Firewalk): programa para analizar las respuestas a los paquetes IP con la técnica del Firewalking con una interface gráfica (opcional) para determinar los filtros ACL de los gateways y los mapeos de red.
* Strobe (http://www.insecure.org/nmap/index.html#other): scanneador de puertos de gran velocidad.
* L0pht Crack (http://www.l0pht.com/l0phtcrack): Esta es la conocida herramienta de auditoría para los passwords bajo Windows. La última versión es la LC3.
* John the Ripper (http://www.openwall.com/join): esta es una de esas utilidades que, yo por lo menos, recuerdo de toda la vida. Es uno de los programas que yo utilizaba cuando empecé a hacer mis primeros pinitos en esto del hack y la verdad es que era el mejor crackeador de passswords para Unix.
* Hunt (http://www.cri.cz/kra/index.html#HUNT): este es un sniffer avanzado que funciona bajo redes ethernet pero que no conocía así que poca cosa puedo decir.


* SSH (http://www.ssh.com/commerce/index.html): Tenemos dos opciones usar el SSH que es de pago o utilizar en cambio el OpenSSH que es una evolución del ssh para OpenBSD. SSH o Secure Shell, es un protocolo o programa que se sirve de dicho protocolo, que permite una conexión cifrada y protegida entre dos máquinas (normalmente cliente servidor) que sirve para substituir al telnet y poder acceder y administrar sistemas remotos de manera segura.
* TCP Wrappers (ftp://ftp.porcupine.org/pub/security/index.html): pequeños programas que permiten una conexión controlada, restringiendo determinados servicios del sistema. Se pueden monitorizar y filtrar las peticiones de entrada de servicios como Systar, Finger, FTP, Telnet, Rlogin, RSH, TFTP, etc. El wrapper reporta el nombre del cliente y del servicio que ha solicitado pero no intercambia información con el cliente o el servidor de la aplicación/servicio solicitado porque lo que hace es comprobar si el cliente tiene permiso para utilizar el servicio que está pidiendo y si no es así, corta la conexión.
* NTOP (http://www.ntop.org): utilidad para Unix que permite visualizar en tiempo real los usuarios y aplicaciones que están consumiendo recursos de red en un instante concreto. Tiene como un microservidor web que permite que cualquier usuario que sepa la clave pueda ver la salida NTOP de forma remota con cualquier navegador.
* Traceroute/ping/telnet (http://www.linux.com): herramientas de Unix y Windows (en este sistema operativo el comando treceroute se denomina tracert).
* NAT (http://www.tux.org/pub/security/secnet/tools/nat10): NetBios Auditing Tool sirve para explorar los recursos compartidos a través del protocolo NetBios en un sistema windows.
* Scanlogd (http://www.openwall.com/scanlogd): programita que detecta los scanneos de puertos que alguien pueda hacer contra tu sistema.
* Sam Spade (http://www.samspade.org): herramientas online para investigar una dirección IP y encontrar spammers.
* NFR (http://www.nfr.org): Network Flight Recorder es un sniffer comercial para detectar intrusiones en los sistemas.
* Logcheck (http://www.psionic.com/abacus/logcheck): es parte del proyecto Abacus de utilidades de seguridad que ayuda a mostrar los problemas y violaciones de seguridad en los archivos log del sistema, analizando cada línea y clasificándola según diferentes niveles de alerta (ignorar, actividad inusual, violación de seguridad y ataque) para luego enviar los resultados al administrador por e-mail.
* Perl (http://www.perl.org): Practical Extraction and Report Language es un lenguaje de scripts que corre en cualquier sistema operativo y que sirve, entre otras múltiples cosas, para crear exploits y explotar las vulnerabilidades de los sistemas.
* Ngrep (http://www.packetfactory.net/Projects/ngrep): herramienta sensible a pcap que permite especificar expresiones regulares extendidas contra la carga de datos de los paquetes. Actualmente reconoce TCP, UDP e ICMP sobre ethernet a través de PPP, SLIP e interfaces nulos.
* Cheops (http://www.marko.net/cheops): sirve para mapear redes locales o remotas y muestra qué Sistema Operativo (SO) tienen las máquinas de la red.
* Vetescan (http://www.self-evident.com): es un scanneador de vulnerabilidades que contiene programas para comprobar y/o explotar exploits conocidos de redes para Windows y Unix y corregirlos.
* Retina (http://www.eeye.com/html/Products/Retina.html): este programa es un conocido scanneador de vulnerabilidades que es comercial y que incluye la forma de arreglar todos los agujeros de seguridad que encuentre. Es para Windows.
* Libnet (http://www.packetfactory.net/libnet): conjunto de rutinas para la construcción y guía de una red.
* Crack (ftp://ftp.cerias.purdue.edu/pub/tools/unix/pwdutils/crack/): este programa es un password cracker.
* Cerberus Internet Scanner (http://www.cerberus-infosec.co.uk/cis.shtml): CIS es otro scanner de seguridad destinado a ayudar a los administradores de red de Windows a detectar y corregir agujeros de seguridad.
* Swatch (http://www.stanford.edu/~atkins/swatch): utilidad para monitorizar los mensajes de los archivos log de Unix mediante el comando syslog lanzando eventos con múltimples métodos de alarma.
* OpenBSD (http://www.openbsd.org): OpenBSD es una distribución libre de sistemas Unix multiplataforma basada en 4.4BSD. OpenBSD incluye emulación de binarios para la mayoría de los programas de los sistemas SVR4 (Solaris), Linux, SunOS, HP-UX, etc e incluye también OpenSSH con soporte para SSH1 y SSH2.
* Nemesis (http://www.packetninja.net/nemesis).
* LSOF (http://vic.cc.purdue.edu/pub/tools/unix/lsof): herramienta de diágnostico de sistemas Unix que lista la información de cualquier archivo que es abierto por un proceso que se esté ajecutando. Muy útil para detectar troyanos y sniffers.
* LIDS (http://www.turbolinux.com.cn/lids): este es un sistema de detección/defensa para Linux contra intrusiones de root deshabilitando algunas llamadas del sistema al kernel.
* IPTraf (http://www.mozcom.com/riker/iptraf): monitor de red que genera multitud de estadísticas como información TCP, contador UDP, información ICMP y OSPF, estado de los nodos, errores IP, etc.
* IPLog (http://ojnk.sourceforge.net): logger del tráfico TCP/IP, UDP e ICMP que detecta scanneos y posibles ataques para sistemas Unix.
* Fragrouter (http://www.anzen.com/research/nidsbench): ni idea.
* QueSO (http://www.apostols.org/projects/queso): utilidad para averiguar qué Sistema operativo corre en una máquina remota analizando las respuestas TCP. Funciona bajo Unix (Linux) y algunas de sus pruebas de detección han sido incluidas al famoso programa NMAP.
* GPG/PGP (http://www.gnupg.org y http://www.pgp.com): substituto del PGP con licencia GNU desarrollado en Europa que no utiliza ni el algoritmo RSA ni IDEA y que por ello no tiene ningún tipo de restricción. PGP o Pretty Good Privacy es el famoso sistema de encriptación que ayuda a asegurar y codificar la información contra posibles “escuchas”.

¿De dónde viene la electricidad?

¿De dónde viene la electricidad?
Electricidad de una casa viene de una central eléctrica. En todas las centrales eléctricas, alguna clase de fuerza hace que una rueda enorme gira a gran velocidad.
Central electrica

Esta rueda hace girar una máquina llamada generador y esto es lo que produce la electricidad. Algunas centrales eléctricas obtiene su fuerza de la combustión de carbón o petróleo, otras contienen la electricidad gracias a la fuerza del agua corriente o de la potencia nuclear.

De cualquier forma la energía más limpia sigue siendo la energía eólica, producida por los molinos de viento, y la energía solar producida por las placas solares.
La mayoría de las centrales eléctricas tiene más de un generador para poder producir gran cantidad de equidad.
Un transformador aumenta la potencia de la electricidad demo de modo que los cables puedan llevarla a grandes distancias. En una subestación otro transformador disminuye la potencia de la electricidad, para que esté lista para ser usada en las casas. La electricidad fluye desde la subestación a las casas a través de cables subterráneos , y, por último, la electricidad centra en cada casa por un contador que  cuenta la cantidad de electricidad que se utiliza..

¿Cómo funciona un teléfono?

¿Cómo funciona un teléfono?
Un teléfono convierte el sonido de tu voz en señales eléctricas y las envía por los cables a la central telefónica. Desde allí, las señales son enviadas al teléfono de la persona con la que estás hablando, donde vuelven a convertirse en sonidos. Las señales viajan también desde el teléfono de la otra persona al tuyo para que puedas escuchar su voz. Un interruptor en la base del teléfono o corta cuando dejas el receptor. En el auricular, un pequeño altavoz convierte las señales en  ondas sonoras que recoge tu oído. Un altavoz en la base hacia un sonido de timbre zumbido, que significa caliente está llamando y, por último, un micrófono convierte las ondas sonoras de tu voz en señales eléctricas. Éstas serían las partes básicas de un teléfono estándar, pero los teléfonos móviles son algo distintos.
¿Cómo funciona un teléfono? 
 
Las partes básicas del teléfono móvil son las mismas, el auricular, el altavoz,… Pero su funcionamiento es ligeramente distinto.
No se si te lo has fijado en tu ciudad que hay cientos de antenas de telefonía sobre los tejados más altos de las casas. Esto es porque, para que tenga cobertura cualquier teléfono móvil, siempre ha de tener una antena cerca. Cuando llamas desde tu teléfono móvil la señal va directamente al receptor más cercano y éste, a su vez, repite la señal hasta el receptor más cercano del teléfono que llamas.
 

Filtrar tablas dinámicas en Excel

Filtrar tablas dinámicas 


Las tablas dinámicas ya estaban disponibles en versiones anteriores de Excel, permitiendo resumir la información de una lista o base de datos. Pero Excel 2000 las ha mejorado considerablemente. Uno de los aspectos más útiles es que ahora no sólo podemos filtrar la tabla por los campos ubicados en la posición página, sino que además podemos filtrar los ubicados en las posiciones fila y columna. Esto aumenta enormemente la flexibilidad de la información resumida en la tabla.

Para crear una tabla dinámica usaremos la opción Datos•Informe de tablas y gráficos dinámicos. Con ello se entra en un asistente de tres pasos que guía el proceso de creación. Para concretar la información que debe mostrar la tabla, pulsaremos en el paso 3 el botón Diseño. Al finalizar, veremos la tabla en pantalla, con los botones de campo disponibles para aplicar filtros.

Bases de datos Relacionales en Access

Una base de datos relacional permite la utilización simultánea de datos procedentes de más de una tabla .

Al hacer uso de las relaciones, se evita la duplicidad de datos , ahorrando memoria y espacio en el disco , aumentando la velocidad de ejecución y facilitando al usuario/a el trabajo con tablas.
Para conseguir una correcta base de datos relacional es imprescindible realizar un estudio previo del diseño de la base de datos.
Para poder relacionar tablas entre sí se deberá especificar un campo en común que contenga el mismo valor en las dos tablas y dicho campo será clave principal en una de ellas.
Las tablas se relacionan de dos a dos, donde una de ellas será la tabla principal de la que parte la relación y la otra será la tabla secundaria destino de la relación.  
Se pueden distinguir tres tipos de relaciones:
Relación Uno a Uno : Cuando un registro de una tabla sólo puede estar relacionado con un único registro de la otra tabla y viceversa .
Por ejemplo: tenemos dos tablas una con los datos de diferentes poblaciones y otra con una lista de Alcaldes, una población sólo puede tener un alcalde, y un alcalde lo será únicamente de una población.
Relación Uno a Varios : Cuando un registro de una tabla (tabla secundaria) sólo puede estar relacionado con un único registro de la otra tabla (tabla principal) y un registro de la otra tabla (tabla principal) puede tener más de un registro relacionado en la primera tabla (tabla secundaria).
Por ejemplo: tenemos dos tablas una con los datos de diferentes poblaciones y otra con los habitantes, una población puede tener más de un habitante, pero un habitante pertenecerá (estará empadronado) en una única población.
Relación Varios a Varios : Cuando un registro de una tabla puede estar relacionado con más de un registro de la otra tabla y viceversa .
Por ejemplo: tenemos dos tablas una con los datos de clientes y otra con los artículos que se venden en la empresa, una cliente podrá realizar un pedido con varios artículos, y un artículo podrá ser vendido a más de un cliente.
Las relaciones varios a varios se suelen representar definiendo una tabla intermedia entre las dos tablas. Siguiendo el ejemplo anterior sería definir una tabla lineas de pedido relacionada con clientes y con artículos. 
La integridad referencial es un sistema de reglas que utiliza Access2000 para asegurarse que las relaciones entre registros de tablas relacionadas son válidas y que no se borren o cambien datos relacionados de forma accidental.
Al exigir integridad referencial en una relación le estamos diciendo a Access2000 que no nos deje introducir datos en la tabla secundaria si previamente no se han introducido en la tabla principal .
Por ejemplo: siguiendo con el ejemplo anterior del tipo de relación Uno a Varios, no nos dejará introducir un habitante a una población si dicha ciudad no existe en la tabla de Poblaciones.
  La integridad referencial dispone de dos acciones:
Actualizar registros en cascada : Cuando se cambie el valor del campo de la tabla principal, automáticamente cambiarán los valores de sus registros relacionados en la tabla secundaria.
Por ejemplo: Si cambiamos el nombre de la población Onteniente por Ontinyent en la tabla de poblaciones, automáticamente todos los habitantes de Onteniente se cambiarán a Ontinyent.
Eliminar registros en cascada : Cuando se elimina un registro de la tabla principal se borrarán también los registros relacionados en la tabla secundaria.
Por ejemplo: Si borramos la población Onteniente en la tabla de poblaciones, automáticamente todos los habitantes de Onteniente se borrarán de la tabla de habitantes.

martes, 23 de abril de 2013

Metodos de Ordenamientos y Busqueda - Programacion

Metodos de Ordenamientos y Busqueda - Programacion 

 

Los metodos que se veran a continuacion son:

  • Ordenamiento por Burbuja

  • Ordenamiento por Burbuja Mejorada

  • Ordenacion por Seleccion

  • Busqueda Binaria

  • Busqueda Lineal

 
Aqui les dejo una ampliacion de la imagen xq se redimenciono la que se guardo en el blog.
 




Aprende Ajax desde cero

Aprende Ajax desde cero

 AJAX es el acrónimo de Asynchronous JavaScript And XML o lo que es lo mismo Javascript asíncrono y xml. Se trata de una tecnología para hacer peticiones asíncronamente y por lo tanto no tener que refrescar toda la página para interactuar con el servidor. Estas llamadas se hacen utilizando Javascript a través del objeto XmlHttpRequest, que sirve de interfaz entre los datos de la página y el servidor.


 Las posibilidades son infinitas, por ejemplo la recarga de datos en combos dependientes, inputs con autocompletado para búsquedas, controles de pestañas más fluidos, formularios de login, etc. Al final el objetivo que buscamos con Ajax es obtener aplicaciones web RIA (Rich Internet Applications) o lo que es lo mismo, aplicaciones dinámicas y fluidas, independientes del sistema operativo y que sean agradables para el usuario.

Objeto XmlHttpRequest

 A continuación hablaré de cada uno de los métodos y propiedades de que dispone el objeto XmlHttpRequest.
·         Disponemos de las siguientes propiedades:
o   readyState: Se trata de un valor numérico que indica el estado de la petición. Se utiliza sobre todo en el evento onreadystatechange de llamadas asíncronas (visto más adelante). Posibles valores:

§  0: No inicializado. El objeto ya se ha creado pero todavía no se ha realizado la petición mediante el método send.
§  1: Abierto. Se acaba de llamar al método send.
§  2: Enviando. Se está enviando la petición al servidor.
§  3: Recibiendo. Se está recibiendo la respuesta del servidor.
§  4: Completado. Ya se ha obtenido la respuesta del servidor y podemos acceder a la propiedad responseText y responseXml.

o   responseText: Almacena la respuesta a la petición en forma de texto.
o   responseXML: Almacena la respuesta a la petición en forma de xml. Por ejemplo si la url a la que llamamos devuelve código html, podremos insertarlo directamente en el DOM haciendo un appendChild mediante javascript. En el caso de responseText se puede insertar a través de la propiedad innerHTML.
o   status: Código http devuelto por el servidor. Por ejemplo, para comprobar que una petición ha obtenido una respuesta válida se comprueba que el código sea 200.
o   statusText: Es el texto equivalente al status code devuelto por el servidor.

·         Estos son los métodos disponibles:
o   abort(): Aborta la petición.
o   getAllResponseHeaders(): Devuelve todas las cabeceras de la respuesta.
o   getResponseHeader(‘cabecera’):  Devuelve el contenido de la cabecera especificada.
o   onreadystatechange: Es un evento que se lanza cada vez que cambia el estado de la petición. Para comprobar el estado tenemos la propiedad readyState.
o   open(’metodo’, ‘url’, async): Establece el tipo de petición y la url. Opcionalmente se puede indicar si la petición será síncrona o asíncrona y el usuario y password si se requiere autenticación.
o   send(contenido): Es el método que lanza la petición. Si usamos el método POST, habrá que pasarle los datos por parámetro. En el caso de GET, bastará con enviar null.
o   setRequestHeader(‘cabecera’, ‘valor’) : Sirve para establecer una cabecera personalizada. Se suele utilizar para establecer el tipo de contenido como codificado en las peticiones por POST .

Ejemplo paso a paso

 Se trata de un ejemplo muy sencillo en ASP.NET que nos permitirá tener una visión global del funcionamiento de las peticiones AJAX. Consistirá en obtener la hora del servidor sin refrescar la página. En primer lugar hablaré de la parte del cliente y a continuación de la parte del servidor.
 En la parte del cliente crearemos un archivo Ajax.js en el que añadiremos toda la lógica necesaria. Lo primero que necesitamos para trabajar con Ajax es un objeto XmlHttpRequest , pero como todos sabemos, no todos los navegadores utilizan la misma notación, por lo que crearemos una función que nos devolverá una instancia de este objeto dependiendo del navegador:
//Obtiene una instancia del objeto XmlHttpRequestfunction ObtenerObjetoAjax() {

var peticionHttp = null;
try {
//Comprobación para navegadores Firefox, Opera y Safari
if (window.XMLHttpRequest) {
peticionHttp = new XMLHttpRequest();
}
//Comprobación para navegadores IE
else if (window.ActiveXObject) {
//Comprobamos para JavaScript 5.0. Si da error,
//creamos un objeto con la versión anterior
try {
peticionHttp = new ActiveXObject("Microsoft.XMLHTTP2");
}
catch (e1) {
peticionHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
//Comprobación para IceBrowser
else if (window.createRequest) {
peticionHttp = window.createRequest();
}
//Si el navegador no soporta ajax retornamos null
else {
peticionHttp = null;
}
}
catch (e2) {
return null;
}
return peticionHttp;
}

 A continuación crearemos la función que envíe la petición al servidor:
//Realiza una petición asíncronamente al servidor

//url: Url dónde realizar la petición

//tipoResultado: Puede set 'XML' o 'TEXT'

//metodo: Tipo de petición. Puede ser 'GET' o 'POST'

//parametrosPost: Parámetros para peticiones tipo POST

//cacheDatos: Indica si se cachearán las peticiones por GET en IE

//funcionPintarDatos: Función para manejar las acciones a realizar en 

//                    cada estado de la peticiónfunction ObtenerDatosASinc(url, tipoResultado, metodo, parametrosPost, 

     cacheDatos, funcionPintarDatos) {

try {
//Obtenemos la instancia del objeto XmlHttpObject
var objAjax = ObtenerObjetoAjax();
//Nos suscribimos al evento onreadystatechange para manejar los
//posibles estados de la petición para que se lance la
//función recibida por parámetro
objAjax.onreadystatechange = function() {
switch (objAjax.readyState) {
//Petición no inicializada
case 0:
break;
//Conexión con el servidor establecida
//(llamada a send)
case 1:
break;
//Enviando petición
case 2:
//Aquí se podría mostrar un gif que indicase
//que se está realizando la petición al servidor
//Habría que ocultarlo en el caso 4,
//cuando ya se ha recibido la respuesta
break;
//Recibiendo petición
case 3:
break;
//Respuesta del servidor recibida
case 4:
//Si el status code de la respuesta es 200,
//todo ha ido bien
if (objAjax.status == 200) {
switch (tipoResultado) {
case 'XML':
funcionPintarDatos(objAjax.responseXML);
break;
case 'TEXT':
funcionPintarDatos(objAjax.responseText);
break;
default:
funcionPintarDatos(objAjax.responseText);
break;
}
}
//Si no, no ha ido bien y retornamos el texto
//equivalente al status code
else {
switch (tipoResultado) {
case 'XML':
funcionPintarDatos(
'<a>' + objAjax.statusText + '</a>');
break;
case 'TEXT':
funcionPintarDatos(objAjax.statusText);
break;
default:
funcionPintarDatos(objAjax.statusText);
break;
}
}
break;
//No hay más estados en la petición,
//por lo que no hacemos nada
default:
break;
}
};
//Si realizamos la petición por POST
if (metodo == 'POST') {
//Si no recibimos parámetros ponemos la variable a null
if (parametrosPost == 'undefined' || !parametrosPost) {
parametrosPost = null;
}
objAjax.open('POST', url, true);
objAjax.setRequestHeader('Content-type',
'application/x-www-form-urlencoded');
objAjax.send(parametrosPost);
}
//Si no la realizamos por GET.
else {
//Internet Explorer cachea las peticiones por GET,
//por lo que agregamos un parametro random si se
//quiere evitar
if (!cacheDatos) {
var separadorUrl =
(url.indexOf('?') > -1) ? '&' : '?';
url += separadorUrl + 'rndCache=' + Math.random();
}
objAjax.open('GET', url, true);
objAjax.send(null);
}
}
catch (e) {
//Si hay un error mostramos su mensaje
alert(e.message);
}
}



 Para hacer la prueba tenemos que crear dos funciones más, la que pinte los datos y a la que llamaremos desde la página. La petición será por GET y la respuesta se devolverá en forma de texto.
 El parámetro que se pasa como false a la función ObtenerDatosASinc indica que no se cacheará la respuesta, cosa que en Internet Explorer ocurre por defecto para las peticiones por GET. De este modo siempre nos devolverá el nuevo valor de la respuesta del servidor.
//Realiza una petición asíncrona al servidor para obtener la hora
function ObtenerHora() {
   
ObtenerDatosASinc('HoraServidor.aspx', 'TEXT', 'GET', null, false, PintarHora);
}   
//Función para pintar los datos recibidos del servidor
function PintarHora(datos) {
   
 document.getElementById('idDivDestino').innerHTML = datos;   
}

  A continuación crearemos una página de prueba en la que agregaremos un div en el que se pintarán las respuestas del servidor, y un botón que será el que lance la petición. Como se observa en el código, añadiremos una referencia al archivo Ajax.js, que es dónde hemos metido toda la lógica de cliente.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PaginaPrueba.aspx.cs"
Inherits="PaginaPrueba" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
     <script language="javascript" type="text/javascript" src="Ajax.js"></script>
 </head>
<body>
    <form id="form1" runat="server">
    <asp:Button runat="server" ID="btnHora" Text="Obtener hora del servidor"
OnClientClick="ObtenerHora(); return false;" />
    <div id="idDivDestino">
    </div>
    </form>
</body>
</html>

  Por último crearemos una nueva página llamada HoraServidor.aspx, que retornará la hora del servidor en la respuesta:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="HoraServidor.aspx.cs"
Inherits="HoraServidor" %>
<% 
    Response.Clear();
    Response.Write(DateTime.Now.ToString());
%>

Conclusión


 En este artículo se han descrito los conceptos básicos de la tecnología Ajax y sus ventajas, además de un ejemplo para facilitar su comprensión. Aparentemente puede parecer tedioso, pero una vez te acostumbras a usarlo, el concepto de página web cambia para siempre, ya que nos permite crear aplicaciones más fluidas y similares a las de escritorio de toda la vida.
 Esto es la base de Ajax, y por supuesto, existen numerosos frameworks con herramientas que facilitan el desarrollo en tiempo y diseño. Por ejemplo ASP.NET posee la librería Atlas que nos permite hacer uso de esta tecnología casi sin pensar en cómo funciona, ya que se encarga de gestionar todas las operaciones internamente.
 Otra librería muy recomendada es AjaxPro, ya que es potente y a la vez ligera. Con ella podemos realizar llamadas a funciones de clases del servidor de manera muy sencilla. En su página web tienen un ejemplo como el que os he mostrado, usando esta librería, que como comprobaréis reduce bastante la complejidad.
 Espero que después de leer este tutorial le cojáis gusto a esta tecnología, porque la tendencia actual en el diseño de aplicaciones es la distribución de servicios, y nada mejor que una aplicación web con una buena interfaz RIA para centralizarlos y explotarlos desde cualquier lugar.