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.


2011-09-22

Detener el servicio Parallels Plesk en CentOS

Unos de los servicios de gestión remota de servidore más populares linux es Parallels Plesk.

Sin embargo, si decidimos gestionar el servidor usando "ssh" es recomendable que paremos este servicio y lo deshabilitamos para que no sea arrancado con la máquina.

Lo que debemos hacer es:


service psa stop
chkconfig --del psa

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

2011-09-21

Detener el servicio postfix en CentOS

Unos de los servidores de correo electronico más populares linux es posftix.

Si no vamos a dedicar nuestra máquina a 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 postfix stop
chkconfig --del postfix

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

Detener el servicio PostgreSQL en CentOS

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

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 postgresql stop
chkconfig --del postgresql

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

Detener el servicio courier de CentOS

Unos de los servidores de correo electronico más populares de CentOS es courier.

Si no vamos a dedicar nuestra máquina a 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 courier-imap stop
chkconfig --del courier-imap

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

Usar dmidecode para mostrar el hardware

Algunas veces nos es útil mostrar remotamente el hardware de una máquina (quizás porque acabamos de alquilar una máquina de hosting y queremos saber cual es exactamente su hardware).

En este caso podemos hacer uso del comando "dmidecode".

Este comando nos mostrará todas las características hardware de la máquina.

Especialmente útiles son los comandos:

"dmidecode -t processor" que nos mostrará toda la información relacionada con los procesadores.


"dmidecode -t memory" que nos mostrará toda la información relacionada con la memoria.

Un comando tremendamente simple y potente.


2011-09-18

Autocompletar la dirección de busqueda

Es posible autocompletar la dirección de búsqueda en nuestro mapa usando las APIs de Google Places.

Si queremos autocompletar el texto de un campo de texto del tipo:

<input id="direccion" type="text" />

debemos usar un script del tipo

var inputEl = document.getElementById("direccion");
var autoComplete = new google.maps.places.Autocomplete(inputEl);
google.maps.event.addListener(autoComplete, 'place_changed', geolocalizar);

donde la segunda línea
var autoComplete = new google.maps.places.Autocomplete(inputEl);
es la que aplica el autocompletado al campo

y la tercera línea
google.maps.event.addListener(autoComplete, 'place_changed', geolocalizar);
es la que llama a la función "geolocalizar" (o cualquier otra de nuestra elección) cuando el usuario termina de buscar.

Muy simple de aplicar.


2011-09-17

Mostrar más noticias en el mapa

Podemos mostrar más noticias en nuestro mapa si somos capaces de recoger de alguna forma lugares proximos.

Una posible forma de hacer esto es con Google Places, un nuevo API experimental (de momento).

Para cargar el API debemos cambiar en nuestro fichero html la línea
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
por
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=places&sensor=true"></script>

Después podemos usar la siguiente función:

function buscarMasNoticias() {
    var map = nioos.map;
    var bounds = map.getBounds();
    var placesService = new google.maps.places.PlacesService(map);
    placesService.search(
        {bounds: bounds},
        function(results, status) {
            if (status == google.maps.places.PlacesServiceStatus.OK) {
                for (var i = 0; i < results.length; i++) {
                    var place = results[i];
                    var name = place.name;
                    var vicinity = place.vicinity;
                    var location = place.geometry.location;
                    var busqueda = name + " " + vicinity;
                    buscarNoticias(busqueda, location);
                }
            }
        }
    );
}

Lo importante aqui es crear el objeto "PlacesService", para poder usar luego el método "search", al que le pasaremos como parámetro los bordes del mapa que se está motrando (var bounds = map.getBounds();).
De los resultados recogemos el nombre y la localización y procedemos con la búsqueda de noticias, tal y como hemos hecho antes.


2011-09-14

Mostrar noticias en el mapa

Es posible mostrar noticias (las noticias de Google News, por ejemplo) en un mapa de Google, usando los recursos que Google pone a nuestra disposición.

El fichero html será:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <link href="css/v1/nioos.css" rel="stylesheet" />
        <script type="text/javascript" src="js/v1/nioosapp.js"></script>
        <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
        <script type="text/javascript" src="https://www.google.com/jsapi"></script>
        <title>Nioos</title>
    </head>
    <body>
        <div class="barra-busqueda">
            <label>Dirección :</label>
            <input id="direccion" type="text" />
            <input type="button" value="Buscar" onclick="geolocalizar()" />
        </div>
        <div id="mapa"></div>
        <script type="text/javascript">
            initApp();
        </script>
    </body>
