Instalacion de Apache Tomcat 7 en Windows

Mini tutorial (con imágenes) sobre la instalación de Apache tomcat 7 en Windows. Dado que he decido volver a retomar la programación en Java quiero dejar constancia con estas breves notas sobre la instalación de Apache Tomcat. Sobre la terminología y conceptos no daré muchos detalles específicos sino solo a grandes rasgos, daré por hecho que si tu también quieres instalarlo es porque ya tienes nociones de programación en Java o al menos sabes algo sobre el tema.

Como dijo Jack El Destripador, vayamos por partes…

¿Que es Apache Tomcat?

Es un Software de código abierto para la implementación (vaya, programación) de Servlets y tecnologías JavaServer Pages (JSP) los cuales derivan de Java. En sí Apache Tomcat actúa como un contenedor web para ejecutar Servlets/JSP.

Descargar el instalador de Tomcat

Para descargar tomcat hay que visitar la dirección http://tomcat.apache.org/ y en el panel derecho (sección Download) elegir una versión de Apache Tomcat:

A la fecha de hoy la versión más reciente de Tomcat es la version 7.0.37, pero ¿Cual versión que debes bajarte? Si observas esa misma pregunta está en la página de tomcat (en esta página) en la sección de descargas. Como ellos mismos explican, la versión depende de la especificación de Servlets y JSP’s que vayas a usar a la hora de estar programando.

En mi caso como voy a usar Tomcat para pruebas y además quiero aprender lo más reciente sobre servlets y jsp entonces me bajare la versión más reciente de Apache Tomcat, es decir, la versión que mencione anteriormente, da click en la versión elegida y podrás ver una pantalla similar a la siguiente:

Aquí debes el servidor espejo y el formato en el que deseas descargar el instalador de Apache Tomcat (formato zip, tar, instalador .exe, etc). En mi caso me bajare la versión: 32-bit/64-bit Windows Service Installer. Esta versión es una versión para windows el cual permite instalar Tomcat con un asistente de instalación, además, permite ejecutar apache de forma automática al encender la pc con un servicio de Windows.

De preferencia descárgalo en el escritorio para fácil ubicación y borrado (después de instalarlo):

Ahora que ya lo tienes en el escritorio hay que darle doble click para ejecutarlo e iniciar el asistente de instalación:

Instalacion de Apache Tomcat

Ahora procederemos a instalar Apache Tomcat. Al dar doble click sobre el icono del escritorio, se abre el asistente de instalación.

Paso 1: Bienvenida

En este paso se te da la bienvenida al asistente y se te indica que cierres todos los programas aplicativos antes de iniciar dicha instalación:

En realidad eso de cerrar las aplicaciones no es tan necesario (aplicaba para versiones anteriores de Windows) pues hoy en día yo desde que tenía windows Xp he instalado muchos programas en Windows que también indican que cierres y se instalan y funcionan sin problemas. Pero por si las dudas si gustas tú puedes cerrarlas. Da click en el botón Next (siguiente) para pasar al siguiente paso de instalación.

Paso 2: Aceptar el acuerdo de licencia

Esta pantalla del asistente te muestra el acuerdo de licencia, léelo; en resumen te indica los términos y condiciones a los que te sometes si usas el programa. Apache Tomcat es un Software libre de código abierto que se distribuye bajo la licencia de Apache. Así que no creo que tengas mucho de qué preocuparte al usar este Software. No digo que no lo hagas, si es tu deseo, hazlo:

Si estas de acuerdo, da click en el botón I Agree (Si Acepto) para aceptar el acuerdo de licencia y pasar al siguiente paso.

Paso 3: Elegir los componentes a instalar

Este paso te permite indicar los componentes de Apache Tomcat que deseas instalar, algunos son opcionales, te recomiendo que dejes los que están marcados por defecto pues creo que si tienen utilidad, por ejemplo la opción ‘Start Menu Items’ te crea unos accesos directos en el Menú inicio para que desde ahí puedes abrir Tomcat en caso de que no los programes con ejecución automática (cada vez que se enciende la computadora).

La opción Documentation. Te copia la documentación de Tomcat en la carpeta de instalación (mas adelante indicaremos donde se instalara). Por cierto, la documentación te recomiendo que la instales y que la leas pues es muuy buena. Muchas veces instalamos un programa y nos ponemos a buscar tutoriales y videos, etc. acerca del uso del programa sin revisar la documentación de los creadores del programa (la oficial), no hay nada mejor que la doc. oficial de un programa para aprender a usarlo. Así que deja de buscar por otros lados tutoriales, manuales y primero que nada revisa esta documentación que aunque esta en inglés es muy útil.
La opción Manager: Instala una aplicacion Web para administrar Tomcat.
La opción Examples: Instala ejemplos de Servlets y JSPs.

Selecciona los componentes que desees y da click al botón Next para ir al siguiente paso del asistente.

Paso 4: Nombre del servicio y login del administrador


En este paso puedes configurar varias cosas, te recomiendo dejarlas como están, te explico algunas opciones:
Windows Service Name. El instalador automáticamente te crea un servicio para que al encender la PC te arranque Apache tomcat. Esta opción te permite especificar el nombre de dicho servicio de Windows. En la imagen se observa que a este servicio le asigne el nombre contenedor_tomcat7. Más adelante explicare como configurar este servicio para que no arranque Tomcat de forma automática.

En la sección Tomcat Administrator Login (optional):
User name: Aquí puedes especificar el nombre de usuario del administrador de tomcat y en la caja de texto password especificas la contraseña de dicho usuario.
Roles: Te permite especificar el rol del usuario, te recomiendo dejar el que esta por defecto (manager-gui) ya que ese te permite accesar a la aplicación web para administrar Tomcat. Da click en el boton Next para avanzar al siguiente paso.

Paso 5: Eleccion del Java Runtime Environment (JRE)


Como decía al inicio, Tomcat te permite la ejecución de tecnologías Servlets y JSPs, por lo tanto necesita de una Máquina Virtual de Java (JVM), en este paso debes elegir la ruta de instalación de una JVM. El instalador de Apache Tomcat por defecto ya trae un JRE que usa para ejecutar el servicio de Windows, pero el también usa el registro de Windows para determinar la ruta base de Java o JRE que pudiéramos tener preinstalados.

A menos que sepas donde esta una versión mas reciente, te recomiendo que dejes la ruta tal y como esta des click en el botón Next para ir al siguiente paso.

Paso 6: Ruta de instalacion de Apache Tomcat


En este paso debemos elegir una carpeta donde se instalara Apache Tomcat. Cabe mencionar que constantemente en tutoriales, manuales, libros, etc. encuentres muchas referencias la palabra $CATALINA_HOME. Ésta representa la carpeta de instalación de tomcat, independientemente si es Linux o Windows.

A menos que tengas poco espacio en disco o quieras instalarlo en otro lugar especifico, te recomiendo que dejes la ruta predeterminada y des click al botón install para iniciar la copia de los archivos del instalador al disco duro.

Copia de los archivos de Apache Tomcat

Despues de dar click al boton install veras una pantalla similar a la siguiente; en la cual se observa el progreso de la copia de archivos, creacion del servicio, etc.

Una vez que el instalador ha terminado de copiar los archivos te muestra la siguiente pantalla en la cual se te indica que ha sido completado el asistente de instalación de Apache Tomcat:

Además, te da la opción de arrancar Apache Tomcat (inicia el servicio de windows) y/o leer el archivo léame que contiene información sobre la versión instalada. Si eliges iniciar Tomcat te mostrara una barra de progreso

y si no hay ningún problema mostrara un nuevo icono en la bandeja del sistema de Windows (en mi caso Windows 7):

Desde este icono podrás configurar el inicio del servicio de Windows (Opción Configure…, ficha General, Opción Statup type).

Una vez que ya tenemos instalado e iniciado el servicio, podemos abrir el navegador y escribir la dirección http://localhost:8080/ para verificar la instalación:

