Alfonso Moure Ortega - SEO Muchoviaje, 40Viajes, Masnatura & Ociocruceros
Moure Profesional | SEO Muchoviaje

Archivo

Archivo para la categoría ‘desarrollo’

Geocodificar una dirección postal con los servicios de Google

Tuesday, 23 de June de 2009 moure Sin comentarios

Es un tema archiconocido y muy usado hoy en día, y por si fuera poco, hipersimple: conseguir las coordenadas de una ubicación por su nombre o mediante una dirección postal. ¿Desde dónde? Pues bueno, hay muchos servicios que ofrecen este tipo de trabajo: desde Geonames (un proyecto increible que recoge coordenadas e información geográfica e incluso demográfica de prácticamente todo el planeta… muy recomendable) hasta los servicios de GData para Google Maps.

La ventaja de usar Google Data (AKA GData) es que el trabajo ya viene hecho, y de paso, está integrado diréctamente en el Google Maps API y por lo tanto el esfuerzo es minomo. Y encima, podemos hacer la consulta de manera asíncrona mediante AJAX. Si usaramos servicios como el de Geonames deberíamos currarnos nosotros mismos esta parte. Pero bueno, todo esto es texto redundante y a nadie le interesan mis verborreas absurdas sobre este tema. Vamos al grano.

function showAddress(address)
{
var geocoder = new GClientGeocoder();
geocoder.getLatLng(address,
function(point)
{
if (!point)
alert(address + ” –> no encontrado en Google Geo Services.”);
else
map.setCenter(point, 13);
}
);
}

Bien, ¿qué hace éste código? Pues es bien sencillo. Primero creamos la instancia de la clase GClientGeocoder, incluido con el Google Maps API desde su versión 2.55, y que contiene una serie de servicios de geocodificado que nos permiten consultar diferentes datos al mercadillo de Mountain View.

Concretamente nos interesa el método getLatLng, que recibe como parámetro la dirección o nombre de la ubicación que nos interesa, y al recibir la respuesta (callback) ejecutará la función creada, recibiendo como parámetro el punto concreto donde se encuentra el lugar, con un objeto de clase GLatLng. ¡Tachán! Ahí está nuestro resultado. Para centrar la vista en él, solo debemos llamar al método setCenter, pasandole como parámetros el punto en cuestión y el nivel de zoom.

Bueno, todo esto está tirado y todos sabemos hacerlo. Sobretodo porque viene en la documentación de la API, y aunque no es exáctamente esta la explicación que dan, es bastante aproximada.

Pero lo interesante aquí es rizar el rizo: recibir como respuesta lugares cercanos a una ubicación concreta.

Dentro del mundo GEO, y a un nivel fundamentalmente básico, hay tres maneras de representar una ubicación:

  • Sus coordenadas geográficas (latitud, longitud)
  • Su encuadre en un mapa (latitud noreste, longitud noreste, latitud suroeste, longitud suroeste)
  • Dirección postal (como, por ejemplo, calle celestina 983)

Pues bien, en el mismo objeto GClientGeocoder tenemos un método que nos permite pedir a Google una colección de localizaciones cercanas a una ubicación concreta: getLocations, que puede recibir como parámetro de consulta o una dirección, o un punto GLatLng.

¿Qué nos va a devolver esta llamada? Un objeto estructurado con todos los datos precisos: por un lado, la información detallada de la ubicación pedida, y por otro, el resultado de Google para la ubicación, con todas las ubicaciones almacenadas en un array de Placemarks, tal que así (lo pego diréctamente desde la documentación de ejemplo de Google, es más claro así, para la geocodificación inversa):

[
  {
    name: "Washington, DC",
    Status: {
      code: 200,
      request: "geocode"
    },
    Placemark: [
      {
        address: "Washington, DC, USA",
        population: "0.563M",
        AddressDetails: {
          Country: {
            CountryNameCode: "US",
            AdministrativeArea: {
              AdministrativeAreaName: "DC",
              Locality: {
                LocalityName: "Washington"
              }
            }
          },
          Accuracy: 4          
        },
        Point: {
          coordinates: [-77.036667, 38.895000, 0]
        }
      }
    ]
  },
  ... // etc., and so on for other cities
]