</html>

Donde:

La línea
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true">
carga las APIs de Google Maps.

La línea
<script type="text/javascript" src="https://www.google.com/jsapi">
es el cargador de las APIs de búsqueda de Google, con el que podremos cargar las APIs de búsqueda de noticias.


La aplicación javascript será:


var nioos = {};


function initApp() {
    google.load("search", "1");
    google.setOnLoadCallback(afterGoogleLoad);
}


function afterGoogleLoad() {
    var divMapa = document.getElementById("mapa");
    var madrid = new google.maps.LatLng(40.416691, -3.700345);
    var myOptions = {
        zoom: 18,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        center: madrid
    };
    var map = new google.maps.Map(divMapa, myOptions);
    nioos.map = map;
    //
    var geocoder = new google.maps.Geocoder();
    nioos.geocoder = geocoder;
    //
    google.maps.event.addListener(map, 'bounds_changed', function() {
        var timer = nioos.timer;
        clearTimeout(timer);
        timer = setTimeout(boundsChangedListener, 3000);
        nioos.timer = timer;
    });
    //
    google.maps.event.addListener(map, 'click', function() {
        closeInfoWindow();
    });
}


function closeInfoWindow() {
    var infoWindow = nioos.infoWindow;
    if (infoWindow) {
        infoWindow.close();
    }
    var oldInfoWindow = nioos.oldInfoWindow;
    if (oldInfoWindow) {
        oldInfoWindow.close();
    }
}


function boundsChangedListener() {
    var map = nioos.map;
    var center = map.getCenter();
    nioos.geocoder.geocode(
        {'latLng': center},
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var direccion = extraerDireccion(results);
                buscarNoticias(direccion, center);
            } else {
                alert('Se desconoce la dirección debido a : ' + status);
            }
        }
    );
}


function extraerDireccion(results) {
    var direccion = results[0].formatted_address;
    var address_components = results[0].address_components;
    for (var i = 0; i < address_components.length; i++) {
        var cmp = address_components[i];
        var types = cmp.types;
        if (types == "postal_code") {
            var postal_code = cmp.long_name;
            direccion = direccion.replace(postal_code, "");
        }
    }
    direccion = direccion.replace("  ", " ");
    direccion = direccion.replace(/, /g, " +");
    return direccion;
}


function buscarNoticias(direccion, center) {
    var newsSearch = new google.search.NewsSearch();
    newsSearch.setResultSetSize(1);
    newsSearch.setSearchCompleteCallback(this, searchComplete, [center, newsSearch]);
    newsSearch.execute(direccion);
}


function searchComplete(center, newsSearch) {
    if (newsSearch.results && newsSearch.results.length > 0) {
        var newsResult = newsSearch.results[0];
        var title = newsResult.titleNoFormatting;
        if (nioos[title]) {
            return;
        }
        var content = newsResult.html;
        var map = nioos.map;
        nioos[title] = content;
        var marker = new google.maps.Marker({
            position: center,
            map: map,
            title: title
        });
        var infoWindow = new google.maps.InfoWindow({
            content: content
        });
        nioos.infoWindow = infoWindow;
        google.maps.event.addListener(marker, 'click', function() {
            closeInfoWindow();
            nioos.oldInfoWindow = infoWindow;
            infoWindow.open(map, marker);
        });
    }
}


function geolocalizar() {
    var direccion = document.getElementById("direccion").value;
    nioos.geocoder.geocode(
        {
            'address': direccion
        },
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var location = results[0].geometry.location;
                nioos.map.setCenter(location);
            } else {
                alert('Dirección ' + direccion + ' desconocida');
            }
        }
    );
}




Donde:

La función
function initApp() {
    google.load("search", "1");
    google.setOnLoadCallback(afterGoogleLoad);
}

se encargar de cargar las APIs de búsqueda (método 'google.load("search", "1")') y de llamar a la función "afterGoogleLoad" cuando se han terminado de cargar.

La función "afterGoogleLoad()" se encarga de "pintar" el mapa y asignarle las correspondientes respuestas a eventos.

Cuando el usuario efectua una búsqueda se ejecuta el método "buscarNoticias(direccion, center)" que, usando el objeto "google.search.NewsSearch()" se encarga de buscar las noticias y mostrarlas en el mapa.

2011-09-11

Añadir una ventana de informacion a un marcador de un mapa de Google