Si al hacerlo, te muestra la pantalla anterior; la instalación fue exitosa y ya puedes empezar a escribir tus WebApps (Aplicaciones web), sino, que es muy poco probable vuelve realizar los pasos o déjame un comentario con una descripción del problema y en cuanto vea tu mensaje y tenga tiempo te contesto.

Desinstalacion de Apache Tomcat (Windows)

Si por alguna razon extraña ya no deseas tener instalado Apache Tomcat en tu computadora, para desinstalarlo;

  • En el Panel de control->Programas y características buscas Apache Tomcat y los desinstalas.
  • Asegúrate de que no tengas iniciado el servicio de Apache Tomcat (con el boton de la bandeja del sistema) y borra la carpeta de instalación de Tomcat (paso 6).
  • Listo, quedo desinstalado.

Despedida

Eso es todo sobre la instalación de Apache Tomcat, mas adelante explicare como crear tu primera aplicación web y ejecutarla en Apache Tomcat. Espero que te haya gustado y sobre todo que te sirva. Te invito a que me dejes un comentario si te gusto el tutorial.

Hasta pronto, saludos

PHP: Seguimiento de estadisticas de un sitio web (Tracking)

Como llevar el seguimiento de estadísticas de un sitio web (Tracking). En este sencillo ejemplo mostrare como se puede implementar con poco código el tracking de cada una de las paginas de tu sitio web.

¿Que es el tracking?

El tracking (rastreo) se refiere a llevar el seguimiento de los visitantes de tu sitio web. Aunque también puedes llevar tracking de los boletines de emails enviados a tus visitantes registrados, obvio, si es que mandas boletines en tu sitio web. El tracking se logra guardando en la base de datos ciertos datos del visitante.

Después de un tiempo se irán generando datos de los visitantes (o de los clicks) y con ellos podemos llevar algunas estadísticas como; las paginas mas visitadas, cuantos visitantes tenemos por día, mes o año, etc.

Los datos a guardar en el tracking

En este ejemplo aplicaremos tracking a un sitio web y los datos que guardaremos serán los siguientes:

  • El nombre de la pagina web.
  • El nombre de la pagina de donde viene el usuario.
  • la dirección IP.
  • El nombre del navegador.
  • Fecha y hora de la visita.

Cada vez que el visitante navegue por una pagina se guardaran en una tabla de mysql los datos anteriores. Esto lo lograremos incrustando un sencillo script en cada pagina que deseemos darle seguimiento. Los primeros cuatro datos los tomaremos del array global $_SERVER[ ]. Este arreglo contiene información muy interesante acerca del servidor y de la computadora del usuario. El quinto dato lo conseguiremos con la funcion now() de MySQL.
 
Para que entiendas mejor el ejemplo a continuacion te muestro una imagen con la estructura de los principales archivos que utilizare:

El archivo index.html unicamente contiene los links a cada una de las paginas a las que se les desea dar seguimiento y un enlace al resumen del tracking.

index.html


<!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>
	<link REL="SHORTCUT ICON" href="img/tux_icon.ico">
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Test Tracking Sitio Web :: Inicio</title>
	<link rel="stylesheet" href="css/estilos.css" type="text/css" />
</head>
<body>
   <h2>Prueba de Tracking</h2>
	<p><a href="pagina1.php">Visitar Pagina1</a></p>
	<p><a href="pagina2.php">Visitar Pagina2</a></p>
	<p><a href="pagina3.php">Visitar Pagina3</a><br/><br/></p>
	<p><a href="tracking_paginas.php">Ver Estadisticas</a></p>
</body>
</html>  

 

Diseño de la Base de datos

Las sentencias SQL que debes usar para recrear la BD y la tabla para guardar los datos del tracking son las siguientes, ejecútalas en algún cliente de MySQL:

/* Crear BD */
CREATE DATABASE prueba;

/* Crear la tabla */
CREATE TABLE `tbl_tracking` (
`id_tracking` int(11) NOT NULL auto_increment,
`tx_pagina` varchar(70) NOT NULL default '',
`tx_paginaOrigen` varchar(200) NOT NULL default '',
`tx_ipRemota` varchar(15) NOT NULL default '',
`tx_navegador` varchar(255) NOT NULL default '',
`dt_fechaVisita` date NOT NULL default '0000-00-00',
PRIMARY KEY  (`id_tracking`)
) AUTO_INCREMENT=1 ;

Como vez únicamente se usara una tabla (tbl_tracking) para guardar el tracking de todas las paginas, esto lo hago así para mantener sencillo y fácil de entender este ejemplo. A mi parecer el nombre de cada campo es lo suficientemente descriptivo como para no tener que explicarte que dato guardara, déjame un comentario si no es así.

El script que guarda el tracking

Este archivo contiene el codigo que guarda los datos del visitante y por lo tanto este script es el que debes insertar a cada página que quieras trackear de tu sitio web:
guardaTracking.php

<?php
/*
	Script que se conecta a la BD y guarda informacion de la pagina que se esta visitando
	e informacion del visitante. Debe insertarse en cada pagina que se desea darle seguimiento.
	Author: Gonzalo Silverio	gonzasilve@gmail.com
	Fuente: https://gonzasilve.wordpress.com
	Archivo: guardaTracking.php
*/

//conectar la BD
include("conectar_bd.php"); 
conectar_bd();

//Recuperar informacion del visitante
$tx_pagina				= $_SERVER['PHP_SELF'];	//nombre de la pagina web actual
$tx_paginaOrigen 		= $_SERVER['HTTP_REFERER'];// Pagina web de donde viene el visitante
$tx_paginaActual		=	$_SERVER['PHP_SELF']; //nombre de la pagina web actual
$i_direccionIp 		= $_SERVER['REMOTE_ADDR'];   // Direccion Ip del visitante
$tx_navegador  		=	$_SERVER['HTTP_USER_AGENT']; // Nombre del navegador

//Insertar los datos del visitante...
$tx_qryInsert  ="INSERT INTO 
tbl_tracking (tx_pagina,tx_paginaOrigen,tx_ipRemota,tx_navegador,dt_fechaVisita) 
VALUES('$tx_pagina','$tx_paginaOrigen','$i_direccionIp','$tx_navegador',now()) ;" ;
$res = mysql_query ( $tx_qryInsert);

//Mostrar descripcion del error en caso de 
//que no se haya insertado el tracking
if(!$res){
	die(mysql_error());
}
<?

Cada linea del script anterior esta comentada por lo que me tomare la libertad de omitir la explicacion. Pero como ves principalmente se realizan dos cosas; recolectar los datos a guardar e insertarlos en la tabla creada para ese proposito.

Si observas en la linea 2 del archivo anterior, estoy insertando un archivo llamado conectar_bd.php con la funcion include de php.

conectar_bd.php
Este archivo se encarga de conectarse con el DBMS y dejar disponible un enlace a la base de datos creada anteriormente.

<?php
/*
	Realiza una conexion al DBMS MySql y selecciona una BD.
	Author: Gonzalo Silverio	gonzasilve@gmail.com
	Fuente: https://gonzasilve.wordpress.com
	Archivo: conectar_bd.php
*/

$conexio;
function conectar_bd()
{
	global $conexio;
	//Definir datos de conexion con el servidor MySQL
	$elUsr = "root";
	$elPw  = "12345";
	$elServer ="localhost";
	$laBd = "prueba";

	$conexio = mysql_connect($elServer, $elUsr , $elPw) or die (mysql_error());
	
	mysql_select_db($laBd, $conexio ) or die (mysql_error());
}	
?>

Espero que no te sea dificil entender este codigo, pues ya lo he usado y explicado anteriormente en otras entradas del blog.

Paginas con tracking

pagina1.php
He creado 3 paginas de ejemplo a las que se insertara el script que guarda el tracking, solo mostrare el codigo de dos ya que la tercera contiene exactamente el mismo codigo.

