Mapas vectoriales de paises en PNG, PDF e Illustrator

Posted: octubre 8th, 2013 | Author: | Filed under: Recursos Web | Tags: , | Comentarios desactivados en Mapas vectoriales de paises en PNG, PDF e Illustrator

Para los casos en que necesitamos un mapa limpio de países de todo el mundo, o bien de regiones o el mundo entero en alta resolución y con posibilidades de trabajar sobre ellos podemos descargarlos desde este sitio.

Podemos encontrar mapas de países de latinoamérica, México, Brasil, Colombia, Argentina, asi como otros de Estados Unidos, Canada y Europa país a país.

https://www.freevectormaps.com


Remover proteccion de clave en hojas en Excel 2007 y 2010

Posted: septiembre 26th, 2013 | Author: | Filed under: Recursos Web, Software | Tags: | Comentarios desactivados en Remover proteccion de clave en hojas en Excel 2007 y 2010

En caso de que tengamos un archivo Excel protegido, en su totalidad u hojas con celdas que no se pueden editar, podemos forzar la clave con un pequeño script en VB. Es ideal para casos en que «olvidamos» la clave y no podemos ver las fórmulas de las celdas protegidas.

Lo primero que debemos hacer es abrir el archivo en cuestion en Excel, en la pestaña de Revisar vemos las opciones de «Proteger Hoja» y «Proteger Libro».

excel-proteger-hoja-contraseña-remover-1

El script que busca la clave para desproteger el archivo corre en la consola de VB de Excel, para abrirla presionamos las teclas Alt+F11 con lo cual veremos una ventana de ejecución de script.

excel-proteger-hoja-contraseña-remover-2

Seleccionamos a la izquierda la hoja en cuestión del archivo y veremos un cuadro blanco donde podemos pegar el siguiente código:

Sub PasswordBreaker()
‘Breaks worksheet password protection.
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox «One usable password is » & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

Debería quedar  de la siguiente forma:excel-proteger-hoja-contraseña-remover-3

Hecho esto le damos clic en ejecutar o con la tecla F5. El script probará contraseñas hasta encontrar una utilizable, por ejemplo algo como esta clave:

