<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>IDisposable Thoughts</title>
    <description>Honey, where is my coding t-shirt?</description>
    <link>http://www.cprieto.com/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <blogChannel:blogRoll>http://www.cprieto.com/opml.axd</blogChannel:blogRoll>
    <dc:creator>Cristian Prieto</dc:creator>
    <dc:title>IDisposable Thoughts</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/IdisposableThoughts" type="application/rss+xml" /><item>
      <title>ViewStateHandlers is up!</title>
      <description>&lt;p&gt;Algunos recordaran mi corta serie de artículos acerca del manejo del ViewState en aplicaciones webforms ASP.NET, también recordaran que hay muchas pero muchas maneras de manejar el “ViewState” y que algunas son fácilmente reutilizables.&lt;/p&gt;  &lt;p&gt;Me llamó la atención el correo que recibí un tiempo después de conversar acerca del uso de los PageAdapters:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Me preguntaba entonces dónde está la reutilización de código cuando usamos tu código para hacer más pequeño el ViewState.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Como recordaran algunos fragmentos de código son tomados de otras personas (como por ejemplo, el de enviar el ViewState hacia el fondo de la página que mencionamos en un artículo pasado), así que decidí hacer una librería que nos permitiera algo así como “manejar” de forma fácil y sencilla el ViewState en las Webforms, fue entonces cuando nació el ViewStateHandler library.&lt;/p&gt;  &lt;p&gt;Esta librería pretende ser un simple contenedor de opciones para el manejo del ViewState, aún está en pañales pero ya tengo algo de código arriba en el control de versiones de CodePlex, si estan interesados pueden darle una hojeada!.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://viewstatehandlers.codeplex.com/"&gt;ViewStateHandlers en Codeplex&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; Por el momento si quieren hecharle una hojeada al código, deben irse a la tab de “Source Code” en la página de proyecto de Codeplex. Falta mucho por escribir aún (terminar el código, escribir algo de documentación de como usarlo).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/OmkZxkuCCvg" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/OmkZxkuCCvg/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/ViewStateHandlers-is-up!.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=e528da7c-c2d4-47cf-9bb0-8ab8f20d8662</guid>
      <pubDate>Mon, 13 Jul 2009 14:19:35 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=e528da7c-c2d4-47cf-9bb0-8ab8f20d8662</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=e528da7c-c2d4-47cf-9bb0-8ab8f20d8662</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/ViewStateHandlers-is-up!.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=e528da7c-c2d4-47cf-9bb0-8ab8f20d8662</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=e528da7c-c2d4-47cf-9bb0-8ab8f20d8662</feedburner:origLink></item>
    <item>
      <title>Stream Transformations</title>
      <description>&lt;p&gt;Recuerdo que una de las primeras cosas que solíamos aprender con un lenguaje o framework era el cómo leer/escribir de o hacia un archivo (o por lo menos antes así era). En la .Net Framework tenemos todo un namespace dedicado a las operaciones de E/S de datos e información (System.IO). Una de las clases básicas en este namespace es la clase abstracta &lt;strong&gt;Stream&lt;/strong&gt;. Cómo en la mayoría de lenguajes y frameworks modernas, &lt;a href="http://en.wikipedia.org/wiki/Stream_%28computing%29"&gt;Stream&lt;/a&gt; encapsula o abstrae las operaciones de E/S hacia diversos orígenes y/o destinos, de esa manera tenemos cosas como Network Streams, File Streams, Memory Streams, etc…&lt;/p&gt;  &lt;p&gt;Algo de lo cual no muchos nos habíamos percatado es que las clases derivadas de Stream no solamente abstraen operaciones de E/S, sino que también pueden ser usadas para “transformar” datos sobre la marcha, de esa manera tenemos ya en la .Net framework clases Stream especiales como &lt;strong&gt;GzipStream&lt;/strong&gt; (Compresión/Descompresión), &lt;strong&gt;CryptoStream&lt;/strong&gt; (Encriptación) y me imagino que hay muchas más en la framework. Hace ya varios meses leí en la &lt;a href="http://msdn.microsoft.com/en-us/magazine/default.aspx"&gt;MSDN Magazine&lt;/a&gt; (una de mis magazines favoritas por cierto, les recomiendo a todos suscribirse :P) un excelente artículo sobre &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163461.aspx"&gt;Testing Transformation Streams&lt;/a&gt; (TS de aquí en adelante) y en general de que se trataba una TS y como crearla/utilizarla. Un ejemplo típico de una transformation Stream es una que elimine los espacios en una Stream básica, por ejemplo:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System.IO;
using System.Text;
using System.Text.RegularExpressions;

namespace FilterSpacesStream
{
    public class NoSpaceStream : Stream
    {
        public NoSpaceStream(Stream sink)
        {
            Sink = sink;
        }

        private Stream Sink { get; set; }

        public override bool CanRead
        {
            get { return true; }
        }

        public override bool CanSeek
        {
            get { return Sink.CanSeek; }
        }

        public override bool CanWrite
        {
            get { return true; }
        }

        public override long Length
        {
            get { return Sink.Length; }
        }

        public override long Position
        {
            get { return Sink.Position; }
            set { Sink.Position = value; }
        }

        public override void Flush()
        {
            Sink.Flush();
        }

        public override long Seek(long offset, SeekOrigin origin)
        {
            return Sink.Seek(offset, origin);
        }

