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

<channel>
	<title>Indalcasa &#187; c#</title>
	<atom:link href="http://www.indalcasa.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.indalcasa.com</link>
	<description>Un blog de tecnologia</description>
	<lastBuildDate>Tue, 03 Jan 2012 15:14:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Deploy de ASP.Net MVC en Apache con mod_mono</title>
		<link>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/</link>
		<comments>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 12:34:10 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=792</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Lo que voy a escribir aquí no es una guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono, aunque la escribiré, sino como hacer el deploy de una aplicación. Cuando montamos un sistema Mono ASP.Net con MVC sobre apache con mod_mono, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Lo que voy a escribir aquí no es una <strong>guía de como instalar Mono ASP.Net con MVC sobre apache con mod_mono</strong>, aunque la escribiré, sino como hacer el <strong>deploy de una aplicación</strong>. Cuando montamos un <strong>sistema Mono ASP.Net con MVC sobre apache con mod_mono</strong>, hay que tener 3 cosas en cuenta para su correcto funcionamiento, son pequeños detalles pero que te pueden dar algún que otro quebradero de cabeza. Las 3 cosas a tener en cuenta son:</p>
<ul>
<li><strong>Apache no entiende que tu app es MVC</strong>, por lo que hay que decirselo.</li>
<li><strong>Apache ni mod_mono son capaces de dictaminar tu index</strong></li>
<li>Siempre hay que tener algo para <strong>recompilar el backend en caso de cacheo o fallo</strong> (generalmente cuando desarrollamos).</li>
</ul>
<p>Bueno, expliquemos cada una, en primer lugar apache no sabe que tu <strong>app es un MVC de ASP.Net</strong>, por lo que cuando hagamos un <strong>deploy</strong> o creemos un proyecto nuevo de <strong>Mono ASP.Net con MVC</strong>, lo primero a crear es un <strong>.htaccess</strong> forzando a que es un <strong>MVC</strong>. El <strong>código del htaccess</strong> es:</p>
<pre class="brush: text; gutter: true">ForceType application/x-asp-net</pre>
<p>Con esto ya  podemos poner a funcionar nuestra <strong>aplicación web</strong>. El siguiente paso para hacer las cosas bien, sería <strong>crear un index</strong>, ¿Por qué? ¿Acaso no saben cual es mi <strong>index</strong>? Pues no, todas las pruebas, tanto en <strong>Linux</strong> como en <strong>Mac OS X</strong>, es que <strong>mod_mono</strong> no es capaz de entender cual es el <strong>index</strong> que definimos en el <strong>global.asax</strong>, por lo que lo mejor es crear un <strong>index.aspx</strong> que cargue nuestro <strong>HomeController</strong>, o el que queramos. El <strong>index</strong> estaría en el raiz del proyecto y su código sería:</p>
<pre class="brush: csharp; gutter: true">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt;
&lt;%
   this.Context.RewritePath(&quot;Home&quot;, false);

   IHttpHandler httpHandler = new MvcHttpHandler();
   httpHandler.ProcessRequest(this.Context);
