Experiencias de un programador curioso del SEO
jmnieves
Este usuario no ha compartido ninguna información biográfica
Web: http://www.juanmarianieves.com
Jabber / Google Talk: jmnieves@juanmarianieves.com
Entradas de jmnieves
Time ago en c#
23 ene
En este articulo os hablare de como calcular el famoso tiempo transcurrido o time ago en c# , el time ago suele usarse en aplicaciónes sociales como twitter o facebook para indicarnos hace cuanto tiempo sucedio una publicación en nuestro timeline.
Función en c# para calcurar el time ago
/// <summary>
/// Función que devuelve un string con el formato "time ago" usado en aplicaciones como twitter
/// </summary>
/// <param name="fechadesde">Fecha anterior</param>
/// <param name="fechahasta">Normalmente la fecha actual</param>
/// <returns></returns>
public static string GetTimeAgo(DateTime fechadesde, DateTime fechahasta)
{
//Comprobamos si la fechahasta es mayor que la fechadesde
if (DateTime.Compare(fechahasta, fechadesde) >= 0)
{
TimeSpan ts = fechahasta.Subtract(fechadesde);
if (ts.Days >0)
{
if (ts.Days > 1)
{
return (ts.Days + " días antes");
}
else
{
return (ts.Days + " día antes");
}
}
else
{
if (ts.Hours > 0)
{
if (ts.Hours > 1)
{
return (ts.Hours + " horas antes");
}
else
{
return (ts.Hours + " hora antes");
}
}
else
{
if (ts.Minutes > 0)
{
if (ts.Minutes > 1)
{
return (ts.Minutes + " minutos antes");
}
else
{
return (ts.Minutes + " minuto antes");
}
}
else
{
if (ts.Seconds > 0)
{
if (ts.Seconds > 1)
{
return (ts.Seconds + " segundos antes");
}
else
{
return (ts.Seconds + " segundo antes");
}
}
}
}
}
return "Compruebe las fechas";
}
else
{
return "Compruebe las fechas";
}
}
Como siempre para vuestra comodidad tambien os la dejo disponible en pastebin.
La inspiración de este articulo me vino del el excelente artículo de Alfredo Artiles sobre Fechas en formato tiempo transcurrido(time ago) con PHP
Custom exceptions en C#
14 ene
En ocasiones queremos lanzar custom exceptions que nos permitan lanzar errores personalizados cuando por ejemplo se ha hecho una llamada al servidor con un parametro incorrecto pero no queremos utilizar una de las excepciones predefinidas ya que queremos guardar y generar más información sobre la excepción. En este articulo os dejo un ejemplo de como crear nuestro propio custom exception en c#.
public class MyCustomException : ApplicationException
{
public MyCustomExceptionException(string message)
: base(message)
{
}
}
Cuando queremos usar nuestro custom exception en la creación de un error controlado lo hariamos de la siguiente forma:
throw new MyCustomException("Mensaje de error customizado");
Podriamos usarlo en el control de errores mediante la captura de errores en global.asax redirigiendolos a una página creada para gestionar los mensajes de error a nuestros usuarios:
protected void Application_Error(Object sender, EventArgs e)
{
if (Context != null && Context.IsCustomErrorEnabled)
{
Server.Transfer("~/Error.aspx", false);
}
}
Una vez redirigo el error podriamos usarlo de la siguiente forma:
Exception ex = Server.GetLastError();
if (ex != null)
{
Exception innerException = ex.InnerException;
if (innerException != null)
{
if (innerException is MyCustomException)
{
HttpContext.Current.Response.StatusCode = 401;
this.lblError.Text = ex.Message;
}
}
Espero que os sea útil y como siempre para vuestra comodida tambien en pastebin.
Función de c# para dar formato a un tweet
6 ene
Hara unos días creando un módulo de twitter para el CMS Cuyahoga tuve que desarrollar una función de c# para dar formato a un tweet.
Revisando el twitter he visto el excelente artículo de Alfredo Artiles sobre Expresiones regulares para dar formato a un Tweet , este excelente profesional ha desarrollado funciones para php y javascript y despues de leer su articulo se me ha ocurrido que podria compartir con vosotros la que realice para c#.
Función en c#
const string ScreenNamePattern = @"@([A-Za-z0-9\-_&;]+)";
const string HashTagPattern = @"#([A-Za-z0-9\-_&;]+)";
const string HyperLinkPattern = @"(http://\S+)\s?";
public static string FormatTweetText(string text)
{
string result = text;
if (result.Contains("http://"))
{
var links = new List<string>();
foreach (Match match in Regex.Matches(result, HyperLinkPattern))
{
var url = match.Groups[1].Value;
if (!links.Contains(url))
{
links.Add(url);
result = result.Replace(url, String.Format("<a href=\"{0}\">{0}</a>", url));
}
}
}
if (result.Contains("@"))
{
var names = new List<string>();
foreach (Match match in Regex.Matches(result, ScreenNamePattern))
{
var screenName = match.Groups[1].Value;
if (!names.Contains(screenName))
{
names.Add(screenName);
result = result.Replace("@" + screenName,
String.Format("<a href=\"http://twitter.com/{0}\">@{0}</a>", screenName));
}
}
}
if (result.Contains("#"))
{
var names = new List<string>();
foreach (Match match in Regex.Matches(result, HashTagPattern))
{
var hashTag = match.Groups[1].Value;
if (!names.Contains(hashTag))
{
names.Add(hashTag);
result = result.Replace("#" + hashTag,
String.Format("<a href=\"http://twitter.com/search?q={0}\">#{1}</a>",
HttpUtility.UrlEncode("#" + hashTag), hashTag));
}
}
}
return result;
}
Como siempre para vuestra comodidad tambien os la dejo disponible en pastebin.
SEO: Estructura interna de enlaces y distribución del pagerank para un rápido indexado
31 dic
Voy a intentar sintetizar aquellas técnicas o ideas a seguir para conseguir una estructura interna de enlaces para una rápida indexación y una correcta distribución del pagerank.
Técnicas a seguir
- Utilizar una arquitectura plana para la estructura de nuestra web.
- Organizar nuestro sitio web en base a las temáticas de nuestras keywords.
- Utilizar textos simples como enlaces a nuestras páginas internas,intentando huir de menus en flash.
- Tener un menú de navegación idéntico en cada página basado en nuestras keywords.
- Las páginas más importantes no deberían estar a más de un link de distancia o al menor número de ellos.
- Relaciona las páginas utilizando enlaces en los contenidos.
- Utiliza los keywords para enlazar con las otras páginas.
- Utilizar palabras que esten en el <title> o en <h1> de la página destino para los enlaces a ella.
- Utilizar rutas absolutas en los enlaces.
- Añadir el atributo “nofollow” en aquellos enlaces que queramos excluir de las búsquedas , como privacidad, acerca de… etc..
- Utilizar Disallow en el robot.txt en aquellas páginas no indexables , como la versión imprimible . Ej: Disallow:print.php
- Crear un sitemap.xml y enlazarlo desde el archivo robot.txt.
- Asegurarnos de no tener errores 404 en nuestras estructura de enlaces
- Nunca utlizar pop-ups para navegar entre contenidos.
- Intentar no tener más de 100 enlaces por página.
- Utilizar la etiqueta canonical para controlar la duplicidad de contenido derivado de multiples dominios o páginas parametrizadas.
- Utilizar la etiqueta <meta name=” robots ” content=” noindex,nofollow”> en los contenidos SSL para evitar duplicidad de indexación ya que estos tambien son indexados en su versión no segura.
- Utilizar las redirecciones 301 cuando eliminemos o redirijamos algún contenido.
- Utilizar una herramienta como Google Webmaster Tool.
Por último os dejo una serie de enlaces via un tag en Delicious creado para la ocasión que os pueden ser útiles para entender esta serie de recomendaciones que he tratado de sintetizar.
Este artículo es una respuesta a una pregunta del ConsultorioSEO de chicaseo.com , teneis el post origina de esta respuesta aqui.
Usabilidad: prevención y recuperación de errores
26 dic
Prevención y recuperación de errores , un tema extenso que intentare sintetizar de forma amena y como siempre en formato “resumen”.
Los errores son inevitables
Los errores ocurren por muy bien que este diseñado un sitio web, debemos tener claro que además los usuarios siempre cometerán errores , ya sea por lapsus accidentales o por no comprender la funcionalidad de la aplicación. Debemos pues seguir dos estrategias claras :
- Intentar prevenirlos y minizarlos.
- Corregir los errores y recuperarse de ellos.
Prevención y minificación
A nivel general podemos seguir estos consejos para preveenir y minificar los errores:
- Ofrecer una organización clara de la estructura del sitio y de
la página. - Mantener la consistencia en el sitio.
- Distinguir claramente enlaces (páginas visitadas /no
visitadas). - Escribir etiquetas descriptivas.
- Utilizar una lenguaje claro para nuestra audiencia.
- Utilizar botones intuitivos.
- Descripciones e instrucciones precisas.
- Seguir convenciones. Ej: Asterisco en los campos obligatorios.
- Ofrecer feedback de lo que está pasando.
- Ofrecer una salida clara:
- Enlace a página de inicio
- Funcionamiento correcto del botón “Atrás”.
Los formularios suelen ser el mayor input de errores , es por ello que debemos tratarlos de forma especial. A continuación os enumero unas cuantas tácticas a seguir:
Tácticas de prevención aplicadas a formularios
- Indicar campos obligatorios , para ello podemos utilizar un asterisco en los campos obligatorios o utilizar alguna de estas alternativas:
- Situar el literal “opcional” junto a los campos no obligatorios.
- Color destacado junto al control.
- Utilizar las negritas en las etiquetas de los campos obligatorios.
- Ofrecer ayuda, pistas y modelos.
- Ajustar el tamaño visual de las cajas de los formularios a las respuestas esperadas,como os comente en el articulo Usabilidad y diseño de formularios.
- Desactivación de botones de acción hasta que el usuario no haya cumplimentado los campos necesarios.
- Desactivación del botón de acción cuando el usuario haya hecho click en él para evitar la duplicidad de envio y los engorrosos registros duplicados mostrando la acción que se esta realizando (FeedBack).
.
Recuperación de errores
Hemos intentando preveenir los errores , pero como ya he comentado esta tarea utopica , nos encontramos con que se ha producido un error. ¿Como debemos afrontarlo? En primer lugar nos vamos a centrar en como comunicamos al usuario que se ha producido un error.
Mensaje de error
Un mensaje de error debe:
- Comunicar que se ha producido un error.
- Informar de qué error se trata.
- Indicar dónde se ha producido.
- Proponer soluciones a los usuarios para resolver el problema.
- Integrar el mensaje de error en la página , pero que a su vez se muestre de forma clara.
Mensajes de error del servidor
No hemos de olvidar que una página web no deja de ser una aplicación y esta puede devolver errores del lado del servidor. Debemos tratar estos errores y no dejar que el control de errores de la aplicación o servidor de páginas web se encarge de ellos , devolviendo mensajes de error incomprensibles para el usuario. Al igual que con los errores de usuario debemos seguir unas “buenas prácticas”:
- Indicar claramente que se ha producido un error.
- Describir el problema de forma precisa.
- Proponer alternativas o soluciones a los usuarios para resolver el problema.
- Utilizar el lenguaje de los usuarios: no utilizar términos técnicos, códigos oscuros, estilo administrativo o interno de la entidad..



