<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Un programador más</title>
	<atom:link href="http://www.unprogramadormas.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.unprogramadormas.com</link>
	<description>Experiencias de un programador curioso del SEO</description>
	<lastBuildDate>Wed, 11 Aug 2010 14:21:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Evitar el cache de los navegadores en ASP MVC</title>
		<link>http://www.unprogramadormas.com/11/08/2010/evitar-el-cache-de-los-navegadores-en-asp-mvc/</link>
		<comments>http://www.unprogramadormas.com/11/08/2010/evitar-el-cache-de-los-navegadores-en-asp-mvc/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 14:19:40 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[asp mvc 2]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=516</guid>
		<description><![CDATA[Cuando desarrollamos nuestras aplicaciones web , muchas veces nos encontramos con un problema con el cual no contabamos la cache del navegador del usuario. Para solventar este problema en ASP MVC contamos con la posibilidad de utilizar ActionFilterAttribute , en este articulo os enseñare a evitar el cache mediante un CustomFilter en ASP MVC. Primero]]></description>
			<content:encoded><![CDATA[<p>Cuando desarrollamos nuestras aplicaciones web , muchas veces nos encontramos con un problema con el cual no contabamos la <a title="Definición de cache en la wikipedia" href="http://es.wikipedia.org/wiki/Cache" target="_blank">cache</a> del navegador del usuario.</p>
<p>Para solventar este problema en <strong>ASP MVC</strong> contamos con la posibilidad de utilizar <a title="ActionFilterAttribute en MSDN" href="http://msdn.microsoft.com/en-us/library/system.web.mvc.actionfilterattribute.aspx" target="_blank">ActionFilterAttribute</a> , en este articulo os enseñare a evitar el cache mediante un CustomFilter en ASP MVC.</p>
<p>Primero de todo crearemos un CustomFilter:</p>
<pre class="brush: csharp;">
  public class NoCacheFilter : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext ActionContext)
        {

            HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
            HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
            HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            HttpContext.Current.Response.Cache.SetNoStore();

        }

    }
</pre>
<p>Como veis sobreescribimos la función <strong>OnActionExecuting</strong> que nos permite captura la llamada al action. En ella definimos la cache del Response de nuestra action en asp mvc.</p>
<p>&lt;h6&gt;Implementación del NoCacheFilter en nuestras actions&lt;/h6&gt;</p>
<pre class="brush: csharp;">
[NoCacheFilter()]
 public ActionResult Index()
 {
       return View();
  }
