2011-12-22

Monitorización del servidor web con pingdom

Una de las formas más simples (y útiles) de monitorizar que nuestro sitio web no se ha caido y sigue online es mediante el uso de herramientas externas que regularmente comprueban que nuestra página web es accesible desde internet.

Una de estas herramientas en pingdom.

Una vez nos hallamos registrado en esta aplicación podremos, de manera gratuita, monitorizar una página web de nuestra elección, y pingdom nos enviará un email (también se puede notificar a traves de SMS, twitter, aplicaciones de iPhone y android).
Sólo tenemos que poner la dirección de nuestra página (www.nioos.com en nuestro caso) y el intervalo de comprobación, y pingdom se encargará de enviarnos un email cuando la página esté caida.

Las cosas mas sencillas suelen ser las más útiles, ¿verdad?


2011-12-21

Instalar rootkit hunter en linux Debian

De la misma forma que existen virus para sistemas windows hay rootkits para linux.

Podemos comprobar si nuestro sistema tiene alguno de estos rootkits si instalamos algún tipo de herramienta que los detecte.

Una de estas herramientas es Rootkit Hunter.

Podemos descargarla directamente en nuestro sistema linux con el comando


apt-get install rkhunter

Una vez instalado podemos ejecutarlo haciendo uso de los siguientes comandos, que pueden incluse ejecutarse desde cron:

rkhunter --versioncheck
comprueba si hay una versión más moderna de Rootkit Hunter disponible para ser descargada.

rkhunter --update
actualiza la base de datos de los rootkits detectados desde el repositorio central de internet.

rkhunter --propupd
actualiza la base de datos de control de los comandos instalados en nuestro sistema.

rkhunter --check --sk
escanea el sistema en busca de posibles rootkits.

Útil y sencillo.

2011-12-13

Instalar rootkit hunter en linux CentOS

De la misma forma que existen virus para sistemas windows hay rootkits para linux.

Podemos comprobar si nuestro sistema tiene alguno de estos rootkits si instalamos algún tipo de herramienta que los detecte.

Una de estas herramientas es Rootkit Hunter.

Podemos descargarla directamente en nuestro sistema linux con el comando

wget http://downloads.sourceforge.net/project/rkhunter/rkhunter/1.3.8/rkhunter-1.3.8.tar.gz

Lo descomprimimos con el comando

tar xvzf rkhunter-1.3.8.tar.gz

Una vez descomprimido, se instala ejecutando el script de instalación localizado en el directorio "rkhunter"

./installer.sh --install

Una vez instalado podemos ejecutarlo haciendo uso de los siguientes comandos, que pueden incluse ejecutarse desde cron:

rkhunter --versioncheck
comprueba si hay una versión más moderna de Rootkit Hunter disponible para ser descargada.

rkhunter --update
actualiza la base de datos de los rootkits detectados desde el repositorio central de internet.



rkhunter --propupd
actualiza la base de datos de control de los comandos instalados en nuestro sistema.


rkhunter --check --sk
escanea el sistema en busca de posibles rootkits.

Útil y sencillo.


2011-12-10

Proteger Debian de ataques externos con fail2ban

Cuando tenemos un servidor en internet es muy común sufrir a diario algún tipo de ataque externo automatizado que trata de acceder y controlar nuestra máquina linux.

Podemos evitar parte de estos ataques instalando la utilidad fail2ban, que permite escanear los ficheros logs del sistema, detecta los ataques sufridos y toma automáticamente medidas para evitarlos, por ejemplo, baneando la IP de la máquina atacante durante cierto tiempo.



La instalación se puede hacer con apt-get.


apt-get install fail2ban

Ahora podemos habilitar las reglas de escaneo de logs que queramos modificando el fichero de configuración /etc/fail2ban/jail.conf.
Aqui podremos, por ejemplo, cambiar la dirección del correo electronico de destino de las notificaciones, el contenido del correo, etc.

destemail = correo.de.destino@dominio.com
mta = mail
action = %(action_mwl)s

La configuración por defecto escanea el fichero /var/log/auth.log que, entre otras cosas, usa el demonio sshd para escribir el log de los intentos fallidos de login para que, usando iptables, restringa los accesos desde la IP atacante y, a la vez, nos envíe un correo electronico avisándonos (un ataque de fuerza bruta muy habitual en internet).


La mayoría de las veces se trata de máquinas que han sido infectadas por algún troyano sin que sus dueños sepan que están siendo usadas para atacar a otras máquinas.
Si podeis poneros en contacto con el dueño y avisarle os lo agradecerá enormemente.