AABAABAAABA[

Luego podemos volver a proteger el archivo para evitar modificaciones por error en celdas con fórmulas.


Como insertar marcas de agua en WordPress

Posted: mayo 26th, 2011 | Author: | Filed under: Recursos Web, Wordpress | Tags: | 1 Comment »

Una forma simple de agregar marcas de agua a las imagenes de nuestro sitio en wordpress no consiste en usar plugins, podemos hacerlo con un archivo .htaccess, un archivo php y la imagen a incrustar.

Lo que tenemos que hacer es crear el archivo watermark.php en la raiz del ftp (junto al archivo wp-config.php), con el siguiente contenido:

<?php
$src = $_GET[‘src’];

header(‘Content-type: image/jpeg’);

//this will prevent the watermark from showing up in the thumbnail images
if (eregi(«150×150», $src)) {
$watermark = imagecreatefrompng(‘empty.png’);
} else {
$watermark = imagecreatefrompng(‘watermark.png’);
}

$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
if(eregi(‘.gif’,$src)) {
$image = imagecreatefromgif($src);
}
elseif(eregi(‘.jpeg’,$src)||eregi(‘.jpg’,$src)) {
$image = imagecreatefromjpeg($src);
}
elseif(eregi(‘.png’,$src)) {
$image = imagecreatefrompng($src);
}
else {
exit(«Your image is not a gif, jpeg or png image. Sorry.»);
}

$size = getimagesize($src);
$dest_x = $size[0] – $watermark_width – 0;
$dest_y = $size[1] – $watermark_height – 0;
imagecolortransparent($watermark,imagecolorat($watermark,0,0));
imagecopyresampled($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height);

imagejpeg($image, «», 95);
imagedestroy($image);
imagedestroy($watermark);
?>

Luego agregamos un archivo watermark.jpg en la raiz, junto al archivo php.

Por ultimo modificamos el arcvhio .htaccess con la siguiente línea, de forma que cada pedido de una imagen en tamaño completo tenga la marca de agua incrustada.

RewriteRule ^(.*)wp-content/uploads/(.*) $1watermark.php?src=wp-content/uploads/$2


Proteger admin de wordpress con .htaccess

Posted: marzo 9th, 2011 | Author: | Filed under: Internet, Recursos Web | Tags: , | 1 Comment »

En el artículo anterior Como proteger un directorio en un sitio web con contraseña vimos como agregar un password a un directorio. Una aplicación útil de esto es proteger el directorio admin de nuestro wordpress con usuario y contraseña para agregar un nivel extra de seguridad.

Los pasos a seguir son los mismos que en el caso anterior, creamos el archivo .htpasswd, lo colocamos en un directorio no accesible desde la web y luego el archivo .htaccess en el directorio wp-admin de forma que el sitio público no quede bloqueado pero si el admin.

El problema que puede surgir en muchos casos con esta solución es que no podemos acceder al archivo admin-ajax.php, que es utilizado por ejemplo por algunos plugins para cargar contenidos.

Una solución es agregar en nuestro archivo .htaccess una directiva para que este archivo sea accesible para todo el público sin pedido de contraseña, esto lo logramos con un archivo como el que sigue:

AuthName «Restricted Area»
AuthType Basic
AuthUserFile /var/www/misitioweb.com/.htpasswd
AuthGroupFile /dev/null
require valid-user

<Files «admin-ajax.php»>
Allow from all
Satisfy Any
</Files>

La primera parte es la de pedido de contraseña, luego colocamos el acceso público para el archivo admin-ajax.php.

De esta forma nuestros plugins deberían funcionar sin problemas aunque coloquemos la protección de contraseña en el directorio wp-admin.


Traducción en tiempo real mediante Google Translate con PHP

Posted: febrero 19th, 2011 | Author: | Filed under: PHP, Recursos Web | Tags: , | Comentarios desactivados en Traducción en tiempo real mediante Google Translate con PHP

La traducción de textos en tiempo real es posible utilizando PHP y la API de Google Translate. En forma rápida y sencilla podemos realizar traducciones en los idiomas soportados por el servicio de Google.

En dos líneas podemos realizar el pedido de traducción y procesar la información de respuesta que llega en JSON:

$trans = @file_get_contents( «http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=Texto&langpair=es|en» );
$json = json_decode( $trans, true );

Los parámetros a utilizar son tres. El primero indica la versión de API que estamos utilizando, en la actualidad la 2.0 está en desarrollo por lo que haremos uso de la 1.0.

El parámetro q indica el texto a traducir. Luego indicamos los idiomas de origen y destino. En este caso es que indica español y en que indica english. Debemos hacer uso de las siglas utilizadas por Google Translate para indicar los idiomas.

Al procesar el JSON con json_decode obtenemos un array con un campo «responseStatus» que indica si la traducción se realizó con éxito. En dicho caso devuelve el valor «200».

El texto está contenido en [«responseData»][«translatedText»], por lo cual podemos responder en un AJAX para realizar traducciones instantáneas y en forma sencilla.

echo $json[‘responseData’][‘translatedText’];


Migrar correos a Google Apps

Posted: enero 29th, 2011 | Author: | Filed under: Internet, Recursos Web | Tags: , , | 2 Comments »

La versión estandar de Google Apps no cuenta con los servicios de migración de correos, por lo que si tenemos un servidor viejo con correos tipo Squirrelmail no podemos hacer una migración automática.

De todas formas tenemos la posibilidad de hacerlo a mano.

Primero que nada creamos las casillas de correo en Google Apps. Creamos la cuenta para el dominio, verificamos que somos los dueños con un archivo HTML y por el momento dejamos los DNS del dominio sin cambiar. Esto es importante ya que necesitamos activar el servicio de Apps para el dominio, para eso el archivo HTML de verifiación, pero no damos de baja el servicio de correo y registros MX en el dominio viejo.

Con el servicio activado y las cuentas creadas, accedemos a una de la siguiente forma: https://mail.google.com/a/dominio.com

Puede ser una buena idea usar otro navegador para no tener que salir de la cuenta de administracion.

Una vez que accedimos a la nueva casilla en Google Apps, lo que hacemos es configurar para recibir correos desde otra casilla. El problema es que no nos dejará configurar el correo con el mismo nombre. Por ejemplo si el correo a migrar es info@dominio.com, y ya creamos en Google Apps el nuevo correo info@dominio.com, al agregar una cuenta para importar debemos «mentir» y usar un nombre diferente. Por ejemplo importar desde info@dominio.net.

De esa forma Apps cree que es una cuenta distinta. En el siguiente paso configuramos el acceso POP o IMAP al servidor viejo segun tengamos acceso, y comenzamos la importación…

Si tenemos que migrar múltiples cuentas puede ser un trabajo largo pero a medida que vamos dando de alta la importación podemos salir y acceder a la siguiente siguiendo los mismos pasos. Apps realizará el trabajo de migración por su cuenta mientras nosotros seguimos dando de alta las importaciones en las otras.


Comandos avanzados de SSH – SSH Tips & Tricks

Posted: noviembre 29th, 2010 | Author: | Filed under: Recursos Web, Servidores Linux | 1 Comment »

1) Acceso SSH sin contraseña:

