<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Métodos</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/" />
    <link rel="self" type="application/atom+xml" href="http://metodos.lnds.net/atom.xml" />
   <id>tag:metodos.lnds.net,2007://8</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8" title="Métodos" />
    <updated>2007-04-20T14:36:47Z</updated>
    <subtitle>Apuntes de un Desarrollador de Software</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.34</generator>
 
<entry>
    <title>Viernes de Robots</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2007/04/viernes_de_robots.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=1212" title="Viernes de Robots" />
    <id>tag:metodos.lnds.net,2007://8.1212</id>
    
    <published>2007-04-20T14:27:21Z</published>
    <updated>2007-04-20T14:36:47Z</updated>
    
    <summary>Todos los viernes, a partir de hoy, voy a publicar algo sobre robots. En agosto de 2005 publiqué una nota sobre los robots auto replicantes de la Universidad de Cornell, en ese tiempo no había YouTube, ahor puedo dejarles el...</summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="Robots" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[<p>Todos los viernes, a partir de hoy, voy a publicar algo sobre robots. </p>

<p>En agosto de 2005 <a href="http://www.lnds.net/2005/08/robots_auto_replicantes.html">publiqué una nota</a> sobre los robots auto replicantes de la <a href="http://ccsl.mae.cornell.edu/research/selfrep/">Universidad de Cornell</a>, en ese tiempo no había YouTube, ahor puedo dejarles el video que mostraba ese trabajo:</p>

<p><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/VyzVtTiax80"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/VyzVtTiax80" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object></p>]]>
        
    </content>
</entry>
<entry>
    <title>Un hack simple en CSS</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2006/02/un_hack_simple_en_css.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=735" title="Un hack simple en CSS" />
    <id>tag:metodos.lnds.net,2006://8.735</id>
    
    <published>2006-02-22T14:21:10Z</published>
    <updated>2006-02-22T14:27:07Z</updated>
    
    <summary>Este hack es bastante simple, resulta que Internet Explorer 6 no respeta el atributo min-height para un elemento div. Una solución, que asegura interoperabilidad, y no quebrar el soporte de los estándares es usar el atributo _height. _height es ignorado...</summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="web" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[<p>Este hack es bastante simple, resulta que Internet Explorer 6 no respeta el atributo <strong>min-height</strong> para un elemento <strong>div</strong>.</p>

<p>Una solución, que asegura interoperabilidad, y no quebrar el soporte de los estándares es usar el atributo _height.<br />
_height es ignorado por todos los browsers, y para IE es equivalente a height.</p>

<p>Un hack para tener un div de una altura mínima de 100 px sería:</p>

<pre><code>&lt;div style=&quot;min-height:100px;_height;100px&quot;&gt;
Aca va mi texto
&lt;/div&gt;</code></pre>]]>
        
    </content>