Proteger CentOS de ataques externos con fail2ban

Cuando tenemos un servidor en internet es muy común sufrir a diario algún tipo de ataque externo automatizado que trata de acceder y controlar nuestra máquina linux.

Podemos evitar parte de estos ataques instalando la utilidad fail2ban, que permite escanear los ficheros logs del sistema, detecta los ataques sufridos y toma automáticamente medidas para evitarlos, por ejemplo, baneando la IP de la máquina atacante durante cierto tiempo.

Podemos descargar fail2ban directamente en nuestra máquina linux desde su página en github.

wget --no-check-certificate --output-document=fail2ban.0.8.6.tar.gz https://github.com/fail2ban/fail2ban/tarball/0.8.6

También es interesante instalar las librerías de gamin en nuestro sistema, para facilitar la tarea de monitorización de los ficheros logs.
Esto se hace con el comando

yum install gamin

Una vez descargado el fichero fail2ban.0.8.6.tar.gz lo podemos descomprimir usando el comando

tar xvfz fail2ban.0.8.6.tar.gz

La instalación consiste ahora en ejecutar el script de instalación que se encuentra en la carpeta creada por la descompresión.

python setup.py install

Una vez hecho esto podemos comprobar que la instalación ha sido correcta ejecutando el comando

fail2ban-client -h

que mostrará la ayuda del comando.

Si queremos que fail2ban se arranque al iniciar la máquina, podemos copiar el fichero redhat-initd que está dentro del directorio files al directorio de los scripts de arranque de linux CentOS.

cp files/redhat-initd /etc/init.d/fail2ban

Recordar que debemos darle los permisos adecuados

chmod 755 /etc/init.d/fail2ban
y que debemos usar la utilidad chkconfig para crear los enlaces simbólicos usados en el arranque automático.

chkconfig --add fail2ban

Fail2ban también genera su propio fichero log que es conveniente rotar con logrotate.
Para esto podemos crear el fichero /etc/logrotate.d/fail2ban con el siguiente contenido.

/var/log/fail2ban.log {
    weekly
    rotate 7
    missingok
    compress
    postrotate
        /usr/bin/fail2ban-client reload 1>/dev/null || true
    endscript
}

Ahora podemos habilitar las reglas de escaneo de logs que queramos modificando el fichero de configuración /etc/fail2ban/jail.conf.
Por ejemplo, podemos habilitar el escaneo del fichero /var/log/secure que, entre otras cosas, usa el demonio sshd para escribir el log de los intentos fallidos de login para que, usando iptables, restringa los accesos desde la IP atacante y, a la vez, nos envíe un correo electronico avisándonos (un ataque de fuerza bruta muy habitual en internet).

[ssh-iptables]
enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
           mail-whois[name=SSH, dest=correo.de.destino@dominio.com, sender=persona.que.manda.el.correo@dominio.com]
logpath  = /var/log/secure
maxretry = 5

Por último, debemos instalar el comando whois en nuestra máquina para recibir más información sobre la IP atacante.

yum install jwhois

La mayoría de las veces se trata de máquinas que han sido infectadas por algún troyano sin que sus dueños sepan que están siendo usadas para atacar a otras máquinas.
Si podeis poneros en contacto con el dueño y avisarle os lo agradecerá enormemente.

2011-12-08

Enviar email con línea de comandos desde linux Debian usando Gmail

Ya hemos visto anteriormente como podemos usar Gmail como servidor de correo electronico para nuestro dominio, pero también es posible enviar correos electrónicos directamente desde nuestro sistema linux Debian desde línea de comandos usando Gmail como relay de correo si instalamos la utilidad "mailx" (también conocida como "nail").

Podemos usar apt-get para instalarla.

apt-get install heirloom-mailx

La configuración general de "mailx" se realiza en el fichero /etc/nail.rc.
Aquí añadiremos las siguientes líneas para hacer que "mailx" use Gmail como nuestro relay de correo.

set smtp-use-starttls
set ssl-verify=ignore
set smtp-auth=login
set smtp=smtp://smtp.gmail.com:587
set from="tu.direccion.de.correo@tu.dominio"
set smtp-auth-user=tu.direccion.de.correo@tu.dominio
set smtp-auth-password=tu.password
set ssl-verify=ignore

Bastante sencillo, ¿verdad?

Enviar email con línea de comandos desde linux CentOS usando Gmail

Ya hemos visto anteriormente como podemos usar Gmail como servidor de correo electronico para nuestro dominio, pero también es posible enviar correos electrónicos directamente desde nuestro sistema linux CentOS desde línea de comandos usando Gmail como relay de correo si instalamos la utilidad "nail" (también conocida como "mailx").