ssh-copy-id user@host

Generamos las llaves mediante ssh-keygen y luego las copiamos al equipo para permitir el acceso sin clave.

2) Crear un tunel desde un puerto local a un equipo remoto en puerto 80:

ssh -N -L2002:localhost:80 equiporemoto

Nos permite acceder a un sitio web a través de http://localhost:2002/

3) Conectar micrófono a un equipo remoto:

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

Nos permite comunicar nuestro microfono con la salida de audio del equipo remoto.

4) Comparar un archivo remoto con uno local:

ssh user@host cat /path/to/remotefile | diff /path/to/localfile –

Útil para saber si un archivo local es idéntico a uno remoto.

5) Montar unidad a través de SSH

sshfs name@server:/path/to/folder /path/to/mount/point

Permite montar un directorio en forma remota, requiere SSHFS: http://fuse.sourceforge.net/sshfs.html

6) Conexión SSH con un host intermedio:

ssh -t reachable_host ssh unreachable_host

Podemos acceder a un equipo inaccesible desde nuestra red, pero que es accesible desde une red remota. Hacemos una conexión con un intermediario que nos permite acceder.

7) Copiar de host1 a host2 mediante el equipo local:

ssh root@host1 “cd /somedir/tocopy/ && tar -cf – .” | ssh root@host2 “cd /samedir/tocopyto/ && tar -xf -”

Útil cuando dos equipos no pueden conectarse en forma directa, utilizamos nuestro equipo como intermediario.

8) Ejecutar programas de entorno gráfico en forma remota:

ssh -fX <user>@<host> <program>

El servidor SSH requiere de la siguiente configuración:

X11Forwarding yes # default en Debian

Recomendable también:

Compression delayed

9) Crear una conexión persistente:

ssh -MNf <user>@<host>

10) Conectar salida de video por SSH:

ssh -t remote_host screen -r

11) Port Knocking!

knock <host> 3000 4000 5000 && ssh -p <port> user@host && knock <host> 5000 4000 3000

Knock para activar servicio SSH y para cerrar.
Ejemplo:
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

12) Remover una línea de texto:

ssh-keygen -R <the_offending_host>

13) Ejecutar comandos complejos sobre SSH sin comillas de escape:

ssh host -l user $(<cmd.txt)

14) Copiar una base de datos MySQL a un servidor nuevo:

mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost “mysql -uUSER -pPASS NEW_DB_NAME”