%&gt;</pre>
<p>Lo que hacemos con este <strong>index.aspx</strong> es decirle que cuando cargue la <strong>home</strong> (el <strong>index</strong>) cargue automáticamente el <strong>HomeController</strong>. Ahora solo nos falta crear un sistema de <strong>reseteo de backend</strong> por si se queda en <strong>cache</strong> y queremos cambiar algo. Para ello creamos una carpeta, por ejemplo, <strong>reset-mono-backend</strong> y creamos un <strong>.htaccess</strong> dentro de esa carpeta. Cabe decir que al htaccess lo podemos otorgar de un sistema de <strong>autentificación</strong> y cosas por el estilo para acceder, pero como esto es un ejemplo, será lo más básico. El <strong>contenido del .htaccess</strong> será:</p>
<pre class="brush: text; gutter: true">ForceType None
SetHandler mono-ctrl</pre>
<p>Al entrar en /nuestroproyecto/reset-mono-backend, nos aparecerá una <strong>interfaz</strong> que nos permitirá entre otras cosas, <strong>resetear el backend</strong>. Otro día explicaré como se instala el sistema en si.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/' addthis:title='Deploy de ASP.Net MVC en Apache con mod_mono ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/deploy-de-asp-net-mvc-en-apache-con-mod_mono/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC</title>
		<link>http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/</link>
		<comments>http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 12:26:08 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=778</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/' addthis:title='Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Hace un tiempo empecé a oír hablar de django y empecé a interesarme por el. La verdad que al principio me llamaba mucho la atención porque la gente no hacia mas que alabar las virtudes de django. Investigando encontraba mas y mas alabanzas, incluso expertos que comparaban django con otros entornos como Mono ASP.Net con [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/' addthis:title='Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/' addthis:title='Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Hace un tiempo empecé a oír hablar de <strong>django</strong> y empecé a interesarme por el. La verdad que al principio me llamaba mucho la atención porque la gente no hacia mas que alabar las virtudes de <strong>django</strong>. Investigando encontraba mas y mas alabanzas, incluso expertos que comparaban <strong>django</strong> con otros entornos como <strong>Mono ASP.Net con MVC</strong> o <strong>ruby</strong>.</p>
<p>A veces las comparaciones son odiosas y esto es que lo les pasa a los demás entornos cuando los comparamos con <strong>django</strong>. Al comparar <strong>django</strong> con <strong>Mono ASP.Net con MVC</strong>, comentaban como un mismo proyecto realizado por programadores expertos en <strong>django</strong>, realizaban muchas mas tareas que los expertos en <strong>ASP.Net</strong> en el mismo tiempo y que el resultado final del proyecto es que era mas rápido y consistente el desarrollo en <strong>django</strong> que en <strong>ASP.Net</strong>. Yo no digo que <strong>django</strong> sea un mal entorno, ni que los programadores de <strong>ASP.Net</strong> sean malos, pero la calidad de un programador de <strong>.Net</strong> realizando una web deja un poco que desear en la mayoría de los casos, no asi un programador friki de <strong>python</strong> que ha decidido hacer webs y que seguramente sea mucho mas versátil que uno de asp.net aunque hiciera la web en <strong>php</strong> y para mi esto no es comparable. Por otro lado comparaban <strong>django</strong> con <strong>ruby</strong> y no me gusto nada la comparación, ya que al comparar, decían que <strong>ruby on rails</strong> era para “nenas” y <strong>django</strong> para “hombre de pelo en pecho”. La verdad que esta comparación, es un poco ridícula, hasta llego a hacerme gracia a pesar de no gustarme.</p>
<p>Ahora vayamos a mi experiencia personal. Decidí instalarme <strong>django</strong>, <strong>ruby</strong> y <strong>Mono ASP.Net con MVC</strong>. Al buscar información, tutoriales o algo de guía para instalar e iniciar <strong>django</strong>, me encuentro con poca información y además centrada para <strong>linux</strong>, seguía las guías para <strong>mac</strong> y me costo sudor y lágrimas hacerlo correr (mi amigo @saikus no fue capaz). Cuando ya conseguí, intente hacer una prueba pero fui incapaz, bastante complicado para empezar sin un libro o sin que alguien te enseñe. Aun así, vi que utiliza una especie de servidor propio, por lo que para por ejemplo hacerlo correr en apache, hay que arrancarlo desde <strong>ssh</strong> y enlazarlo por un fastcgi o similar con <strong>apache</strong>, pero la cuestión es, cuanta comunidad puede generar algo que es muy muy muy dificil que sin ser pro y sin gastar un dineral en hosting, puedan hacer pruebas (yo en mi hosting no puedo instalarlo de momento).</p>
<p>Por ejemplo, mi experiencia con <strong>ruby</strong> o <strong>asp.net</strong> es muy mas satisfactoria, puesto que ruby es tan fácil como instalarlo desde algún <strong>apt-get</strong>, <strong>ports</strong>, descargable, etc y luego instalar las mil y una gemas necesarias. De una forma rápida y fácil puedes hacer funcionar un ejemplo o programar algo no solo en <strong>linux</strong>, sino en <strong>MacOSX</strong>, que es importante, ya que cada vez hay mas gente que usa este sistema. Por otro lado <strong>Mono ASP.Net con MVC</strong> es también muy fácil, quizás algo mas complejo que <strong>ruby</strong>, pero tan fácil como bajarse el instalable o en el peor de los casos las fuentes de la web de <strong>mono</strong> y compilar. <strong>Mono</strong> ya tiene <strong>XSP</strong> que es su propio <strong>server</strong> como ocurre con <strong>django</strong> y <strong>rails</strong>, y con <strong>mod_mono</strong> lo compilamos e instalamos en un periquete en <strong>apache</strong>.</p>
<p>Por que me gusta mas usar <strong>Mono ASP.Net con MVC</strong> que usar <strong>ruby</strong> o <strong>django</strong>. <strong>Django</strong> lo descarto por el costo de su instalación, porque no tengo un buen <strong>IDE</strong> donde poder programarlo y si quisiera pagar aunque fuera poco por los <strong>IDES</strong>, ¿Por qué no volverme a <strong>Windows</strong> y usar <strong>Visual Studio</strong>? <strong>Ruby</strong> es un poco parecido, es mas fácil de instalar y trabajar, pero falta un buen <strong>IDE</strong>, <strong>Netbeans</strong> tiene soporte, al igual que <strong>Eclipse</strong> para <strong>django</strong>, pero son plugins para mi gusto no estan muy muy depurados. Por el lado de <strong>Mono ASP.Net con MVC</strong> tenemos la opción de <strong>monodevelop</strong>, que si bien es cierto que sus primeras versiones eran como los plugins antes mencionados, las ultimas han mejorado sustancialmente y no hay que olvidar que en lugar de ser un <strong>IDE</strong> de java con plugins para <strong>python</strong> o <strong>ruby</strong>, es un <strong>IDE de .Net (dotnet)</strong>, por lo que <strong>mvc</strong> esta soportado nativamente.</p>
<p>En conclusión, a <strong>django</strong> le veo demasiadas pegas que ensombrecen las virtudes que tiene. <strong>Ruby</strong> es quizás el mas equilibrado en cuanto a potencia y tiempo de desarrollo y <strong>Mono ASP.Net con MVC</strong> es mas lento en cuanto a desarrollo pero muy potente, además de no ser un framework añadido a un lenguaje (<strong>mvc</strong> si, pero no <strong>asp</strong>) sino todo un entorno preparado para la web, donde con un par de clicks es muy fácil generar <strong>clientes de servicios web</strong>, o <strong>crear un servicio web xml</strong>, una pagina web o mil cosas mas. Es por esto que yo personalmente me quedo con <strong>Mono ASP.Net con MVC</strong>.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/' addthis:title='Por que no usar django. Breve comparativa entre django, ruby y Mono ASP.Net con MVC ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/web-2/por-que-no-usar-django-breve-comparativa-entre-django-ruby-y-mono-asp-net-con-mvc/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 08:04:59 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=766</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>En .Net, bien sea en C# o en VB.Net, hay un tipo de clases llamadas controladores genéricos que nos proveen de un nivel muy básico de controlador web. En ASP.Net, los handlers o  HttpHandler son un tipo de clases tan básicas, que no implementan entre otras cosas, las sesiones, por lo que tendremos que indicar [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>En <strong>.Net</strong>, bien sea en <strong>C#</strong> o en <strong>VB.Net</strong>, hay un tipo de clases llamadas <strong>controladores genéricos</strong> que nos proveen de un <strong>nivel muy básico de controlador web</strong>. En <strong>ASP.Net</strong>, los <strong>handlers</strong> o  <strong>HttpHandler</strong> son un tipo de clases tan básicas, que no implementan entre otras cosas, las <strong>sesiones</strong>, por lo que tendremos que indicar explícitamente en la clase que tipo de <strong>sesión vamos a implementar</strong>.</p>
<p>Me voy a centrar en explicar 3 casos que son los más comunes, a la hora de <strong>implementar un handler</strong>:</p>
<ul>
<li><strong>Sin sesión</strong>: para esto no hay que hacer nada, con la declaración por defecto nos es suficiente. <strong>No tendremos acceso a la sesión</strong>, que sera nula si hacemos un <strong>context.Session</strong></li>
<li><strong>Sesión de solo lectura</strong>: para esto debemos <strong>implementar la interfaz IReadOnlySessionState</strong>, de tal modo que al hacer <strong>context.Session</strong>, tenga los <strong>valores de la sesión</strong>, pero no podremos añadir o actualizar datos sobre la <strong>sesión</strong>.</li>
<li><strong>Sesión de lectura y escritura</strong>: para esto debemos <strong>implementar la interfaz IRequiresSessionState</strong>, que nos permitirá acceder a los <strong>datos de la sesión</strong>, así como añadir y actualizar los datos.</li>
</ul>
<div>A continuación dejo unos ejemplos en C# y en VB.Net para que os hagais una idea.</div>
<pre class="brush: csharp; title: Ejemplo de implementación de handlers en C#; notranslate">
//Este ejemplo devolverá un error ya que context.Session es Nothing
public class IndalcasaSessionHandler : System.Web.IHttpHandler {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//pero value tendrá el valor original que tuviera y no el valor &quot;nuevo valor&quot;
//ya que no se puede escribir en la sesión
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}

//Este ejemplo no devolverá un error ya que context.Session no es Nothing
//y actualizará el valor de la sesión correctamente
public class IndalcasaSessionHandler : System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState {
    public void ProcessRequest(HttpContext context) {
        Object value;

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;);
		value = context.Session.Item(&quot;value&quot;);

		context.Response.Write(value);
    }
}
</pre>
<pre class="brush: vb; title: Ejemplo de implementación de handlers en VB.Net; notranslate">
'Este ejemplo devolverá un error ya que context.Session es Nothing
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;un valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'pero value tendrá el valor original que tuviera y no el valor &quot;nuevo valor&quot;
'ya que no se puede escribir en la sesión
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler, System.Web.SessionState.IReadOnlySessionState

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;nuevo valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class