Podemos encontrar la última versión de "nail" en http://rpm.pbone.net/.

La podemos descargar directamente en nuestro sistema con "wget"

wget ftp://ftp.pbone.net/mirror/centos.karan.org/el5/extras/testing/i386/RPMS/nail-12.3-4.el5.kb.i386.rpm

Una vez descargado el paquete lo podemos instalar usando "rpm".

rpm -ivh nail-12.3-4.el5.kb.i386.rpm

Lo más cómodo ahora es crear algunos links simbólicos para que las aplicaciones que habitualmente usan el comando "mail" de linux empiecen a usar nuestro nuevo comando "nail".

ln -s /usr/bin/nail /usr/bin/mail
ln -s /usr/bin/nail /bin/mail

Por último, la configuración general de "nail" se realiza en el fichero /etc/nail.rc.
Aquí añadiremos las siguientes líneas para hacer que "nail" use Gmail como nuestro relay de correo.

set smtp-use-starttls
set ssl-verify=ignore
set smtp-auth=login
set smtp=smtp://smtp.gmail.com:587
set from="tu.direccion.de.correo@tu.dominio"
set smtp-auth-user=tu.direccion.de.correo@tu.dominio
set smtp-auth-password=tu.password
set ssl-verify=ignore

Bastante sencillo, ¿verdad?


2011-12-04

Borrar los ficheros logs antiguos de tomcat en linux

Con el paso del tiempo el tamaño y cantidad de ficheros logs de tomcat se vuelve muy elevado.
Podemos borrar estos ficheros logs haciendo uso de "cron" y del comando "find".

Esto lo hacemos modificando el fichero shell script (en nuestro el fichero "tomcat.log.cron") del directorio "/etc/cron.daily".


#!/bin/sh
find /opt/tomcat/logs/ -type f -name '*.txt.gz' -mtime +30 -exec rm -f '{}' ';'
find /opt/tomcat/logs/ -type f -name '*.log.gz' -mtime +30 -exec rm -f '{}' ';'
El comando "find" busca ficheros (-type f) en el directorio "/opt/tomcat/logs/" con la terminación txt.gz ó log.gz (-name '*.txt.gz') que hallan sido modificados hace más de 30 días (-mtime +30) aproximadamente, y ejecutar (-exec) sobre ellos el comando de borrado rm.

Esto mismo se puede hacer con cualquier tipo de fichero log, no es necesario que sea de tomcat.

Una forma sencilla de ahorrar una espacio en el disco de nuestro sistema.

Comprimir los ficheros logs antiguos de tomcat en linux

Con el paso del tiempo el tamaño y cantidad de ficheros logs de tomcat se vuelve muy elevado.
Podemos comprimir estos ficheros logs haciendo uso de "cron" y del comando "find".

Esto lo hacemos creando un fichero shell script en el directorio "/etc/cron.daily" para que "cron" los ejecute diariamente (en nuestro caso lo llamaremos "tomcat.log.cron").

#!/bin/sh
find /opt/tomcat/logs/ -type f -name '*.txt' -mtime +2 -exec gzip -9 '{}' ';'
find /opt/tomcat/logs/ -type f -name '*.log' -mtime +2 -exec gzip -9 '{}' ';'

El comando "find" busca ficheros (-type f) en el directorio "/opt/tomcat/logs/" con la terminación txt ó log (-name '*.txt') que hallan sido modificados hace más de 2 días (-mtime +2) aproximadamente, y ejecuta (-exec) sobre ellos el comando de compresión gzip.
Esto mismo se puede hacer con cualquier tipo de fichero log, no es necesario que sea de tomcat.

Una forma sencilla de ahorrar una espacio en el disco de nuestro sistema.

2011-11-27

Seguimiento de errores con Google Analytics

De igual forma que podemos hacer un tracking de los eventos con Google Analytics (las búsquedas por ejemplo), también es posible hacer un tracking de algunos de los errores que se producen en nuestra página web (algo que, de otra forma, es muy complejo).

Para hacer esto lo único que debemos hacer, igual que antes, es añadir el siguiente código a nuestros javascript:

_gaq.push(['_trackEvent', 'Error', 'geocode', status]);
ó
_gaq.push(['_trackEvent', 'Error', 'twitterError', errorThrown]);

donde


'Error'
es la "categoría del evento", un valor de nuestra elección y que se mostrará en la página de eventos de Google Analytics

'geocode' ó 'twitterError'
es  la "acción de evento", un valor de nuestra elección y que se mostrará en la página de eventos de Google Analytics