<?php
/*
	Pagina 1 de ejemplo de la cual se desea llevar su seguimiento de visitas.
	Author: Gonzalo Silverio	gonzasilve@gmail.com
	Fuente: https://gonzasilve.wordpress.com
	Archivo: pagina1.php
*/

	//Insertar el tracking a esta pagina del sitio
	include "guardaTracking.php";
?>
<!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>
	<link REL="SHORTCUT ICON" href="img/tux_icon.ico">
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Test Tracking Sitio Web :: Pagina 1</title>
	<link rel="stylesheet" href="css/estilos.css" type="text/css" />
</head>
<body>
	<h2>Pagina 1 -Test Tracking</h2>
	<p><a href="index.html">Volver</a></p>
	<p><a href="tracking_paginas.php">Ver Estadisticas</a></p>
</body>
</html>  

Si observas en la linea 10 es donde se inserta el script del tracking con ayuda de la directiva include de PHP, todo lo demas es HTML y basicamente crea dos enlaces, uno al inicio del sitio web y otro a la tabla de resumen del tracking.

pagina2.php

<?php
/*
	Pagina 2 de ejemplo de la cual se desea llevar su seguimiento de visitas.
	Author: Gonzalo Silverio	gonzasilve@gmail.com
	Fuente: https://gonzasilve.wordpress.com
	Archivo: pagina2.php
*/

	//Insertar el tracking a esta pagina del sitio
	include "guardaTracking.php";
?>
<!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>
	<link REL="SHORTCUT ICON" href="img/tux_icon.ico">
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Test Tracking Sitio Web :: Pagina 2</title>
	<link rel="stylesheet" href="css/estilos.css" type="text/css" />
</head>
<body>
	<h2>Pagina 2 -Test Tracking</h2>
	<p><a href="index.html">Volver</a></p>
	<p><a href="tracking_paginas.php">Ver Estadisticas</a></p>
</body>
</html>  

Como decia anteriormente despues de que transcurra el tiempo se iran acumulando datos de todas las paginas trackeadas con los cuales se llevaran las estadisticas del sitio web.

tracking_paginas.php
Esta pagina despliega parte de la informacion del tracking organizada en 3 secciones; informacion del sitio web, de los visitantes y estadisticas de cada pagina web. En este caso e organizado la informacion en base a las paginas web, pero la informacion del tracking se podria analizar, por ejemplo, en base a la fecha de visita.

<?php
/*
	Pagina que muestra la informacion del tracking.
	Author: Gonzalo Silverio	gonzasilve@gmail.com
	Fuente: https://gonzasilve.wordpress.com
	Archivo: tracking_paginas.php
*/

	//conectar BD
	include("conectar_bd.php"); 
	conectar_bd();

?>
<!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>
	<link REL="SHORTCUT ICON" href="img/tux_icon.ico">
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
	<title>Gonzalo Silverio :: Test Tracking Sitio Web</title>
	<link rel="stylesheet" href="css/estilos.css" type="text/css" />

	<style>
	/*.{ font-size:12px; }  */
	</style>
</head>
<body>

<table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas">
  <thead>
    <tr>
       <th colspan="4"><h2>Estadisticas del sitio</h2></th>
    </tr>
    <tr>
       <th width="16%"><strong>Total de Visitantes </strong></th>
       <th width="24%"><strong>Total de Visitas </strong></th>
       <th width="25%"><strong>Navegadores usados </strong></th>
       <th width="35%"><strong>Pagina mas visitada </strong></th>
    </tr>
  </thead>
  
	<?php
	$query = "SELECT COUNT( DISTINCT (tx_ipRemota) ) AS i_total
	FROM tbl_tracking";
	$result						= mysql_query($query);
	$i_totalVisitantes = mysql_num_rows($result);

	$query = "SELECT COUNT(*) as i_total
	FROM tbl_tracking;";
	$result						= mysql_query($query);
	$i_totalVisitas = mysql_result($result,0,'i_total');
	
	$query = "SELECT COUNT(distinct(tx_navegador)) as i_total
	FROM tbl_tracking";
	$result						= mysql_query($query);
	$i_totalNavegadores = mysql_result($result,0,'i_total');

	$query = "SELECT tx_pagina, COUNT( tx_pagina )  AS i_total
	FROM tbl_tracking
	group by tx_pagina
	order by i_total DESC;";
	$result						= mysql_query($query);
	$i_masVisitada = mysql_result($result,0,'tx_pagina').", ".mysql_result($result,0,'i_total')." visitas";

	
	if($i_totalVisitas>0) {
		 ?>
		 <tr valign="top" >
		   <td><?php echo $i_totalVisitantes; ?></td>
		   <td><?php echo $i_totalVisitas; ?></td>
		   <td><?php echo $i_totalNavegadores; ?></td>
		   <td><?php echo $i_masVisitada; ?></td>
		 </tr>
	 <?php		 
	  } 
	  else
	  {
	  ?>
	   <tr><td colspan="4"><p>No hay datos!</p></td></tr>
	<?php
	  }
	?>
</table>


<table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas">
  <thead>
     <tr>
       <th colspan="4"><h2>Estadisticas de visitantes</h2></th>
     </tr>
     <tr>
       <th width="10%"><strong>Direccion Ip</strong></th>
       <th width="15%"><strong>Fecha</strong></th>
       <th width="40%"><strong>Navegador usado</strong></th>
       <th width="35%"><strong>Paginas visitadas</strong></th>
     </tr>
   </thead>
   <?php

	$queryV = "SELECT *
	FROM tbl_tracking
	GROUP by tx_pagina
	ORDER BY dt_fechaVisita DESC";
	$resultV=mysql_query($queryV);
	$visitors = mysql_num_rows($resultV);
	if($visitors>0){
	$i=1;
	while ($rowV =mysql_fetch_assoc($resultV)) {
	$estilo =(($i%2)==0) ? "class='even'":"";
	?>
	<tr valign="top" <?php echo $estilo; ?> >
		<td><?php echo $rowV['tx_ipRemota']; ?></td>
		<td><?php echo $rowV['dt_fechaVisita']; ?></td>
		<td><?php echo $rowV['tx_navegador']; ?></td>
		<td><a href="<?php echo "http://".$_SERVER['SERVER_NAME'].$rowV['tx_pagina']; ?>" target="_blank"><?php echo $_SERVER['SERVER_NAME'].$rowV['tx_pagina']; ?></a></td>
	</tr>
	<?php 
	  $i++;
	}
	}else{
	?>
	<tr><td colspan="4"><p>No hay datos!</p></td></tr>
	<?php } ?>
</table>


<table width="100%" border="1" cellspacing="1" bordercolor="#0000FF" id ="tbl_estadisticas">
  <thead>
     <tr>
       <th width="16%" colspan="4"><h2>Estadisticas de paginas</h2></th>
     </tr>
      <tr>
       <th width="16%"><strong>Nombre de la pagina</strong></th>
       <th width="24%"><strong>Numero de visitas </strong></th>
       <th width="25%"><strong>Visitado por </strong></th>
       <th width="35%"><strong>Pagina de donde venia</strong></th>
     </tr>
  </thead>
  <?php
  $queryP = "SELECT *,count(*) as i_total_visitas
   FROM tbl_tracking
   WHERE tx_ipRemota = '".$_SERVER['REMOTE_ADDR']."'
   GROUP BY tx_pagina";
$resultP=mysql_query($queryP);
if($visitors>0){
   $i=1;
   while ($rowP =mysql_fetch_assoc($resultP)) {
      $estilo =(($i%2)==0) ? "class='even'":"";
   ?>
      <tr valign="top" <?php echo $estilo; ?> >
       <td><?php echo $rowP['tx_pagina']; ?></td>
       <td><?php echo $rowP['i_total_visitas']; ?></td>
       <td><?php echo $rowP['tx_ipRemota']; ?></td>
       <td><a href="<?php echo $rowP['tx_paginaOrigen']; ?>" target="_blank"><?php echo $rowP['tx_paginaOrigen']; ?></a> </td>
     </tr>
     <?php
     $i++;
   }
  }else{
   ?>
  <tr><td colspan="4"><p>No hay datos!</p></td></tr>
  <?php }?>