Es muy sencillo añadir una ventana de información a un marcador de un mapa de Google Maps (el tipo de ventana que sale cuando pinchamos encima del marcador).

El código es el siguiente:

var infoWindow = new google.maps.InfoWindow({
  content: direccion
});
google.maps.event.addListener(marker, 'click', function() {
  infoWindow.open(map, marker);
});

Donde
var infoWindow = new google.maps.InfoWindow({
  content: direccion
});
crear la ventana de información (el parámetro "content" es el texto que se mostrará al abrir la ventana de información) y
google.maps.event.addListener(marker, 'click', function() {
  infoWindow.open(map, marker);
});
la abre cuando hacemos click con el ratón encima del marcador ("marker" es el marcador previamente creado y que mostrará la ventana de información al hacer 'click' sobre él y "map" es el mapa de google maps).


2011-09-09

Añadir una marca a un mapa de Google Maps

Es posible añadir una marca a un mapa de Google Map usando el objecto "Marker" del API.

Siguiendo con el ejemplo anterior podemos sustituir el diálogo con la dirección con una marca en el mapa.
Así, la función "boundsChangedListener()"queda:

function boundsChangedListener() {
    var map = nioos.map;
    var center = map.getCenter();
    nioos.geocoder.geocode(
        {'latLng': center},
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var direccion = results[0].formatted_address;
                new google.maps.Marker({
                    position: center,
                    map: map,
                    title: direccion
                });
            } else {
                alert('Se desconoce la dirección debido a : ' + status);
            }
        }
    );
}

El marcador se añade con el código:

new google.maps.Marker({
   position: center,
   map: map,
   title: direccion
});

donde "center" es la posición central del mapa después del desplazamiento, "map" es el mapa de Google y "title" es el texto que aparece cuando dejamos el ratón encima del marcador.


2011-09-08

Añadir un retraso en la ejecución del javascript

A veces nos interesa retrasar la ejecución de parte del código javascript.

En estos casos podemos usar la funcion "setTimeout(codigo, retraso)" de javascript, donde "codigo" es el código javascript que queremos que se ejecute con retraso y "retraso" es el tiempo en milisegundos que se va a retrasar la ejecución.

Además la función "setTimeout" devuelve un identificador que podemos usar para cancelar la ejecución retrasada mediante la función "clearTimeout(id)".

En el siguiente ejemplo, que forma parte de un controlador de evento que se dispara cada vez que el usuario desplaza el mapa de google, lo podemos ver más claramente.

google.maps.event.addListener(map, 'bounds_changed', function() {
  var timer = nioos.timer;
  clearTimeout(timer);
  timer = setTimeout(boundsChangedListener, 3000);
  nioos.timer = timer;
});

La línea
var timer = nioos.timer;
recoge el identificador del retraso actuál, si es que existe uno.

La línea
clearTimeout(timer);
cancela el retraso actuál, si es que existe uno.


La línea
timer = setTimeout(boundsChangedListener, 3000);
crea un retraso de 3 segundos en la ejecución de la función "boundsChangedListener".


La línea
nioos.timer = timer;
almacena el identificador del retraso para poder usarlo más tarde si nos hace falta.

Sencillo y útil, ¿verdad?





Geocodificación inversa en un mapa de Google Map

Google Map dispone de un servicio de geocodificación inversa que nos permitirá transformar de latitud y longitud a una dirección real.

Así, por ejemplo, podemos usar el evento "bounds_changed" para transformar el nuevo centro del mapa en una dirección real.

google.maps.event.addListener(map, 'bounds_changed', function() {
  var center = map.getCenter();
  nioos.geocoder.geocode(
    {'latLng': center},
    function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var direccion = results[0].formatted_address;
        alert('Nueva dirección : ' + direccion);
      } else {
        alert('Se desconoce la dirección debido a : ' + status);
      }
    }
  );
});

La línea
var center = map.getCenter();
recoge el centro del mapa.

La función "geocode" con el parámetro "latLng" realiza la geocodificació inversa.

2011-09-06

Responder a eventos de Google Map

Los mapas de Google Map disparán eventos cada vez que el usuario interactua con ello (cuando los mueve, cuando cambia el zoom, etc.).

La sintaxis para usar estos eventos en javascript es muy sencilla:

google.maps.event.addListener(map, 'bounds_changed', function() {
  alert('Cambio detectado');
});

donde

map es un objeto mapa de google.
'bounds_changed' es el nombre del evento que estamos esperando.
alert('Cambio detectado'); es la respuesta al evento.