status ó errorThrown
es el valor de  la "etiqueta de evento", es el valor del código postal, en este caso, y se mostrará en la página de eventos de Google Analytics.

Toda la información se podrá visualizar en Google Analytics, en la sección
Contenido - Eventos - Eventos principales

De esta forma podemos obtener mucha información muy útil de una forma muy sencilla.

Seguimiento de eventos con Google Analytics

Después de activar las características de Google Analytics en nuestra página web podemos realizar un tracking completo de aquellos eventos que ocurran en nuestra página web y que nos interesen.

Por ejemplo podemos hacer un seguimiento del evento de búsqueda, usando como parámetros de este evento el país y el código postal buscado desde nuestra página web.

En  el fondo es algo bastante sencillo, ya que lo único que requiere es añadir la siguiente línea de código javascript:

_gaq.push(['_trackEvent', 'Busqueda', 'postalCode', postalCode]);

donde

'Busqueda'
es la "categoría del evento", un valor de nuestra elección y que se mostrará en la página de eventos de Google Analytics

'postalCode'
es  la "acción de evento", un valor de nuestra elección y que se mostrará en la página de eventos de Google Analytics

postalCode
es el valor de  la "etiqueta de evento", es el valor del código postal, en este caso, y se mostrará en la página de eventos de Google Analytics.

Toda la información se podrá visualizar en Google Analytics, en la sección
Contenido - Eventos - Eventos principales

De esta forma podemos obtener mucha información muy útil de una forma muy sencilla.


2011-11-19

Añadir analítica web a nuestros sitios web con Google Analytics

Podemos añadir analítica web a nuestra web con Google Analytics de una forma muy simple.

Sólo debemos abrir una cuenta en Google Analytics y poner el código javascript que se nos proporciona justo antes de cerrar la cabecera (header) ó el cuerpo (body) de nuestras páginas web.

A partir de entonces tendremos disponibles todo tipo de estadísticas sobre las visitas a nuestros sitios web.

Así podremos conocer gran cantidad de información sobre las visitas a nuestros sitios web de una forma muy sencilla.


Poner un icono de favoritos en nuestra página web

Poner un icono de favoritos en nuestra página web (esas pequeñas imágenes que aparecen al lado de la barra de direcciones y en cada pestaña del navegador que tenemos abierta, y que son usadas también en los marcadores de favoritos de las páginas web) es muy simple, sólo hay que añadir:

<link rel="shortcut icon" href="favicon.ico" />

a la cabecera de nuestra página web.

El archivo favicon.ico es una imagen de tipo .ico que debe tener un tamaño de 16x16 pixels.

