Un programador más

Experiencias de un programador curioso del SEO

Sígueme en TwitterRSS Feeds

  • Inicio
  • ¿Quien soy?
  • Contacta conmigo

Time ago en c#

23 ene

Publicado por jmnieves en .NET

2 comentarios

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

C#

Custom exceptions en C#

14 ene

Publicado por jmnieves en .NET

No hay comentarios

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.

C#, gestion de errores

Función de c# para dar formato a un tweet

6 ene

Publicado por jmnieves en .NET

No hay comentarios

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\-_&amp;;]+)";
const string HashTagPattern = @"#([A-Za-z0-9\-_&amp;;]+)";
const string HyperLinkPattern = @"(http://\S+)\s?";

public static string FormatTweetText(string text)
{
string result = text;

if (result.Contains("http://"))
{
var links = new List&lt;string&gt;();
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("&lt;a href=\"{0}\"&gt;{0}&lt;/a&gt;", url));
}
}
}

if (result.Contains("@"))
{
var names = new List&lt;string&gt;();
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("&lt;a href=\"http://twitter.com/{0}\"&gt;@{0}&lt;/a&gt;", screenName));
}
}
}

if (result.Contains("#"))
{
var names = new List&lt;string&gt;();
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("&lt;a href=\"http://twitter.com/search?q={0}\"&gt;#{1}&lt;/a&gt;",
HttpUtility.UrlEncode("#" + hashTag), hashTag));
}
}
}

return result;
}

Como siempre para vuestra comodidad tambien os la dejo disponible en pastebin.

C#, twitter

SEO: Estructura interna de enlaces y distribución del pagerank para un rápido indexado

31 dic

Publicado por jmnieves en SEO

No hay comentarios

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.

indexacion, pagerank

Usabilidad: prevención y recuperación de errores

26 dic

Publicado por jmnieves en Usabilidad

3 comentarios

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.
    Ejemplo de ayuda de implementación

    Ejemplo de ayuda de introducción

  • 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).

    Desactivar al enviar , mostrando que acción se esta realizando.

    Desactivar al enviar , mostrando que acción se esta realizando.

    .

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.
    Ejemplo de un mal mensaje de error

    Ejemplo de un mal mensaje de error

    Buena práctica en mensaje de errores

    Buena práctica en mensaje de errores

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..

Ejemplo de mensaje incomprensible para el usuario

Ejemplo de mensaje incomprensible para el usuario

Buena práctica de mensaje de error del servidor

Buena práctica de mensaje de error del servidor

prevencion de errores
«12345»...Última »
    • Comentarios recientes
    • Entradas populares
    • Archivos
    • Etiquetas
    • Categorías
    • .NET (8)
    • Jquery (5)
    • La Red (6)
    • SEO (12)
    • Usabilidad (3)
    4.0 asp mvc 2 C# curiosidades empresa escritura online estandarizacion gestion de errores google html indexacion internet Jquery LSSI manifiesto optimización pagerank PLINQ plugins jquery prevencion de errores reflexiones SEO twitter Usabilidad
    • agosto 2010 (1)
    • junio 2010 (1)
    • mayo 2010 (2)
    • febrero 2010 (1)
    • enero 2010 (3)
    • diciembre 2009 (6)
    • noviembre 2009 (6)
    • octubre 2009 (3)
    • septiembre 2009 (1)
    • agosto 2009 (10)
    • Twitter : Evitar el ruido en el timeline de tus followers (9)
    • SEO y tiempos de carga (4)
    • Robots.txt nuestra puerta a los motores de búsqueda (3)
    • Plugins imprescindibles para Jquery – jgfeed (lector rss) (3)
    • SEO y flash (3)
    • Usabilidad: prevención y recuperación de errores (3)
    • SEO: Excluir contenido de ser indexado por google (2)
    • Escribir para SEO (2)
    • Time ago en c# (2)
    • Bloggers & Guadalpin 2010 (2)
    • disfrutamallorca: Muchas gracias por tu explicación, voy ha aplicar el tema de los pasos (virtusbooks.com) no para ...
    • jmnieves: disfrutamallorca: Muy bueno el post, despues de leer el post voy a corregir dos cosillas....
    • disfrutamallorca: Muy bueno el post, despues de leer el post voy a corregir dos cosillas. Además quisiera hacerte una ...
    • Bitacoras.com: Información Bitacoras.com... Valora en Bitacoras.com: Cuando desarrollamos nuestras aplicaciones ...
    • jmnieves: Que sepais que no gane :-( , pero bueno , como dicen lo importante es participar ( eso lo decimos...
    • jmnieves: Denada David , un placer haberte podido ayudar.
    • David: Estaba buscando precisamente este tipo de exclusiones en el panel de control de buscadores...
    • Guadalpin: Muchas gracias por participar. Te deseamos mucha suerte.
  • Mis últimos tweets

    Cargando tweets...
    ¡Sígueme en Twitter!
  • Sigueme en FB

  • Blogs amigos

    • Ajax24
    • Cambio y Corto
    • EnQuarentena
    • Juan Puebla
  • Mis últimos delicious

    • HowTo: Use the new ASP.NET Chart Controls with ASP.NET MVC | Code-Inside Blog International
    • Convert HTML to PDF | Online HTML to PDF API
    • ASP.NET MVC: Securing Your Controller Actions
    • Scott Hanselman - jQuery to ship with ASP.NET MVC and Visual Studio
    • Using jQuery UI in ASP.NET | gduthie | Channel 9
  • RSS Os recomiendo

    • Tutorial sobre Visual Studio Scrum 1.0
    • Subir ficheros al servidor en ASP.NET MVC
    • Galería de imágenes para dispositivos touchscreen
    • Sets de elementos web para wireframing
    • Referenciar scripts, estilos y otros recursos desde vistas MVC
    • ¿Es “agile” una moda, tendencia, la mejor opción … la única opción?
    • Build a Custom HTML5 Video Player: Free Premium Tutorial
    • How to Create a Web-Based Drawing Application Using Canvas: New Premium Tutorial
    • Quick Tip: Getting Offline Access with HTML5 Application Cache
    • Using Microformats in HTML5
RSS Feeds XHTML 1.1 Arriba
PR 3