15) Quitar una línea de un archivo de texto, útil para eliminar las alertas: “ssh host key change”

sed -i 8d ~/.ssh/known_hosts

16) Copiar la clave pública de SSH s un servidor que no tiene ssh-copy-id

cat ~/.ssh/id_rsa.pub | ssh user@machine “mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys”

Nos permite acceder a un equipo remoto sin necesidad de la contraseña.

17) Test de velocidad SSH

yes | pv | ssh $host “cat > /dev/null”

Nos muestra en vivo la transferencia, envia la salida a /dev/null
Es necesario contar con pv instalado:
Debian: ‘apt-get install pv’
Fedora: ‘yum install pv’ (‘extras’ repository)

18) Establecer una ventana GNU a la cual es posible reconectarse:

ssh -t user@some.domain.com /usr/bin/screen -xRR

19) Continuar scp para un archivo grande:

rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file

Permite resumir una copia scp mediante rsync.
Requiere rsync en ambos hosts.

rsync –partial –progress –rsh=ssh $file_source $user@$host:$destination_file local -> remote
o
rsync –partial –progress –rsh=ssh $user@$host:$remote_file $destination_file remote -> local

20) Analizar tráfico ssh remoto mediante wireshark

ssh root@server.com ‘tshark -f “port !22″ -w -’ | wireshark -k -i –

Utilizando tcpdump:
ssh root@example.com tcpdump -w – ‘port !22′ | wireshark -k -i –

21) Abrir una sesión SSH en por tiempo indefinido:

autossh -M50000 -t server.example.com ‘screen -raAd mysession’

Ideal para conexiones inestables o cuando se requiere cambiar de servicio WiFi.

22) Mayor seguridad en la conexión:

ssh -4 -C -c blowfish-cbc

23) Balanceo de ancho de banda:

tar -cj /backup | cstream -t 77k | ssh host ‘tar -xj -C /backup’

Comprime y limita el ancho de banda a 77k bit/s.

24) Transferir la clave pública a través de SSH:

ssh-keygen; ssh-copy-id user@host; ssh user@host

25) Copiar stdin al buffer de tu X11:

ssh user@host cat /path/to/some/file | xclip


Como proteger un directorio en un sitio web con contraseña

Posted: noviembre 13th, 2010 | Author: | Filed under: Internet, Recursos Web | Comentarios desactivados en Como proteger un directorio en un sitio web con contraseña

Gestores FOREX y asesoria en inversiones. Mercado de divisas.

Al momento de desarrollar un nuevo sitio web suele suceder que debemos publicar el sitio para que el clienta pueda verlo, pero no queremos que el resto del mundo acceda hasta el momento en que este listo. Tampoco queremos que los buscadores lo indexen, ya que daran de alta el contenido que puede ser de prueba o bien podemos tener el sitio en una url temporal, como un subdominio o un dominio de desarrollo. Para evitar dolores de cabeza más tarde viendo como el contenido es indexado mezclando los sitios podemos colocar una contraseña y evitar el indexado erróneo.

Una solución simple en Apache es utilizar un archivo .htaccess y .htpasswd para crear una simple autenticación de usuario. El procedimiento que debemos seguir es simple. Primero definimos un nombre de usuario y contraseña, por ejemplo:

  • Usuario: usuario
  • Contraseña: 123456

El siguiente paso es comprender como funciona el sistema de autenticación de Apache. Debemos crear un archivo .htpasswd que contendrá el usuario y contraseña. Creamos un archivo .htpasswd con el siguiente contenido (si lo hacemos en windows con notepad debemos tener cuidado al guardar de seleccionar todas las extensiones de archivo, ya que por defecto esta marcada la opción Archivos de Texto que nos agrega .txt al final):

usuario:gtXa5NHfNQI9U

El archivo .htpasswd contiene simplemente eso. Como pueden ver la contraseña se encuentra encodeada en base 64, por lo cual si trabajos en un servidor compartido no debemos confiar a este sistema una seguridad de relevancia. Es una simple barrera, no un sistema infalible…