Esta imagen se puede crear con un editor gráfico (como GIMP, por ejemplo) o usando un servicio online (como por ejemplo http://www.favicon.cc/).


2011-11-12

Cuidado con los acentos en la etiqueta meta description

La etiqueta meta description es la que es muestrada por los buscadores debajo del link de nuestra página web.

Debemos tener cuidado si queremos usar acentos ú otras letras que no sean ASCII en esta etiqueta, ya que, en general, los buscadores no la mostraran adecuadamente.
En lugar de usar una letra acentudada directamente debemos usar su correspondiente código de escape html.

Es algo muy sencillo que evitará dar una imagen pobre a los usuarios que encuentren nuestra web en algún buscador.

2011-11-09

Usar css media queries

Podemos usar css media queries para detectar el espacio disponible en el navegador del cliente y así cambiar el tamaño de los elementos de nuestra página web (incluso podemos cambiar el tamaño de la letra, por ejemplo) dependiendo del tamaño disponible.

El fichero css será algo así:


@CHARSET "UTF-8";
/* valores por defecto */
.contenedor {
    width: 984px;
    margin: 0 auto;
    position: relative;
}
.header {
    width: 216px;
    position: absolute;
    left: 0px;
}
.nioos {
    margin: 0;
    font-size: 91px;
    font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, serif;
    line-height: 147px;
    text-align: center;
}
.subtitle {
    font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, serif;
    font-size: 13px;
    line-height: 21px;
    text-align: center;
}
.principal {
    width: 728px;
    position: absolute;
    left: 256px;
}
#mapa {
    width: 100%;
    height: 450px;
    font-family: Verdana, Geneva, sans-serif;
    font-size: 13px;
    line-height: 21px;
}
.gs-newsResult {
    height: 168px;
}
.gs-publisher, .gs-publishedDate, .gs-clusterUrl {
    font-size: 11px;
    line-height: 17px;
}
.barra-busqueda {
    width: 100%;
    margin-bottom: 5px;
    position: relative;
}
#direccion {
    width: 645px;
}
.control {
    font-family: "Lucida Console", Monaco, monospace;
    font-size: 13px;
}
#buscando {
    position: absolute;
    left: 625px;
    top: 4px;
    visibility: hidden;
}
#placeAttr {
    width: 100%;
    height: 20px;
    font-family: Arial,sans-serif;
    font-size: 11px;
    text-align: right;
    padding-top: 2px;
}
/* valores para un ancho de navegador de entre 1365px y 1280px */
@media (max-width: 1365px) and (min-width: 1280px) {
    .contenedor {
        width: 1240px;
    }
    .header {
        width: 280px;
    }
    .nioos {
        font-size: 105px;
        line-height: 170px;
    }
    .subtitle {
        font-size: 21px;
        line-height: 34px;
    }
    .principal {
        width: 920px;
        left: 320px;
    }
    #mapa {
        height: 569px;
        font-size: 21px;
        line-height: 34px;
    }
    .gs-newsResult {
        height: 306px;
    }
    #direccion {
        width: 810px;
    }
    .control {
        font-size: 21px;
    }
    #buscando {
        left: 790px;
        top: 7px;
    }
}
/* valores para un ancho de navegador de entre 1439px y 1366px */
@media (max-width: 1439px) and (min-width: 1366px) {
    .contenedor {
        width: 1324px;
    }
    .header {
        width: 301px;
    }
    .nioos {
        font-size: 105px;
        line-height: 170px;
    }
    .subtitle {
        font-size: 21px;
        line-height: 34px;
    }
    .principal {
        width: 983px;
        left: 341px;
    }
    #mapa {
        height: 608px;
        font-size: 21px;
        line-height: 34px;
    }
    .gs-newsResult {
        height: 306px;
    }
    #direccion {
        width: 870px;
    }
    .control {
        font-size: 21px;
    }
    #buscando {
        left: 850px;
        top: 7px;
    }
}
/* valores para un ancho de navegador de entre 1679px y 1440px */
@media (max-width: 1679px) and (min-width: 1440px) {
    .contenedor {
        width: 1400px;
    }
    .header {
        width: 320px;
    }
    .nioos {
        font-size: 126px;
        line-height: 204px;
    }
    .subtitle {
        font-size: 21px;
        line-height: 34px;
    }
    .principal {
        width: 1040px;
        left: 360px;
    }
    #mapa {
        height: 643px;
        font-size: 21px;
        line-height: 34px;
    }
    .gs-newsResult {
        height: 306px;
    }
    #direccion {
        width: 900px;
    }
    .control {
        font-size: 21px;
    }
    #buscando {
        left: 880px;
        top: 7px;
    }
}
/* valores para un ancho de navegador de entre 1919px y 1680px */
@media (max-width: 1919x) and (min-width: 1680px) {
    .contenedor {
        width: 1640px;
    }
    .header {
        width: 380px;
    }
    .nioos {
        font-size: 147px;
        line-height: 238px;
    }
    .subtitle {
        font-size: 21px;
        line-height: 34px;
    }
    .principal {
        width: 1220px;
        left: 420px;
    }
    #mapa {
        height: 754px;
        font-size: 21px;
        line-height: 34px;
    }
    .gs-newsResult {
        height: 306px;
    }
    #direccion {
        width: 1105px;
    }
    .control {
        font-size: 21px;
    }
    #buscando {
        left: 1085px;
        top: 7px;
    }
}
/* valores para un ancho de navegador mayores de 1920px */
@media (min-width: 1920px) {
    .contenedor {
        width: 1880px;
    }
    .header {
        width: 440px;
    }
    .nioos {
        font-size: 168px;
        line-height: 272px;
    }
    .subtitle {
        font-size: 42px;
        line-height: 68px;
    }
    .principal {
        width: 1400px;
        left: 480px;
    }
    #mapa {
        height: 865px;
        font-size: 21px;
        line-height: 34px;
    }
    .gs-newsResult {
        height: 306px;
    }
    #direccion {
        width: 1280px;
    }
    .control {
        font-size: 21px;
    }
    #buscando {
        left: 1260px;
        top: 7px;
    }
}


Para conocer cuales son las resoluciones más habituales, y así construir nuestro fichero css para las resoluciones que consideremos más importantes, podemos visitar las siguientes webs:

http://www.w3schools.com/browsers/browsers_display.asp
http://www.w3schools.com/browsers/browsers_resolution_higher.asp
http://gs.statcounter.com/
http://en.wikipedia.org/wiki/Display_resolution
http://www.screenresolution.org/

