<?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 &#187; .NET</title>
	<atom:link href="http://www.unprogramadormas.com/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.unprogramadormas.com</link>
	<description>Experiencias de un programador curioso del SEO</description>
	<lastBuildDate>Mon, 07 Mar 2011 16:54:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</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; title: ; notranslate">
  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; title: ; notranslate">
[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>
<p><strong>Edición</strong>: Añado la versión en VB gracias a FdoGonzález</p>
<pre class="brush: vb; title: ; notranslate">
Public Class NoCacheFilter
Inherits System.Web.Mvc.ActionFilterAttribute

Public Overrides Sub OnActionExecuting(ByVal ActionContext As System.Web.Mvc.ActionExecutingContext)
MyBase.OnActionExecuting(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()
End Sub

End Class
</pre>
]]></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>6</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; title: ; notranslate">
   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; title: ; notranslate">
  [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>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; title: ; notranslate">
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; title: ; notranslate">
  /// &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; title: ; notranslate">
&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 Como siempre para vuestra comodidad tambien]]></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; title: ; notranslate">

        /// &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; title: ; notranslate">
  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; title: ; notranslate">
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; title: ; notranslate">
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; title: ; notranslate">
  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>1</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; title: ; notranslate">
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>Twitter : Destroy Status con REST y cURL en C#</title>
		<link>http://www.unprogramadormas.com/24/12/2009/twitter-destroy-status-con-res-y-curl-en-c/</link>
		<comments>http://www.unprogramadormas.com/24/12/2009/twitter-destroy-status-con-res-y-curl-en-c/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 15:46:02 +0000</pubDate>
		<dc:creator>jmnieves</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://yokese.wordpress.com/?p=384</guid>
		<description><![CDATA[Hace unos dias estuve trasteando con la API de twitter concretamente tratando de eliminar mensajes del timeline. Twitter ofrece en su API metodos REST. Revisando estos metodos encontre  Destroy Status metodo que permite ser llamado via cURL ; como sabeis habitualmente trabajo con c# así que me puse manos a la obra y encontre la]]></description>
			<content:encoded><![CDATA[<p>Hace unos dias estuve trasteando con la <strong><acronym title="Interfaz de programación de aplicaciones">API</acronym> de twitter</strong> concretamente tratando de <strong>eliminar mensajes del timeline</strong>. Twitter ofrece en su <acronym title="Interfaz de programación de aplicaciones">API</acronym> metodos <a title="¿Que es REST?" href="http://es.wikipedia.org/wiki/Representational_State_Transfer">REST</a>. Revisando estos metodos encontre  <a title="Metodo Destroy Status de la API de Twitter" href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses%C2%A0destroy">Destroy Status</a> metodo que permite ser llamado via <strong><a title="¿Que es cURL?" href="http://es.wikipedia.org/wiki/CURL">cURL</a></strong> ; como sabeis habitualmente trabajo con c# así que me puse manos a la obra y encontre la libreria <strong><a title="Libreria cURL para .NET" href="http://sourceforge.net/projects/libcurl-net/">libcurl.NET</a></strong> que permite usar <strong><a title="¿Que es cURL?" href="http://es.wikipedia.org/wiki/CURL">cURL</a></strong> desde una aplicación .NET. Bueno no me enrollo más y os dejo con lo importante un ejemplo de la implementación de un metodo para eliminar mensajes de twitter via <strong><a title="Metodo Destroy Status de la API de Twitter" href="http://apiwiki.twitter.com/Twitter-REST-API-Method%3A-statuses%C2%A0destroy">Destroy Status</a> en C#</strong>.</p>
<h6>Codigo de ejemplo de eliminación de un mensaje en twitter via REST y cURL.</h6>
<pre class="brush: csharp; title: ; notranslate">
Curl.GlobalInit((int)CURLinitFlag.CURL_GLOBAL_ALL);
Easy easy = new Easy();
Easy.ReadFunction wf = new Easy.ReadFunction(OnWriteData);
string statusid = &quot;idejemplo&quot;; //Id del Status
easy.SetOptCURLoption.CURLOPT_URL,&quot;http://twitter.com/statuses/destroy/&quot; + statusid + &quot;.xml&quot;);
easy.SetOpt(CURLoption.CURLOPT_POST,true);
easy.SetOpt(CURLoption.CURLOPT_USERPWD, _TWITTERUSER + &quot;:&quot; + _TWITTERPASS);
string code = easy.Perform().ToString();
easy.Cleanup();
Curl.GlobalCleanup();
</pre>
<p><a title="Ejemplo de codigo en pastebin para una mejor visualización" href="http://pastebin.com/f37206e92">Ejemplo en pastebin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.unprogramadormas.com/24/12/2009/twitter-destroy-status-con-res-y-curl-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