Para encodear la contraseña a base 64 podemos buscar en Google alguna de las webs que hacen esto online, por ejemplo: http://www.motobit.com/util/base64-decoder-encoder.asp

Colocamos el nombre de usuario, dos puntos y la contraseña encodeada.

Hecho esto colocamos este archivo en un directorio que no sea visible desde el servidor web. Es decir que si tipeamos una URL no podamos acceder al mismo. Si estamos trabajando en un servidor Apache en Linux, podríamos tener nuestro sitio web en una ruta como la siguiente:

/var/www/vhosts/sitioweb.com/

Por lo general tendremos un directorio httpdocs que es donde colocamos los archivos web, pero tendremos cuidado de NO colocar el .htpasswd ahí para que no sea visible desde Internet. Colocamos el archivo en la siguiente ubicación:

/var/www/vhosts/sitioweb.com/.htpasswd

Hecho esto pasamos a proteger el directorio, por ejemplo podría ser el siguiente:

/var/www/vhosts/sitioweb.com/httpdocs/nuevo

El archivo .htaccess contendrá lo siguiente:

AuthName «Restricted Area»
AuthType Basic
AuthUserFile /var/www/vhosts/sitioweb.com/.htpasswd
AuthGroupFile /dev/null
require valid-user

Como ven desde el .htaccess pedimos que Apache autentique con el archivo .htpasswd. El archivo .htaccess quedaría ubicado así:

/var/www/vhosts/sitioweb.com/httpdocs/nuevo/.htaccess

Listo, con estos dos archivos en su lugar y con las rutas correctas, veremos el mensaje que pide usuario y contraseña al acceder al sitio web.

Al momento de desarrollar un nuevo sitio web suele suceder que debemos publicar el sitio para que el clienta pueda verlo, pero no queremos que el resto del mundo acceda hasta el momento en que este listo. Tampoco queremos que los buscadores lo indexen, ya que daran de alta el contenido que puede ser de prueba o bien podemos tener el sitio en una url temporal, como un subdominio o un dominio de desarrollo. Para evitar dolores de cabeza más tarde viendo como el contenido es indexado mezclando los sitios podemos colocar una contraseña y evitar el indexado erróneo.


Micropagos en Juegos y Juegos en todo

Posted: abril 27th, 2010 | Author: | Filed under: Internet, Recursos Web | Comentarios desactivados en Micropagos en Juegos y Juegos en todo

Dando un vistazo a las tendencias de juegos, servicios de celulares y demás aplicaciones de ocio como pueden ser trivias, sorteos, etc. se puede ver una tendencia clara hacia la interacción constante con el usuario. Cada vez se requiere una respuesta más elaborada a estas aplicaciones, lo cual nos lleva a invertir más tiempo y a darle una importancia relativa mayor en nuestra vida. El resultado, una vez que estamos participando no podemos dejar de hacerlo.

Los juegos online como Mafia, Farmville y otros están marcando el camino para las nuevas generaciones de entretenimiento. Juegos donde participas con tus amigos, donde tu grupo social está incluído y compartes pero sobre todo compites con tus conocidos. Una vez que tenemos nuestra granja y vemos la de nuestros amigos, queremos una mejor, invertimos más tiempo y esto alimenta el círculo para que sigamos en él.

Claro que en caso de que no tengamos el tiempo suficiente para construir paso a paso nuestra granja podemos gastar unos pocos dólares y nos ahorramos el tiempo… O si estamos en el Mafia podemos comprar lo que otros tienen y se han ganado con tiempo. ¿Qué padre le negaría unos dólares a su hijo que ha estado tan tranquilo con ese juego las últimas semanas?

Esto nos lleva a los micropagos. Los micropagos son pagos de un dólar por ejemplo, que se puedan hacer al instante y con un servicio de celular o a través de Paypal, con comisiones mínimas que permiten que el pago sea rentable. Este eslabón posibilita la creación de aplicaciones que requieran de pagos mínimos para obtener resultados rápidos, creando un abanico hasta ahora inexplorado para compras en Internet, el público en general que no cuenta con tarjetas de crédito.