'Este ejemplo no devolverá un error ya que context.Session no es Nothing
'y actualizará el valor de la sesión correctamente
Public Class IndalcasaSessionHandler
    Implements System.Web.IHttpHandler, System.Web.SessionState.IRequiresSessionState

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
        Dim value As Object

		context.Session.Add(&quot;value&quot;, &quot;nuevo valor&quot;)
		value = context.Session.Item(&quot;value&quot;)

		context.Response.Write(value)
    End Sub
End Class
</pre>
<p>Espero que os saque de un apuro en el que alguna vez me he visto metido por no recordar las <strong>interfaces que hay que implementar para poder leer y/o escribir en la sesión en un controlador genérico de ASP.Net</strong>.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/' addthis:title='Habilitar sesiones en un handler.ashx con IRequiresSessionState e IReadOnlySessionState ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/habilitar-sesiones-en-un-handler-ashx-con-irequiressessionstate-e-ireadonlysessionstate/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Double.Parse y Decimal.Parse con símbolos de putuación</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 09:02:18 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=758</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Un problema que me encuentro a menudo en .Net por igual en Visual Basic o en C#, es cuando tengo que parsear un decimal o un double desde un string. Muchas veces, cuando parseas un double o un decimal, encontramos un error ya que en operaciones matemáticas, el símbolo de puntuación para la parte decimal [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Un problema que me encuentro a menudo en <strong>.Net</strong> por igual en <strong>Visual Basic</strong> o en <strong>C#</strong>, es cuando tengo que <strong>parsear un decimal o un double desde un string</strong>. Muchas veces, cuando <strong>parseas un double o un decimal</strong>, encontramos un error ya que en <strong>operaciones matemáticas</strong>, el <strong>símbolo de puntuación para la parte decimal es el punto</strong>, por lo que al hacer un <strong>Double.Parse(number)</strong> o un <strong>Decimal.Parse(number)</strong>, lo que hace es ignorar el punto y por tanto tomar la <strong>parte decimal</strong> como si fuera <strong>parte entera</strong>. Para que esto no nos pase, tenemos que indicar que el <strong>sistema numérico utilizado es el matemático</strong>, aquel que no varia con la <strong>cultura</strong>. Con un ejemplo se verá mas claro.</p>
<p>Un ejemplo en <strong>C#</strong>:</p>
<pre class="brush: csharp; title: Ejemplo en C#; notranslate">
string number = &quot;15.3&quot;;
double doNumber;
decimal deNumber;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