Espero que os sea de utilidad… Aunque sea algo tan básico.

Peleando para trabajar con AJAX, JSON y PHP

Monday, 22 de June de 2009 moure 1 comentario

Bueno, como vistes en mi anterior post, ando jugueteando a ratos con Javascript y algunas de sus mejores funcionalidades (o metodologías, como prefiráis): AJAX y JSON. Como muchos sabéis, la gran utilidad que se nos presenta explotando estas tres tecnologías (este método, éste protocolo y este lenguaje de programación de scripting de lado de servidor, para ser exáctos) es la posibilidad de intercambiar datos entre cliente y servidor de manera asíncrona y sin tener que recargar todo el HTML de la página, y por lo tanto, de enviar comandos en uno u otro sentido y conocer el resultado de los mismos.

En PHP existen dos maneras de recoger información que venga del exterior: mediante GET o mediante POST. Cuando trabajamos con GET, podemos probar bien nuestras aplicaciones haciendo uso del ya bien conocido QueryString de la URL, pero cuando tratemos de trabajar diréctamente mediante POST (bastante más seguro y útil) la cosa se vuelve más complicada.

¿Quién no ha desperdiciado horas tratando de enviar parámetros por POST a una aplicación PHP para probar su funcionamiento?

Hoy he visto la luz. Que sí, que muchos ya conoceríais su existencia, pero… he encontrado este Addon de Firefox que nos permite controlar los parámetros que enviamos a la aplicación tanto mediante GET como POST y probar así diferentes juegos de prueba. Se llama Tamper Data, y os puede facilitar mucho la vida :) .

Mira que siempre he sido un buen amante de los addons para Firefox, pero por suerte o por desgracia soy un programador muy tradicional y siemre intento hacer todo a manita y pasando de herramientas externas siempre que me fuera posible. Porque, como bien me dicen mis amigos, siempre me gusta reinventar la rueda… ¡qué le vamos a hacer!

Y, como no, también nos permitirá ver la respuesta que recibimos del servidor de manera sencilla, aunque si trabajais con JSON, os recomiendo también instalar otra extensión: JSONView, que nos mostrará formateada y resaltada mediante diferentes colores y formas nuestras estructuras JSON sin necesidad de andar haciendo pirulas con nuestro Javascript (esos históricos alert(miobjeto.toString()); que tanto usamos para hacer pruebas de Javascript…

AJAX, JSON y jQuery, llamando a funciones de PHP desde el cliente

Wednesday, 3 de June de 2009 moure 3 comentarios

¿Alguna vez habéis querido llamar a métodos PHP desde el lado del cliente mediante AJAX? Pues bien, es bastante sencillo y voy a explicarlo de un modo rápido. Puntualizo que para la comunicación usaré el formato JSON (Javascript Object Notation) para la toma y devolución de datos.

Para facilitar las peticiones usaremos jQuery, que ya trae en sí todo lo necesario para poder realizar este tipo de petición. Primero vamos a crear una función en PHP que multiplique dos números, tal que así:

function Multiplicar(a,b) { return a*b; }

Hasta aquí supongo que todos hemos llegado. Ahora viene lo divertido… Creamos la parte de cliente, en Javascript, una vez hayamos incrustado la librería de jQuery en nuestra página:

function DoMultiplicar(p_a,p_b)
{
$.post(ruta_al_servicio, {a:p_a,b:p_b,cmd:”multiplica”},
function(data)
{
eval(”var obj = ” + data + “;”);
alert(data.result);
}
, “json”);
}

Y procesamos la petición en PHP:

if ($_POST["cmd"] == “multiplica”)
Multiplicar($_POST["a"],$_POST["b"]);

Vale, pero, ¿qué ha hecho todo esto? Pues muy sencillo… Por la parte de Javascript, hemos llamado al método $.post, al cuál le hemos pasado como parámetros, en el mismo orden:

  • Ruta al servicio: ruta absoluta al fichero PHP que controla la petición por POST, y que se encarga de la llamada al método Multiplicar.
  • Parámetros: mediante la notación de objetos de Javascript (JSON), introducimos los difentes parámetros que usará nuestro script de servidor. Para los que no estén familiarizados con JSON, es un protocolo de declaración de objetos de Javascript, que permite crear una estructura de objeto mediante una cadena sencilla, rodeada por llaves, donde cada miembro se separa por comas. Para más información, consultar la página oficial de JSON, donde apareden numerosos ejemplos con los que aprender.
  • Método callback: función que recoge, en este caso, el resultado de la petición. Lo hemos llamado data, pero podéis llamarlo como mejor os venga para vuestro trabajo: el parámetro que recibe será siempre la respuesta del servidor.

Una vez recogido el resultado con el callback, ya lo tenemos: el resultado de la multiplicación. Si tenéis dudas, no tengáis problema en dejar comentarios… aunque sé que este pequeño tutorial es sencillo y básico para muchos ;) , puede que para otros no tanto.