</entry>
<entry>
    <title>Cómo medir el desempeño de aplicacions ASP.NET</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2005/11/como_medir_el_desempeno_de_apl.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=600" title="Cómo medir el desempeño de aplicacions ASP.NET" />
    <id>tag:metodos.lnds.net,2005://8.600</id>
    
    <published>2005-11-30T23:42:49Z</published>
    <updated>2005-11-30T23:49:08Z</updated>
    
    <summary><![CDATA[ La literatura disponible nos sugiere que para analizar el desempe&ntilde;o de las aplicaciones ASP.NET debemos medir al menos los siguientes parámetros dentro del Performance Monitor: &nbsp; Performance object Performance counter ASP.NET Application Restarts ASP.NET Requests Queued ASP.NET Worker Process...]]></summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="Calidad" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[  <p class="MsoNormal"><span>La literatura disponible nos sugiere que para analizar el desempe&ntilde;o de las aplicaciones ASP.NET debemos medir al menos los siguientes parámetros dentro del Performance Monitor:</span></p> <p>&nbsp;</p><p>  </p> <div align="center">  <table cellspacing="0" cellpadding="0" border="0" class="MsoNormalTable">  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Performance object</span></strong></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="center" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Performance counter</span></strong></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Application Restarts</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Requests Queued</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Worker Process   Restarts</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET Applications</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Errors Total</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET Applications</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><a name="OLE_LINK2" /><a name="OLE_LINK1"><strong><span style="font-size: 12pt; font-family: "times new roman";">Requests/Sec</span></strong></a><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Processor</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">% CPU Utilization</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr> </table>  </div> <p>&nbsp;</p><p>  </p> <p align="left" class="MsoNormal"><span>Fuente: Help de Microsoft.Net SDK 1.1, sección:&nbsp; </span></p>   <p align="left" class="MsoNormal"><span>Ms-help://MS.NETFrameworkSDKv1.1/cpguidenf/html/cpconperformancecountersforaspnet.htm</span></p>   <p align="left" class="MsoNormal"><span>&nbsp;</span></p>   <p align="left" class="MsoNormal"><strong><span>Application Restarts: </span></strong><span>indica cuantas veces una aplicación ASP.NET se re inicializa, lo ideal es que este parámetro sea 0 (cero), pues una aplicación sin problemas no debe presentar re inicios, salvo cuando se hagan updates o se instalen nuevas versiones de alguna componente.</span></p>   <p align="left" class="MsoNormal"><strong><span>Request Queued : </span></strong><span>Cuantos requerimientos se encuentran encolados esperando una respuesta. Cuando este número empieza a crecer linealmente con respecto a la carga de cliente conectados, entonces el servidor web ha alcanzado el límite de requerimientos concurrentes que puede procesar. El máximo por omisión es de 5.000. Este parámetros se puede cambiar en el archivo Machine.config.</span></p>   <p align="left" class="MsoNormal"><strong><span>Worker Process Restarts: </span></strong><span>El número de veces que un proceso trabajando ha sido re iniciado en el servidor. Este número aumenta cuando se producen caidas inesperadas de algún proceso. Este parámetro no debe aumentar bruscamente, de hacerlo debe investigarse las causas de inmediato.</span></p>   <p align="left" class="MsoNormal"><strong><span>Errors Total:&nbsp; </span></strong><span>Es el número total de errores que ocurren durante la ejecución de requerimientos http. Incluye errores en el parser, errores de compilación, errores durante el procesamiento y errores de ejecución. Este valor debe ser revisado atentamente.</span></p>   <p class="MsoNormal"><strong><span>Requests/Sec</span></strong><span>: Es la cantidad de request por Segundo atendidos por el servidor web. Este valor representa el throughput real de las aplicaciones en el servidor web. Bajo carga constante este valor debe mantenerse dentro de ciertos rangos.</span></p>   <p class="MsoNormal"><strong><span>% CPU Utilization: </span></strong><span>es el porcentaje de utilización de la CPU, a mayor utilización de la CPU mayor será la contención de las aplicaciones.</span></p>  <p>&nbsp;</p> <p>&nbsp;</p> ]]>
        <![CDATA[  <h2>Parámetros más finos&nbsp;</h2> <p class="MsoNormal"><span>Los parámetros descritos anteriormente son relevantes para monitorear aplicaciones, pero cuando se han detectado &nbsp;problemas entonces es bueno fijarse en estos otros parámetros:</span></p> <p class="MsoNormal">  </p> <table width="57%" cellspacing="0" cellpadding="0" border="0" align="left" style="margin-left: 6.75pt; margin-right: 6.75pt; width: 57.3%;" class="MsoNormalTable">   <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="center" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Performance object</span></strong></p>   </td>   <td valign="top"><br />       </td> <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="center" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Performance counter</span></strong></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">ASP.NET Applications</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td valign="top"><br />       </td> <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Pipeline Instance   Count</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">.NET CLR Exceptions</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td valign="top"><br />       </td> <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">       <div align="center">   </div> <p align="center" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";"># of Exceps Thrown</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  <tr>   <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">System</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>   <td valign="top"><br />       </td> <td width="50%" valign="top" style="padding: 0.75pt; width: 50%;">   <p align="left" class="MsoNormal"><strong><span style="font-size: 12pt; font-family: "times new roman";">Context Switches/sec</span></strong><span style="font-size: 12pt; font-family: "times new roman";"></span></p>   </td>  </tr>  </table>  <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">&nbsp;</p> <p class="MsoNormal">  </p> <p class="MsoNormal"><strong><span>Pipeline Instance Count: </span></strong><span>Es el número de </span>instancias de pipelines para la instancia de ASP.NET indicada. Dado que un thread sólo puede correr en 1 pipeline, es mejor que este valor se mantenga bajo, pues este indica el número de request que están siendo atendidos por la aplicación.<span style="font-size: 12pt; font-family: "times new roman";"></span></p>   <p class="MsoNormal"><strong><span style="font-size: 10pt; font-family: arial;"># of Excepts Thrown:</span></strong><strong><span style="font-size: 12pt;">: </span></strong><span>Es la cantidad de excepciones generadas. Este valor se puede complementar con el parámetro que indica la cantidad de excepciones por segundo.</span></p>   <p class="MsoNormal"><strong><span># Context Switches/sec: &nbsp;</span></strong><span>Este parámetro mide la tasa a la cual ocurren cambios de contextos de los threads entre todas las CPUs. Un valor muy alto de este parámetro implica una gran contención debido a locks o muchos cambios entre modo kernel o user en cada thread.</span></p> <p class="MsoNormal">  </p> <h2><span>Recomendaciones de Microsoft</span></h2>  <p class="MsoNormal">&nbsp;  </p> <p class="MsoNormal"><span>El documento </span><strong><span style="font-family: verdana;">ASP.NET Performance Monitoring, and When to Alert Administrators</span></strong><span style="font-family: verdana;">, disponible en línea en la siguiente dirección: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/monitor_perf.asp">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/monitor_perf.asp</a>, nos indica en que fijarse y cómo tomar algunas medidas para evitar el colapso de las aplicaciones. Tambi&eacute;n nos permite encontrar indicadores de que puede estar fallando en nuestras aplicaciones.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">&nbsp;</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">El artículo contiene enlaces a varios utilitarios, como snap.exe, que es una herramienta para recolectar datos para medir el desempe&ntilde;o de las aplicaciones.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">Otro utilitario disponible es httpClient.exe que permite medir el TTLB (Time to last byte), un parámetro importante para medir la contención y la latencia de las aplicaciones.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">Qqq.exe es una aplicación en modo comando de linea que permite stressar aplicaciones.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">ErrorHandler.dll, es una dll que permite registrar en la bitácora de eventos (log) las excepciones no manejadas.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">Todos estos utilitarios están con códigos fuente, por lo que pueden ser modificados para necesidades específicas.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">&nbsp;</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">Tambi&eacute;n en el artículo se describe como con una modificación en el archivo global.asax, podemos registrar en el log la mayoría de las excepciones no manejadas.</span></p>   <p class="MsoNormal"><span style="font-family: verdana;">&nbsp;</span></p>   <p class="MsoNormal"><!--[if gte vml 1]><v:shapetype  id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe">  <v:stroke joinstyle="miter"/>  <v:path gradientshapeok="t" o:connecttype="rect"/> </v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t202" style='position:absolute;  left:0;text-align:left;margin-left:-63pt;margin-top:30.1pt;width:45pt;  height:36pt;z-index:1'/><![endif]--><!--[if !vml]--><span style="position: absolute; z-index: 1; left: 0px; margin-left: -85px; margin-top: 39px; width: 66px; height: 54px;">  <table cellspacing="0" cellpadding="0" border="0">  <tr>   <td width="66" height="54" style="border: 0.75pt solid black; background: white none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial; vertical-align: top;"><!--[endif]--><!--[if !mso]--><span style="position: absolute; left: 0pt; z-index: 1;">   <table width="100%" cellspacing="0" cellpadding="0" border="0">    <tr>     <td><!--[endif]-->     <div class="shape">     <p class="MsoNormal">E<span style="font-size: 36pt;"></span></p>     </div>     <!--[if !mso]--></td>    </tr>   </table>   </span><!--[endif]--><!--[if !mso & !vml]-->&nbsp;<!--[endif]--><!--[if !vml]--></td>  </tr> </table>  </span><!--[endif]--><span style="font-family: verdana;">Otras&nbsp; aplicaciones de depuración que tambi&eacute;n se mencionan en este artículo son sos.dll, winddbg.exe y cdbg.exe que permiten depurar en un servidor de producción, pudiendo incluso observarse el proceso de recolección de basura. O estudiar el contenido del heap del GC. &nbsp;El uso de estas aplicaciones es importante en este caso &nbsp;para poder detectar cuales son los objetos que llenan el heap y que obligan a realizar tanto garbage collection, como se pudo observar.</span></p>    ]]>
    </content>
</entry>
<entry>
    <title>Web Services u Object Remoting</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2005/10/web_services_u_object_remoting.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=490" title="Web Services u Object Remoting" />
    <id>tag:metodos.lnds.net,2005://8.490</id>
    
    <published>2005-10-20T02:14:11Z</published>
    <updated>2005-10-19T23:09:06Z</updated>
    
    <summary>Hace un tiempo publique en Netveloper un artículo sobre web services y object remoting. Puedes leer el artículo, pero también he decidido guardar una copia en este blog....</summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="Arquitectura" />
            <category term="SOA" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[<p>Hace un tiempo publique en <a href="http://www.netveloper.com/">Netveloper</a> un artículo sobre web services y object remoting. Puedes leer el <a href="http://www.netveloper.com/contenido.aspx?IDP=0&IDC=195">artículo</a>, pero también he decidido guardar una copia en este blog.<br />
</p>]]>
        <![CDATA[<p><strong><br />
Conceptualmente Web Service y Remoting son lo mismo, objetos distribuidos. La diferencia principal es el protocolo.<br />
</strong></p>

<p> En Remoting puedes usar protocolos no estándares. En Web Services usa SOAP, o RPC-XML, en genera estándares abiertos, sobre HTTP.</p>

<p>- Si quieres publicar a la web tus servicios, entonces debes usar Web Services, porque tus clientes pueden estar usando otro ambiente, como Java, PHP, etc, y lo que importa es la interoperabilidad.</p>

<p>- Si es para manejo interno, el remoting puede tener mejor performance si usas como otros protocolos, que usen TCP y manejen binarios, en vez de soap, de todas maneras remoting se puede hacer con soap pero es lo mismo que web services, si lo usas sobre IIS.</p>

<p>- Tu puedes tener remoting sin tener que instalarlos en el IIS. Eso puede tener ventajas también en el performance, pero tienes que preocuparte de blindarlo de todas las otras caracteristicas que te agrega IIS, como SSL, logging, seguridad, etc. En el fondo, es como que tuvieras que construir tu propio web server.<br />
Por eso que se recomienda usar remoting en la intranet, donde normalmente la seguridad no es tan crítica porque se supone que todos los computadores son confiables (se supone).</p>

<p>- Probablemente, has visto mejor performance debido a la serialización. Los web services usan XMLSerializer, mientras que en remoting se usa SOAPFormatter o BinaryFormatter, que generan mensajes más comprimidos y se generan más rápido, además mandar un mensaje binario es más rápido que un XML, por ponerlo de algún modo. Además hay algunos detalles técnicos con respecto a la cantidad de conexiones que permite IIS sobre remoting, pero no creo que sea el caso.</p>

<p><strong>¿Cómo decidir?</strong></p>

<p>En Microsoft hay un artículo al respecto: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/bdadotnetarch16.asp" >ASP.NET Web Services or .NET Remoting: How to Choose</a></p>

<p>Otro artículo interesante está en <a href="http://www.acmqueue.org/modules.php?name=Content&pa=showpage&pid=246">Fuzzy Boundaries: Objects, Components, and Web Services.</a></p>

<p>En mi experiencia:</p>

<p>Si voy a interoperar con agentes externos, que no controlo, uso Web Services, porque es un estándar abierto. <br />
Sólo uso object remoting en aplicaciones dentro de una intranet, porque muchas veces no puedes controlar los firewalls, routers, etc. <br />
Sólo tiene sentido usar webservice u object remoting si los servicios van a ser usados entre máquinas distintas. Si no hay que usar objetos comunes y corrientes. <br />
Object Remoting y Web services deben ser una interfaz a objetos de negocios internos, es decir, la lógica de negocios no debe estar en ellos, sino que en clases internas que se exponen usando estos mecanismos. Esto es conocido como el patrón Adapter o Wrapper, que sería más o menos como muestra la siguiente imagen:</p>

<p><img alt="modelo.gif" src="http://www.lnds.net/archives/modelo.gif" width="684" height="473" /></p>

<p>Abusando de la notación UML, lo que la Figura muestra son algunas posibles configuraciones.</p>

<p><br />
Tenemos:</p>

<p>Objeto de Negocio que implementa la lógica de negocios</p>

<p>Un WebService, que publica los servicios del objeto de negocios al mundo exterior.</p>

<p>Un Objeto Remoting que publica lo mismo para el mundo interior, usando object remoting.</p>

<p>Tenemos un cliente interno que podría usar web services o remoting.</p>

<p>Un cliente interno que usa directamente el objeto de negocios.</p>

<p>En este patrón usamos el web service y el remoting como un Wrapper, para publicar la funcionalidad, que la realiza el objeto de negocios, eso nos da flexibilidad, y re utilización de lógica.</p>]]>
    </content>