/*
Los valores son:
doNumber = 153
deNumber = 153
*/

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

/*
Los valores son:
doNumber = 15.3
deNumber = 15.3
*/
</pre>
<p>Un ejemplo en <strong>VB.Net</strong></p>
<pre class="brush: vb; title: Ejemplo en VB.Net; notranslate">
Dim number As String = &quot;15.3&quot;;
Dim doNumber As Double;
Dim deNumber As Decimal;

doNumber = double.Parse(number);
deNumber = decimal.Parse(number);

'Los valores son:
'doNumber = 153
'deNumber = 153

doNumber = double.Parse(number, CultureInfo.InvariantCulture);
deNumber = decimal.Parse(number, CultureInfo.InvariantCulture);

'Los valores son:
'doNumber = 15.3
'deNumber = 15.3
</pre>
<p><strong>CultureInfo</strong> es una clase que provee de información de las culturas y en concreto, la propiedad <strong>InvariantCulture</strong> o <strong>CultureInfo.InvariantCulture</strong>, es quien provee la información de la cultura que no varia por localizaciones, vease el <strong>simbolo de puntuación matemático</strong>. La clase <strong>CultureInfo</strong> se encuentra en el namespace <strong>System.Globalization</strong>, quedado la ruta así: <strong>System.Globalization.CultureInfo.InvariantCulture</strong>.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/' addthis:title='Double.Parse y Decimal.Parse con símbolos de putuación ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/double-parse-y-decimal-parse-con-simbolos-de-putuacion/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Por qué usar StringBuilder en lugar de concatenar Strings</title>
		<link>http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/</link>
		<comments>http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 01:36:16 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=703</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/' addthis:title='Por qué usar StringBuilder en lugar de concatenar Strings ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Ando un poco liado y llevo una temporada sin escribir. Hay un apunte, que es común para varios lenguajes que son Java y por ejemplo .Net, tanto Visual Basic .Net y C#, así como el resto de lenguajes de la plataforma .Net que es la clase StringBuilder. Hay gente que no sabe por que o cuando utilizar la clase [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/' addthis:title='Por qué usar StringBuilder en lugar de concatenar Strings ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/' addthis:title='Por qué usar StringBuilder en lugar de concatenar Strings ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Ando un poco liado y llevo una temporada sin escribir. Hay un apunte, que es común para varios lenguajes que son <strong>Java</strong> y por ejemplo <strong>.Net</strong>, tanto <strong>Visual Basic .Net</strong> y <strong>C#</strong>, así como el resto de lenguajes de la plataforma <strong>.Net</strong> que es la <strong>clase StringBuilder</strong>. Hay gente que no sabe por que o cuando utilizar la <strong>clase StringBuilder</strong> y realmente es uno de esos pequeños detalles de <strong>buenas prácticas</strong>, que a simple vista en un proyecto pequeño no se aprecian, pero cuando entre manos tenemos un gran proyecto que recibe millones de peticiones diarias, estas pequeñas nuevas practicas pueden suponer un gran referente de ahorro en el consumo de memoria y procesador de un servidor.</p>