        public override void SetLength(long value)
        {
            Sink.SetLength(value);
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            return Sink.Read(buffer, offset, count);
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            string text = Encoding.UTF8.GetString(buffer);
            string result = Regex.Replace(text, @&amp;quot;\s&amp;quot;, string.Empty);

            byte[] data = Encoding.UTF8.GetBytes(result);
            Sink.Write(data, 0, data.Length);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Y su respectivo Fact Fixture:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System.IO;
using System.Text;
using Xunit;

namespace FilterSpacesStream
{
    public class NoSpaceStreamFacts
    {
        private readonly MemoryStream output = new MemoryStream();
        private readonly NoSpaceStream sut;

        public NoSpaceStreamFacts()
        {
            sut = new NoSpaceStream(output);
        }

        [Fact]
        public void It_can_read()
        {
            Assert.Equal(output.CanRead, sut.CanRead);
        }

        [Fact]
        public void It_can_write()
        {
            Assert.True(sut.CanWrite);
        }

        [Fact]
        public void It_can_Seek()
        {
            Assert.Equal(output.CanSeek, sut.CanSeek);
        }

        // And many other operations I really don't want to test...

        [Fact]
        public void When_write_a_string_with_spaces_it_returns_a_string_without_spaces()
        {
            string text = &amp;quot;This is a test &amp;quot;;
            byte[] buffer = Encoding.UTF8.GetBytes(text);
            sut.Write(buffer, 0, buffer.Length);
            sut.Flush();

            buffer = output.ToArray();
            string converted = Encoding.UTF8.GetString(buffer);
            Assert.Equal(&amp;quot;Thisisatest&amp;quot;, converted);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Uno de los usos básicos que podríamos darle a las Transformation Streams es crear una que sobre la marcha me comprima/cambie/elimine datos en la Render Stream utilizada por la ASP.NET Framework, ven ahora hacia dónde estoy orientando este post? (Rayos, creo que pensé en “voz” alta :P)&lt;/p&gt;

&lt;p&gt;Bueno, hasta la siguiente entrega!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/HkGX02rprQU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/HkGX02rprQU/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Stream-Transformations.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=e2cb9a0e-1466-4208-8ee7-ffa5f4249185</guid>
      <pubDate>Sun, 05 Jul 2009 01:51:43 -0600</pubDate>
      <category>.Net Framework</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=e2cb9a0e-1466-4208-8ee7-ffa5f4249185</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=e2cb9a0e-1466-4208-8ee7-ffa5f4249185</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Stream-Transformations.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=e2cb9a0e-1466-4208-8ee7-ffa5f4249185</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=e2cb9a0e-1466-4208-8ee7-ffa5f4249185</feedburner:origLink></item>
    <item>
      <title>MVP Awarded</title>
      <description>&lt;p&gt;No sé porqué no lo había posteado antes, pero el día 1 de Julio recibí el siguiente mail en mi inbox:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Estimado/a Cristian Prieto,       &lt;br /&gt;Enhorabuena. Nos complace presentarle el programa de nombramiento MVP de Microsoft® de 2009. Este nombramiento se concede a los líderes excepcionales de la comunidad técnica que comparten de forma activa su experiencia de alta calidad y de la vida real con otras personas. Le agradecemos especialmente la contribución que ha realizado en las comunidades técnicas en el área de ASP/ASP.NET a lo largo del pasado año.&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Claro, esa es la versión “genérica” de un mail diciéndote que este año has sido galardonado como MVP, así que todo indica que ahora soy MVP en ASP.NET. Gracias a cada uno de ustedes, los que día a día han tenido que &lt;em&gt;soportarme&lt;/em&gt; durante mis charlas, escuchar y aguantar mis quejas sobre que X ó Y no funciona como debería o sobre &lt;em&gt;cómo debería hacerse el procedimiento X&lt;/em&gt;. Ahora más que nunca me dieron unas ganas increíbles de cooperar con la comunidad, ahora más que nunca creo que debemos instar más a la gente a mejorar con cada día, ahora más que nunca me siento en deseos de transformar a &lt;em&gt;Morts &lt;/em&gt;en &lt;em&gt;Elvis&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Gracias a todos, gracias amigos…&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/V8JJvJIr6HE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/V8JJvJIr6HE/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/MVP-Awarded.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=8f7b7c6e-bbcc-4d92-b499-7a5756a5d4c9</guid>
      <pubDate>Fri, 03 Jul 2009 13:06:18 -0600</pubDate>
      <category>Personal</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=8f7b7c6e-bbcc-4d92-b499-7a5756a5d4c9</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=8f7b7c6e-bbcc-4d92-b499-7a5756a5d4c9</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/MVP-Awarded.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=8f7b7c6e-bbcc-4d92-b499-7a5756a5d4c9</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=8f7b7c6e-bbcc-4d92-b499-7a5756a5d4c9</feedburner:origLink></item>
    <item>
      <title>Visual Studio Debugger, Mensajes y Tracepoints</title>
      <description>&lt;p&gt;Hace un tiempo conversaba con alguien acerca de como encontrar/resolver/debuggear errores en una aplicación legacy, y en base a eso surgió una conversación la cual al final terminó mal (o sea, me dejó personalmente con muy mal sabor de boca).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Yo no necesito un debugger, con un simple &lt;strong&gt;var_dump&lt;/strong&gt; o &lt;strong&gt;print_r&lt;/strong&gt; puedo ver el contenido de mis variables en el momento y me doy cuenta si estoy bien o estoy mal&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hace unas cuantas horas, conversando con otro amigo sobre Test Runners me dijó una frase que &lt;em&gt;&lt;u&gt;obviamente&lt;/u&gt;&lt;/em&gt; era chiste: “&lt;em&gt;if you don’t have a good test runner you can use Console.WriteLine”&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Aunque parezca increíble a veces, el imprimir un mensaje en algún lugar (Debugger, Consola, Log, etc) también &lt;em&gt;podría&lt;/em&gt; ser una forma de debugging, el problema es que la mayoría de veces nos vemos obligados a modificar el código fuente de nuestro programa para lograrlo. De tal manera, tomemos en consideración la siguiente pieza de código:&lt;/p&gt;  &lt;pre class="brush: csharp; highlight: [10,17];"&gt;using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Debug.WriteLine(&amp;quot;** Start **&amp;quot;);
            var cat = new Cat();

            int number = 1;
            
            cat.Groom(number);

            Trace.WriteLine(&amp;quot;** End **&amp;quot;);
            
            Console.ReadLine();
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Pongamos atención a la línea 10 y 17. Cuando ejecutamos nuestro código veremos en la ventana de Output del Visual Studio (el panel Debug) varios mensajes, pero entre esos la línea “** Start **” y “** End **”. A simple vista podríamos decir que ambos hacen exactamente lo mismo, pertenecen al mismo Namespace [&lt;strong&gt;System.Diagnostics&lt;/strong&gt;] (de hecho si revisas sus métodos tienen las mismas signatures y los mismos métodos) pero difieren en la forma en que operan&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Debug&lt;/strong&gt; emite mensajes en design time, o sea, cuando la aplicación corre en modo Debug&lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Trace&lt;/strong&gt; emite mensajes en runtime y siempre, o sea, cuando la aplicación este en modo Debug y modo Release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obviamente cuando corremos la aplicación dentro del Debugger de Visual Studio, tanto las salidas de Debug y Trace son redireccionadas y mostradas en el panel de Debug de la Output Window, pero podemos redirigir esas salidas a un archivo (mediante los &lt;strong&gt;listeners&lt;/strong&gt; de System.Diagnostics) o también se mostraran en la Trace de ASP.net, también puedo ver mensajes Trace “in-vivo” en la aplicación de forma simple, pero eso lo dejo para otro tip corto más adelante.&lt;/p&gt;

&lt;p&gt;Como les mencionaba, los mensajes tipo Trace y Debug son usados para mostrar información relevante a la aplicación y que “teóricamente” debemos mostrar en momentos de debugging, no un “vamos a poner la app a producción, haz un search/replace para quitarle los mensajes de Trace”, o bueno, imagínense que es durante &lt;strong&gt;esa&lt;/strong&gt; sesión de debugging y necesitas ver cierta información. Bien, así como hay Breakpoints tenemos &lt;strong&gt;Tracepoints&lt;/strong&gt; que nos pueden mostrar mensajes en sesiones de Debugging, basta con insertar un breakpoint y en el menú contextual seleccionar “&lt;strong&gt;When Hit…&lt;/strong&gt;” (observen que el ícono de breakpoint cambia a un rombo rojo).&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=insert%20tracepoint.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="insert tracepoint" border="0" alt="insert tracepoint" src="http://www.cprieto.com/image.axd?picture=insert%20tracepoint_thumb.jpg" width="372" height="176" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Observen que puedo mostrar no solo expresiones, o variables encerrándolas con llaves, sino también variables “especiales” como el proceso, la Callstack, etc…&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=tracepoint.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="tracepoint" border="0" alt="tracepoint" src="http://www.cprieto.com/image.axd?picture=tracepoint_thumb.jpg" width="328" height="289" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Los Tracepoints obedecen a las mismas reglas que un Breakpoint, son como hermanos o como un “breakpoint” especial que indica mensajes, aunque claramente si le quitamos el check en “&lt;strong&gt;Continue Execution&lt;/strong&gt;” se comportará como un breakpoint, sólo que mostrará un mensaje en output como “adición especial” (y cambiará su ícono mostrando que es un breakpoint, no un tracepoint).&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Saludos y hasta la próxima entrega!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/tlohRgk_i5Q" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/tlohRgk_i5Q/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Visual-Studio-Debugger-Mensajes-y-Tracepoints.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=dee0cdd3-ad23-4547-8f18-f2148774c06f</guid>
      <pubDate>Thu, 02 Jul 2009 13:13:35 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=dee0cdd3-ad23-4547-8f18-f2148774c06f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=dee0cdd3-ad23-4547-8f18-f2148774c06f</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Visual-Studio-Debugger-Mensajes-y-Tracepoints.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=dee0cdd3-ad23-4547-8f18-f2148774c06f</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=dee0cdd3-ad23-4547-8f18-f2148774c06f</feedburner:origLink></item>
    <item>
      <title>Visual Studio Debugger, Conditional Breakpoint</title>
      <description>&lt;p&gt;Se pueden agregar condicionales a los breakpoints, de esta manera entraremos en el breakpoint solamente si la condición es satisfecha.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.cprieto.com/image.axd?picture=Insert%20breakpoint%20condition.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Insert breakpoint condition" border="0" alt="Insert breakpoint condition" src="http://www.cprieto.com/image.axd?picture=Insert%20breakpoint%20condition_thumb.jpg" width="353" height="190" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Por ejemplo, podríamos decirle que haga un breakpoint si la variable &lt;strong&gt;number&lt;/strong&gt; es mayor a 2 (Si observan bien el indicador de breakpoint cambia para mostrar que tiene incluida una condición).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.cprieto.com/image.axd?picture=Breakpoint%20condition.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Breakpoint condition" border="0" alt="Breakpoint condition" src="http://www.cprieto.com/image.axd?picture=Breakpoint%20condition_thumb.jpg" width="304" height="162" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Otra opción importante son los &lt;strong&gt;filtros de Breakpoint&lt;/strong&gt;, los cuales limitan el breakpoint a procesos, máquinas o thread específicas de ejecución. Son bastante útiles para el debugging de aplicaciones multithread o de múltiples procesos.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=insert%20breakpoint%20filter.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="insert breakpoint filter" border="0" alt="insert breakpoint filter" src="http://www.cprieto.com/image.axd?picture=insert%20breakpoint%20filter_thumb.jpg" width="306" height="142" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=breakpoint%20filter.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="breakpoint filter" border="0" alt="breakpoint filter" src="http://www.cprieto.com/image.axd?picture=breakpoint%20filter_thumb.jpg" width="299" height="255" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Hay que poner especial atención a los tooltips que aparecen sobre los indicadores de Breakpoints, porque nos muestran las condiciones o filtros bajo los que se encuentra el breakpoint.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/xHekErX5H_o" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/xHekErX5H_o/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Visual-Studio-Debugger-Conditional-Breakpoint.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=22b4e191-8fa1-4f62-9351-a7d0d2b94a1e</guid>
      <pubDate>Wed, 01 Jul 2009 11:50:32 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=22b4e191-8fa1-4f62-9351-a7d0d2b94a1e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=22b4e191-8fa1-4f62-9351-a7d0d2b94a1e</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Visual-Studio-Debugger-Conditional-Breakpoint.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=22b4e191-8fa1-4f62-9351-a7d0d2b94a1e</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=22b4e191-8fa1-4f62-9351-a7d0d2b94a1e</feedburner:origLink></item>
    <item>
      <title>Visual Studio Debugger, Breakpoints</title>
      <description>&lt;p&gt;Creo que luego de aprender el &lt;strong&gt;F5&lt;/strong&gt; (&lt;em&gt;Debug&lt;/em&gt;), &lt;strong&gt;Ctrl + F5&lt;/strong&gt; (&lt;em&gt;Run without debugging&lt;/em&gt;) y &lt;strong&gt;Shift + F5&lt;/strong&gt; (&lt;em&gt;Stop Debugging&lt;/em&gt;) lo siguiente que uno aprende al utilizar el Debugger de Visual Studio es el uso de los breakpoints. Según Wikipedia un &lt;a href="http://en.wikipedia.org/wiki/Breakpoint"&gt;Breakpoint&lt;/a&gt; es una pausa o stop intencional dentro de un programa con propósitos de debugging, el propósito es más que pausarlo, porque durante esa “pausa” el developer puede examinar la memoria y condiciones de ejecución actuales de su programa, de forma en que pueda observar que se esta comportando como espera.&lt;/p&gt;  &lt;p&gt;En Visual Studio Debugger es sumamente fácil insertar un Breakpoint, como recordaremos en Visual Studio el Debugger esta integrado íntimamente con el Editor, de tal manera que operaciones como las de “Insert breakpoint here” son sumamente sencillas. Para insertar un Breakpoint basta con hacer un click en el margen derecho del punto de edición y listo, una “bolita roja” mostrará el punto del breakpoint.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.cprieto.com/image.axd?picture=insert%20breakpoint.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="insert breakpoint" border="0" alt="insert breakpoint" src="http://www.cprieto.com/image.axd?picture=insert%20breakpoint_thumb.jpg" width="398" height="107" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Navegando entre Breakpoints es sumanente sencillo, Cada vez que llegamos a un método podemos ver que sucede dentro de él con un &lt;em&gt;Step Into&lt;/em&gt; (&lt;strong&gt;F11&lt;/strong&gt;), Si entramos a un método y ya no deseamos ver que esta pasando, podemos salir de el usando un &lt;em&gt;Step Out&lt;/em&gt; (&lt;strong&gt;Ctrl + F11&lt;/strong&gt;), y si queremos saltarnos los detalles de ejecución de un método usamos &lt;em&gt;Step Over&lt;/em&gt; (&lt;strong&gt;F10&lt;/strong&gt;). Podemos continuar la ejecución normal o ir hasta el siguiente breakpoint usando &lt;em&gt;Continue&lt;/em&gt; (&lt;strong&gt;F5&lt;/strong&gt;). Podemos reiniciar la ejecución del programa con &lt;em&gt;Restart&lt;/em&gt; (&lt;strong&gt;Ctrl + Shift + F5&lt;/strong&gt;).&lt;/p&gt;  &lt;p&gt;Podemos insertar un breakpoint desde “código” (Útil a debuggear cosas como Windows Services), basta con usar &lt;strong&gt;System.Diagnostics.Debugger.Break()&lt;/strong&gt;&lt;/p&gt;  &lt;pre class="brush: csharp; highlight: [14];"&gt;using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine(&amp;quot;** START **&amp;quot;);
            var cat = new Cat();


            Debugger.Break();
            int number = 1;
            
            cat.Groom(number);

            Console.WriteLine(&amp;quot;** END **&amp;quot;);
            Console.ReadLine();
        }
    }
}&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/P4W11OoLLvw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/P4W11OoLLvw/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Visual-Studio-Debugger-Breakpoints.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=48bed1f7-189e-4a18-ac85-2ae01376a2b4</guid>
      <pubDate>Wed, 01 Jul 2009 11:32:53 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=48bed1f7-189e-4a18-ac85-2ae01376a2b4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=48bed1f7-189e-4a18-ac85-2ae01376a2b4</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Visual-Studio-Debugger-Breakpoints.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=48bed1f7-189e-4a18-ac85-2ae01376a2b4</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=48bed1f7-189e-4a18-ac85-2ae01376a2b4</feedburner:origLink></item>
    <item>
      <title>Visual Studio Debugger, Anuncio</title>
      <description>&lt;p&gt;Desde hace ya varias semanas que viene una idea resonando en mi cabeza, una serie (probablemente corta, quien sabe) acerca del bueno uso o tips de debugging en ese nuestro amigo el Debugger de Visual Studio.&lt;/p&gt;  &lt;p&gt;Alguien me comentará: “Hey, pero ahí si te pasaste de básico compadre, yo quiero algo mas ‘avanzado’, quizás háblanos de .Net 4.0 o de las lunas de Marte [si, &lt;a href="http://en.wikipedia.org/wiki/Moons_of_Mars"&gt;Marte tiene 2 lunas&lt;/a&gt;]”&lt;/p&gt;  &lt;p&gt;Una de las cosas que disfruto de sobremanera es el metoring en equipos de desarrollo, y algo que me he topado en todos estos años de trabajo en grupos es el detalle del poco conocimiento que tienen los developers acerca de las herramientas que usan en su día a día, una de ellas, el Debugger. Es fantástico todo lo que podemos llegar a conocer de nuestra aplicación si aprendemos a usar correctamente el debugger.&lt;/p&gt;  &lt;p&gt;Recuerdo una discusión hace un tiempo con alguien que me mencionaba: “Yo nunca he necesitado ni usado un debugger en mi lenguaje X ó Y, no es necesario, es overrated”. Luego este mismo individuo nos explicaba como usaba técnicas novedosas como “Print lavariable” para ver el contenido de la variable en un punto. ¿Increíble verdad?&lt;/p&gt;  &lt;p&gt;Desarrollando en .Net encontramos dos debuggers importantes, &lt;a href="http://en.wikipedia.org/wiki/Windbg"&gt;WinDBG&lt;/a&gt;, el padre de todos los debuggers en la plataforma Windows, con el cual es posible hasta debuggear al mismo Windows u operaciones de kernel de Windows (útil para cosas como crear device drivers o similares). Comprender el WinDBG y todo lo que podemos hacer con el es algo extenso, así que nos concentraremos en un hermano menor (no relacionado directamente) y que viene en nuestro amigo inseparable Visual Studio, El &lt;a href="http://en.wikipedia.org/wiki/Visual_Studio_Debugger"&gt;Visual Studio Debugger&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Hasta el siguiente post&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/GNrBW0XXIqM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/GNrBW0XXIqM/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Visual-Studio-Debugger-Anuncio.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=03fd812a-f4fc-45da-be45-35689a4693ef</guid>
      <pubDate>Fri, 26 Jun 2009 11:17:38 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=03fd812a-f4fc-45da-be45-35689a4693ef</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=03fd812a-f4fc-45da-be45-35689a4693ef</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Visual-Studio-Debugger-Anuncio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=03fd812a-f4fc-45da-be45-35689a4693ef</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=03fd812a-f4fc-45da-be45-35689a4693ef</feedburner:origLink></item>
    <item>
      <title>Disminuyendo el ViewState, Moviéndolo al fin de página</title>
      <description>&lt;p&gt;Cuando pensé que se me habían olvidado los temas para seguir hablando del ViewState me encuentro con la siguiente idea: Moverlo al final de la página y así acelerar la carga de la página HTML en el Browser. El artículo original se encuentra en el blog del increíble &lt;a href="http://www.hanselman.com/blog/MovingViewStateToTheBottomOfThePage.aspx"&gt;Scott Hanselman&lt;/a&gt; por si quieren revisarlo.&lt;/p&gt;  &lt;p&gt;Bien, la idea de Hanselman es sumamente simple, captamos el evento &lt;strong&gt;Render&lt;/strong&gt; de la página y la modificamos extrayendo el ViewState actual, removiendolo y volviendo a agregarlo al final antes de la tag &lt;strong&gt;&amp;lt;/form&amp;gt;&lt;/strong&gt; de la form principal. Hanselman hace la anotación que con este approach &lt;strong&gt;no podemos&lt;/strong&gt; tener más de una form en la página.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System.IO;
using System.Web.UI;
using System.Web.UI.Adapters;

namespace ViewStateSample.Web
{
    public class BottomViewStatePageAdapter : PageAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            var sw = new StringWriter();
            var htmlWriter = new HtmlTextWriter(sw);

            base.Render(htmlWriter);

            string html = sw.ToString();

            int startPoint = html.IndexOf(&amp;quot;&amp;lt;input type=\&amp;quot;hidden\&amp;quot; name=\&amp;quot;__VIEWSTATE\&amp;quot;&amp;quot;);
            if (startPoint &amp;gt;= 0) {
                int endPoint = html.IndexOf(&amp;quot;/&amp;gt;&amp;quot;, startPoint) + 2;
                string viewStateInput = html.Substring(startPoint, endPoint - startPoint);
                html = html.Remove(startPoint, endPoint - startPoint);

                int formEndStart = html.IndexOf(&amp;quot;&amp;lt;/form&amp;gt;&amp;quot;);
                if (formEndStart &amp;gt;= 0)
                    html = html.Insert(formEndStart, string.Format(&amp;quot;\n{0}\n&amp;quot;, viewStateInput));
            }

            writer.Write(html);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Obviamente debido a que es un &lt;strong&gt;PageAdapter&lt;/strong&gt; necesitamos usar a nuestro viejo amigo el &lt;a href="http://www.cprieto.com/post/Comprimiendo-el-ViewState-usando-el-Browser-File.aspx"&gt;Browser File&lt;/a&gt;&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;browsers&amp;gt;
  &amp;lt;browser refID=&amp;quot;Default&amp;quot;&amp;gt;
    &amp;lt;controlAdapters&amp;gt;
      &amp;lt;adapter controlType=&amp;quot;System.Web.UI.Page&amp;quot;
               adapterType=&amp;quot;ViewStateSample.Web.BottomViewStatePageAdapter&amp;quot; /&amp;gt;
    &amp;lt;/controlAdapters&amp;gt;
  &amp;lt;/browser&amp;gt;
&amp;lt;/browsers&amp;gt;&lt;/pre&gt;

&lt;p&gt;Claro que para lograr una verdadera optimización es necesario también mover campos como el &lt;strong&gt;__EVENTVALIDATION&lt;/strong&gt; y tomar en cuenta casos en que se &lt;a href="http://www.cprieto.com/post/Encryptando-el-ViewState.aspx"&gt;encripta el ViewState&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Algo interesante es como implementar esta clase con nuestra __COMPRESSIONSTREAM, pero esto se los dejo de investigación para el lector.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/qBdWS4mIcpw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/qBdWS4mIcpw/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Disminuyendo-el-ViewState-Moviendolo-al-fin-de-pagina.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=b06e86df-bfe0-495f-b245-c5d0fbf779b8</guid>
      <pubDate>Wed, 24 Jun 2009 21:37:48 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=b06e86df-bfe0-495f-b245-c5d0fbf779b8</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=b06e86df-bfe0-495f-b245-c5d0fbf779b8</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Disminuyendo-el-ViewState-Moviendolo-al-fin-de-pagina.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=b06e86df-bfe0-495f-b245-c5d0fbf779b8</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=b06e86df-bfe0-495f-b245-c5d0fbf779b8</feedburner:origLink></item>
    <item>
      <title>Comprimiendo el ViewState, usando el Browser File</title>
      <description>&lt;p&gt;&lt;strong&gt;NOTA:&lt;/strong&gt; El código anterior no fue probado en mi máquina, gracias a &lt;em&gt;Ricardo&lt;/em&gt; por indicarme el error. Reescribo parte del post con las aclaraciones y con el código corregido.&lt;/p&gt;  &lt;p&gt;Uno de mis lectores me escribió el día de hoy con un problema específico acerca de mi post sobre usar el &lt;a href="http://www.cprieto.com/post/Disminuyendo-el-ViewState-reutilizando-los-cambios.aspx"&gt;Browser File para reutilizar nuestros cambios&lt;/a&gt; en la compresión del ViewState:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Tratando de usar el browser file con el page adapter de compresión me fue imposible debido a que me solicita que el control debe ser un control adapter&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Bien, la falta, para variar, fue mía. No indiqué en el ejemplo los cambios que se necesitan. Lo bueno es que son pequeños cambios!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Para que funcione el browser file con controles necesitamos indicar un “Control Adapter”, en nuestro caso ya que es un Page Control necesitamos usar un &lt;strong&gt;PageAdapter&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;el PageAdapter tiene una propiedad Page que se refiere a nuestra Page la cual estamos “adaptando” &lt;/li&gt;    &lt;li&gt;El PageAdapter no posee un overload equivalente al &lt;strong&gt;SavePageToPersistentMedium&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;El PageAdapter posee un overload (&lt;strong&gt;GetStatePersister&lt;/strong&gt;) para retornar el &lt;strong&gt;PageStatePersiter&lt;/strong&gt; que luego será usado en vez del PageStatePersister de la página &lt;/li&gt;    &lt;li&gt;Podemos adaptar nuestro ViewState comprimido creando un PageStatePersister &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Manos a la obra, lo primero es adaptar nuestros métodos &lt;strong&gt;SavePageStateToPersistenceMedium&lt;/strong&gt; y &lt;strong&gt;LoadPageStateFromPersistenceMedium&lt;/strong&gt; a un &lt;strong&gt;PageStatePersister&lt;/strong&gt;, para esto podemos heredar de PageStatePersister. Ojo, el PageStatePersister es responsable de guardar tanto el ControlState como el ViewState, ambas son guardadas en una estructura tipo &lt;strong&gt;Pair&lt;/strong&gt;.&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;
using System.IO;
using System.Text;
using System.Web.UI;
using Rioshu.Utils.Compression.SevenZip;

namespace ViewStateCompressCS
{
    public class HiddenFieldCompressedViewState : PageStatePersister
    {
        public HiddenFieldCompressedViewState(Page page) : base(page)
        {
            Formatter = new LosFormatter();
        }

        public LosFormatter Formatter { get; set; }

        public override void Load()
        {
            string viewState = Page.Request.Form[&amp;quot;__COMPRESSSTATE&amp;quot;];
            if (string.IsNullOrEmpty(viewState))
                throw new InvalidOperationException(&amp;quot;Something is wrong with the current compressed ViewState&amp;quot;);

            byte[] vstateBytes = Convert.FromBase64String(viewState);
            vstateBytes = SevenZipHelper.Decompress(vstateBytes);
            viewState = Encoding.UTF8.GetString(vstateBytes);
            var pair = Formatter.Deserialize(viewState) as Pair;
            if (pair == null)
                throw new InvalidOperationException(&amp;quot;Something is wrong deserializing the current compressed ViewState&amp;quot;);

            ViewState = pair.First;
            ControlState = pair.Second;
        }

        public override void Save()
        {
            string viewState = string.Empty;
            using (var sw = new StringWriter()) {
                Formatter.Serialize(sw, new Pair(ViewState, ControlState));
                viewState = sw.ToString();
            }

            byte[] vstateBytes = Encoding.UTF8.GetBytes(viewState);
            vstateBytes = SevenZipHelper.Compress(vstateBytes);
            viewState = Convert.ToBase64String(vstateBytes);

            Page.ClientScript.RegisterHiddenField(&amp;quot;__COMPRESSSTATE&amp;quot;, viewState);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Bien, ahora simplemente escribimos el PageAdapter necesario&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;namespace ViewStateCompressCS
{
    public class CompressedViewStatePageAdapter : System.Web.UI.Adapters.PageAdapter
    {
        public override System.Web.UI.PageStatePersister GetStatePersister()
        {
            return new HiddenFieldCompressedViewState(Page);
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Por último, modificamos nuestra clase base de la página para que simplemente haga lo que le corresponde&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Web.UI;

namespace ViewStateCompressCS
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e) {}
    }
}&lt;/pre&gt;

&lt;p&gt;Casi listo, simplemente nos hace falta agregar el Browser file&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;browsers&amp;gt;
  &amp;lt;browser refID=&amp;quot;Default&amp;quot;&amp;gt;
    &amp;lt;controlAdapters&amp;gt;
      &amp;lt;adapter controlType=&amp;quot;System.Web.UI.Page&amp;quot;
               adapterType=&amp;quot;ViewStateCompressCS.CompressedViewStatePageAdapter&amp;quot; /&amp;gt;
    &amp;lt;/controlAdapters&amp;gt;
  &amp;lt;/browser&amp;gt;
&amp;lt;/browsers&amp;gt;&lt;/pre&gt;

&lt;p&gt;Listo, ya podemos reutilizar nuestros cambios como si nada. El código esta basado en el código base del artículo “&lt;a href="http://www.cprieto.com/post/disminuyendo-el-viewstate-exprimiendo-la-compresion.aspx"&gt;Exprimiendo la compresión&lt;/a&gt;”&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/LmJQJV92h10" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/LmJQJV92h10/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Comprimiendo-el-ViewState-usando-el-Browser-File.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=7a8a329d-a89e-4e38-9639-600529ce9387</guid>
      <pubDate>Tue, 23 Jun 2009 13:26:31 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=7a8a329d-a89e-4e38-9639-600529ce9387</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=7a8a329d-a89e-4e38-9639-600529ce9387</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Comprimiendo-el-ViewState-usando-el-Browser-File.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=7a8a329d-a89e-4e38-9639-600529ce9387</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=7a8a329d-a89e-4e38-9639-600529ce9387</feedburner:origLink></item>
    <item>
      <title>Debug Tip #2: Internet Explorer Javascript debug con Visual Studio</title>
      <description>&lt;p&gt;Hace muchos años, cuando no conocía lo lindo de Visual Studio y sus pormenores, cuando no teníamos Javascript frameworks como JQuery, Dojo, cuando no existían herramientas como la &lt;a href="http://www.microsoft.com/downloadS/details.aspx?familyid=E59C3964-672D-4511-BB3E-2D5E1DB91038"&gt;Internet Explorer Developer Toolbar&lt;/a&gt; o &lt;a href="http://www.fiddlertool.com/"&gt;Fiddler&lt;/a&gt;, cuando Firebug en Firefox era una extensión en pañales y el debugger de javascript era &lt;a href="http://www.mozilla.org/projects/venkman/"&gt;Venkman Debugger&lt;/a&gt;. En esos tiempos remotos la mayor pesadilla de un developer era encontrarse con un rebelde script de javascript que no funcionara correctamente en Internet Explorer, cuando nos encontrábamos con la necesidad de debug javascript en Internet Explorer.&lt;/p&gt;  &lt;p&gt;Muchos web developers aún hoy en día (y aún aquellos especializados en tecnologías Microsoft) desconocen el poder de Visual Studio para debuggear nativamente scripts de Javascript en Internet Explorer. Al igual que su contraparte el debugger de SQL Server, este se integra transparentemente a la experiencia de debug de Visual Studio.&lt;/p&gt;  &lt;p&gt;Comencemos con una simple página HTML &lt;em&gt;dentro de un proyecto&lt;/em&gt; de Visual Studio (en mi caso un Web Application Project).&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
        function sayHello(person) {
            alert(&amp;quot;Hello &amp;quot; + person);
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;input type=&amp;quot;button&amp;quot; id=&amp;quot;simple_button&amp;quot; onclick=&amp;quot;sayHello('friend')&amp;quot; value=&amp;quot;Say Hello&amp;quot; /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;Lo ejecutamos con nuestro querido amigo F5 (Run) de Visual Studio y al presionar el boton, voilà! el mensaje que esperábamos. Preparemos el Internet Explorer para la experiencia de Debugging, por defecto no esta habilitado para debug de scripts, pero basta con ir a Tools –&amp;gt; Internet Options –&amp;gt; Advanced y quitar los checks en las casillas que desabilitan el script debugging&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=Internet%20Explorer%20debug.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Internet Explorer debug" border="0" alt="Internet Explorer debug" src="http://www.cprieto.com/image.axd?picture=Internet%20Explorer%20debug_thumb.jpg" width="377" height="495" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Ahora regresamos a la página en cuestión y agregamos a un siempre amigo Breakpoint&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=breakpoint.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="breakpoint" border="0" alt="breakpoint" src="http://www.cprieto.com/image.axd?picture=breakpoint_thumb.jpg" width="460" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Nuevamente ejecutamos nuestra web application y al ir a la página y presionar el botón, shazam!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=javascript%20step.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="javascript step" border="0" alt="javascript step" src="http://www.cprieto.com/image.axd?picture=javascript%20step_thumb.jpg" width="462" height="265" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Debug instantáneo con call stack y todo para Javascript :P&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/iB_a1V-A6hI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/iB_a1V-A6hI/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/debug_tip_2_internet_explorer_javascript_debug_con_visual_studio.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=0c7b5cc5-4b85-48a5-ba39-5c12739a336c</guid>
      <pubDate>Tue, 23 Jun 2009 00:37:25 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=0c7b5cc5-4b85-48a5-ba39-5c12739a336c</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=0c7b5cc5-4b85-48a5-ba39-5c12739a336c</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/debug_tip_2_internet_explorer_javascript_debug_con_visual_studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=0c7b5cc5-4b85-48a5-ba39-5c12739a336c</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=0c7b5cc5-4b85-48a5-ba39-5c12739a336c</feedburner:origLink></item>
    <item>
      <title>Encryptando el ViewState</title>
      <description>&lt;p&gt;Como recordaran el ViewState es una simple Property Bag (con tracking changes support claro) en la cual podemos meter cualquier dato u objeto serializable que necesitemos. En otras palabras es posible hacer algo como esto&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;
using System.Web.UI;

namespace WebApplication11
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            ViewState[&amp;quot;data&amp;quot;] = &amp;quot;hola mundo&amp;quot;;
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Y claro, en este caso “hola mundo” será guardado en el ViewState por defecto renderizandose en el campo __VIEWSTATE de la página en el browser cliente. Cómo el formato de serialización es conocido (recuerdan? es el LosFormatter) se puede leer tranquilamente el contenido del ViewState usando un simple deserializador. Una forma de averiguarlo es usando el &lt;a href="http://alt.pluralsight.com/toolcontent/ViewStateDecoder22.zip"&gt;ViewState Decoder de Fritz Onion&lt;/a&gt;, si lo usamos en nuestra página simple podremos ver algo un poco aterrador:&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-16&amp;quot;?&amp;gt;
&amp;lt;viewstate&amp;gt;
  &amp;lt;Pair&amp;gt;
    &amp;lt;Pair&amp;gt;
      &amp;lt;String&amp;gt;-1616687229&amp;lt;/String&amp;gt;
      &amp;lt;Pair&amp;gt;
        &amp;lt;ArrayList&amp;gt;
          &amp;lt;IndexedString&amp;gt;data&amp;lt;/IndexedString&amp;gt;
          &amp;lt;String&amp;gt;hola mundo&amp;lt;/String&amp;gt;
        &amp;lt;/ArrayList&amp;gt;
      &amp;lt;/Pair&amp;gt;
    &amp;lt;/Pair&amp;gt;
  &amp;lt;/Pair&amp;gt;
&amp;lt;/viewstate&amp;gt;&lt;/pre&gt;

&lt;p&gt;Digo aterrador porque para algunos programadores paranoícos (sorry, no entro en esa categoría) podrian decir algo como “herejía, como es posible que el cliente pueda ver esa data ‘secreta’”. Bien, para satisfacer ese instinto de paranoia que llevan dentro solo hay que agregar a la meta-tag de página: ViewStateEncryptionMode=”Always”&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;%@ Page Language=&amp;quot;C#&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeBehind=&amp;quot;Default.aspx.cs&amp;quot; 
    Inherits=&amp;quot;WebApplication11._Default&amp;quot; ViewStateEncryptionMode=&amp;quot;Always&amp;quot;%&amp;gt;

&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;

&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;
&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;
    &amp;lt;div&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;Listo, ahora no podran ver el “mensaje secreto”. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA1:&lt;/strong&gt; Eso no significa que deben guardar información sensitiva en el ViewState.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA2:&lt;/strong&gt; Aunque es posible leer el contenido del ViewState NO es posible enviar contenido modificado de regreso al server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTA3:&lt;/strong&gt; por casualidad revisando la documentación me topo con que para variar esta propiedad también puede ser modificada en el Web.Config&lt;/p&gt;

&lt;pre class="brush: xml; highlight: [3];"&gt;&amp;lt;configuration&amp;gt;
   &amp;lt;system.web&amp;gt;
      &amp;lt;pages ViewStateEncryptionMode=&amp;quot;Always&amp;quot; /&amp;gt;
   &amp;lt;/system.web&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/LD4CYqtH5Yo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/LD4CYqtH5Yo/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Encryptando-el-ViewState.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=c3e9ee6d-ecee-4448-9039-c909e1fd45e3</guid>
      <pubDate>Mon, 22 Jun 2009 20:04:31 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=c3e9ee6d-ecee-4448-9039-c909e1fd45e3</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=c3e9ee6d-ecee-4448-9039-c909e1fd45e3</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Encryptando-el-ViewState.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=c3e9ee6d-ecee-4448-9039-c909e1fd45e3</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=c3e9ee6d-ecee-4448-9039-c909e1fd45e3</feedburner:origLink></item>
    <item>
      <title>Disminuyendo el ViewState, Server Side State con Session</title>
      <description>&lt;p&gt;Creo que para estas alturas más de alguien tiene que haber pensado algo como: “Hey, si puedo controlar donde guardar el ViewState, porqué en vez de ‘comprimirlo’ y enviarlo al cliente no lo ‘guardo’ en el servidor?”&lt;/p&gt;  &lt;p&gt;Pues claro que se puede, en la .Net Framework 2.0 se agregó una propiedad más a la &lt;strong&gt;System.Web.UI.Page&lt;/strong&gt; llamado &lt;strong&gt;PageStatePersister&lt;/strong&gt; que retorna un objeto de tipo &lt;strong&gt;PageStatePersister&lt;/strong&gt;, este se utiliza en la ejecución de la cascada del runtime de asp.net para retornar el objeto encargado de persistir el ViewState (o sea, guardarlo o retraerlo). Cómo los desarrolladores de ASP.net siempren andan buscando un “shortcut” y a más de alguien se le debe haber ocurrido guardar el ViewState en la sesión del usuario (que por defecto se guarda en la memoria del &lt;em&gt;AppPool&lt;/em&gt; en el servidor) existe ya un PagePersister conocido como &lt;strong&gt;SessionPageStatePersister&lt;/strong&gt;, para usarlo basta con hacer lo siguiente:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;
using System.Web.UI;

namespace WebApplication8
{
    public partial class _Default : Page
    {
        protected override PageStatePersister PageStatePersister
        {
            get { return new SessionPageStatePersister(this); }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }
    }
}&lt;/pre&gt;

&lt;p&gt;Listo, ahora nuestro ViewState no existe en la página sino en la sesión del usuario donde quiera que esta se este guardando (recuerdan? InProc? Session Server?). Hay que tener cuidado porque por defecto la sesión tiene una duración de 20 minutos y si se recicla el Application Pool no solo perdemos los datos de la sesión, sino también el ViewState. Otro problema es que el SessionPageStatePersister guarda una cantidad “fija” de elementos dentro del historial de la sesión, por defecto es de 9 items dentro del historial, esto lo podemos cambiar en el Web.config con la entrada sessionPageState&lt;/p&gt;

&lt;pre class="brush: xml;"&gt;&amp;lt;system.web&amp;gt;
    &amp;lt;!-- otros elementos del system.web --&amp;gt;
    &amp;lt;sessionPageState historySize=&amp;quot;20&amp;quot; /&amp;gt;
&amp;lt;/system.web&amp;gt;&lt;/pre&gt;

&lt;p&gt;Hey, un momento, eso indica que puedo usar el SessionStatePersister para crear mi propio storage server side del ViewState…… YEAH!!! exacto!!! pero eso será algo que no tocaré en esta serie de artículos, o quizás si, pero después :)&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/84ubfnbBvgo" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/84ubfnbBvgo/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Disminuyendo-el-ViewState-Server-Side-State-con-Session.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=6f2e61bc-5a53-4b68-a225-4a80a703a803</guid>
      <pubDate>Fri, 19 Jun 2009 20:17:41 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=6f2e61bc-5a53-4b68-a225-4a80a703a803</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=6f2e61bc-5a53-4b68-a225-4a80a703a803</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Disminuyendo-el-ViewState-Server-Side-State-con-Session.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=6f2e61bc-5a53-4b68-a225-4a80a703a803</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=6f2e61bc-5a53-4b68-a225-4a80a703a803</feedburner:origLink></item>
    <item>
      <title>Debugeando bases de datos con Visual Studio</title>
      <description>&lt;p&gt;Hay algo poco conocido entre los usuarios de Visual Studio en general, lo incre&amp;iacute;ble de sus herramientas de debugging (claro, nada con un WinDBG para debuggear, pero ese es otro tema!).&lt;/p&gt;
&lt;p&gt;De hecho, muy pocas personas saben que Visual Studio tiene la capacidad de debuggear Procedimientos almacenados (Stored Procedures) y UDF (User Defined Functions) &lt;strong&gt;dentro&lt;/strong&gt; de Visual Studio, yep, con &amp;ldquo;step into&amp;rdquo; y todo!&lt;/p&gt;
&lt;h2&gt;&amp;ldquo;Pure SQL Server Debugging&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Usando el Server Explorer podemos seleccionar el UDF o SP que queremos debuggear y haciendo click derecho sobre la funci&amp;oacute;n/sp objetivo le indicamos que &amp;ldquo;&lt;em&gt;Step Into Function&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=step%20into%20function.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="step into function" src="http://www.cprieto.com/image.axd?picture=step%20into%20function_thumb.jpg" border="0" alt="step into function" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos presentar&amp;aacute; el conocido cuadro de ingreso de par&amp;aacute;metros, ingresamos lo que queremos probar y voil&amp;aacute;!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=Steped%20function.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Steped function" src="http://www.cprieto.com/image.axd?picture=Steped%20function_thumb.jpg" border="0" alt="Steped function" width="613" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Si vemos cuidadosamente observaremos que aparecen las ya conocidas &amp;ldquo;debug tooltips&amp;rdquo; que nos muestran los valores de nuestras variables y par&amp;aacute;metros locales (obviamente tambi&amp;eacute;n podemos verlos en la ventana de Locals del Visual Studio). Con esta opci&amp;oacute;n no necesitamos tener ninguna soluci&amp;oacute;n o proyecto abierto, simplemente tener la conexi&amp;oacute;n desde el Server Explorer del Visual Studio. &amp;iquest;Simple verdad?&lt;/p&gt;
&lt;h2&gt;SQL Server and Application Debugging&lt;/h2&gt;
&lt;p&gt;Otra opci&amp;oacute;n es hacerlo desde dentro de nuestro proyecto de C# o VB, con esta opci&amp;oacute;n en particular tenemos la posibilidad de agregar breakpoints a nuestros SPs o UDFs, simplemente agregamos el Breakpoint en el SP o UDF como estamos acostumbrados y le decimos al proyecto que habilite las opciones de debugging de SQL Server para ese proyecto en cuesti&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=Debugging%20Options.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Debugging Options" src="http://www.cprieto.com/image.axd?picture=Debugging%20Options_thumb.jpg" border="0" alt="Debugging Options" width="614" height="429" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aseguremonos tambi&amp;eacute;n que la base de datos esta habilitada para Application Debugging, simplemente hagamos click derecho sobre la base de datos en cuesti&amp;oacute;n en el Server Explorer y revisemos que aparezca algo as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cprieto.com/image.axd?picture=Application%20Debugging.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Application Debugging" src="http://www.cprieto.com/image.axd?picture=Application%20Debugging_thumb.jpg" border="0" alt="Application Debugging" width="238" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Done&amp;hellip; &amp;iquest;A&amp;uacute;n m&amp;aacute;s sencillo verdad?&lt;/p&gt;
&lt;h2&gt;Observaciones importantes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio necesita correr en modo Administrador (o sea, en Windows Vista hay que decirle que &amp;ldquo;Run As Administrator&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Cuando se trata de una instancia &lt;strong&gt;remota&lt;/strong&gt; de SQL Server las cosas se ponen un poco m&amp;aacute;s complicadas. SQL Server necesita correr bajo un usuario que pertenezca al rol &lt;strong&gt;sysadmin&lt;/strong&gt; en el login de SQL Server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Espero tengan un &amp;ldquo;happy debugging&amp;rdquo; :D&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/DtK_6ckydrE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/DtK_6ckydrE/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Debugeando-bases-de-datos-con-Visual-Studio.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=6a7bb68e-9bf9-4ae5-ba19-46ea89021e82</guid>
      <pubDate>Fri, 19 Jun 2009 19:45:00 -0600</pubDate>
      <category>Debug</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=6a7bb68e-9bf9-4ae5-ba19-46ea89021e82</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=6a7bb68e-9bf9-4ae5-ba19-46ea89021e82</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Debugeando-bases-de-datos-con-Visual-Studio.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=6a7bb68e-9bf9-4ae5-ba19-46ea89021e82</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=6a7bb68e-9bf9-4ae5-ba19-46ea89021e82</feedburner:origLink></item>
    <item>
      <title>Disminuyendo el ViewState, reutilizando los cambios</title>
      <description>&lt;p&gt;¿Bueno, hasta el momento hemos aprendido un par de trucos y cosas no solo del ViewState, sino de ASP.net en general. Hemos comprimido, cambiado, guardado y reutilizado el ViewState de una página en específica, es cuando a nuestro precavido lector se le puede venir la siguiente pregunta: “¿Cómo reutilizamos nuestros cambios en las páginas?”&lt;/p&gt;  &lt;p&gt;Realmente se me ocurren tres formas diferentes (aunque ahora que lo pienso hay 4, hablaremos de ella luego) de reutilizar nuestros cambios hechos en la página y pasarlos a toda otra multitud de páginas. Algunos de ellos pueden ser “asumibles” y otros usaremos técnicas no muy conocidas entre los usuarios de ASP.net.&lt;/p&gt;  &lt;h2&gt;Herencia&lt;/h2&gt;  &lt;p&gt;Bien, creo que esta era lógica, como recordaremos toda página de ASP.net es una “hija” de la clase &lt;em&gt;System.Web.UI.Page&lt;/em&gt;, nuestros cambios han sido implementados como &lt;em&gt;&lt;strong&gt;overrides&lt;/strong&gt;&lt;/em&gt; de Page, ¿porqué no llamamos a nuestra clase con Overrides CompressedViewStatePage y la declaramos como &lt;strong&gt;&lt;em&gt;abstract&lt;/em&gt;&lt;/strong&gt; y a partir de ella cambiamos el resto de las páginas?. Quizás algo como esto:&lt;/p&gt;  &lt;p&gt;Y bueno, cada vez que querramos utilizar nuestro sistema de ViewState comprimido en una página basta con decirle a nuestra página objeto que es de tipo CompressedViewStatePage y no de Page:&lt;/p&gt;  &lt;p&gt;¿Simple verdad?, mmmm… Houston we got a trouble… si actualmente tenemos un proyecto con muchas páginas (algo sumamente común en asp.net webforms) tendríamos que ir página por página y hacer nuestros cambios, rayos, debe existir una forma &lt;u&gt;más&lt;/u&gt; fácil.&lt;/p&gt;  &lt;h2&gt;The Browser File&lt;/h2&gt;  &lt;p&gt;Algo muy poco conocido de ASP.net es su capacidad para adaptar su página y hasta el markup de los controles dependiendo del browser del cliente, yep, eso es posible!.&lt;/p&gt;  &lt;p&gt;Así como existen carpetas “especiales” como App_Data, App_Code y App_Theme, existe una carpeta poco conocida llamada &lt;strong&gt;App_Browsers&lt;/strong&gt;, donde podemos crear lo que se le llama un “Browser definition file” que dependiendo del browser del cliente pudemos lograr un override general a nuestra página en cuestion y así manipular a nuestro antojo el comportamiento de la cascada.&lt;/p&gt;  &lt;p&gt;Esto lo logra mediante el concepto de “adaptadores de renderizado”, que le indica a la framework en vez de la clase X usar la clase Y cuando un browser Z este presente (pura ecuación matemática!). Obviamente lo que debemos indicarle es que en presencia de “cualquier” browser simplemente utilice nuestra clase &lt;strong&gt;CompressedViewStatePage&lt;/strong&gt; en vez de la clase &lt;strong&gt;Page&lt;/strong&gt;, interesante y simple verdad? :D&lt;/p&gt;  &lt;p&gt;En nuestro caso simplemente agregamos un App_Browsers folder a nuestro proyecto de “ViewState comprimido” y agregamos un nuevo “Browser File”, en su interior definimos que “por default” usaremos nuestra clase heredada de Page (CompressedViewStatePage) en vez de Page.&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;browsers&amp;gt;
    &amp;lt;browser refID=&amp;quot;Default&amp;quot;&amp;gt;
        &amp;lt;controlAdapters&amp;gt;
            &amp;lt;adapter controlType=&amp;quot;System.Web.UI.Page&amp;quot; 
                     adapterType=&amp;quot;MyApplicaction.CompressedViewStatePage, MyApplication&amp;quot; /&amp;gt;
        &amp;lt;/controlAdapters&amp;gt;
    &amp;lt;/browser&amp;gt;
&amp;lt;/browsers&amp;gt;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Simple y efectivo!&lt;/p&gt;

&lt;p&gt;Si quieres conocer un poco más acerca del Browser Definition File basta con revisar la ayuda de MSDN &lt;a href="http://msdn.microsoft.com/en-us/library/ex526337.aspx"&gt;aquí&lt;/a&gt; y un &lt;a href="http://jesschadwick.blogspot.com/2009/05/leverage-aspnet-control-adapters-for.html"&gt;interesante artículo de Jess Chadwick&lt;/a&gt; sobre como reemplazar controles con el App_Browser file.&lt;/p&gt;

&lt;p&gt;Saludos&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/Rd65qUD72xM" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/Rd65qUD72xM/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Disminuyendo-el-ViewState-reutilizando-los-cambios.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=0fc4117b-0d12-47e5-b227-74c8ecb13635</guid>
      <pubDate>Thu, 18 Jun 2009 09:45:00 -0600</pubDate>
      <category>ASP.NET</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=0fc4117b-0d12-47e5-b227-74c8ecb13635</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=0fc4117b-0d12-47e5-b227-74c8ecb13635</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Disminuyendo-el-ViewState-reutilizando-los-cambios.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=0fc4117b-0d12-47e5-b227-74c8ecb13635</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=0fc4117b-0d12-47e5-b227-74c8ecb13635</feedburner:origLink></item>
    <item>
      <title>Visual Studio 2010 ¿que hay de nuevo?</title>
      <description>&lt;p&gt;Compañeros en .Net como mi amigo &lt;a href="http://weblogs.asp.net/carloslone/default.aspx"&gt;Carlos Lone&lt;/a&gt;, han hecho un par de webcasts acerca de las nuevas features de Visual Studio 2010, para aquellos que les gusta estar “en todas” y adelantarse a los acontecimientos, les dejo la lista de episodios de Channel 9 y su serie “10-4” con muchos videos sobre las nuevas features de VS2010 y .Net Framework 4.0&lt;/p&gt;  &lt;p&gt;Aquí esta el link: &lt;a href="http://channel9.msdn.com/shows/10-4/"&gt;Channel9 10-4 (Visual Studio 2010)&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/IdisposableThoughts/~4/RLzhhIC65bU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/IdisposableThoughts/~3/RLzhhIC65bU/post.aspx</link>
      <author>cristian</author>
      <comments>http://www.cprieto.com/post/Visual-Studio-2010-que-hay-de-nuevo.aspx#comment</comments>
      <guid isPermaLink="false">http://www.cprieto.com/post.aspx?id=fa0248fa-fba9-4cfb-b626-de2910fac2c4</guid>
      <pubDate>Thu, 18 Jun 2009 09:22:41 -0600</pubDate>
      <category>.Net Framework</category>
      <dc:publisher>cristian</dc:publisher>
      <pingback:server>http://www.cprieto.com/pingback.axd</pingback:server>
      <pingback:target>http://www.cprieto.com/post.aspx?id=fa0248fa-fba9-4cfb-b626-de2910fac2c4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.cprieto.com/trackback.axd?id=fa0248fa-fba9-4cfb-b626-de2910fac2c4</trackback:ping>
      <wfw:comment>http://www.cprieto.com/post/Visual-Studio-2010-que-hay-de-nuevo.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.cprieto.com/syndication.axd?post=fa0248fa-fba9-4cfb-b626-de2910fac2c4</wfw:commentRss>
    <feedburner:origLink>http://www.cprieto.com/post.aspx?id=fa0248fa-fba9-4cfb-b626-de2910fac2c4</feedburner:origLink></item>
  </channel>
</rss>