</entry>
<entry>
    <title>Rompiendo las Reglas: : invocando métodos privado desde otra clase en C#</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2005/10/rompiendo_las_reglas_invocando.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=492" title="Rompiendo las Reglas: : invocando métodos privado desde otra clase en C#" />
    <id>tag:metodos.lnds.net,2005://8.492</id>
    
    <published>2005-10-19T23:09:44Z</published>
    <updated>2005-10-19T23:23:41Z</updated>
    
    <summary><![CDATA[Las reglas de la programación orientada al objeto (OOP) dicen que no se puede llamar a un m&eacute;todo privado de una clase. De modo que si se tiene la siguiente clase: class MiClase { &nbsp;&nbsp; private void MetodoPrivado() &nbsp;&nbsp; {...]]></summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="C#" />
            <category term="Calidad" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[<p>Las reglas de la programación orientada al objeto (OOP) dicen que no se puede llamar a un m&eacute;todo privado de una clase. </p><p>De modo que si se tiene la siguiente clase:</p> <blockquote>   <p><strong>class</strong> MiClase<br /> {<br /> &nbsp;&nbsp; <strong>private void </strong>MetodoPrivado()<br /> &nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Console.WriteLine(&quot;m&eacute;todo privado invocado&quot;);<br /> &nbsp;&nbsp; }<br /> }</p> </blockquote> <p>No es posible llamar al m&eacute;todo MetodoPrivado desde otra clase, incluso desde una clase derivada.<br /> </p> <blockquote>   <pre><br /></pre>   <p> </p> </blockquote> ]]>
        <![CDATA[<h2>Rompiendo las reglas</h2> <p>Pero en C# usando Reflection es posible saltar esta restricción, y llamar un m&eacute;todo privado.</p> <p>El siguiente código muestra cómo&nbsp;</p> <h1 /> <blockquote>   <p> <strong>using </strong>System;</p>   <p><strong>using </strong>System.Reflection;</p>   <p><br />   <strong>public class</strong> PrivateCaller<br /> {</p>   <p>&nbsp;&nbsp; <strong>static void</strong> Main()<br /> &nbsp;&nbsp; {</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp; PrivateClass a = <strong>new</strong> PrivateClass();</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp; BindingFlags eFlags = BindingFlags.Instance </p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | BindingFlags.Public </p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | BindingFlags.NonPublic;</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp; MethodInfo m;</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp; <strong>try</strong><br /> &nbsp;&nbsp;&nbsp;&nbsp; {</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m = t.GetMethod(&quot;PrivateMethod&quot;, eFlags);</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>if</strong> (m != <strong>null</strong>)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.Invoke(objInstance, aobjParams);</p>   <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>   <p>&nbsp;&nbsp;&nbsp; }</p>   <p>&nbsp;&nbsp;&nbsp; <strong>catch</strong><br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp; throw;</strong><br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp; }<br /> }</p> </blockquote> <h1><br /> </h1> <p>Por supuesto esto se puede evitar aplicando el atributo ReflectionPermission.</p> <p>&iquest;Para qu&eacute; podría usarse esto?</p> <p>Un uso interesante es cuando quieres hacer testing de clases, usando <a href="http://www.nunit.org/" target="_blank">NUnit</a>, por ejemplo, en ese caso puedes usar esto para probar m&eacute;todos privados de una clase.</p> <p>Otro uso es para invocar m&eacute;todos de una clase a la cual no tienes acceso para modificarla.&nbsp;</p> ]]>
    </content>
</entry>
<entry>
    <title>7 Consejos para usar excepciones</title>
    <link rel="alternate" type="text/html" href="http://metodos.lnds.net/2005/10/7_consejos_para_usar_excepcion_1.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.lnds.net/cgi-bin/mt-atom.cgi/weblog/blog_id=8/entry_id=491" title="7 Consejos para usar excepciones" />
    <id>tag:metodos.lnds.net,2005://8.491</id>
    
    <published>2005-10-19T22:31:13Z</published>
    <updated>2005-10-19T23:08:34Z</updated>
    
    <summary>Aqui hay 7 consejos para el uso de excepciones en C#, pero creo que son también útiles para Java. 1) No utilice las excepciones para controlar el flujo de la aplicación. 2) Usar código de validación para evitar excepciones innecesarias....</summary>
    <author>
        <name>ediaz</name>
        <uri>www.lnds.net</uri>
    </author>
            <category term="Calidad" />
    
    <content type="html" xml:lang="es" xml:base="http://metodos.lnds.net/">
        <![CDATA[<p>Aqui hay 7 consejos para el uso de excepciones en C#, pero creo que son también útiles para Java.</p>

<p>    1) No utilice las excepciones para controlar el flujo de la aplicación.<br />
    2) Usar código de validación para evitar excepciones innecesarias.<br />
    3) Usar el bloque finally para asegurar la liberación de los recursos.<br />
    4) No atrape las excepciones que no va a manejar. .<br />
    5) Tenga en cuenta que relanzar excepciones (rethrowing) es costoso. Casi tan costoso como la excepción que se produjo.<br />
    6) Preservar toda la información de diagnóstico posible en los manejadores de excepciones. Esto es util para efectos de depurar.<br />
    7) Utilizar el Monitor de Performance para monitorear excepciones del <span class="caps">CLR. </span></p>

<p>Gracias a Juan Daria Tempesta (Instructor <span class="caps">DCE</span>) por inspirar este artículo</p>]]>
        
    </content>
</entry>

</feed> 