<p>Tanto en <strong>Java</strong> como en <strong>.Net</strong>, cuando creamos un nuevo <strong>String</strong>, instanciamos un <strong>objeto String</strong> en una variable, cuando con la sentencia "+=" vamos concatenando mas texto, lo que hacen estas plataformas es crear una nueva instancia del <strong>objeto</strong> con la concatenación de las dos variables de texto. Por otro lado, cuando tenemos un <strong>StringBuilder</strong> instanciamos una <strong>clase StrringBuilder</strong>, llamando al método "<strong>append</strong>" en <strong>Java</strong> y "<strong>Append</strong>" en <strong>.Net</strong>, lo que hacemos es realizar una concatenación real de texto en el buffer de texto para luego instanciar un <strong>nuevo objeto String</strong> cuando llamemos al método "<strong>toString</strong>" en <strong>Java</strong> y "<strong>ToString</strong>" en <strong>.Net</strong>. A simple vista parece una tontería, cuando tenemos un texto que concatenamos 2 o 3 veces, realmente no merece la pena generar un <strong>StringBuilder</strong>, pero cuando concatenamos repetidamente texto varias veces el rendimiento es mayor si utilizamos <strong>StringBuilder</strong>, ya que si tenemos 20 concatenaciones seguidas, utilizando <strong>Strings</strong> normales concatenados, tendríamos 20 <strong>instancias de objetos</strong>, mientras que con <strong>StringBuilder</strong> solo 2. Como he dicho antes, en un pequeño proyecto, esto es prácticamente inapreciable, pero cuando tenemos un proyecto que recibe millones de peticiones diarias, algo tan tonto como utilizar <strong>concatenaciones de texto</strong> o <strong>StringBuilder</strong> puede suponer tener que añadir mas memoria al servidor para soportar tantas <strong>instancias de objetos</strong> e incluso un procesador mas potente para soportar el paso del recolector de basura para tantos <strong>objetos instanciados</strong>, esto en el mejor de los casos, si no llegamos al caso de tener que añadir un servidor al cluster para soportar todo esto.</p>
<p>Un cumulo de <strong>buenas practicas</strong> pueden suponer un gran ahorro de recursos, que se traducen en ahorro de dinero, cuando se trata de grandes proyectos.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/' addthis:title='Por qué usar StringBuilder en lugar de concatenar Strings ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/por-que-usar-stringbuilder-en-lugar-de-concatenar-strings/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Char curiosidad de IsLetter e IsDigit</title>
		<link>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/</link>
		<comments>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 09:01:45 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[char]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[string]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[vb.net]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=134</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera incluir texto o números, pero en ningún caso debería de poderse incluir caracteres raros. Seamos sinceros y siempre que hemos necesitado usar esto [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>El otro día, nos disponíamos mi jefe y yo a realizar un control sobre un campo de texto de una aplicación web. La idea era que en este campo solo se pudiera <strong>incluir texto o números</strong>, pero en ningún caso debería de poderse incluir <strong>caracteres raros</strong>. Seamos sinceros y siempre que hemos necesitado usar esto en lenguajes donde su framework no estaba preparado para diferenciar que tipo de carácter era, acabamos o bien creando un array diccionario y comparando los caracteres o bien usando expresiones regulares. Como no, desde el salto a tecnología de Microsoft (en este caso <strong>Visual Basic .Net</strong>) me propuse buscar alguna clase o método que hiciera solo lo que quería hacer, y la encontré.</p>
<p>En <strong>.Net</strong> existe la <strong>clase Char</strong>, que tiene el método <strong>Char.IsLetterOrDigit</strong> (boleano) donde le indicas un <strong>char o carácter</strong> y este te devuelve true o false si es un número o letra y false si no lo es. Monto una función para recorrer carácter a carácter del campo de texto comprobando si es <strong>alfanumérico</strong> o no, con la idea de borrar los caracteres que no sean <strong>alfanuméricos</strong>. Una vez montada la función, la pruebo unas cuantas veces y todo funciona estupendamente. Cuando nos vamos a disponer a subir a producción... sorpresa, la última prueba a fallado (pero es imposible), se nos deslizo el dedo y por poner un "1", pusimos un <strong>"º"</strong>. Cuando nos ponemos a investigar (ha probar con jabatos) nos damos cuenta de que esta función, establece que los caracteres <strong>"º"</strong> y <strong>"ª"</strong> son <strong>alfanuméricos</strong>, vamos que son letras, supongo que la <strong>"o"</strong> y la <strong>"a"</strong>.</p>
<p>Por supuesto esto lo controlamos y listo, pero si alguien se encuentra en nuestra misma situación y conoce alguna función que si trabaje correctamente que lo comente. Y si alguien buscando por internet se encuentra bloqueado y se ve encuentra con este post, ya puede respirar tranquilo, porque no es que funcione mal, es que no funciona del todo bien. (Si, ya se que para algunos <strong>"º"</strong> y <strong>"ª"</strong> son letras, pero realmente son caracteres especiales)</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/' addthis:title='Char curiosidad de IsLetter e IsDigit ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/char-curiosidad-de-isletter-e-isdigit/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bucle do-while en VisualBasic</title>
		<link>http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/</link>
		<comments>http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 08:15:42 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[do]]></category>
		<category><![CDATA[mono]]></category>
		<category><![CDATA[net framework]]></category>
		<category><![CDATA[vb]]></category>
		<category><![CDATA[visual basic]]></category>
		<category><![CDATA[while]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=61</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/' addthis:title='Bucle do-while en VisualBasic ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Llevo tiempo currando con Visual Basic .Net, pero como persona formada desde hace años en lenguajes tipo C (C, C++, Java, C#, PHP, etc) el paso a programar en Visual Basic, cuesta mucho y cosas tan cotidianas como hacer un bucle, un switch o similares pueden convertirse en una peligrosa trampa que nos consumira muchos [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/' addthis:title='Bucle do-while en VisualBasic ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/' addthis:title='Bucle do-while en VisualBasic ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Llevo tiempo currando con <strong>Visual Basic .Net</strong>, pero como persona formada desde hace años en lenguajes tipo <strong>C</strong> (<strong>C</strong>, <strong>C++</strong>, <strong>Java</strong>, <strong>C#</strong>, <strong>PHP</strong>, etc) el paso a programar en Visual Basic, cuesta mucho y cosas tan cotidianas como hacer un bucle, un switch o similares pueden convertirse en una peligrosa trampa que nos consumira muchos minutos muy valiosos.</p>
<p>La ultima que me he topado ha sido el bucle <strong>do while</strong>. En cualquier lenguaje tipo <strong>C</strong>, practicamente independiente del lenguaje estos bucles son iguales:</p>
<blockquote><pre class="csharp">  <span style="color: #0600FF;">do</span> <span style="color: #000000;">&#123;</span>
    sentencias
  <span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">while</span><span style="color: #000000;">&#40;</span>condicion<span style="color: #000000;">&#41;</span>;</pre>
</blockquote>
<p>Pero como no, estamos con <strong>Visual Basic</strong> y aqui todo funciona de manera diferente, es como nuestro tipico amigo que siempre lleva la contraria a todo. Por ejemplo para hacer un bucle <strong>do-while</strong> (me sorprende que en 9 meses sea la primera vez que me vea obligado a hacerlo, el bucle es <strong>do-loop-while</strong>, siendo su sintaxis</p>
<blockquote><pre class="vbnet">  <span style="color: #0600FF;">Do</span>
    sentencias
  <span style="color: #0600FF;">Loop</span> <span style="color: #0600FF;">While</span> condicio</pre>
</blockquote>
<p>Puede que la gente que conozca o programe en <strong>Visual Basic</strong> lo vea una tonteria, pero para gente como yo que por razones laborales se ven obligadas a programar en dicho lenguaje y que por muchos meses se que lleve sigan prefiriendo <strong>C#</strong> a <strong>VB.Net</strong>, cosas tan cotidianas pueden convertirse en un minimundo.</p>
<p>Ya de paso y para aprovechar el post, explico que los bucles <strong>do while</strong>, son bucles que se recorreran igual que los <strong>while</strong>, en funcion de una condicion que de ser cierta dara una vuelta mas al bucle y que la principal diferencia entre los bucles <strong>while</strong> y <strong>do while</strong>, radica en que el <strong>while</strong>, primero comprueba la condicion antes de hacer una iteracion al bucle, mientras que los <strong>do while</strong> primero dara una iteracion al bucle y al final comprobara si debe de seguir haciendo iteraciones. Dicho de otro modo, el el <strong>while</strong>, primero comprobamos que debemos entrar al bucle y de ser cierto, entramos, en los <strong>do while</strong>, primero entramos al bucle y al final de este comprobamos si debemos dar una vuelta mas.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/' addthis:title='Bucle do-while en VisualBasic ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/bucle-do-while-en-visualbasic/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SharpOs, un sistema operativo diferente.</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 11:00:27 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[os]]></category>
		<category><![CDATA[sharpos]]></category>

		<guid isPermaLink="false">http://www.indalcasa.com/?p=43</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/' addthis:title='SharpOs, un sistema operativo diferente. ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>SharpOs es un sistema operativo que en lugar de estar desarrollandose como la mayoría de los sistemas operativos en C o C++, este sistema operativo se esta desarrollandose completamente en C#. El proyecto es GNU y esta disponible su código fuente desde SourceForge o desde la web de SharpOs. De momento se encuentra en una [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/' addthis:title='SharpOs, un sistema operativo diferente. ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/' addthis:title='SharpOs, un sistema operativo diferente. ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p><strong>SharpOs</strong> es un sistema operativo que en lugar de estar desarrollandose como la mayoría de los sistemas operativos en C o C++, este sistema operativo se esta desarrollandose completamente en <strong>C#</strong>. El proyecto es GNU y esta disponible su código fuente desde SourceForge o desde la web de <strong><a title="Página web de SharpOs" href="http://www.sharpos.org/">SharpOs</a></strong>.</p>
<p>De momento se encuentra en una fase alpha pero he descargado el código fuente y compilado con <strong>SharpDevelop</strong> y lo he ejecutado con <strong>MVWare</strong>. La verdad es que me sorprende que funcione correctamente y bueno, es cuestión de esperar un poco a que este más desarrollado, pero ya de por si tiene muy buena pinta.</p>
<p style="text-align: center;"><a href="http://www.indalcasa.com/wp-content/uploads/2008/04/sharpos.png"><img class="alignnone size-medium wp-image-44" title="sharpos" src="http://www.indalcasa.com/wp-content/uploads/2008/04/sharpos-300x188.png" alt="Captura de SharpOs" width="300" height="188" /></a></p>
<p>La anterior captura es una realizada con la compilación desde mi equipo con <strong>VMWare</strong> donde se aprecia la ayuda de los comandos, como aparece un nuevo comando "test" y cuando lo ejecutamos aparece el texto "Testeando la aplicacion.....".</p>
<p>Espero que vaya subiendo rápido, que tengo ganas de poder desarrollar alguna que otra aplicación para este sistema operativo.</p>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/' addthis:title='SharpOs, un sistema operativo diferente. ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/sharpos-un-sistema-operativo-diferente/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Controlar errores no controlados con C#</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/#comments</comments>
		<pubDate>Sat, 22 Sep 2007 17:58:12 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[Mono (C#)]]></category>
		<category><![CDATA[Aplicación]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[catch]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ThreadException]]></category>
		<category><![CDATA[try]]></category>
		<category><![CDATA[try catch]]></category>

		<guid isPermaLink="false">http://84.20.10.74/~indalcas/?p=20</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/' addthis:title='Controlar errores no controlados con C# ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>Algo que me gusta de PHP es su control de errores, ya que a pesar de no tener un tipo de error común, sino que tenemos que luchar contra errores y excepciones, dispone de dos funciones para controlaras como set_error_handler y set_exception_handler. Cuando desarrollo aplicaciones en C# echaba de menos estos algún método similar para [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/' addthis:title='Controlar errores no controlados con C# ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/' addthis:title='Controlar errores no controlados con C# ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>Algo que me gusta de <strong>PHP</strong> es su control de errores, ya que a pesar de no tener un tipo de error común, sino que tenemos que luchar contra errores y excepciones, dispone de dos funciones para controlaras como <strong>set_error_handler</strong> y <strong>set_exception_handler</strong>.</p>
<p>Cuando desarrollo aplicaciones en <strong>C#</strong> echaba de menos estos algún método similar para capturar excepciones, probé varias cosas lógicas, entre ellas antes de hacer nuestro <strong>Application.Run</strong>, englobarlo todo dentro de un <strong>try</strong> y <strong>catch</strong> al siguiente estilo:</p>
<blockquote>
<pre class="csharp"><span style="color: #0600FF;">try</span> <span style="color: #000000;">&#123;</span>
  Application.<span style="color: #0000FF;">Run</span><span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Formulario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span> <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#123;</span>
  Application.<span style="color: #0000FF;">Run</span><span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Formulario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre>
</blockquote>
<p>Esto controlaba cualquier excepción, pero me cerraba la aplicación, una opción era volver a hacer un Application.run en el catch. Si fuera una calculadora hubiera valido, pero cuando se trata de una aplicación grande, no es una solución. Tampoco podemos dejarla al aire, puesto que cuando se lance una excepción, se cerrará la aplicación.</p>
<p>Buscando, buscando, encontré un evento llamado <strong>Application.ThreadException</strong>, que controlara todas aquellas excepciones que se produzcan dentro de <strong>Application.Run</strong>. Controlando este evento, no tendremos que catchear todo nuestro código, sino que definiremos una ventanita que recogerá la excepción y avisara al usuario de que se ha producido un error. Dentro de esta ventana, dependiendo de cuanto queramos trabajárnosla, podremos dar opción al usuario para enviar la traza de la excepción para que el equipo de desarrolladores, pueda reparar el error para futuras versiones o actualizaciones y así poco a poco, generar una aplicación grande desde el principio y robusta poco a poco si se van controlando aquellos errores que no son los más comunes.</p>
<p>A continuación os dejo el código de como controlar cualquier excepción desde el principio.</p>
<blockquote>
<pre class="csharp"><span style="color: #0600FF;">using</span> <span style="color: #000000;">System</span>
<span style="color: #0600FF;">using</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Windows</span>.<span style="color: #0000FF;">Forms</span>;
<span style="color: #0600FF;">using</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Threading</span>;namespace myespacio <span style="color: #000000;">&#123;</span>
&nbsp;
  <span style="color: #0600FF;">internal</span> <span style="color: #0600FF;">sealed</span> <span style="color: #FF0000;">class</span> MiPrograma <span style="color: #000000;">&#123;</span>
&nbsp;
    <span style="color: #000000;">&#91;</span>STAThread<span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
      Application.<span style="color: #0000FF;">ThreadException</span> +=
      <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ThreadExceptionEventHandler
        <span style="color: #000000;">&#40;</span>MiPrograma.<span style="color: #0000FF;">excepcion</span><span style="color: #000000;">&#41;</span>;
&nbsp;
      Application.<span style="color: #0000FF;">Run</span><span style="color: #000000;">&#40;</span><a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Formulario<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> excepcion<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender,
          ThreadExceptionEventArgs excepcion<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
      MessageBox.<span style="color: #0000FF;">Show</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;Se ha producido un error&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre>
</blockquote>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/' addthis:title='Controlar errores no controlados con C# ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-errores-no-controlados-con-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Controlar eventos de Windows en C#</title>
		<link>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/</link>
		<comments>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/#comments</comments>
		<pubDate>Sun, 09 Sep 2007 22:24:11 +0000</pubDate>
		<dc:creator>Juan</dc:creator>
				<category><![CDATA[.Net (C#)]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[EventHandler]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Manejador de eventos.]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[SystemEvents]]></category>
		<category><![CDATA[Win32]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://84.20.10.74/~indalcas/?p=13</guid>
		<description><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/' addthis:title='Controlar eventos de Windows en C# ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div>En .Net hay una clase que dispone de una serie de eventos propios del sistema operativo, que nos permite manejar o ser advertidos de ciertas modificaciones en el mismo, como podría ser el caso de modificaciones de hora, pantalla, etc. para aplicarlas sobre la aplicación y que esta no haga extraños. La clase encargada de [...]<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/' addthis:title='Controlar eventos de Windows en C# ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></description>
			<content:encoded><![CDATA[<div class="addthis_toolbox addthis_default_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/' addthis:title='Controlar eventos de Windows en C# ' ><a class="addthis_button_google_plusone" g:plusone:size="medium" ></a><a class="addthis_counter addthis_pill_style"></a></div><p>En <strong>.Net</strong> hay una clase que dispone de una serie de eventos propios del sistema operativo, que nos permite manejar o ser advertidos de ciertas modificaciones en el mismo, como podría ser el caso de modificaciones de hora, pantalla, etc. para aplicarlas sobre la aplicación y que esta no haga extraños.</p>
<p>La clase encargada de eventualizar ciertas acciones del sistema operativo se encuentra dentro del espacio de nombres <strong>Microsoft.Win32</strong> y se trata de la clase abstracta y no heredable <strong>SystemEvents</strong>. Esta clase provee de los diferentes tipos de eventos que listo a continuación con una breve descripción.</p>
<ul>
<li><strong>DisplaySettingsChanged</strong>:  se produce cuando el usuario cambia la configuración de pantalla.</li>
<li><strong>DisplaySettingsChanging</strong>: se produce cuando la configuración de pantalla esta cambiando.</li>
<li><strong>EventsThreadShutdown</strong>: se produce antes de que finalice el subproceso que escucha los subprocesos del sistema.</li>
<li><strong>InstalledFontsChanged</strong>: se produce cuando el usuario agrega o quita fuentes del sistema.</li>
<li><strong>LowMemory</strong>: se produce cuando el sistema se queda sin memoria RAM disponible.</li>
<li><strong>PaletteChanged</strong>: se produce cuando el usuario cambia a una aplicación que utiliza una paleta diferente.</li>
<li><strong>PowerModeChanged</strong>: se produce cuando el usuario suspende o reanuda el sistema.</li>
<li><strong>SessionEnded</strong>: se produce cuando el usuario cierra sesión o apaga el sistema.</li>
<li><strong>SessionEnding</strong>: se produce cuando el usuario intenta cerrar sesión o apagar el sistema.</li>
<li><strong>SessionSwitch</strong>: se produce cuando se cambia la sesión entre usuarios.</li>
<li><strong>TimeChanged</strong>: se produce cuando se cambia la hora del sistema.</li>
<li><strong>TimerElapsed</strong>: se produce cuando ha transcurrido el intervalo de un temporizador de Windows.</li>
<li><strong>UserPreferenceChanged</strong>: se produce cuando cambian las preferencias del usuario.</li>
<li><strong>UserPreferenceChanging</strong>: se produce cuando van a cambiar las preferencias del usuario.</li>
</ul>
<p>De esta pequeña lista no he probado todas, pero si algunas con un correcto funcionamiento. Hay muchos eventos que pueden ser utilizados como el hecho de la memoria baja para lanzar el recolector de basura o el control de cierre de sistema para guardar los datos en memoria en un archivo.</p>
<p>Para utilizarlas se utilizaría el siguiente código:</p>
<blockquote>
<pre class="csharp"> <span style="color: #0600FF;">using</span> <span style="color: #000000;">Microsoft.<span style="color: #0000FF;">Win32</span></span>;
 ...
 <span style="color: #0000FF;">SystemEvents</span>.<span style="color: #0000FF;">TimeChanged</span> +=
   <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">EventHandler</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">message</span><span style="color: #000000;">&#41;</span>;
 ...
 <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> message<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
   MessageBox.<span style="color: #0000FF;">Show</span><span style="color: #000000;">&#40;</span><span style="color: #808080;">&quot;Han cambiado la hora del sistema.&quot;</span><span style="color: #000000;">&#41;</span>;
 <span style="color: #000000;">&#125;</span></pre>
</blockquote>
<div class="addthis_toolbox addthis_default_style addthis_32x32_style" addthis:url='http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/' addthis:title='Controlar eventos de Windows en C# ' ><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a><a class="addthis_button_compact"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.indalcasa.com/programacion/dotnet-csharp/controlar-eventos-de-windows-en-csharp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