También hay que tener en cuenta que ciertos navegadores antiguos (como internet explorer 8 y versiones anteriores) no tienes soporte para media queries de css, por lo que deberemos indicar los valores por defecto del tamaño de los elementos de nuestra página web para estos browsers.


2011-11-03

Mostrar y ocultar una imagen de carga con css

Es muy importante mostrar información al usuario sobre lo que está pasando con la página web que está visualizando.

De esta forma es conveniente, por ejemplo, mostrar una pequeña imagen cerca del botón de búsqueda cuando el usuario está esperando a que se devuelvan los resultados.

Hay muchas posibles imagenes que se pueden usar, la que usamos en nuestro ejemplo es una que hemos descargado de Ajaxload - Ajax loading gif generator.

Esta pequeña "ruedecita" se situa en nuestra página mediante el elemento:

<img id="buscando" src="images/ajax-loader.gif" />


Este elemento tiene un estilo css asociado que inicialmente no lo muestra (el elemento está oculto).

#buscando {
    position: absolute;
    left: 790px;
    top: 7px;
    visibility: hidden;
}


Posteriormente, mediante un javascript muy simple, lo mostramos y ocultamos a nuestra conveniencia para informar al usuario de que la página está realizando alguna acción y todavía no ha terminado.

Para mostrar:

document.getElementById("buscando").style.visibility = "visible";


Para ocultar:

document.getElementById("buscando").style.visibility = "hidden";


Es un efecto simple y da una muy buena impresión al usuario de nuestra web.


2011-11-02

Usar el api de twitter con jquery

Es posible usar el api de twitter junto con jquery, en concreto con sus potentes capacidades ajax, para mostrar los twits próximos a nuestra zona de busqueda sobre el mapa de nuestro sitio web.

El uso de ajax con jquery es muy simple como vamos a ver con la siguiente función:

function buscarTwitter(mDistancia, lat, lng) {
    var distance = mDistancia / 1000;
    var twitterUrl = "http://search.twitter.com/search.json?q=&rpp=100&geocode=" + lat + "," + lng + "," + distance + "km";
    $.ajax({
        url: twitterUrl,
        cache: false,
        dataType: "jsonp",
        beforeSend: mostrarBuscando(),
        complete: ocultarBuscando(),
        success: function(data) {
            var results = data.results;
            parsearResults(results);
        }
    });
}

En primer lugar construimos la URL de búsqueda en twitter con los parámetros que queremos, en este caso, la latitud, la longitud, y el radio de búsqueda (en kilómetros).

var twitterUrl = "http://search.twitter.com/search.json?q=&rpp=100&geocode=" + lat + "," + lng + "," + distance + "km";


Después usamos la función de jquery $.ajax():

$.ajax({
  url: twitterUrl,
  cache: false,
  dataType: "jsonp",
  beforeSend: mostrarBuscando(),
  complete: ocultarBuscando(),
  success: function(data) {
    var results = data.results;
    parsearResults(results);
  }
});


Aquí es importante notar que:
  • el parámetro dataType es jsonp (el tipo de datos devuelto por el api)
  • el parámetro beforeSend es una función "mostrarBuscando()" que se encarga de hacer visible la "ruedecita" de búsqueda
  • el parámetro complete es una función "ocultarBuscando()" que se encarga de ocultar la "ruedecita" de búsqueda
  • el parámetro success es una función que recoge los datos devueltos por twitter y los presenta en el mapa

Como veis no es dificil usar un api externo haciendo uso de las funcionalidades de jquery.


Añadir jquery al proyecto web

La librería jquery es una de las librerías javascript más populares para el desarrollo de sitios web.

La forma más sencilla de añadir esta librería a nuestra página web es añadiendo, en la cabecera, la siguiente línea, que no permite cargar la librería directamente de los servidores de Google.

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>

Muy sencillo.


2011-10-28

Uso del sessionStorage de html5

HTML5 dispone de nuevas funcionalidades, como sessionStorage, que nos permite almacenar datos durante una sesión de navegación por nuestra web.

Esto es muy útil cuando, por ejemplo, el usuario visita un enlace externo a nuestra web y posteriormente vuelve en la misma sesión.

Los datos que hallamos almacenado estarán disponibles a su vuelta y podemos usarlos, por ejemplo, para mostrar los campos de un formulario que previamente había rellenado, algo que el usuario agradecerá.

Hay que tener en cuenta que sessionStorage (al menos actualmente) sólo permite almacenar parámetros como cadena, y no almacena objetos javascript reales.

Usar etiquetas html5 en browsers antiguos