Google Wave: reinventando Internet

Saturday, 30 de May de 2009 moure Sin comentarios

Ayer tuve una experiencia extraordinaria: me tragué uno de los videos del Google I/O, concretamente aquel en el que nos presentaban uno de los nuevos proyectos (proyectazos) de los chicos de Mountain View: Google Wave.

Google Wave es un nuevo concepto de comunicación online. Como decían en la propia presentación, es “reinventar el correo electrónico”, porque “¿cómo sería el correo electrónico si hubiera sido inventado ahora?”. Pues su punto más básico es llevar el tradicional modo de comunicación por correo (postal o email) basado en “envio un mensaje a uno o varios destinatarios y ellos responden”, a un nivel superior: la conversación.

Chat, chat, chat. No es un chat, aunque pueda parecerlo. En Google Wave, lo que tenemos no son canales ni charlas, son waves. Un wave es básicamente un hilo de comunicación entre personas, donde pueden charlar, publicar fotografías, videos, mapas, textos… lo que quieran. De manera lineal o colaboratiba, no importa. Se define como un medio de comunicación y colaboración.

Fusión entre el chat, blog, email, social network… Todo. Increible.

Os dejo el video. Debéis verlo, es flipante. Estoy deseando ponerle las manos encima a la primera beta…

Os dejo además tres enlaces que os pueden servir para descubrir más sobre Google Wave:

Como digo aquí arriba, es Open Source, y ya han realizado varias propuestas para estandarizar alguna de sus funcionabilidades más impresionantes para que puedan usarse por todo Internet, desde cualquier navegador. Gracias pequeños genios por vuestro incansable trabajo…

Rich Snippets: microformatos y RDFa en Google

Thursday, 14 de May de 2009 moure 2 comentarios

Desde hace tiempo ya venimos escuchando la nueva ola de la Web 3.0, incluso antes si quiera de comprender el verdadero significado (si es que tiene alguno) de la Web 2.0.

Y éste nuevo significado en la era 3.0 no es otro que el semántico: dotar de significado y sentido a elementos de información dentro del HTML.

Pero como siempre, falta el apoyo de las grandes marcas. No importa que pequeños y aislados grupos de personas trabajen para crear nuevas maneras de llevar a un nuevo punto el potencial de Internet, mientras gente como Google no promocione sus creaciones, éstas tienen el peligro de caer en el olvido, o peor aun, de extinguirse para siempre.

Éste es el caso de los microformatos (o microformats), una colección de atributos que pueden ser añadidos a nuestras etiquetas tradicionales para dotar de un significado o sentido a la información que encierran. Ahora ha llegado su momento de explosión, largamente esperado: Google implanta los rich snippets, al fin de un modo oficial.