</pre>
<p>Como siempre para vuestra comodidad os dejo el código en <a title="Custom ActionFilter" href="http://pastebin.com/Bg6e6FBs">pastebin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/11/08/2010/evitar-el-cache-de-los-navegadores-en-asp-mvc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Custom ActionFilter</title>
		<link>http://www.unprogramadormas.com/08/06/2010/custom-actionfilter/</link>
		<comments>http://www.unprogramadormas.com/08/06/2010/custom-actionfilter/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 09:50:42 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[asp mvc 2]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=506</guid>
		<description><![CDATA[Ando liado con un proyecto en asp mvc 2.0 y ya sabeis que me gusta compartir lo que voy aprendiendo asi que hoy os voy a proponer aprender a realizar nuestro propio Custom ActionFilter. Un ActionFilter nos permite interceptar la llamada a un action antes de empezar a ejecutar el código de la misma. Esto]]></description>
			<content:encoded><![CDATA[<p>Ando liado con un proyecto en <strong>asp mvc 2.0 </strong>y ya sabeis que me gusta compartir lo que voy aprendiendo asi que hoy os voy a proponer aprender a realizar nuestro propio <strong>Custom ActionFilter</strong>. Un ActionFilter nos permite interceptar la llamada a un action antes de empezar a ejecutar el código de la misma. Esto nos puede servir por ejemplo para reestablecer la cultura de la aplicación o como en el ejemplo que os voy a mostrar forzar a un action de nuestro controlador a ser accesible solo cuando el usuario este autentificado.</p>
<h5>Código de nuestro Custom Action Filter</h5>
<pre class="brush: csharp;">
   public class OnlyAuthenticatedFilterAttribute : ActionFilterAttribute
    {
        public OnlyAuthenticatedFilterAttribute()
        {

        }

        public override void OnActionExecuting(ActionExecutingContext ActionContext)
        {
                 if (!ActionContext.HttpContext.User.Identity.IsAuthenticated)
                 {
                     string returnUrl = &quot;~/Login/?ReturnUrl=&quot; + HttpContext.Current.Request.RawUrl;
                     ActionContext.HttpContext.Response.Redirect(returnUrl, true);

                 }

        }
}
</pre>
<p>Como veis sobreescribimos la función <strong>OnActionExecuting</strong> que nos permite captura la llamada al action. En ella utilizando el <strong>ActionExecutingContext</strong> comprobamos si el usuario actual esta autenficado y en caso de no estarlo lo redirigimos a una página de login.</p>
<h5>Implementación del Custom Filter en nuestra Action</h5>
<pre class="brush: csharp;">
  [OnlyAuthenticatedFilterAttribute()]
   public ActionResult Index()
   {
         return View();
    }
</pre>
<p>Espero que este ejemplo os haya sido claro y os sea útil para vuestros proyectos en asp mvc 2. Como siempre para vuestra comodidad os dejo el código en <a title="Custom ActionFilter" href="http://pastebin.com/LecpS3D8">pastebin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/08/06/2010/custom-actionfilter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bloggers &amp; Guadalpin 2010</title>
		<link>http://www.unprogramadormas.com/12/05/2010/bloggers-guadalpin-2010/</link>
		<comments>http://www.unprogramadormas.com/12/05/2010/bloggers-guadalpin-2010/#comments</comments>
		<pubDate>Wed, 12 May 2010 09:19:36 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[La Red]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=497</guid>
		<description><![CDATA[Menos mal que reservé en el mejor hotel en Marbella&#8230; si no me hubiera sido imposible llegar a tiempo a mi reunión con Antonio Cañestro ,concejal de obras publicas del municipio costero de Fuengirola. Era una reunión a la cual no podia llegar tarde, el futuro de la fábrica familiar dependia de ello. Mi familia]]></description>
			<content:encoded><![CDATA[<p>Menos mal que reservé en el mejor <a title="hotel en marbella" href="http://www.granhotelguadalpin.com/?utm_source=blogs&amp;utm_campaign=concursobloggers2010">hotel en Marbella</a>&#8230; si no me hubiera sido imposible llegar a tiempo a mi reunión con Antonio Cañestro ,concejal de obras publicas del municipio costero de Fuengirola.</p>
<p>Era una reunión a la cual no podia llegar tarde, el futuro de la fábrica familiar dependia de ello.<br />
Mi familia desde que mi memoria llega alcanzar se ha dedicado a la fabricación de losas y la posibilidad de proveer al municipio de Fuengirola de losas de piedra para su nuevo paseo marítimo, era un negocio que sacaria a flote la fábrica en estos tiempos tan duros de crisis.</p>
<p>Después de degustar un magnifico desayuno , con las pilas cargadas me reuní con el concejal y despues de los típicos flecos me confirmo que nuestra propuesta habia ganado el concurso. La fábrica de mis padres habia vuelto a lidiar con otra crisis y mientras regresaba al hotel disfrute del paisaje marino como si de un trofeo se tratase.</p>
<hr />
<p>Este relato lo he escrito con motivo de participar en el <a href="http://www.granhotelguadalpin.com/concurso_bloggers2010.cfm" title="Bloggers &#038; Guadalpin 2010">Bloggers &#038; Guadalpin 2010</a> un concurso de relatos breves que como premio ganas una estancia <img src='http://www.unprogramadormas.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/12/05/2010/bloggers-guadalpin-2010/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>AsParallel usa todos tus nucleos en LINQ</title>
		<link>http://www.unprogramadormas.com/10/05/2010/asparallel-usa-todos-tus-nucleos-en-linq/</link>
		<comments>http://www.unprogramadormas.com/10/05/2010/asparallel-usa-todos-tus-nucleos-en-linq/#comments</comments>
		<pubDate>Mon, 10 May 2010 16:57:34 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[4.0]]></category>
		<category><![CDATA[PLINQ]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=493</guid>
		<description><![CDATA[Hará ya unos dias estuve en la presentación de visual studio 2010 en barcelona y una de las cosas que más me gustarón fue AsParallel() una sencilla función que potencia LINQ al número de nucleos que disponga tu servidor. Es lo que los chicos de Redmond llama PLINQ. Su implementación es tan sencilla como añadir]]></description>
			<content:encoded><![CDATA[<p>Hará ya unos dias estuve en la presentación de visual studio 2010 en barcelona y una de las cosas que más me gustarón fue <strong>AsParallel()</strong> una sencilla función que potencia LINQ al número de nucleos que disponga tu servidor. Es lo que los chicos de Redmond llama <a href="http://msdn.microsoft.com/en-us/magazine/cc163329.aspx" title="Parallel LINQ: Running Queries On Multi-Core Processors">PLINQ</a>.</p>
<p>Su implementación es tan sencilla como añadir nuestras sentencias LINQ la función .AsParallel() ejemplo:</p>
<pre class="brush: csharp;">
IEnumerable&lt;T&gt; data = ...;
var q = data.AsParallel().Where(x =&gt; x.Id &gt; pId).ToList();
</pre>
<p>Y aqui acaba el articulo , AsParallel() es tan simple de implementar y sin embargo nos abre el mundo del multithreading en nuestras consultas LINQ.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/10/05/2010/asparallel-usa-todos-tus-nucleos-en-linq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proteger emails de los robots mediante javascript y c#</title>
		<link>http://www.unprogramadormas.com/01/02/2010/proteger-emails-de-los-robots-mediante-javascript-y-csharp/</link>
		<comments>http://www.unprogramadormas.com/01/02/2010/proteger-emails-de-los-robots-mediante-javascript-y-csharp/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 09:50:48 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=484</guid>
		<description><![CDATA[En este articulo os hablare de como proteger emails de los robots de spam mediante javascript en c#, muchas veces nos vemos obligados a mostrar direcciones de correo electronico en nustras páginas con el riesgo de que esas cuentas caigan en manos de robots spammers y colapsar dichas cuentas de emails de publicidad no deseada.]]></description>
			<content:encoded><![CDATA[<p>En este articulo os hablare de como <strong>proteger emails de los robots de spam mediante javascript en c#</strong>, muchas veces nos vemos obligados a mostrar direcciones de correo electronico en nustras páginas con el riesgo de que esas cuentas caigan en manos de robots spammers y colapsar dichas cuentas de emails de publicidad no deseada. A continuación os dejo una función en c# que sustituira los emails por códigos en javascript que los robots no serán capaces de descifrar:</p>
<h5>Función en C# para proteger emails de los robots mediante javascript</h5>
<pre class="brush: csharp;">
  /// &lt;summary&gt;
        /// Función que devuelve un script para proteger un email de los robots
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;email&quot;&gt;Email a proteger&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string HideEmail(string email)
        {
            string script;
            string character_set  = &quot;+-.0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz&quot;;
            string key = ShuffleWord(character_set);  //Reordena character_set aleatoriamente
            string cipher_text = &quot;&quot;;
            Random rnd = new Random();
            string id = rnd.Next().ToString();
            for (int i=0;i&lt;email.Length;i++)
            {
                cipher_text += key[character_set.IndexOf(email[i])];
            }
            script  = string.Format(&quot;var a=\&quot;{0}\&quot;;\nvar b=a.split(\&quot;\&quot;).sort().join(\&quot;\&quot;);\nvar c=\&quot;{1}\&quot;;var d=\&quot;\&quot;;\nfor(var e=0;e&lt;c.length;e++)d+=b.charAt(a.indexOf(c.charAt(e)));\ndocument.getElementById(\&quot;{2}\&quot;).innerHTML=\&quot;&lt;a href='mailto:'\&quot; + d + \&quot;'&gt;\&quot; + d + \&quot;&lt;/a&gt;\&quot;;&quot;,key,cipher_text,id);
            script = &quot;&lt;script type=\&quot;text/javascript\&quot;&gt;\n/*&lt;![CDATA[*/&quot; + script + &quot;/*]]&gt;*/\n&lt;/script&gt;&quot;;
            return &quot;&lt;span id='&quot; + id + &quot;'&gt;\n[email protegido mediante javascript]\n&lt;/span&gt;\n&quot; + script;
        }

        /// &lt;summary&gt;
        /// Función que reordena un string de forma aleatoria
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;s&quot;&gt;Cadena a reordenar&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
         public static string ShuffleWord(string s)
         {
            Random r = new Random((int)(new TimeSpan()).Ticks);
            System.Collections.ArrayList arl = new System.Collections.ArrayList();
            string strFinal = String.Empty;
            int temp = 0;
            if (s.Length &gt; 2)
            {
               for (int i = 1; i &lt; s.Length - 1; i++)
               {
                  arl.Add(i);
               }

               for (int c = 1; c &lt; s.Length -1 ; c++)
               {
                    temp = r.Next(arl.Count);
                    strFinal += s[(int)arl[temp]].ToString();
                    arl.RemoveAt(temp);
               }
               strFinal = s[0] + strFinal + s[s.Length-1];
               return strFinal;
            }
               return s;
         }
</pre>
<h5>Código html resultante</h5>
<pre class="brush: xml;">
&lt;span id='1344355154'&gt;
[email protegido mediante javascript]
&lt;/span&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
/*&lt;![CDATA[*/var a=&quot;+hnjV@WtNxDFQaPy.pwbEkmv0_RrZO27KBuXe-HGqMd4AofCL58SgYJ6liUsTI1c93z&quot;;
var b=a.split(&quot;&quot;).sort().join(&quot;&quot;);
var c=&quot;36SosoaCYM5gn46Y&quot;;var d=&quot;&quot;;
for(var e=0;e&lt;c.length;e++)d+=b.charAt(a.indexOf(c.charAt(e)));
document.getElementById(&quot;1344355154&quot;).innerHTML=&quot;&lt;a href='mailto:'&quot; + d + &quot;'&gt;&quot; + d + &quot;&lt;/a&gt;&quot;;/*]]&gt;*/
&lt;/script&gt;
</pre>
<p>Como siempre para vuestra comodidad tambien os la dejo disponible en <a title="Proteger emails de los robots mediante javascript y c#" href="http://pastebin.com/d7fc1134">pastebin</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/01/02/2010/proteger-emails-de-los-robots-mediante-javascript-y-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time ago en c#</title>
		<link>http://www.unprogramadormas.com/23/01/2010/time-ago-en-csharp/</link>
		<comments>http://www.unprogramadormas.com/23/01/2010/time-ago-en-csharp/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 15:10:06 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=477</guid>
		<description><![CDATA[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 /// &#60;summary&#62; /// Función que devuelve]]></description>
			<content:encoded><![CDATA[<p>En este articulo os hablare de como calcular el famoso <strong>tiempo transcurrido o time ago en c#</strong> , 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.</p>
<h5>Función en c# para calcurar el time ago</h5>
<pre class="brush: csharp;">

        /// &lt;summary&gt;
        /// Función que devuelve un string con el formato &quot;time ago&quot; usado en aplicaciones como twitter
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;fechadesde&quot;&gt;Fecha anterior&lt;/param&gt;
        /// &lt;param name=&quot;fechahasta&quot;&gt;Normalmente la fecha actual&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public static string GetTimeAgo(DateTime fechadesde, DateTime fechahasta)
        {
            //Comprobamos si la fechahasta es mayor que la fechadesde
            if (DateTime.Compare(fechahasta, fechadesde) &gt;= 0)
            {
                TimeSpan ts = fechahasta.Subtract(fechadesde);

                if (ts.Days &gt;0)
                {
                    if (ts.Days &gt; 1)
                    {
                        return (ts.Days + &quot; días antes&quot;);
                    }
                    else
                    {
                        return (ts.Days + &quot; día antes&quot;);
                    }
                }
                else
                {

                    if (ts.Hours &gt; 0)
                    {
                        if (ts.Hours &gt; 1)
                        {
                            return (ts.Hours + &quot; horas antes&quot;);
                        }
                        else
                        {
                            return (ts.Hours + &quot; hora antes&quot;);
                        }
                    }
                    else
                    {
                        if (ts.Minutes &gt; 0)
                        {
                            if (ts.Minutes &gt; 1)
                            {
                                return (ts.Minutes + &quot; minutos antes&quot;);
                            }
                            else
                            {
                                return (ts.Minutes + &quot; minuto antes&quot;);
                            }
                        }
                        else
                        {
                            if (ts.Seconds &gt; 0)
                            {
                                if (ts.Seconds &gt; 1)
                                {
                                    return (ts.Seconds + &quot; segundos antes&quot;);
                                }
                                else
                                {
                                    return (ts.Seconds + &quot; segundo antes&quot;);
                                }
                            }

                        }

                    }
                }
                return &quot;Compruebe las fechas&quot;;
            }
            else
            {

                return &quot;Compruebe las fechas&quot;;

            }
        }
</pre>
<p>Como siempre para vuestra comodidad tambien os la dejo disponible en <a title="Función en c# para calcular el time ago" href="http://pastebin.com/d5f739646">pastebin</a>.</p>
<blockquote><p>
La inspiración de este articulo me vino del el excelente artículo de <a title="Twitter de Alfredo" href="http://twitter.com/aartiles24" target="_blank">Alfredo Artiles</a> sobre <a title="Fechas en formato tiempo transcurrido(time ago) con PHP" href="http://www.bitacoradewebmaster.com/2010/01/19/fechas-en-formato-tiempo-transcurridotime-ago-con-php/#comment-15376?utm_source=juanmanieves" target="_blank">Fechas en formato tiempo transcurrido(time ago) con PHP</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/23/01/2010/time-ago-en-csharp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Custom exceptions en C#</title>
		<link>http://www.unprogramadormas.com/14/01/2010/custom-exceptions-en-csharp/</link>
		<comments>http://www.unprogramadormas.com/14/01/2010/custom-exceptions-en-csharp/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 14:39:48 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[gestion de errores]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=464</guid>
		<description><![CDATA[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]]></description>
			<content:encoded><![CDATA[<p>En ocasiones queremos lanzar <strong>custom exceptions</strong> 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 <a title="Excepciones predefinidas" href="http://www.clikear.com/manuales/csharp/c130.aspx" target="_blank">excepciones predefinidas</a> 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 <strong>custom exception en c#</strong>.</p>
<pre class="brush: csharp;">
  public class MyCustomException : ApplicationException
    {
        public MyCustomExceptionException(string message)
            : base(message)
        {
        }
    }
</pre>
<p>Cuando queremos usar nuestro <strong>custom exception</strong> en la creación de un error controlado lo hariamos de la siguiente forma:</p>
<pre class="brush: csharp;">
throw new MyCustomException(&quot;Mensaje de error customizado&quot;);
</pre>
<p>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:</p>
<pre class="brush: csharp;">
protected void Application_Error(Object sender, EventArgs e)
 {
 if (Context != null &amp;&amp; Context.IsCustomErrorEnabled)
 {
 Server.Transfer(&quot;~/Error.aspx&quot;, false);
 }
 }
</pre>
<p>Una vez redirigo el error podriamos usarlo de la siguiente forma:</p>
<pre class="brush: csharp;">
  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;
                    }
              }
</pre>
<p>Espero que os sea útil y como siempre para vuestra comodida tambien en <a title="Código en pastebin" href="http://pastebin.com/df0acb8">pastebin</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/14/01/2010/custom-exceptions-en-csharp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Función de c# para dar formato a un tweet</title>
		<link>http://www.unprogramadormas.com/06/01/2010/funcion-de-csharp-para-dar-formato-a-un-tweet/</link>
		<comments>http://www.unprogramadormas.com/06/01/2010/funcion-de-csharp-para-dar-formato-a-un-tweet/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 16:01:39 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.unprogramadormas.com/?p=414</guid>
		<description><![CDATA[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]]></description>
			<content:encoded><![CDATA[<p>Hara unos días creando un módulo de twitter para el <acronym title="Content Management Systems">CMS</acronym> <a title="A .NET Web Site Framework " href="http://www.cuyahoga-project.org/" target="_blank">Cuyahoga</a> tuve que desarrollar una <strong>función de c# para dar formato a un tweet</strong>.</p>
<p>Revisando el twitter he visto el excelente artículo de <a title="Twitter de Alfredo" href="http://twitter.com/aartiles24" target="_blank">Alfredo Artiles</a> sobre <a title="Expresiones regulares para dar formato a un Tweet" href="http://www.bitacoradewebmaster.com/2010/01/06/expresiones-regulares-para-dar-formato-a-un-tweet/#comment-14999" target="_blank">Expresiones regulares para dar formato a un Tweet</a> , 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#.</p>
<h5>Función en c#</h5>
<pre class="brush: csharp;">
const string ScreenNamePattern = @&quot;@([A-Za-z0-9\-_&amp;amp;;]+)&quot;;
const string HashTagPattern = @&quot;#([A-Za-z0-9\-_&amp;amp;;]+)&quot;;
const string HyperLinkPattern = @&quot;(http://\S+)\s?&quot;;

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

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

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

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

return result;
}
</pre>
<p>Como siempre para vuestra comodidad tambien os la dejo disponible en <a title="Funcion en pastebin" href="http://pastebin.com/d4f87c7ed">pastebin</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/06/01/2010/funcion-de-csharp-para-dar-formato-a-un-tweet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO: Estructura interna de enlaces y distribución del pagerank para un rápido indexado</title>
		<link>http://www.unprogramadormas.com/31/12/2009/seo-estructura-interna-de-enlaces-y-distribucion-del-pagerank-para-un-rapido-indexado/</link>
		<comments>http://www.unprogramadormas.com/31/12/2009/seo-estructura-interna-de-enlaces-y-distribucion-del-pagerank-para-un-rapido-indexado/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 09:43:41 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[indexacion]]></category>
		<category><![CDATA[pagerank]]></category>

		<guid isPermaLink="false">http://yokese.wordpress.com/?p=409</guid>
		<description><![CDATA[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]]></description>
			<content:encoded><![CDATA[<p>Voy a  intentar sintetizar aquellas técnicas o ideas a seguir para conseguir <strong>una estructura interna de enlaces para una rápida indexación y una correcta distribución del <a title="¿Que es el PageRank?" href="http://es.wikipedia.org/wiki/PageRank" target="_blank">pagerank</a></strong>.</p>
<h5>Técnicas a seguir</h5>
<ul>
<li>Utilizar una <a title="¿Como es una arquitectura plana?" href="http://www.seocolombia.com/blog/wp-content/uploads/2009/10/arquitectura-web-seo.jpg">arquitectura plana</a> para la estructura de nuestra web.</li>
<li>Organizar nuestro sitio web en base a las temáticas de nuestras <a title="¿Que es un KeyWord?" href="http://en.wikipedia.org/wiki/Index_term" target="_blank">keywords</a>.</li>
<li>Utilizar textos simples como enlaces a nuestras páginas internas,intentando huir de menus en flash.</li>
<li>Tener un menú de navegación idéntico en cada página basado en nuestras <a title="¿Que es un KeyWord?" href="http://en.wikipedia.org/wiki/Index_term" target="_blank">keywords</a>.</li>
<li>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.</li>
<li>Relaciona las páginas utilizando enlaces en los contenidos.</li>
<li>Utiliza los <a title="¿Que es un KeyWord?" href="http://en.wikipedia.org/wiki/Index_term" target="_blank">keywords</a> para enlazar con las otras páginas.</li>
<li>Utilizar palabras  que esten en el &lt;title&gt; o en &lt;h1&gt; de la página destino para los enlaces a ella.</li>
<li>Utilizar <a title="Diferentes tipo de rutas" href="http://es.wikipedia.org/wiki/Ruta_%28inform%C3%A1tica%29" target="_blank">rutas</a> absolutas en los enlaces.</li>
<li>Añadir el atributo <a title="¿Que es el atributo nofollow?" href="http://es.wikipedia.org/wiki/Nofollow" target="_blank">&#8220;nofollow&#8221;</a> en aquellos enlaces que queramos excluir de las búsquedas , como privacidad, acerca de&#8230; etc..</li>
<li>Utilizar <a title="Parametro Disallow" href="http://www.seoconsultants.com/robots-text-file/">Disallow</a> en el <a title="Articulo relacionado con la configuración del fichero Robot.txt" href="http://yokese.wordpress.com/2009/08/12/robots-txt-nuestra-puerta-a-los-motores-de-busqueda/">robot.txt</a> en aquellas páginas no indexables , como la versión imprimible . Ej: Disallow:print.php</li>
<li>Crear un <a title="Como implementar un sitemap.xml" href="http://www.sitemaps.org/" target="_blank">sitemap.xml</a> y enlazarlo desde el archivo robot.txt.</li>
<li>Asegurarnos de no tener <a title="¿Que es un error 404?" href="http://es.wikipedia.org/wiki/Error_404">errores 404</a> en nuestras estructura de enlaces</li>
<li>Nunca utlizar <a title="¿Que es un Pop-up?" href="http://es.wikipedia.org/wiki/Ventana_emergente" target="_blank">pop-ups</a> para navegar entre contenidos.</li>
<li> Intentar no tener más de 100 enlaces por página.</li>
<li>Utilizar la <a title="Controlar el contenido duplicado mediante la etiqueta canonical" href="http://yokese.wordpress.com/2009/08/11/contenido-duplicado-y-buscadores/" target="_blank">etiqueta canonical</a> para controlar la duplicidad de contenido derivado de multiples dominios o páginas parametrizadas.</li>
<li>Utilizar la etiqueta &lt;meta name=” robots ” content=” noindex,nofollow”&gt; en los contenidos <acronym title="Secure Sockets Layer">SSL</acronym> para evitar duplicidad de indexación ya que estos tambien son indexados en su versión no segura.</li>
<li>Utilizar las <a title="Redirecciones 301 y SEO" href="http://google.dirson.com/posicionamiento.net/redireccion-301/" target="_blank">redirecciones 301</a> cuando eliminemos o redirijamos algún contenido.</li>
<li>Utilizar una herramienta como <a title="Herramientas para Webmasters" href="https://www.google.com/webmasters/tools/" target="_blank">Google Webmaster Tool</a>.</li>
</ul>
<p>Por último os dejo una serie de <a title="Enlaces de interes para una correcta estructura de enlaces y distribución del pagerank" href="http://delicious.com/yokese/%23ConsultorioSEO1">enlaces via un tag en Delicious</a> creado para la ocasión que os pueden ser útiles para entender esta serie de recomendaciones que he tratado de sintetizar.</p>
<hr />Este artículo es una respuesta a una pregunta del <strong><a title="Consultorio SEO" href="http://www.chicaseo.com/category/consultorio-seo/">ConsultorioSEO</a></strong> de <strong><a title="ChicaSEO " href="http://www.chicaseo.com/">chicaseo.com</a></strong> , teneis el post origina de esta respuesta <a title="Estructura interna de enlaces #SEOConsultorio" href="http://www.chicaseo.com/estructura-interna-enlaces/">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/31/12/2009/seo-estructura-interna-de-enlaces-y-distribucion-del-pagerank-para-un-rapido-indexado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usabilidad: prevención y recuperación de errores</title>
		<link>http://www.unprogramadormas.com/26/12/2009/usabilidad-prevencion-y-recuperacion-de-errores/</link>
		<comments>http://www.unprogramadormas.com/26/12/2009/usabilidad-prevencion-y-recuperacion-de-errores/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 11:56:10 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[Usabilidad]]></category>
		<category><![CDATA[prevencion de errores]]></category>

		<guid isPermaLink="false">http://yokese.wordpress.com/?p=305</guid>
		<description><![CDATA[Prevención y recuperación de errores , un tema extenso que intentare sintetizar de forma amena y como siempre en formato &#8220;resumen&#8221;. 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]]></description>
			<content:encoded><![CDATA[<p><strong>Prevención y recuperación de errores</strong> , un tema extenso que intentare sintetizar de forma amena y como siempre en formato &#8220;resumen&#8221;.</p>
<h5>Los errores son inevitables</h5>
<p>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 :</p>
<ul>
<li>Intentar prevenirlos y minizarlos.</li>
<li>Corregir los errores y recuperarse de ellos.</li>
</ul>
<h5>Prevención y minificación</h5>
<p>A nivel general podemos seguir estos consejos para preveenir y minificar los errores:</p>
<ul>
<li>Ofrecer una organización clara de la estructura del sitio y de<br />
la página.</li>
<li>Mantener la consistencia en el sitio.</li>
<li>Distinguir claramente enlaces (páginas visitadas /no<br />
visitadas).</li>
<li>Escribir etiquetas descriptivas.</li>
<li>Utilizar una lenguaje claro para nuestra audiencia.</li>
<li>Utilizar botones intuitivos.</li>
<li>Descripciones e instrucciones precisas.</li>
<li>Seguir convenciones. Ej: Asterisco en los campos obligatorios.</li>
<li>Ofrecer feedback de lo que está pasando.</li>
<li>Ofrecer una salida clara:
<ul>
<li>Enlace a página de inicio</li>
<li>Funcionamiento correcto del botón “Atrás”.</li>
</ul>
</li>
</ul>
<p>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:</p>
<h6>Tácticas de prevención aplicadas a formularios</h6>
<ul>
<li> Indicar campos obligatorios , para ello podemos utilizar un asterisco en los campos obligatorios o utilizar alguna de estas alternativas:
<ul>
<li>Situar el literal “opcional” junto a los campos<em> no obligatorios</em>.</li>
<li>Color destacado junto al control.</li>
<li>Utilizar las negritas en las etiquetas de los campos obligatorios.</li>
</ul>
</li>
<li>Ofrecer ayuda, pistas y modelos.
<div id="attachment_395" class="wp-caption aligncenter" style="width: 279px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/campo_con_ayuda.png"><img class="size-full wp-image-395 " title="Ejemplo de ayuda de introducción" src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/campo_con_ayuda.png" alt="Ejemplo de ayuda de implementación" width="269" height="79" /></a><p class="wp-caption-text">Ejemplo de ayuda de introducción</p></div></li>
<li>Ajustar el tamaño visual de las cajas de los formularios a las respuestas esperadas,como os comente en el articulo <strong><a title="Recomendaciones para un correcto diseño de un formulario" href="http://www.unprogramadormas.com/wp-content/uploads//2009/11/21/usabilidad-y-diseno-de-formularios/">Usabilidad y diseño de formularios</a></strong>.</li>
<li>Desactivación de botones de acción hasta que el usuario no haya cumplimentado los campos necesarios.</li>
<li>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).
<p><div id="attachment_397" class="wp-caption aligncenter" style="width: 164px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/desactivar_al_enviar.png"><img class="size-full wp-image-397" title="Desactivar al enviar , mostrando que acción se esta realizando." src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/desactivar_al_enviar.png" alt="Desactivar al enviar , mostrando que acción se esta realizando." width="154" height="40" /></a><p class="wp-caption-text">Desactivar al enviar , mostrando que acción se esta realizando.</p></div>
<p>.</li>
</ul>
<h5>Recuperación de errores</h5>
<p>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.</p>
<h6>Mensaje de error</h6>
<p>Un mensaje de error debe:</p>
<ul>
<li>Comunicar que se ha producido un error.</li>
<li>Informar de qué error se trata.</li>
<li>Indicar dónde se ha producido.</li>
<li>Proponer soluciones a los usuarios para resolver el problema.</li>
<li>Integrar el mensaje de error en la página , pero que a su vez se muestre de forma clara.
<div id="attachment_400" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/mensaje_de_error_nodescriptivo.png"><img class="size-medium wp-image-400" title="Ejemplo de un mal mensaje de error" src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/mensaje_de_error_nodescriptivo.png?w=300" alt="Ejemplo de un mal mensaje de error" width="300" height="58" /></a><p class="wp-caption-text">Ejemplo de un mal mensaje de error</p></div>
<div id="attachment_401" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/mensaje_de_error_descriptivo.png"><img class="size-medium wp-image-401" title="Buena práctica en mensaje de errores" src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/mensaje_de_error_descriptivo.png?w=300" alt="Buena práctica en mensaje de errores" width="300" height="32" /></a><p class="wp-caption-text">Buena práctica en mensaje de errores</p></div></li>
</ul>
<h6>Mensajes de error del servidor</h6>
<p>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 &#8220;buenas prácticas&#8221;:</p>
<ul>
<li>Indicar claramente que se ha producido un error.</li>
<li>Describir el problema de forma precisa.</li>
<li>Proponer alternativas o soluciones a los usuarios para resolver el problema.</li>
<li>Utilizar el lenguaje de los usuarios: no utilizar términos técnicos, códigos oscuros, estilo administrativo o interno de la entidad..</li>
</ul>
<p><div id="attachment_404" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/malapracticademensajedeservidor.png"><img class="size-medium wp-image-404" title="Ejemplo de mensaje incomprensible para el usuario" src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/malapracticademensajedeservidor.png?w=300" alt="Ejemplo de mensaje incomprensible para el usuario" width="300" height="211" /></a><p class="wp-caption-text">Ejemplo de mensaje incomprensible para el usuario</p></div>
<div id="attachment_405" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.unprogramadormas.com/wp-content/uploads/2009/12/buenapracticademensajedeservidor.png"><img class="size-medium wp-image-405" title="Buena práctica de mensaje de error del servidor" src="http://www.unprogramadormas.com/wp-content/uploads/2009/12/buenapracticademensajedeservidor.png?w=300" alt="Buena práctica de mensaje de error del servidor" width="300" height="190" /></a><p class="wp-caption-text">Buena práctica de mensaje de error del servidor</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/26/12/2009/usabilidad-prevencion-y-recuperacion-de-errores/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