Es posible usar las nuevas etiquetas HTML5 (header, section, hgroup) en browsers antiguos, tales como Internet Explorer 8 y anteriores, mediante el siguiente truco.

1.- Las nuevas etiquetas HTML5 no reconocidas se muestran como si fueran "inline", cuando en realidad deben ser mostradas por el browser en modo "block". Esto es fácil de solucionar con una hoja de estilo especial que incluya las etiquetas HTML5 no reconocidas y las ponga en modo "block".

(fichero ie.css)
header, section, hgroup {
    display: block;
}


2.- El segundo problema surge cuando Internet Explorer no aplica estilos sobre etiquetas no reconocidas. Sin embargo podemos hacer que las "reconozca" mediante un javascript en la cabecera que "defina" esas etiquetas nuevas.

(fichero ie.js)
document.createElement('header');
document.createElement('section');
document.createElement('hgroup');



Finalmente podemos cargar estos nuevos elementos, la hoja de estilo y el fichero javascript, usando otro truco más, esta vez uno própio de Internet Explorer, que no permite, mediante unos comentarios HTML especiales, detectar si la página es ejecutada por un browser Internet Explorer inferior al 9.

<!--[if lt IE 9]>
  <script type="text/javascript" src="ie.js"></script>
  <link rel="stylesheet" href="ie.css" />
<![endif]-->



Por supuesto, también es posible usar directamente html5shiv, que básicamente hace esto mismo.

Facil, ¿verdad?


2011-10-03

Modificar la URL del calendario de Google Apps

Una vez configurado Google Apps en nuestro dominio podemos cambiar la URL de acceso al calendario (la URL asignada por defecto puede ser un poco complicada de recordar).

Lo único que debemos hacer es, desde el panel de control de Google Apps, ir a "Configuración" - "Calendario" - "Dirección web" y cambiar la dirección por defecto.

Luego tenemos que definir un registro CNAME en nuestro DNS que apunte a "ghs.google.com" con el nombre que anteriormente le hemos dado.


Modificar la URL del correo de Google Apps

Una vez configurado Google Apps en nuestro dominio podemos cambiar la URL de acceso al correo (la URL asignada por defecto puede ser un poco complicada de recordar).

Lo único que debemos hacer es, desde el panel de control de Google Apps, ir a "Configuración" - "Correo electronico" - "Dirección web" y cambiar la dirección por defecto.

Luego tenemos que definir un registro CNAME en nuestro DNS que apunte a "ghs.google.com" con el nombre que anteriormente le hemos dado.


2011-10-02

Usar Gmail (Google Apps) como nuestro servidor de correo

La mayoría de las veces no es necesario tener un servidor de correo de dedicado y podemos parar los servicios de correo electronico de nuestra máquina.

En su lugar podemos usar Google Apps, en concreto, el correo electronico, en forma de Gmail, que gratuitamente nos proporciona Google y que nos permitirá definir hasta 10 cuentas de correo electronico usando nuestra propio dominio de internet.

Lo primero que debemos hacer es acceder a Google Apps en la URL

http://www.google.com/apps/intl/es/group/index.html


A continuación hacemos click en el botón "Empezar".
Veremos la pantalla de registro en Google Apps, donde podremos indicar el nombre de nuestro dominio (en mi caso nioos.com).


A continuación hacemos click en el botón "Empezar ahora".
Continuaremos con el registro en Google Apps, donde debemos indicar, al menos, los campos obligatorios Nombre, Apellido, Dirección de correo electrónico, Teléfono y País.
(Recordar marcar también la casilla relacionada con los registros DNS).


Continuamos y se nos pedirá que creemos nuestra primera cuenta de correo, que corresponde también con la cuenta de administración de los servicios de Google Apps.
Debemos introducir el Nombre de usuario, su Contraseña y  la Verificacion propuesta en la página.


Al continuar aparecerá el asistente de configuración.


Lo primero que nos pide es verificar que el dominio (en nuestro caso nioos.com) es realmente nuestro.


Google nos presenta varias opciones, pero, la más sencilla es descargarse el fichero "google______.html" y ponerlo (mediante ftp, por ejemplo) en nuestro servidor web.


Ahora procedemos a "Verificar", y si Google es capaz de encontrar el fichero que hemos dejado en nuestro servidor web podremos continuar con la configuración.


A partir de aqui Google Apps nos permitirá definir usuarios (hasta 10 en la versión gratuita) y grupos.


Nos permite decidir que aplicaciones vamos a tener disponibles en nuestro dominio.
Aunque estamos principalmente interesados en Gmail para gestionar el correo de nuestro dominio, también podemos, de forma gratuita, habilitar Google Docs, Google Calendar y Google Sites.