2011-09-04

Geolocalización en un mapa de Google Maps

Las APIs de Google Maps nos permite hacer geolocalización, es decir, nos permite traducir el texto de una dirección en sus correspondientes coordenadas (latitud y longitud), que podemos usar para, por ejemplo, centrar el mapa de nuestra página web.


El código de la página es algo como:


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <link href="css/v1/nioos.css" rel="stylesheet" />
        <script type="text/javascript" src="js/v1/nioosapp.js"></script>
        <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
        <title>Nioos</title>
    </head>
    <body>
        <div>
            <label>Dirección :</label>
            <input id="direccion" type="text" />
            <input type="button" value="Buscar" onclick="geolocalizar()" />
        </div>
        <div id="mapa"></div>
        <script type="text/javascript">
            initApp();
        </script>
    </body>
</html>


El elemento
<input id="direccion" type="text" />
representa el campo de texto para introducir la dirección que queremos "geocodificar".

El elemento
<input type="button" value="Buscar" onclick="geolocalizar()" />
es el botón que al ser apretado realizará esta "geocodificación" mediante la función javascript "geolocalizar()" en el evento "onclick".


El código javascript es algo como:


var nioos = {};

function initApp() {
    var divMapa = document.getElementById("mapa");
    var madrid = new google.maps.LatLng(40.416691, -3.700345);
    var myOptions = {
        zoom: 18,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        center: madrid
    };
    var map = new google.maps.Map(divMapa, myOptions);
    nioos.map = map;
    //
    var geocoder = new google.maps.Geocoder();
    nioos.geocoder = geocoder;
}

function geolocalizar() {
    var direccion = document.getElementById("direccion").value;
    nioos.geocoder.geocode(
        {
            'address': direccion
        },
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var location = results[0].geometry.location;
                nioos.map.setCenter(location);
            } else {
                alert('Dirección ' + direccion + ' desconocida');
            }
        }
    );
}


El código
var nioos = {};
inicializa un objecto javascript que iremos usando en toda nuestra aplicación.

La función
initApp()
crea y "pinta" el mapa inicial centrado en las coordenadas de Madrid y crea también el "geolocalizador" de Google Map ("var geocoder = new google.maps.Geocoder();") guardando ambos en el objeto "nioos" para su posterior uso.

La función
geolocalizar()
recoge el texto escrito en el cuadro de búsqueda ("var direccion = document.getElementById("direccion").value;") y se usa el "geocoder" para transformar ese texto a una latitud y longitud (función "geocode()" con el parámetro "address") y centrar el mapa ("nioos.map.setCenter(location);") en esa nueva localización.


Añadir un mapa de Google Maps a una página web

Google Maps dispone de un API público que permite añadir un mapa de Google Maps a nuestra página web usando javascript.

Sería algo así:


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
        <title>Demo</title>
    </head>
    <body>
        <div id="mapa" style="width: 500px; height: 500px;"></div>
        <script type="text/javascript">
          var divMapa = document.getElementById("mapa");
          var madrid = new google.maps.LatLng(40.416691, -3.700345);
          var myOptions = {
            zoom: 6,
            mapTypeId: google.maps.MapTypeId.ROADMAP
          };
          var map = new google.maps.Map(divMapa, myOptions);
          map.setCenter(madrid);
        </script>
    </body>
</html>


La línea
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>
importa las API de Google Maps que nos permitiran pintar el mapa.

La línea
<div id="mapa" style="width: 500px; height: 500px;"></div>
define el tamaño del mapa y su posición en nuestra página web.

La línea
var madrid = new google.maps.LatLng(40.416691, -3.700345);
define la latitud y longitud de Madrid, donde posteriormente centraremos el mapa con
map.setCenter(madrid);

La línea
var myOptions = {
  zoom: 6,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};
permite definir los parámetros iniciales del mapa, como el nivel de zoom y el tipo de mapa.


2011-09-03

Añadir un fichero javascript a un proyecto de eclipse

Para añadir un archivo javascript a un proyecto de eclipse lo más cómodo es cambiar a la perspectica "Web".

Después sólo hay que seleccionar el menú

File - New - JavaScript Source File

Luego basta con rellenar el diálogo.

Añadir una hoja de estilo css a un proyecto de eclipse

Para añadir una hoja de estilo css a un proyecto de eclipse lo más cómodo es cambiar a la perspectica "Web".

Después sólo hay que seleccionar el menú

File - New - CSS File

Luego basta con rellenar el diálogo.