Gracias a estos cambios, podremos mejorar ya no el posicionamiento de nuestros contenidos, sino su presentación en los SERPs y el modo en que los usuarios captan el sentido de la página antes incluso de entrar. Podremos presentar a Google una información mucho más rica sobre nuestros productos o servicios que ofrecemos a los visitantes, o si lo preferimos, indicarle nuestra ubicación geográfica o interrelación entre apartados de nuestro site.

Un ejemplo sencillo: el review o artículo de opinión o revista sobre algo. A todos nos ayuda buscar opiniones de otra gente sobre un producto que queremos adquirir. Esto nos lleva su tiempo, porque aunque existen herramientas ya preparadas para localizar reviews, a veces esto lleva un buen rato, y un rato siempre se convierte en una brutal pérdida de tiempo. Y el tiempo es oro.

¿Y si permitimos que Google publique en su SERP la puntuación de nuestro review y alguna anotación en lugar del típico trozo de texto de la misma? ¿No será más util que muestre algo que realmente le inspire interés al usuario? Pues claro que sí:

<div class=”hReview”>
<span class=”item”>
<span class=”fn”>L’Amourita Pizza</span>
</span>
<span class=”rating”>3.5</span>
<span class=”reviewer”>Ulysses Grant</div>
<span class=”dtreviewed”>2009-01-06</span>
<span class=”summary”>”Delicious, tasty pizza in Eastlake.”</span>
</div>

Efectos del Google Rich Snippet

Efectos del Google Rich Snippet

Este ejemplo está literalmente cogido de la documentación de Google para rich snippets de reviews. Soy poco original, lo sé.

ViewState y Google: ¿afecta a los trabajos de indexado?

Wednesday, 13 de May de 2009 moure 2 comentarios

Se escucha desde hace mucho tiempo el sonido distante de éste mismo problema: ¿afecta la existencia del ViewState de ASP.NET en el indexado de Google? La respuesta solo puede tomar dos valores: sí o no. Y cada persona, cada SEO, cada gurú de Internet, os responderá una cosa diferente. Por supuesto, yo también tengo mi teoría.

Y es la siguiente: sí, el ViewState de ASP.NET afecta al posicionamiento en Google. ¿Por qué? Os doy varias razones:

  1. Por su tamaño: en páginas demasiado complejas y con una gran carga de controles ASP.NET, ocupará tanto espacio que nos arriesgamos no solo a perjudicar a los usuarios menos favorecidos en su velocidad de conexión, sino que también nos arriesgaremos a producir un timeout en las consultas de Google.
  2. Por el desplazamiento de contenido: Google utiliza como criterio de posicionamiento, como todos bien sabemos, la posición de la información y metainformación dentro del documento HTML. Un ViewState demasiado grande moverá los datos realmente importantes (es decir, todo el BODY) hacia abajo.
  3. Por su incoherencia como información: El contenido del ViewState es incomprensible, no solo para un humano, sino también para una máquina ajena a la aplicación ASP.NET en ejecución. Incluso a veces es incomprensible para ella misma.

¿Cómo evitar su existencia? No siempre es posible. El uso de callbacks en ASP.NET, aunque es algo muy cómodo, no es ni de lejos recomendable para atraer a Google. Todos lo sabemos. Pero a veces, se hace inevitable.

De todas maneras, si podéis evitar el uso de ViewState (y por favor, no uséis variables de sesión, porque os volveréis majaras trabajando con ellas), os digo un modo bien sencillo de desactivarlo: en la etiqueta inicial de vuestra página ASP.NET, no hay más que activar EnableViewState como false:

<%@ Page Language=”C#” EnableViewState=”False” %>

Lógicamente podéis usar este mismo atributo en cualquier control de vuestra página, pero gracias a realizarlo a nivel de Page, os aseguraréis de que se extiende como es debído y que nada se os pase por alto. Recordad así mismo que podéis establecer EnableViewState como false a nivel de página, pero como true a nivel de control, simplemente indicandolo en la etiqueta propia del elemento que queréis que pueda usar nuestro valioso espacio de control de estado.