</table>
<p align="center"><a href="index.html">Volver</a></p>
   <br/><br/>
</body>
</html>

Lo interesante del archivo anterior son las consultas (querys) que se utilizan para obtener los datos, pues hay tantas cosas que se puede hacer con la informacion recolectada. Incluso si asi se necesitara podria utilizarse alguna libreria (como jpGraph) para mostrar la informacion en forma grafica. Pero eso ya depende de las necesidades de cada sitio web. A continuacion muestro un pantallazo de la tabla k muestra el traking del sitio web del ejemplo (click aqui para ampliar):

A continuacion pongo algunos otros querys que obtienen mas informacion estadistica:

//Total de visitas del sitio
SELECT count(*) FROM tbl_tracking;

//Numero de veces que un navegador a sido usado para visitar el sitio
SELECT *, count(*) FROM tbl_tracking GROUP by tx_navegador;

//Numero de veces que un usuario en particular nos ha visitado
SELECT count(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1';

//navegador que ha usado un usuario en particular para visitarnos
"SELECT *,count(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1' GROUP BY tx_navegador

//Numero de visitas de un usuario en los ultimos 30 dias
SELECT *,COUNT(*) FROM tbl_tracking WHERE tx_ipRemota = '127.0.0.1';

//Numero de veces que una pagina ha sido visitada
SELECT count(*) FROM tbl_tracking WHERE tx_pagina = '/pagina1.php'

//Usuarios que han visitado una pagina en particular
SELECT *,count(*) FROM stattracker WHERE tx_pagina = '/pagina1.php' GROUP BY tx_ipRemota


Demo

Hemos llegado al fin del articulo, si deseas ver el ejemplo funcionando da click aqui para ver un demo. Recuerda visitar varias paginas para que veas como se va guardando la informacion, por ultimo entra a la pagina de estadisticas para ver los resultados del tracking.

Si gustas tener los fuentes, ya sabes solo dejame tu email en un comentario y te los hago llegar en un zip. Reviso a diario mi email y por lo tanto, igualmente si tienes dudas con toda confianza me puedes preguntar en un comentario, en cuanto vea tu pregunta la estare contestando.

Espero que te haya gustado el articulo y sobre todo que hojala te sirva de algo en algun momento.

Saludos cordiales.
Hasta pronto y gracias por tu visita.

Introduccion a JSON – Parte I

Hola, mi cuenta de gmail ha sido vulnerada, por lo que las imágenes no se ven, pero esta entrada ya la he replicado en http://www.notas-programacion.com/2014/10/introduccion-a-json-parte-i/, el contenido de este blog se estará migrando progresivamente allá.

JavaScript Object NotationBreve introducción a esta Tecnología de intercambio de Datos. En esta ocasion quiero escribir unas breves notas acerca de JSON, aunque ya hay mucha teoria por la red con respecto a este tema he decidido dar mi pequeño aporte, ‘mi teoria’. Siempre habia querido saber para que diantres se usa esto del JSON, pero siempre por desidia o pereza no me decidía a investigar, antier me desidi y aquí están los resultados que quiero compartir.

Como dijo Jack El Destripador, vayamos por partes…

¿Que es JSON?

Primero que todo empecemos por definir que es JSON. JSON es la abreviatura/acrónimo de JavaScript Object Notation, como puedes ver en su definicion literal JSON utiliza el código JavaScript como modelo de datos. JSON es una forma de enviar/recibir, vaya intercambiar datos, por lo general entre un cliente y un servidor. XML nacio primero y es otra manera de hacerlo, JSON aparecio despues como otra alternativa a este sistema de envío y recepción de datos.

Pero, ¿Porque utilizar un sistema de intercambio de Datos?. JSON se emplea habitualmente en entornos donde la cantidad de datos que fluyen entre cliente y servidor es de vital importancia. Segun he leido Google y Yahoo lo utilizan a diestra y siniestra en muchos de sus servicios, como los de mensajeria que ya conocemos, Gmail y Yahoo Mail y tambien lo utilizan las redes sociales twitter y facebook.

Obviamente, si intentas utilizar JSON en un entorno donde el flujo de datos es pequeño no notaras la diferencia ¿Ya te imaginas porque esos grandes sitios web lo utilizan?. Tienen millones de usuarios y el tema de intercambio de datos entre sus servidores y los navegadores de los usuarios es criticoo.

La lista de lenguajes que soportan JSON incluye ActionScript, C, C++, C#, ColdFusion, Common Lisp, Delphi, E, Eiffel, Java, JavaScript, ML, Objective-C, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Lua y Visual FoxPro.

En esta serie de ejemplos de JSON solo veremos un poco de JSON con Javascript y PHP, pues necesitaria toda una vida para explicar como se usa en todos los lenguajes mencionados.

Notacion y ejemplos JSON

Voi a dar por hecho que si estas leyendo este tema es porque ya tienes los fundamentos basicos de Javascript. Para empezar vamos repasar un poco sobre como se definen los arrays y objetos literales en JavaScript. Los temas que veremos a continuacion son:

  • Los arreglos literales
  • Los objetos literales
  • Los objetos JSON

Veremos estos temas debido a que utilizaremos esos fundamentos para desarrollar el tema de los Objetos JSON. OJO!: Aqui en el blog solo mostrare el codigo JavaScript, pero si quieres ver el codigo funcionando te dejo un link para que lo pruebes ejecutandose en un documento HTML de mi sitio web. Si entras a ver el ejemplo, recuerda que dependiendo del navegador que uses, por lo general puedes ver el codigo fuente de una pagina web dando click derecho con el raton y elegir la opcion Ver codigo fuente.

Los arreglos literales

La notacion literal es una forma de declaracion de arreglos que se introdujo a partir de JavaScript 1.2. Los arrays literales se definen con la siguiente sintaxis:

var miArray = [ 'item1',2,'item3',true ];

Observa como para declarar un arreglo literal se encierra entre corchetes a sus elementos y se separan por comas. Los elementos de un array literal pueden ser cadenas, numeros (enteros o decimales), valores booleanos, un arreglo literal, el valor null o incluso expresiones.

A continuacion dos ejemplos de este tipo de arreglos:

	<script language="javascript" type="text/javascript">
//EJEMPLO 1
			//Array con items de texto
			var arrayColores = [ 'Azul', 'Verde', 'blanco', 'Rosa' ];			
			//Mostrar los valores
			alert( 'Los colores son: '+arrayColores[0]+', '+arrayColores[1]+', '+arrayColores[2] );

//EJEMPLO 2			
			//Array con items de texto y numeros
			var arrayCompra = [ 'Papas adobadas 30 gr.', 8.50, true, 2, 'Axel Hernandez' ];		
			//Mostrar los valores
			var detalleCompra = 'Detalle de compra:\n';
			detalleCompra += 'Producto: '+arrayCompra[0]+'\n';
			detalleCompra += 'Precio: '+arrayCompra[1]+'\n';
			detalleCompra += 'Tiene descuento: '+arrayCompra[2]+'\n';
			detalleCompra += 'Valor descuento: '+arrayCompra[3]+'\n';
			detalleCompra += 'Empleado que atendio: '+arrayCompra[4]+'\n';
			detalleCompra += 'Importe a pagar: '+(arrayCompra[1]-arrayCompra[3]);
			alert( detalleCompra );					
	</script>

Si deseas ver funcionando el ejemplo anterior da click aqui.

En el codigo anterior hay dos ejemplos; uno en donde se define un array unicamente con elementos de tipo texto (linea 4) y el segundo ejemplo define un array literal con elementos de diferentes tipos de datos (linea 10). Una vez declarado, un arreglo literal se comporta como un arreglo normal, es por eso que para acceder a los elementos se hace por medio de numeros de indice, ej. arrayColores[0] contiene el primer color.

Ahora vamos a ver como se definen los arreglos literales de mas de una dimension, para que esto siga siendo sencillo solo mostrare arreglos con dos y tres dimensiones, a continuacion el ejemplo:

	<script language="javascript" type="text/javascript">
			//Dos dimensiones
			var paises = [["Estados unidos", "México", "Colombia"], "China", "Irak"];
			//Mostrar los valores
			var strPaises = 'Arreglo bidimensional, Los paises son:\n';
			strPaises += 'paises[0][0]: '+paises[0][0]+'\n';		//Estados unidos
			strPaises += 'paises[0][1] '+paises[0][1]+'\n';		//México
			strPaises += 'paises[1]: '+paises[1];		//China
			alert( strPaises );	
			
			
			//Tres dimensiones
			paises = [["Estados unidos", ["Distrito Federal","Veracruz","Queretaro","..."], "Colombia"], "China", "Irak"];
			//Mostrar los valores
			strPaises = 'Arreglo dimension 3, Los paises son:\n';
			strPaises += 'paises[0][0]: '+paises[0][0]+'\n';		//Estados unidos
			strPaises += 'paises[0][1][0]: '+paises[0][1][0]+'\n';		//Distrito Federal
			strPaises += 'paises[0][1][1]: '+paises[0][1][1]+'\n';	//Veracruz
			strPaises += 'paises[0][1]: '+paises[0][2]+'\n';		//Colombia
			strPaises += 'paises[1]: '+paises[1];		//China
			alert( strPaises );		
	</script>

Si deseas ver funcionando el ejemplo anterior da click aqui.

Los objetos literales

Ahora veamos como se definen los objetos literales de javascript, con un ejemplo…

	<script language="javascript" type="text/javascript">
//EJEMPLO 1: Objeto literal con items de texto
			var nomVariableObjeto = {
				'nombre':'Gonzalo',
				'apellido':'Silverio',
				'matricula':"05ab77",
				'carrera':"I.S.C."
			};
			var detalleAlumno = "Datos del alumno:\n"
			detalleAlumno += 'Matricula: '+nomVariableObjeto.matricula+'\n';
			detalleAlumno += 'Nombre: '+nomVariableObjeto.nombre+' '+nomVariableObjeto.apellido+'\n';
			detalleAlumno += 'Carrera: '+nomVariableObjeto.carrera;
			alert(detalleAlumno);

			//Mostrar nuevamente los datos pero por medio de indices
			detalleAlumno = "Datos del alumno:\n"
			detalleAlumno += 'Matricula: '+nomVariableObjeto['matricula']+'\n';
			detalleAlumno += 'Nombre: '+nomVariableObjeto['nombre']+' '+nomVariableObjeto['apellido']+'\n';
			detalleAlumno += 'Carrera: '+nomVariableObjeto['carrera'];
			alert(detalleAlumno);


//EJEMPLO 2: Objeto literal con diferentes tipos de items
			var varObjetoAlumno = {
				'matricula':"05ab77",
				'nombre':'Gonzalo Silverio',
				'materias':['Matematicas discretas','Fisica II','Metodos numericos',
				'becado':true,
				'promedio':8.53
			};
			var strMaterias='';
			var i=0
			for(i=0;i<(varObjetoAlumno.materias.length-1); i++)
				strMaterias += varObjetoAlumno.materias[i]+', ';

			strMaterias += varObjetoAlumno.materias[i];

			detalleAlumno = "Datos del alumno:\n";
			detalleAlumno += 'Matricula: '+varObjetoAlumno.matricula+'\n';
			detalleAlumno += 'Nombre: '+varObjetoAlumno.nombre+'\n';
			detalleAlumno += 'Materias: '+strMaterias+'\n';
			detalleAlumno += 'Esta becado: '+varObjetoAlumno.becado+'\n';
			detalleAlumno += 'Promedio general: '+varObjetoAlumno.promedio;
			alert(detalleAlumno);
	</script>

He creado una pagina que muestra los ejemplos anteriores, si deseas verlo da click aqui.

La sintaxis para crear los objetos literales de Javascript es la siguiente;
var miObjeto = { ‘propiedad1’: valor1, ‘propiedad2’: valor2 }

donde propiedad es el nombre de una propiedad que estamos creando en el nuevo objeto y valor es el valor que estamos asignando a la propiedad. Los valores que pueden asignarse a una propiedad son: un numero (entero o decimal), una cadena de texto, un valor booleano (true o false), null, un array literal o incluso una funcion anonima.

Tambien puedes ver en el ejemplo anterior que para acceder a las propiedades de un objeto lo podemos hacer directamente por medio del nombre ó por medio de indices. Estas son las dos sintaxis:

//Sintaxis 1
	nomVariableObjeto.nombrePropiedad
//Sintaxis 2
	nomVariableObjeto['nombrePropiedad']

Observa como en el EJEMPLO 1 accedemos a las propiedades del objeto por medio de la sintaxis 2. Y en el EJEMPLO 2 por medio la sintaxis 1.

Bien, veamos otro ejemplo mas ya para terminar con el tema de los Objetos literales de Javascript. En el ejemplo que mostrare a continuacion se observa como incluso es posible podemos asignar una funcion anonima a una propiedad del objeto JSON.

<script language="javascript" type="text/javascript">
    //Definimos un pequeño objeto Javascript llamado persona
    //Con una funcion anonima
    var persona = {
      "nombre": "Gonzalo",
      "apellidos": "Silverio Silverio",
      "carrera": "Ingenieria en sistemas",
      "saludar": function(aquien) {
	var mensaje=  "Que tal! ¿Como estás " + aquien + "?\n Yo soy " + this.nombre + " "+this.apellidos+
	" y estudie "+this.carrera+", hasta pronto.\n\nSigue visitandome!";				
        alert(mensaje);
      }
    };
      var miObjeto = eval(persona);
      alert("El nombre es: " + miObjeto.nombre +
    		  "\nEl apellido es: " + miObjeto.apellidos +
    		  "\nLa carrera es: " + miObjeto.carrera);
      miObjeto.saludar('Xavier');
</script>

si deseas ver el ejemplo anterior ejecutandose da click aqui.

Si quisieramos agregar/modificar una propiedad a un objeto que ya existe entonces los hariamos con la siguiente sintaxis:
objeto.nom_propiedad = valor

Donde nom_propiedad es el nombre de una nueva propiedad (o de una propiedad ya existente en el objeto que deseamos modificar) y valor es el nuevo valor que deseamos asignarle.

Ahora que ya sabes como declarar arreglos y objetos literales te resultara mas facil crear los objetos JSON…

Los objetos JSON

Deciamos que JSON es un formato ligero de intercambio de datos. Un documento JSON es un subconjunto de JavaScript, y para esto se basa principalmente en dos estructuras:

  • Una coleccion de pares propiedad:valor (objetos)
  • Los arreglos literales

Como vimos anteriormente los objetos comienzan con { y terminan con } en medio estan los pares propiedad:valor separados por comas. Veamos el diagrama sintactico de un objeto JSON:
Sintaxis de objeto JSON

Donde propiedad es el nombre de una propiedad del objeto JSON y valor pueden ser cadenas, objetos, numeros (enteros o decimales), valores booleanos (true o false), un arreglo literal o el valor null. Observa como es posible anidar objetos dentro de un objeto.

Si te fijas mencione que el valor de una propiedad puede ser un arreglo, debes saber que tambien es posible anidar arreglos dentro de un arreglo. Un arreglo tiene la siguiente sintaxis:
Sintaxis de arreglo JSON
De igual manera valor pueden ser cadenas, objetos, numeros (enteros o decimales), valores booleanos (true o false), un arreglo literal o el valor null. Aqui esta la informacion mas completa (de hecho, de ahi me base para mostrarte los diagramas sintacticos).

Por lo general los documentos JSON son obtenidos del servidor a travez de AJAX, pero nosotros primeramente veremos dos ejemplos donde el documento JSON lo escribiremos directamente en un archivo HTML, lo convertiremos a objeto y desplegaremos sus valores ahi mismo. Posteriormente en otro ejemplo obtendremos un documento JSON desde el servidor a travez de Ajax (con ayuda de JQuery), lo convertiremos a objeto Javascript y mostraremos su contenido al usuario.

Asi poco a poco iremos incrementando la complejidad de los ejemplos hasta intercambiar documentos JSON con datos provenientes de una base de datos (es lo interesante y realmente util).

A continuacion veremos varios ejemplos donde crearemos varios documentos JSON, te recomiendo que los pruebes con esta herramienta online, la cual nos permite comprobar si la sintaxis esta correcta. A mi parecer es una excelente herramienta para probar la sintaxis de JSON, deberias agregarla a tus marcadores (borra el fb).

Ejemplo, creamos un documento JSON, asi:

	{
	 "nombre": "Gonzalo",
	 "apellidos": "Silverio Silverio",
	 "carrera": "Ingenieria en sistemas"
	}

El documento anterior contiene 3 campos y sus respectivos valores. Como puedes ver la sintaxis de un documento JSON difiere de manera muy leve con la sintaxis para definir un objeto literal de Javascript:
{ ‘propiedad1’: valor1, ‘propiedad2’: valor2, … }

Bien, ahora veamos un documento JSON mas elaborado:

 {
		"desarrollador" : "Xavier Landa",
		"depto" : "Sistemas (SI)",
		"email" : "ej_email@dominio.com",
		"genero" : "h",
		"direccion":["Benito Juarez",3,"Lomas de Chapultepec","D.F."],
		"tel" : "123000987",
		"proyectos":[
			{
				"codigo" : 	"xs2012",
				"nombre" : 	"XenixSoft",
				"url"		 : 	"https://gonzasilve.wordpress.com",
				"prioridad" : 1
			},
			{
				"codigo" : 	"msw2012",
				"nombre" :		"Mantenimiento website oficial",
				"url"		 :  "http://shalo.site50.net",
				"prioridad" : 2
			},
			{
				"codigo" : 	"plg2011",
				"nombre" :		"Plugin DB Converter",
				"url"		 :  "http://gonzasilve.260mb.com",
				"prioridad" : 0
			}
		]
	}

El documento anterior incluye varias cosas interesantes; podemos ver que se trata de un solo objeto principal con 7 campos (desarrollador,depto,email,genero,genero,tel,proyectos). El campo direccion es un arreglo con los datos de la direccion de una persona (Nombre de la calle, numero, colonia, ciudad) y el campo proyectos es un arreglo de 3 objetos, en este caso cada objeto (un proyecto) tiene 4 campos. Pero pudiera darse el caso de que algun objeto del arreglo tuviera solo 3, menos o mas campos. Por ejemplo, podria ser que un proyecto no tenga una direccion web. JSON no tiene la limitacion de que el numero de campos en un arreglo de objetos sea el mismo.

¿Ves como puedes crear documentos JSON tan flexibles como los necesites (o como tengas de imaginacion)?

Ahora veamos como se puede convertir un documento JSON en un objeto Javascript, con un ejemplo (con el primer documento JSON para que lo entiendas mas facilmente):

	<script language="javascript" type="text/javascript">
	//Definimos un pequeño documento JSON en una variable
	var cadenaJSON = "{"+
		"'nombre' : 'Gonzalo',"+
		"'apellidos' : 'Silverio Silverio',"+
		"'carrera' : 'Ingenieria en sistemas'"+
	"}";
	//Convertir el documento JSON a Objeto Javascript
	var objCadena = eval('(' + cadenaJSON + ')');
	
	//Mostrar los valores del objeto JSON al usuario
	var str_Nombre = "Nombre: "+objCadena.nombre+"\n";
	var str_Apellidos = "Apellidos: "+objCadena.apellidos+"\n";
	var str_Carrera = "Carrera: "+objCadena.carrera+"\n";
	alert(str_Nombre+str_Apellidos+str_Carrera);
	</script>

si deseas ver el ejemplo anterior ejecutandose da click aqui (no olvides ver el codigo fuente).

Observa como se usa la funcion eval; e colocado «( )» alrededor del documento JSON, esto es muy importante, no lo olvides. Otra cosa interesante del ejemplo es que una vez que el documento JSON es convertido a objeto JSON, éste tiene todas las propiedades de los objetos vistas anteriormente.

Si entraste al ejemplo y tienes dudas sobre las funciones de JQuery que he utilizado, en este caso google es nuestro mejor amigo, explicarte yo me llevaria muucho tiempo.

En resumen, los documentos JSON por lo general se obtienen de un servidor (con AJAX) en forma de cadena, estos documentos tienen la sintaxis JSON vista anteriormente. Despues de que el documento JSON es obtenido del servidor éste es convertido en un objeto Javascript. Para convertirlo usamos la funcion eval() que recibe la cadena (el documento JSON) y la devuelve en forma de objeto Javascript.

Si te quedo la «espinita» sobre como usar el documento JSON mas elaborado que expuse mas arriba, click aqui para ver un ejemplo (no olvides ver el codigo fuente).

Despedida

Bueno, pues llegamos al final de esta parte, en la continuacion (Parte 2) de este mini tutorial de JSON veremos como obtener documentos JSON desde el servidor con ayuda de Ajax y JQuery. Si te gusto o te sirvio esta informacion, o si tienes dudas respecto al tema, te invito a que por favor me dejes un comentario (ademas, me motivas a escribir mas!). Por otra parte si gustas te envio los ejemplos en un .zip, solo deja tu correo.

Hasta pronto.
Saludos cordiales.

PHP: Como determinar si es un visitante o es un robot www (boot)

Sencillo script que permite determinar si un visitante es ó no un robot. Estoy por publicar algo sobre un nuevo tema y me encontré con este tema de los robots WWW. Me di a la tarea de investigar sobre como diferenciar a una persona que visita la pagina o a un programa de esos que andan explorando la red buscando nuevos contenidos. Antes de iniciar con el ejemplo es necesario tener bien claro dos terminos: Robot y Agente.

¿Que es un robot WWW?

Un robot WWW es un programa que recorre periodicamente la estructura de internet en busca de nuevos contenidos. La forma de operar de estos programas por lo general es recuperando un documento raiz y de manera recursiva recorrer todos los documentos a los éste que hace referencia. El orden en que estos programas hacen el recorrido por lo general es determinado despues de hacer un analisis en base a varios parametros, es decir, despues de haber aplicado tecnicas de heurística. Estos programas a veces son llamados boots www, Robots web, Web Wanderers, Web Crawlers, o Spiders (arañas). Como ves, estos nombres son un poco engañosos ya que dan la impresion de que son un software parecido a los virus ya que se mueven en la internet rastreando entre los miles de sitios web. Si embargo, estos scripts/programas por lo general andan en busca de nuevos contenidos o información para fines estadísticos.

Imaginemos que un robot (por ejemplo el robot www de Google) anda explorando la red y se encuentra con nuestro sitio web y empieza a rastrear toda la estructura de documentos que hemos creado, si estamos guardando el tracking del sitio web ¿Debemos guardar el tracking de un robot www? ¿Debemos permitirle al robot explorar nuestro sitio?. En mi opinión, para mi sitio web la respuesta para ambas preguntas es SI.

Para la primer pregunta es es si porque asi llevo el seguimiento de cuantos robots y con que frecuencia visitan mi sitio web. El tracking entre mas detallado sea, mejor. La segunda pregunta tambien me conviene ya que muy probablemente que ese robot este recabando información acerca de que tan activo es mi sitio para asi posicionarlo o reclasificarlo mejor dentro de los indices de Google ¿porque habria de desagradarme que mi sitio web apareciera entre los primeros resultados de las busquedas de Google?. Hasta la pregunta suena comica ¿no?.

En la red internet existen varios sitios web que ofrecen de manera gratuita información gratuita y muy detallada acerca de los diferentes robots www mas conocidos. Estuve buscando por varios lugares y al final opte por elegir http://www.robotstxt.org/ pues contiene un listado de los boots www mas conocidos, este listado esta en el archivo http://www.robotstxt.org/db/all.txt. Lo que me gusto es que la lista esta muy extensa y detallada. Si gustas puedes abrir la URL ahora y podras ver que el detalle de cada robot es similar a la siguiente (robot www de Google):

robot-id: googlebot
robot-name: Googlebot
robot-cover-url: http://www.googlebot.com/ 
robot-details-url: http://www.googlebot.com/bot.html
robot-owner-name: Google Inc.
robot-owner-url: http://www.google.com/
robot-owner-email: googlebot@google.com 
robot-status: active
robot-purpose: indexing
robot-type: standalone 
robot-platform: Linux
robot-availability: none
robot-exclusion: yes
robot-exclusion-useragent: googlebot
robot-noindex: yes
robot-host: googlebot.com
robot-from: yes 
robot-useragent: Googlebot/2.X (+http://www.googlebot.com/bot.html)
robot-language: c++
robot-description: Google's crawler
robot-history: Developed by Google Inc
robot-environment: commercial
modified-date: Thu Mar 29 21:00:07 PST 2001
modified-by: googlebot@google.com

¿Que es Agente?

En informatica este termino se usa en muchisimos contextos pero en general podemos distinguir facilmente a los Agentes autonomos, los agentes inteligentes y a los agentes de usuario (User-agent). En este caso estamos interesados en los agentes de usuario, los cuales son programas que realizan tareas de red para un usuario.

Ejemplos de agentes de este tipo son los programas de navegacion (Mozilla Firefox, Netscape Navigator, Microsoft Internet Explorer, Google Chrome, Safari, etc) ó los clientes de correo electronico (Mozilla Thunderbird, Microsoft Outlook, etc).

Como hacer la distincion de un boot www

La forma de detectar al tipo de visitante es por medio del nombre del agente que accede a nuestro sitio. En PHP existe la variable global $_SERVER[‘HTTP_USER_AGENT’] que nos devuelve una cadena que indica el agente de usuario empleado para acceder a la pagina. A continuacion muestro el contenido que devuelve esta variable en varios navegadores (con ayuda de phpinfo()):

Google Chrome v. 22.0.1229.94 m
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Firefox v. 13.0.1
Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1
Internet Explorer v. 8.0.7600.16385
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Safari v. 5.1.7 (7534.57.2)
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

Implícitamente usaremos la información de esta variable para detectar a un robot www.

El codigo fuente para detectar robots www

Para hacer la distincion del agente que esta visitando nuestro sitio web aprovecharemos el listado de nombres de boots que mencione anteriormente: http://www.robotstxt.org/db/all.txt.

Basicamente leeremos ese archivo de texto desde un script PHP linea a linea y guardaremos el nombre de cada robot en un arreglo.
Despues compararemos cada item del arreglo contra el nombre del agente de usuario que esta visitando la pagina (valor que esta en la variable global $_SERVER[‘HTTP_USER_AGENT’]). Obviamente el visitante es un robot si el nombre del agente coincide con el nombre de algún robot del arreglo. A continuacion muestro el codigo:

<?php
/*
	Descripcion: Contiene una funcion que determina si el visitante es un robot www.
	Para esto hace uso del sitio http://www.robotstxt.org/db/all.txt
	que contiene un listado de los robots mas conocidos.
	Author: Gonzalo Silverio  gonzasilve@gmail.com
*/

/*
Parametros: El nombre de un agente de usuario.
Devuelve: true en caso de que el nombre del agente sea un nombre de robot
					false si el agente NO es un robot.
*/
	function esRobot($agente) {
		$archivoRobots = "http://www.robotstxt.org/db/all.txt";
		$delimitador1 = "robot-name:";
		$delimitador2 = ":";
		if (trim($agente)=="") $agente=trim($_GET['agente']);
		if (trim($agente)=="") $agente=trim($_SERVER['HTTP_USER_AGENT']);
		
		//Obtener el contenido del archivo como un array en donde cada item es una linea del archivo.
		$str_archivo = @file($archivoRobots);
		$total_lineas = count($str_archivo);

    $i = 0;
		$r = 0;
		$lista_robots = array();
		
    while ($i<=$total_lineas)    {
      $linea = chop($str_archivo[$i]);
			if(   (strpos($linea, $delimitador1) !== false) ) {
				$items= explode($delimitador2,$linea);
				$lista_robots[$r] = trim($items[1]);
				$r++;
			}
      $i++;
    }

		//Determina si la cadena que llega es un robot
		foreach($lista_robots as $robot)	{
			if(strpos($agente, trim($robot) )  !== false)
			return true;
		}
		return false;

	}

	//Ejemplos de como usar la funcion anterior:
	//Sintaxis 1
	if( esRobot("Pioneer") ) echo "SI"; else echo "NO";
	echo "<br/>";
	
	if( esRobot() ) echo "SI"; else echo "NO";
	echo "<br/>";	
	
	if( esRobot( trim($_SERVER['HTTP_USER_AGENT']) ) ) echo "SI"; else echo "NO";

?>

Si tienes duda acerca de como se usan algunas funciones de php te aconsejo que visites la pagina oficial de documentacion de PHP.
Al ejecutar el código anterior debes ver algo como:

SI
NO
NO

Si eres observador te darás cuenta que la ejecucion tarda un tiempo considerable ya que tiene que leer todo un archivo que esta en linea y debe parsearlo por completo y ademas depende de un sitio; si dicho sitio borra el archivo con los nombres de robots o le cambia de nombre o el formato en como estan organizados entonces la funcion anterior dejara de funcionar de manera correcta. Para solucionar esto vamos a bajar una copia del archivo y guardar unicamente los nombres de los robots, en cada linea estara el nombre de un robot y un delimitador, algo asi:

ABCdatos BotLink|#|
Acme.Spider|#|
Ahoy! The Homepage Finder|#|
Alkaline|#|
Anthill|#|
Walhello appie|#|
Arachnophilia|#|
Arale|#|
Araneo|#|
AraybOt|#|
ArchitextSpider|#|
..
... etc.

En este caso el delimitador es |#| y no una coma (,) ya que es posible que el nombre de un robot tenga ese caracter.

A continuación pongo otra versión del script para detectar robots pero ahora lee un archivo de texto local que tiene la sintaxis mencionada anteriormente:

<?php
/*
	Descripcion: Contiene una funcion que determina si el visitante es un robot www.
	Para esto hace uso del archivo local archivos/listaRobots.txt
	que contiene un listado de los robots mas conocidos.
	Author: Gonzalo Silverio  gonzasilve@gmail.com
 */

/*
	Parametros: El nombre de un agente de usuario.
	Devuelve: true en caso de que el nombre del agente sea un nombre de robot
	false si el agente NO es un robot.
 */
	function esRobot($agente) {
		$delimitador = "|#|";
		$archivoRobots = "archivos/listaRobots.txt";
		if (trim($agente)=="") $agente=trim($_GET['agente']);
		if (trim($agente)=="") $agente=trim($_SERVER['HTTP_USER_AGENT']);

		//Obtener el contenido del archivo como una cadena.
		$str_archivo = file_get_contents($archivoRobots,FILE_USE_INCLUDE_PATH);
		//Convertir cadena a arreglo con ayuda del delimitador
		$lista_robots = explode($delimitador,$str_archivo);

		foreach($lista_robots as $robot)	{
			if(strpos($agente, trim($robot) )  !== false)
				return true;
		}
		return false;
	}

	//Ejemplos de como usar la funcion anterior:
	//Sintaxis 1
	if( esRobot("Pioneer") ) echo "SI"; else echo "NO";
	echo "<br/>";

	if( esRobot() ) echo "SI"; else echo "NO";
	echo "<br/>";	

	if( esRobot( trim($_SERVER['HTTP_USER_AGENT']) ) ) echo "SI"; else echo "NO";

?>

Que facil ¿no?. Este dato podrias guardarlo en la base de datos para llevar un conteo de los robots que visitan tu sitio web. El resultado debe ser similar al anterior:

SI
NO
NO

 

Eso es todo. Si deseas el código basta con que dejes tu e-mail y en cuanto vea tu mensaje te hago llegar el ejemplo. Si te gusto el articulo, te invito a que me dejes un comentario, pero sobre todo a que me sigas visitando.

Saludos cordiales.

 
 

PHP: Validar un numero entero

La siguiente funcion permite validar si una cadena esta compuesta unicamente de numeros.
Parametros: La cadena.
Devuelve: true en caso de que el parametro solo vengan numeros, false en caso contrario.

El codigo

function soloNumeros($laCadena) {
	$carsValidos = "0123456789";
	for ($i=0; $i<strlen($laCadena); $i++) {
	  if (strpos($carsValidos, substr($laCadena,$i,1))===false) {
		 return false; 
	  }
	}
	return true; 
}

//Ejemplo
$cad1 = "6878456";
$cad2 = "687a456";

if( soloNumeros($cad1) ) 
	echo "$cad1 es un Entero.<br/>";
else 
	echo "$cad1 NO es un Entero.<br/>";

if( soloNumeros($cad2) ) 
	echo "$cad2 es un Entero.<br/>";
else 
	echo "$cad2 NO es un Entero.<br/>";

/*
Salida:
6878456 es un Entero.
687a456 NO es un Entero.
*/

 

Si te gusto el ejemplo deja un comentario, igualmente si tienes otra versión Saludos.
 
 
Enlaces relacionados:
 
 

PHP: Sumar o Restar Dias a cualquier fecha

Fechas en PHP

Si deseas sumarle o restarle dias a una fecha cualquiera puedes usar la siguiente función que pongo a continuación; la cual espera como entrada una fecha y un numero de días. Si Deseas sumar días, solo pasa el numero sin signo. Si deseas restar dias pasale un numero negativo.
 
 
 
 

El codigo

function dameFecha($fecha,$dia)
{	list($day,$mon,$year) = explode('/',$fecha);
	return date('d/m/Y',mktime(0,0,0,$mon,$day+$dia,$year));		
}
 
 //Sumar 5 dias
echo dameFecha('18/09/2012',5);
//Salida: 23/09/2012

 //Restar 5 dias  
echo dameFecha('18/09/2012',-5);
//Salida: 13/09/2012

//Sumar 12 dias a la fecha actual
echo dameFecha(date('d/m/Y'),12);
//Salida: ...depende de la fecha actual

¿Sencillo y facíl no?

 

Deja tus inquietudes en un comentario. Saludos.
 
 
Enlaces relacionados:
 
 

PHP: Transformar un arreglo a un string separado por comas

Si deseas separar un arreglo en una cadena que tenga sus elementos separados con algun separador puedes usar la siguiente funcion que pongo a continuacion; la cual espera como entrada un arreglo y un caracter separador.

El codigo

function arrayAString($miArray,$sep) {
	echo implode($sep,$miArray);
}

	//Ejemplo
	$elArreglo = array('Carlos','Daniel','Xavier','Gonzalo','Karla');	
	echo arrayAString($elArreglo,',');
	//Salida: Carlos,Daniel,Xavier,Gonzalo,Karla

Como ves básicamente he renombrado a la función implode de PHP (no confundir con explode que hace lo contrario). ¿Facíl no?

 

Deja tu comentario si tienes alguna duda. Que estés bien, te mando saludos cordiales.
 
 
Enlaces relacionados:
 
 

PHP: Restar o Sumar Dias, Semanas, Meses o Años a la fecha actual

Recordemos que la funcion date(‘Y-m-d’), nos devuelve la fecha actual en el formato ‘Año-mes-dia’ y si queremos otro formato solo cambiamos el orden, por ejemplo date(‘d-m-Y’). El siguiente script muestra como Restar Dias, Semanas, Meses o Años a la fecha actual en PHP.

El codigo

$dt_Ayer= date('Y-m-d', strtotime('-1 day')) ; // resta 1 día
$dt_laSemanaPasada = date('Y-m-d', strtotime('-1 week')) ; // resta 1 semana
$dt_elMesPasado = date('Y-m-d', strtotime('-1 month')) ; // resta 1 mes
$dt_ElAnioPasado = date('Y-m-d', strtotime('-1 year')) ; // resta 1 año
//Mostrar fechas
echo $dt_Ayer;
echo $dt_laSemanaPasada;
echo $dt_elMesPasado;
echo $dt_ElAnioPasado;
/*
Resultado (fecha actual: 2012-09-18):
2012-09-17
2012-09-11
2012-08-18
2011-09-18
*/

…Por el contrario si lo que deseas es sumar entonces solo cambias el signo – por un +, asi:
$dt_5DiasDespues = date('Y-m-d', strtotime('+5 day')) ; // Suma 5 días
$dt_5SemanasDespues = date('Y-m-d', strtotime('+5 week')) ; // Suma 5 semanas
$dt_5MesesDespues = date('Y-m-d', strtotime('+5 month')) ; // Suma 5 meses
$dt_5AniosDespues = date('Y-m-d', strtotime('+5 year')) ; // Suma 5 años
//Mostrar fechas
echo $dt_5DiasDespues;
echo $dt_5SemanasDespues;
echo $dt_5MesesDespues;
echo $dt_5AniosDespues;
/*
Resultado (fecha actual: 2012-09-18):
2012-09-23
2012-10-23
2013-02-18
2017-09-18
*/

¿Facil, no?

 

Si tienes alguna duda expresala en un comentario. Saludos.
 
 
Enlaces relacionados:
 
 

PHP: Convertir cadena con separadores a Array

Si tienes una cadena separada con espacios, comas o cualquier otro separador es fácil convertirla en un array con la función explode de PHP.

El codigo

// Ejemplo 1
$miCadena  = "piece1 piece2 piece3 piece4 piece5 piece6";
$piezas = explode(" ", $miCadena);
/*
Resultado:
Array   piezas
( 
[0] piece1
[1] piece2
[2] piece3
[3] piece4
[4] piece5
[5] piece6
*/
…Por el contrario si los elementos de la cadena son pocos y deseas ponerlos en una variable a cada uno:
// Ejemplo 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user."<br/>";
echo $pass."<br/>"; 
echo $uid."<br/>";
echo $gid."<br/>";
// ..etc
/*
Resultado:
foo
*
1023
1000
*/

// Ejemplo 3 (separar dia, mes y año de la fecha actual)
list($dia,$mes,$anio) = explode('/',date('d/m/Y') );
echo $dia."<br/>";
echo $mes."<br/>";
echo $anio."<br/>";
La funcion explode devuelve un array y sus elementos son asignados a una lista de variables con ayuda de la funcion list de php.

 

Si te gusto el código expuesto o tienes alguna critica constructiva, déjame un comentario. Saludos cordiales.
 
 
Enlaces relacionados:
 
 

PHP: Obtener el ultimo día de cualquier mes

A veces cuando manejamos fechas, es necesario saber cual es el ultimo día del mes actual. Ho en general cual es el ultimo dia de un mes X. Por ejemplo Febrero tiene por lo general 28 ó 29 dias mientras que Diciembre 31. La funcion que muestro en el siguiente Script calcula y devuelve el ultimo día de cualquier mes, pasandole unicamente el año y mes deseado:

El codigo

function getUltimoDiaMes($elAnio,$elMes) {
  return date("d",(mktime(0,0,0,$elMes+1,1,$elAnio)-1));
}

//Ejemplo de uso
$ultimoDia = getUltimoDiaMes(2013,10);
echo $ultimoDia."<br/>";
echo getUltimoDiaMes(2012,09)."<br/>";
/*
Resultado:
31
30
*/

 

Si te gusto el código expuesto, déjame un comentario. Saludos cordiales.
 
 
Enlaces relacionados: