﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>JuanCri.com Blog / mono</title>
    <description>Blog de Juan C. Olivares / mono</description>
    <link>http://www.juancri.com/tags/mono</link>
    <lastBuildDate>Tue, 27 May 2008 13:44:06 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>RSS.NET: http://www.rssdotnet.com/</generator>
    <item>
      <title>Cambio de API en Service Pack</title>
      <description>&lt;p&gt;El problema es el siguiente: Instalamos una aplicaci&amp;oacute;n ASP.NET 2.0 y todo funciona de maravillas. Movemos la aplicaci&amp;oacute;n a otro PC y &amp;iexcl;bang!, ya no corre. La raz&amp;oacute;n es que no encuentra una propiedad de &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.typename.aspx"&gt;SqlParameter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Al ver la &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.typename.aspx"&gt;documentaci&amp;oacute;n&lt;/a&gt;, descubro que una propiedad est&amp;aacute; disponible desde .NET 2.0 SP1 en adelante... es decir, &amp;iexcl;se agregan elementos a la API en un service pack!&lt;/p&gt;
&lt;p&gt;Tenemos dos soluciones: No utilizamos la propiedad o subimos los requerimientos m&amp;iacute;nimos a .NET 2.0 SP1... &amp;iexcl;plop! (voto por la primera)&lt;/p&gt;</description>
      <link>http://www.juancri.com/blog/cambio_de_api_en_service_pack</link>
      <guid isPermaLink="True">http://www.juancri.com/blog/cambio_de_api_en_service_pack</guid>
      <pubDate>Tue, 27 May 2008 13:44:06 GMT</pubDate>
    </item>
    <item>
      <title>Lambda simplificado</title>
      <description>&lt;p&gt;Hoy estaba agregando &lt;a href="http://logging.apache.org/log4net/"&gt;Log4net&lt;/a&gt; a un proyecto y, por primera vez, decid&amp;iacute; comprobar cada llamada al logger con IsDebugEnabled, IsInfoEnabled, etc. Esto es muy &amp;uacute;til para optimizar el c&amp;oacute;digo y no construir strings innecesarios. Por ejemplo, esta expresi&amp;oacute;n:&lt;/p&gt;
&lt;p class="Code"&gt;logger.Debug (&amp;quot;Ejecutando funci&amp;oacute;n de &amp;quot; + nombreX + &amp;quot; con par&amp;aacute;metro &amp;quot; + z);&lt;/p&gt;
&lt;p&gt;En este caso, la concatenaci&amp;oacute;n de strings se realizar&amp;aacute; antes de llamar al m&amp;eacute;todo. Si el debug est&amp;aacute; desactivado, estaremos concatenando strings por las puras. Para corregir esto, podemos comprobar antes que el debug est&amp;eacute; activado, as&amp;iacute;:&lt;/p&gt;
&lt;p class="Code"&gt;if (logger.IsDebugEnabled) logger.Debug (&amp;quot;Ejecutando funci&amp;oacute;n de &amp;quot; + nombreX + &amp;quot; con par&amp;aacute;metro &amp;quot; + z);&lt;/p&gt;
&lt;p&gt;Pero es bastante tedioso y repetitivo. Una soluci&amp;oacute;n ser&amp;iacute;a que en vez de enviar strings concatenados, envi&amp;aacute;ramos la expresi&amp;oacute;n. Esto se puede hacer con expresiones &lt;a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"&gt;lambda (closures o m&amp;eacute;todos an&amp;oacute;nimos)&lt;/a&gt;. Podr&amp;iacute;amos definir ILog.Debug as&amp;iacute;:&lt;/p&gt;
&lt;p class="Code"&gt;public delegate string CreateString ();&lt;br /&gt;
void Debug (CreateString create);&lt;/p&gt;
&lt;p&gt;De este modo, el m&amp;eacute;todo Debug ser&amp;iacute;a el encargado de verificar si el debug est&amp;aacute; habilitado y, s&amp;oacute;lo en ese caso, llamar&amp;iacute;a a la expresi&amp;oacute;n para concatenar el texto. Podr&amp;iacute;amos llamar a este m&amp;eacute;todo de esta forma:&lt;/p&gt;
&lt;p class="Code"&gt;logger.Debug (delegate { return &amp;quot;Ejecutando funci&amp;oacute;n de &amp;quot; + nombreX + &amp;quot; con par&amp;aacute;metro &amp;quot; + z; });&lt;/p&gt;
&lt;p&gt;El problema es que aqu&amp;iacute; tambi&amp;eacute;n agregamos demasiado c&amp;oacute;digo para ser una expresi&amp;oacute;n simple. Lo ideal, para m&amp;iacute;, ser&amp;iacute;a hacer una llamada como esta:&lt;/p&gt;
&lt;p class="Code"&gt;logger.Debug ( { &amp;quot;Ejecutando funci&amp;oacute;n de &amp;quot; + nombreX + &amp;quot; con par&amp;aacute;metro &amp;quot; + z); } );&lt;/p&gt;
&lt;p&gt;Ser&amp;iacute;a lo m&amp;aacute;s simple. Al agregar las llaves &amp;quot;{ }&amp;quot;, estar&amp;iacute;amos dici&amp;eacute;ndole al compilador que queremos usar un m&amp;eacute;todo an&amp;oacute;nimo. Aqu&amp;iacute; nos evitar&amp;iacute;amos usar tanto &amp;quot;delegate&amp;quot; como &amp;quot;return&amp;quot;, que son palabras clave obvias en este caso.&lt;/p&gt;</description>
      <link>http://www.juancri.com/blog/lambda_simplificado</link>
      <guid isPermaLink="True">http://www.juancri.com/blog/lambda_simplificado</guid>
      <pubDate>Tue, 06 May 2008 21:10:59 GMT</pubDate>
    </item>
    <item>
      <title>Hola Monos</title>
      <description>&lt;p&gt;Esta es una prueba y a la vez una bienvenida a los lectores de &lt;a href="http://planeta.mono-hispano.org/"&gt;Planeta Mono Hispano&lt;/a&gt;. Una menci&amp;oacute;n especial a &lt;a href="http://www.joil.cl/"&gt;Joil&lt;/a&gt; que finalmente configur&amp;oacute; el sitio y los feeds. Para obtener m&amp;aacute;s informaci&amp;oacute;n pueden visitar:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="http://www.mono-hispano.org"&gt;Mono Hispano&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://planeta.mono-hispano.org/"&gt;Planeta&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://www.mono-hispano.org/index.php?title=Listas_de_correo"&gt;Lista de correo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <link>http://www.juancri.com/blog/hola_monos</link>
      <guid isPermaLink="True">http://www.juancri.com/blog/hola_monos</guid>
      <pubDate>Mon, 31 Mar 2008 15:52:15 GMT</pubDate>
    </item>
    <item>
      <title>Weak references</title>
      <description>&lt;p&gt;La clase &lt;a href="http://msdn2.microsoft.com/en-us/library/system.weakreference.aspx"&gt;System.WeakReference&lt;/a&gt; permite almacenar informaci&amp;oacute;n prescindible. En palabras sencillas, podemos guardar una referencia a informaci&amp;oacute;n que no es tan valiosa. Un ejemplo muy com&amp;uacute;n es el uso de cach&amp;eacute;. Si queremos usar cache, podemos hacerlo utilizando esta clase, as&amp;iacute; permitiremos que el garbage collector pueda liberar la memoria utilizada por nuetros datos si es que fuese necesario.&lt;/p&gt;
&lt;p&gt;En la &lt;a href="http://anonsvn.mono-project.com/viewcvs/trunk/mcs/class/corlib/System.Runtime.InteropServices/GCHandle.cs?view=markup"&gt;implementaci&amp;oacute;n&lt;/a&gt; en &lt;a href="http://mono-project.com/"&gt;Mono&lt;/a&gt;, se utiliza internamente la estructura &lt;a href="http://msdn2.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx"&gt;GCHandle&lt;/a&gt;.&lt;/p&gt;</description>
      <link>http://www.juancri.com/blog/weak_references</link>
      <guid isPermaLink="True">http://www.juancri.com/blog/weak_references</guid>
      <pubDate>Thu, 07 Feb 2008 01:48:13 GMT</pubDate>
    </item>
  </channel>
</rss>