¿Dudas? Dejad un comentario y gustoso os echaré una mano.

iPhone SDK 2.2.1 en el aire

Wednesday, 28 de January de 2009 moure 2 comentarios

Ya tenemos disponible la nueva SDK 2.2.1 para desarrolladores bajo la plataforma iPhone de Apple. Pese a que por desgracia aun no tengo en mi poder un Mac para poder trabajar con ésto, sigo al dedillo las novedades que van apareciendo.

¿Alguna experiencia positiva trabajando en este terreno?

Wikimou

Monday, 19 de January de 2009 moure 1 comentario

Bueno, tengo esto bastante abandonado la verdad…

Tengo demasiado trabajo y demasiadas cosas en la cabeza.

En general, muchas de esas excusas que los blogger más adustos suelen utilizar para defenderse a las críticas sobre lo poco que actualizan. Pero, en serio, no me olvido de mi querido blog… ¡habrá que retomarlo!

Para darle salsa al nuevo año, y dado que todo el mundo me pregunta día sí, día también, sobre dudas de todo tipo (programación, desarrollo, SEO, Internet…) he decidido crear Wikimou, una wiki que intentará solucionar muchas de esas dudas que me preguntan. Cada vez que resulva algo en desarrollo que me parezca interesante o cuando me pregunten algo importante, intentaré publicarlo aquí para que quede constancia de ello.

Por supuesto, se aceptan colaboraciones en toda su temática:

  • Desarrollo
  • SEO
  • Trucos de programación
  • Internet
  • Técnicas sociales
  • Problemas técnicos de todo tipo
  • Google
  • API

Os invito a todos a participar en el proyecto. ¡Juntemos todas nuestras proezas! ¡Aprendamos de nosotros mismos y dejemos a los demás acompañarnos!

Palabras reservadas en un enum de C#

Tuesday, 28 de October de 2008 moure Sin comentarios

A veces queremos utilizar palabras reservadas dentro de un listado de valores de un enumerado (enum) dentro de nuestro código C#. Hoy un compañero me ha preguntado cómo hacerlo, y tras repasar mis chuletas mentales, almacenadas en memoria secundaria en lo más profundo de mis sesos, recordé la forma: poniendo el modificador @ delante del valor igual a la palabra reservada. Por ejemplo:

enum Languages {es, @as, @in, en, zh};

Ya no hay excusas: no habrá que usar strings “a pelo” en nuestras serializaciones de datos (XmlSerialization).

Categories: asp.net, c#, desarrollo Tags: , , ,

Convertir un String en enumerado con C#

Friday, 24 de October de 2008 moure 1 comentario

Adiós al tradicional método de convertir un string en enum utilizando un eterno switch en C#… Viejos tiempos en los que debíamos hacer algo similar a…

switch(saludo)
{

case “hola”: return Saludos.Hola;
case “hello”: return Saludos.Hello;

}

¿Quién no ha hecho este tipo de aberración alguna vez durante su vida como desarrollador? Todos…

Afortunadamente me he topado con un sistema muy interesante, que prácticamente podemos definir como evidente (¿Cómo no se me pudo ocurrir antes?) para realizar la conversión sin tener que hacer uso de un switch del tamaño de 20 folios A4. Tan sencillo como ésto:

public Enum Saludos {Hola,Hello,Hi};

public Saludos GetSaludo(string saludo)
{

return (Saludos)Enum.Parse(typeof(Saludos), saludo);

}

De éste modo realizaremos la conversión de manera sencilla y práctica, con una única línea de código.

Alfonso Moure Ortega ghostmou http://www.moure.es Muchoviaje Madrid SEO Head Manager Grupo Muchoviaje - SEO, GEO, SMO, .NET developer
Alfonso Moure Ortega  |  Viajes libres  |  Vitaedot  |  Xinwen Xibanya  |  Efemérides  |  Hard Rock  |