El siguiente paso es configurar el correo electronico (usar gmail desde nuestro propio dominio como servidor de correo).


Seleccionamos "Activar Gmail ahora" y hacemos click en el botón "Siguiente >>".
Debemos modificar los registros DNS de correo electronico (MX) para usar los que nos proporciona Google.
Para facilitar la tarea nos muestra una lista con los servicios de hosting más comunes.


Seleccionamos nuestro servicio de hosting y nos aparecerán los registros MX que debemos actualizar.


Con esta información de los registros MX debemos ir al panel de control de nuestro hosting.


Localizamos nuestros dominios contratados, para así poder manipular sus registros DNS.


Procedemos a modificar los registros DNS de nuestro dominio principal (no de los subdominios).


Debemos modificar los registros MX (no los registros A u otro tipo de registros DNS).


Modificamos los registros MX con los datos que nos ha facilitado Google.


Ahora, desde el asistente de configuración de Google Apps, podemos comprobar si los registros MX que acabamos de modificar funcionan correctamente (en algunos casos, dependiendo de los DNS de nuestro hosting, esto puede no ser inmediato, llevando entre unos pocos minutos hasta unas 24 horas).


Después de haber hecho esto tendremos la oportunidad de añadir más dominios, si es que tenemos alguno más (lo habitual es que no tengamos más dominios).


También nos permite configurar las opciones avanzadas del correo electronico.


Podemos configurar Google Calendar,



Google Docs,



y Google Sites.



También se nos permite personalizar las URLs de acceso a nuestras aplicaciones (mail, calendario, etc).


Y se nos da la posibilidad de añadir y comprar más aplicaciones desde Google Apps Marketplace.


Para finalizar se nos indican algunos recursos para formar a los usuarios en el uso de Google Apps (si fuese necesario),



recursos para administradores,


y distintas opciones de asistencia.


Así llegamos al final de la configuración.


Para modificar la configuración de nuestras aplicaciones debemos usar una URL del estilo de:
https://www.google.com/a/nioos.com
(La parte final debe ser vuestro propio dominio)


Recodar que antes de poder empezar a usar el correo electronico debemos "activarlo" desde el panel de control


simplemente haciendo click en el link "Activar el correo electronico".


A partir de ahora ya se puede usar el correo electronico y el resto de aplicaciones desde nuestro propio dominio.


Para acceder a nuestro correo electronico debemos usar una URL del estilo de:
https://mail.google.com/a/nioos.com
(La parte final debe ser vuestro propio dominio)


Parece un largo camino, pero, en el fondo, es muy sencillo.

2011-09-25

Configuracion básica de tomcat

La configuración básica de tomcat se realiza mediante el fichero "server.xml" localizado en el subdirectorio "conf" de tomcat.

Este fichero de configuración nos permite cambiar los puertos de tomcat, definir host virtuales, etc.

En nuestro caso este fichero es

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <Service name="Catalina">
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11Protocol"
               connectionTimeout="20000" />
    <Engine name="Catalina" defaultHost="www.nioos.com">
      <Host name="www.nioos.com"  appBase="www"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="www_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

Cambiando '<Connector port="8080"' cambiaremos el puerto donde escucha tomcat.

Añadiendo más etiquetas "Host" podemos añadir más host virtuales.

Una descripción detallada sobre los parámetros de configuración que se puede usar la podeis encontrar en la documentación de la configuración de tomcat.


2011-09-23

Detener el servicio MySQL en CentOS

Unos de los servidores de base de datos más populares en entornos linux es MySQL.

Si no vamos a dedicar nuestra máquina a servidor de base de datos es recomendable que paremos este servicio y lo deshabilitamos para que no sea arrancado con la máquina.

Lo que debemos hacer es:


service mysqld stop
chkconfig --del mysqld

donde la primera línea (service mysqld stop) detiene el servicio y la segunda línea (chkconfig --del mysqld) evita que se vuelva a arrancar automáticamente con la máquina.



Detener spamassassin en CentOS

Spamassassin es un servidor antispam muy popular en el entorno linux.

Sin embargo, si no vamos a dedicar el servidor linux como servidor de correo electronico es recomendable que paremos este servicio y lo deshabilitamos para que no sea arrancado con la máquina.

Lo que debemos hacer es:


service spamassassin stop
chkconfig --del spamassassin
donde la primera línea (service spamassassin stop) detiene el servicio y la segunda línea (chkconfig --del spamassassin) evita que se vuelva a arrancar automáticamente con la máquina.