Es de suponer que los micropagos sean el próximo paso a dar por parte de Facebook, en su intento de crear una red cerrada o Internet propia, donde otras grandes companías como Google no puedan participar ni interferir, y donde los usuarios no tengan la necesidad de salir de esta red.

Sumando micropagos, celulares, juegos en celulares y el día de mañana juegos en la TV, en la calle, en discotecas y pubs podemos imaginar un futuro donde participar en juegos, compartiendo y compitiendo con nuestros amigos y contactos de redes sociales sea la norma. Y a falta de tiempo podamos gastar unos pocos dólares para estar en el msmo nivel sin tener que invertir tiempo.


Paginado de resultados con PHP

Posted: julio 31st, 2008 | Author: | Filed under: PHP, Recursos Web | Tags: , , , | 2 Comments »

Ordenar los resultados en los listados suele ser un problema repetido y aburrido de solucionar. Tenemos que cortar la consulta de resultados, luego contar las páginas segun la cantidad de resultados por página, poner links de siguiente, anterior, etc, etc, etc…

En esta entrada les dejo un script para olvidarse de una vez de este tema, un script que se encarga de hacer todo el paginado por su cuenta, simplemente definimos algunos valores y problema solucionado.

Primero que nada el script: «Paginator». El sitio del proyecto lo encuentran en:
http://jpinedo.webcindario.com/scripts/paginator/

Descargan los dos archivos del script y lo primero que tenemos que hacer es configurar el script para que se conecte a la base de datos. Esto lo hacemos en el archivo: paginatorconf.inc.php. Verán que en este archivo definen servidor, usuario, contraseña y DB.

Hecho esto lo único que tenemos que hacer es preparar la consulta SQL tal como la usariamos normalmente, sin LIMIT ni nada. Veamos un ejemplo:

$_pagi_sql = «SELECT * FROM tabla ORDER BY nombre»;

$_pagi_cuantos = 50;
$_pagi_nav_num_enlaces = 5;

require(«paginatorconf.inc.php»);
require(«paginator.inc.php»);

Guardamos en una variable de nombre $_pagi_sql (este nombre es el que usa el script, sirve para no confundirse) la consulta, luego definimos el formato del paginado, es decir la cantidad de resultados por página y el numero de enlaces hacia las páginas de resultados, y llamamos a los dos archivos del paginator, primero al de configuración y luego a paginator.inc.php.

Luego de haber incluído el segundo archivo tendremos en la variable $_pagi_result el resultado de la consulta. Además tenemos otras variables que guardan todos los datos que necesitamos, como cantidad de resutlados, número de enlaces y demás, veamos como podemos desplegar la información:

<table>
<tr>
<th width=»3%»>N&ordm;</th>
<th>Nombre</th>
</tr>

<?
$i = $_pagi_desde;

while($row = mysql_fetch_array($_pagi_result)){
?>
<tr>
<td><?=$i?>.</td>
<td> <?=$row[‘nombre’]?></td>
</tr>

<?
$i++;
}
?>

<tfoot>
<tr><th colspan=2 width=100%>
Resultados: Desde <?=$_pagi_desde?> hasta <?=$_pagi_hasta?> (Total: <?=$_pagi_totalReg?>)
<br />Página: <?=$_pagi_navegacion?>
</th></tr>
</tfoot>

</table>

Recorremos los resultados obtenidos, y con la variable $_pagi_navegacion desplegamos la navegación con los links de siguiente, anterior y links directo a las páginas. así de simple :).

Para los casos en que utilizan variables GET para su sitio, no hay problema, ya que las variables GET que utiliza el navegador no borran las de ustedes, el script se encarga de propagar o «poner en su sitio» las variables GET que tenga la URL para no romper la misma ;).