<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Alejandro Weblog</title>
	<atom:link href="http://apirola.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://apirola.wordpress.com</link>
	<description>Just another weblog</description>
	<lastBuildDate>Sun, 26 Apr 2009 03:44:34 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='apirola.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/c154d8f6618f822758b9a6f82bd01aeb?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Alejandro Weblog</title>
		<link>http://apirola.wordpress.com</link>
	</image>
			<item>
		<title>LaNacion.com como votar comentarios sin control</title>
		<link>http://apirola.wordpress.com/2009/04/26/lanacioncom-como-votar-comentarios-sin-control/</link>
		<comments>http://apirola.wordpress.com/2009/04/26/lanacioncom-como-votar-comentarios-sin-control/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 03:43:34 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2009/04/26/lanacioncom-como-votar-comentarios-sin-control/</guid>
		<description><![CDATA[Hace ya algún tiempo LNOL permite a los usuarios del sitio efectuar la valoraciones en los comentarios de las notas sin necesidad de estar autenticado en el sistema.
Para evitar que los usuarios abusen del sistema LNOL utiliza un control basado en cookies, un metodo probadamente inutil, que solo detiene a usuarios poco calificados tecnicamente.
Pero lamentablemente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=109&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hace ya algún tiempo LNOL permite a los usuarios del sitio efectuar la valoraciones en los comentarios de las notas sin necesidad de estar autenticado en el sistema.</p>
<p>Para evitar que los usuarios abusen del sistema LNOL utiliza un control basado en cookies, un metodo probadamente inutil, que solo detiene a usuarios poco calificados tecnicamente.</p>
<p>Pero lamentablemente este sistema es aun mas sencillo de vulnerar dado que se puede saltar incluso el control de la cookie y votar N veces sin mayores problemas.</p>
<p> <span id="more-109"></span>
<p>Debemos creer que al no ser un sistema critico, quizas LNOL prefiere asumir el riesgo de que terceros lo burlen en pos de la facilidad a la hora de votar</p>
<h2>Como funciona?</h2>
<p>Al pie de cada nota hay varios links:</p>
<p><a href="http://apirola.files.wordpress.com/2009/04/image.png"><img title="image" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="37" alt="image" src="http://apirola.files.wordpress.com/2009/04/image-thumb.png?w=493&#038;h=37" width="493" border="0" /></a> </p>
<p>El codigo HTML de estos links es el siguiente:</p>
<p><a href="http://apirola.files.wordpress.com/2009/04/image1.png"><img title="image" style="border-right:0;border-top:0;display:inline;border-left:0;border-bottom:0;" height="227" alt="image" src="http://apirola.files.wordpress.com/2009/04/image-thumb1.png?w=489&#038;h=227" width="489" border="0" /></a> </p>
<p>Cada comentario se indentifica con un ID en este caso la funcion panelVotar utiliza el ID 4081449 correspondiente a ese comentario.</p>
<p>Si vemos la funcion javascript:panelVotar(comentarioId,usuarioId,bX3,valorTipo_id)</p>
<p>Vemos una linea comentada: </p>
<div id="codeSnippetWrapper" style="border-right:silver 1px solid;border-top:silver 1px solid;font-size:8pt;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;border-bottom:silver 1px solid;font-family:&#39;background-color:#f4f4f4;text-align:left;margin:20px 0 10px;padding:4px;">
<div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;height:38px;background-color:#f4f4f4;text-align:left;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:87.51%;color:black;direction:ltr;line-height:12pt;font-family:&#39;height:16px;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#008000;">/*if(valorCookieLogin != &quot;&quot;)  {//el usr esta logueado*/</span></pre>
<p><!--CRLF--></div>
</div>
<p>Que da paso libre a votar sin necesidad de encontrarse logueado. </p>
<p>A continuacion actualiza la<strong> cookie cookieComentariosVotados,</strong> donde guarda la lista de IDs votados separados por pipes y luego invoca la funcion computarVoto</p>
<div id="codeSnippetWrapper" style="border-right:silver 1px solid;border-top:silver 1px solid;font-size:8pt;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;border-bottom:silver 1px solid;font-family:&#39;background-color:#f4f4f4;text-align:left;margin:20px 0 10px;padding:4px;">
<div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">if</span>(actualizar)</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span> 170 {<span style="color:#008000;">//no habia votado anteriormente =&gt; actualizo la cookie.</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span> 171 document.cookie = <span style="color:#006080;">&quot;cookieComentariosVotados=&quot;</span>+ valorCookie + comentarioId + <span style="color:#006080;">&quot;,&quot;</span> + valorUsuarioId + <span style="color:#006080;">&quot;|;expires=&quot;</span>+fecha.toGMTString() + <span style="color:#006080;">&quot;; path=/&quot;</span>;</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span> 172</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span> 173 <span style="color:#008000;">//Computo el voto en BD.</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span> 174 computarVoto(comentarioId,valorUsuarioId,valorTipo_id);</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span> 175 }</pre>
<p><!--CRLF--></div>
</div>
<p>computarVoto envia el voto al servidor de LNOL mediante un request a una pagina ASP.</p>
<div id="codeSnippetWrapper" style="border-right:silver 1px solid;border-top:silver 1px solid;font-size:8pt;overflow:auto;border-left:silver 1px solid;width:97.5%;cursor:text;direction:ltr;max-height:200px;line-height:12pt;border-bottom:silver 1px solid;font-family:&#39;background-color:#f4f4f4;text-align:left;margin:20px 0 10px;padding:4px;">
<div id="codeSnippet" style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">function</span> computarVoto(comentarioId,usuarioId,valorTipo_id)</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span> <span style="color:#0000ff;">var</span> url;</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span>&#160; </pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span> url = <span style="color:#006080;">&quot;/Scripts/VotarComentario.asp?comentario_id=&quot;</span>+ comentarioId + <span style="color:#006080;">&quot;&amp;user_id=&quot;</span> + usuarioId + <span style="color:#006080;">&quot;&amp;valorTipo_id=&quot;</span> + valorTipo_id;</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span> <span style="color:#0000ff;">var</span> xmlHttp;</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span> <span style="color:#0000ff;">try</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   8:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   9:</span> <span style="color:#008000;">// Firefox, Opera 8.0+, Safari</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  10:</span> xmlHttp=<span style="color:#0000ff;">new</span> XMLHttpRequest();</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  11:</span> }</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  12:</span> <span style="color:#0000ff;">catch</span> (e)</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  13:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  14:</span> <span style="color:#008000;">// Internet Explorer</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  15:</span> <span style="color:#0000ff;">try</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  16:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  17:</span> xmlHttp=<span style="color:#0000ff;">new</span> ActiveXObject(<span style="color:#006080;">&quot;Msxml2.XMLHTTP&quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  18:</span> }</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  19:</span> <span style="color:#0000ff;">catch</span> (e)</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  20:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  21:</span> <span style="color:#0000ff;">try</span></pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  22:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  23:</span> xmlHttp=<span style="color:#0000ff;">new</span> ActiveXObject(<span style="color:#006080;">&quot;Microsoft.XMLHTTP&quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  24:</span> }</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  25:</span> <span style="color:#0000ff;">catch</span> (e)</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  26:</span> {</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  27:</span> alert(<span style="color:#006080;">&quot;Your browser does not support AJAX!&quot;</span>);</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  28:</span> <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">false</span>;</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  29:</span> }</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:#f4f4f4;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  30:</span> }</pre>
<p><!--CRLF--></p>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;direction:ltr;line-height:12pt;font-family:&#39;background-color:white;text-align:left;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  31:</span> }</pre>
<p><!--CRLF--></div>
</div>
</p>
<p>Es decir que puedo colocar la URL en un browser y votar a gusto:</p>
<p><a title="http://www.lanacion.com.ar/Scripts/VotarComentario.asp?comentario_id=4081449&amp;user_id=valorTipo_id=2" href="http://www.lanacion.com.ar/Scripts/VotarComentario.asp?comentario_id=4081449&amp;user_id=valorTipo_id=2"><strong>http://www.lanacion.com.ar/Scripts/VotarComentario.asp?comentario_id=4081449&amp;user_id=valorTipo_id=2</strong></a></p>
<p>Donde valorTipo_id indica el tipo de voto 1-Positivo y 2-Negativo.&#160; Dado que el control en base a la cookie se realiza por medio de javascript, solo en ela pagina de la nota, no es necesario eliminar <strong>cookieComentariosVotados</strong>&#160; en cada request efectuado a VotarComentarios.asp.&#160; Por lo tanto generar votos duplicados se reduce a copiar la URL a un navegador y pesionar F5 tantas veces como votos se desean.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/109/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/109/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/109/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=109&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2009/04/26/lanacioncom-como-votar-comentarios-sin-control/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2009/04/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2009/04/image-thumb1.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq error al filtrar nulos</title>
		<link>http://apirola.wordpress.com/2009/01/20/linq-error-al-filtrar-nulos/</link>
		<comments>http://apirola.wordpress.com/2009/01/20/linq-error-al-filtrar-nulos/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 19:57:24 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2009/01/20/linq-error-al-filtrar-nulos/</guid>
		<description><![CDATA[Al hacer un una consulta con Linq suponía que no iba a tener problemas con los campos nulos. El problema esta en como Linq traduce la consulta a SQL.
Por ejemplo si escribimos el siguiente query:
List&#60;CFD&#62; cfds = (from c in db.CFD
               [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=102&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Al hacer un una consulta con Linq suponía que no iba a tener problemas con los campos nulos. El problema esta en como Linq traduce la consulta a SQL.</p>
<p>Por ejemplo si escribimos el siguiente query:</p>
<pre class="code"><span style="color:#2b91af;">List</span>&lt;<span style="color:#2b91af;">CFD</span>&gt; cfds = (<span style="color:blue;">from </span>c <span style="color:blue;">in </span>db.CFD
                  <span style="color:blue;">where </span>((c.PolizaEn == poliza) || </pre>
<pre class="code">(c.PolizaS6 == poliza) || (c.PolizaSIS == poliza))
                  <span style="color:blue;">select </span>c).ToList&lt;<span style="color:#2b91af;">CFD</span>&gt;();
</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Si poliza fuese null, Linq hará la siguiente consulta al SQL:</p>
<p><span style="color:blue;">SELECT </span><span style="color:gray;">&#8230;<br /></span><span style="color:blue;">FROM</span>[CFD] <span style="color:blue;">AS</span>[t0]<br /><span style="color:blue;">WHERE</span><span style="color:gray;">((</span>[t0]<span style="color:gray;">.</span>[PolizaEn] <span style="color:gray;">= null</span><span style="color:gray;">) OR </span><span style="color:gray;">(</span>[t0]<span style="color:gray;">.</span>[PolizaS6] <span style="color:gray;">=null</span><span style="color:gray;">) OR (</span>[t0]<span style="color:gray;">.</span>[PolizaSIS] <span style="color:gray;">=</span> null<span style="color:gray;">))<br /></span><span style="color:gray;"></span></p>
<p><span style="color:gray;">Para mi sorpresa no traduce los <strong>== null</strong> en <strong>is null</strong>. Por lo cual la consulta no retorna resultados. Para evitar este problema con campos nuleables se debe utilizar Linq de la siguiente manera:</p>
<p></span><a href="http://11011.net/software/vspaste"></a>
<pre class="code"><span style="color:#2b91af;">List</span>&lt;<span style="color:#2b91af;">CFD</span>&gt; cfds = (<span style="color:blue;">from </span>c <span style="color:blue;">in </span>db.CFD
                  <span style="color:blue;">where </span>(<span style="color:blue;">object</span>.Equals(c.PolizaEn, poliza) || </pre>
<pre class="code"><span style="color:blue;">object</span>.Equals(c.PolizaS6, poliza) || <span style="color:blue;">object</span>.Equals(c.PolizaSIS, poli))
                  <span style="color:blue;">select </span>c).ToList&lt;<span style="color:#2b91af;">CFD</span>&gt;();
</pre>
<pre class="code">&nbsp;</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=102&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2009/01/20/linq-error-al-filtrar-nulos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Como extraer texto entre dos tags de HTML</title>
		<link>http://apirola.wordpress.com/2008/10/10/como-extraer-texto-entre-dos-tags-de-html/</link>
		<comments>http://apirola.wordpress.com/2008/10/10/como-extraer-texto-entre-dos-tags-de-html/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 16:48:06 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Rugular Expression]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Content]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[Tag]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/10/10/como-extraer-texto-entre-dos-tags-de-html/</guid>
		<description><![CDATA[En el caso de que necesitemos obtener un determinado texto que esta comprendido entre dos tags de html por ejemplo: &#60;h1&#62;hola mundo&#60;/h1&#62; es muy útil utilizar “regular expressions”.
Ejemplo
//Ejemplo:
string s =
GetTagContent("body", "&#60;body style=”color:#000000”&#62;hola mundo&#60;/body&#62;");
Console.WriteLine(s);
El resultado devuelto por GetTagContent es “hola mundo”.
Aqui les dejo el código de la función:
/// &#60;summary&#62;
/// Devuelve la cadena de caracteres entre dos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=94&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En el caso de que necesitemos obtener un determinado texto que esta comprendido entre dos tags de html por ejemplo: &lt;h1&gt;hola mundo&lt;/h1&gt; es muy útil utilizar “regular expressions”.</p>
<p>Ejemplo</p>
<pre class="code"><span style="color:green;">//Ejemplo:
</span><span style="color:blue;">string </span>s =</pre>
<pre class="code">GetTagContent(<span style="color:maroon;">"body"</span>, <span style="color:maroon;">"&lt;body style=”color:#000000”&gt;hola mundo&lt;/body&gt;"</span>);</pre>
<pre class="code"><span style="color:teal;">Console</span>.WriteLine(s);</pre>
<p>El resultado devuelto por GetTagContent es “hola mundo”.</p>
<p>Aqui les dejo el código de la función:</p>
<pre class="code"><span style="color:gray;">/// &lt;summary&gt;
/// </span><span style="color:green;">Devuelve la cadena de caracteres entre dos tags de HMTL/XML
</span><span style="color:gray;">/// &lt;/summary&gt;
/// &lt;param name="InStr"&gt;</span><span style="color:green;">El texto donde se desea buscar</span><span style="color:gray;">&lt;/param&gt;
/// &lt;param name="Tag"&gt;</span><span style="color:green;">el nombre del tag ej: body</span><span style="color:gray;">&lt;/param&gt;
/// &lt;returns&gt;</span><span style="color:green;">el string entre los tags</span><span style="color:gray;">&lt;/returns&gt;
</span><span style="color:blue;">public string </span>GetTagContent(<span style="color:blue;">string </span>InStr, <span style="color:blue;">string </span>Tag)
{
    <span style="color:blue;">string </span>regexp = <span style="color:maroon;">"&lt;TAG[.\\n\\s\\w=\"';#:\\(\\)]*&gt;(.*)&lt;/TAG&gt;"</span>;
    <span style="color:blue;">string </span>pattern = regexp.Replace(<span style="color:maroon;">"TAG"</span>, Tag);
    System.Text.RegularExpressions.<span style="color:teal;">Match </span>m= <span style="color:blue;">null</span>;
    <span style="color:blue;">try
    </span>{
        m = <span style="color:teal;">Regex</span>.Match(InStr,
            pattern,
            System.Text.RegularExpressions.<span style="color:teal;">RegexOptions</span>.Singleline |
            <span style="color:teal;">RegexOptions</span>.IgnoreCase);

    }
    <span style="color:blue;">catch </span>(<span style="color:teal;">Exception </span>ex)
    {
        <span style="color:teal;">MessageBox</span>.Show(ex.ToString());
    }

    <span style="color:blue;">if </span>(m != <span style="color:blue;">null</span>)
    {
        <span style="color:blue;">return </span>m.Groups[1].Value;
    }
    <span style="color:blue;">else
    </span>{
        <span style="color:blue;">return </span><span style="color:maroon;">""</span>;
    }
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=94&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/10/10/como-extraer-texto-entre-dos-tags-de-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Ocultar el texto de la barra de estado&#8230;</title>
		<link>http://apirola.wordpress.com/2008/10/06/ocultar-el-texto-de-la-barra-de-estado/</link>
		<comments>http://apirola.wordpress.com/2008/10/06/ocultar-el-texto-de-la-barra-de-estado/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 15:01:20 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[MouseOut]]></category>
		<category><![CDATA[MouseOver]]></category>
		<category><![CDATA[Status bar]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=86</guid>
		<description><![CDATA[Parece mentira pero la gente de testing paso como bug el texto que se muestra en la barra de estado del IE/FF. Bueno para los que tienen la desgracia de tener tal reporte, va el siguiente script:
 &#60;script type=&#8221;text/javascript&#8221;&#62;
function hidestatus(){
window.status=&#8221;;
return true;

}

if (document.layers)
document.captureEvents(Event.MOUSEOVER &#124; Event.MOUSEOUT);

document.onmouseover=hidestatus;
document.onmouseout=hidestatus;
 &#60;/script&#62;

       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=86&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Parece mentira pero la gente de testing paso como bug el texto que se muestra en la barra de estado del IE/FF. Bueno para los que tienen la desgracia de tener tal reporte, va el siguiente script:</p>
<blockquote><p> <span style="font-size:x-small;color:#0000ff;">&lt;</span><span style="font-size:x-small;color:#800000;">script</span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#ff0000;">type</span><span style="font-size:x-small;color:#0000ff;">=&#8221;text/javascript&#8221;&gt;<br />
</span><span style="font-size:x-small;color:#0000ff;">function</span><span style="font-size:x-small;"> hidestatus(){<br />
window.status=</span><span style="font-size:x-small;color:#800000;">&#8221;;<br />
</span><span style="font-size:x-small;color:#0000ff;">return</span><span style="font-size:x-small;"> </span><span style="font-size:x-small;color:#0000ff;">true;<br />
</span></p>
<div><span style="font-size:x-small;">}<br />
</span></div>
<div><span style="font-size:x-small;color:#0000ff;">if</span><span style="font-size:x-small;"> (document.layers)<br />
document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);<br />
</span><span style="font-size:x-small;"><br />
document.onmouseover=hidestatus;<br />
document.onmouseout=hidestatus;<br />
</span><span style="font-size:x-small;"><span style="font-size:x-small;"> </span></span><span style="font-size:x-small;color:#0000ff;">&lt;/</span><span style="font-size:x-small;color:#800000;">script</span><span style="font-size:x-small;color:#0000ff;">&gt;</span></div>
</blockquote>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/86/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/86/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/86/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=86&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/10/06/ocultar-el-texto-de-la-barra-de-estado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Buscando hosting de SVN</title>
		<link>http://apirola.wordpress.com/2008/10/05/svn-hosting/</link>
		<comments>http://apirola.wordpress.com/2008/10/05/svn-hosting/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 03:45:27 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=79</guid>
		<description><![CDATA[En a busqueda de un hosting SVN que que sea rapido, gratuito, y que permita versionar proyectos que no son Open Source (no por ser propietario sino por verguenza de que cualquiera ver menudo mamarracho) bueno he aqui un excelente indice, con una tabla comparativa de los hosting disponibles y filtros a gusto. http://www.svnhostingcomparison.com/
   [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=79&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En a busqueda de un hosting SVN que que sea rapido, gratuito, y que permita versionar proyectos que no son Open Source (no por ser propietario sino por verguenza de que cualquiera ver menudo mamarracho) bueno he aqui un excelente indice, con una tabla comparativa de los hosting disponibles y filtros a gusto. <a href="http://www.svnhostingcomparison.com/">http://www.svnhostingcomparison.com/</a></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=79&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/10/05/svn-hosting/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Python&#8230; por donde empezar?</title>
		<link>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/</link>
		<comments>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 06:49:18 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[PyDEV]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/?p=69</guid>
		<description><![CDATA[Bueno para los que como yo vienen de otros lenguajes de programacion y estan interesados en comenzar con Python creo que conseguir informacion no es lo dificil sino saber elegir.
IDE

En el campo de IDEs y editores de código gratuitos PyDEV (http://pydev.sourceforge.net/) se alza como cabeza de serie. PyDEV es un plu-gin para Eclipse que permite [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=69&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Bueno para los que como yo vienen de otros lenguajes de programacion y estan interesados en comenzar con Python creo que conseguir informacion no es lo dificil sino saber elegir.</p>
<p><strong>IDE</strong></p>
<blockquote>
<p style="text-align:left;">En el campo de IDEs y editores de código gratuitos <a title="PyDEV" href="http://pydev.sourceforge.net/"><strong>PyDEV</strong></a> (http://pydev.sourceforge.net/) se alza como cabeza de serie. PyDEV es un plu-gin para Eclipse que permite utilizar este IDE multiplataforma para programar en Python. Cuenta con autocompletado de código (con información sobre cada elemento), resaltado de sintaxis, un depurador gráfico, resaltado de errores, explorador de clases, formateo del código,<br />
refactorización, etc. Sin duda es la opción más completa, sobre todo si instalamos las extensiones comerciales, aunque necesita de una canti-dad importante de memoria y no es del todo estable.<br />
Otras opciones gratuitas a considerar son <strong>SPE</strong> o Stani’s Python Editor (http://sourceforge.net/projects/spe/), Eric (http://die-offenbachs.de/eric/), <strong>BOA Constructor </strong>(http://boa-constructor.sourceforge.net/) o incluso<br />
emacs o vim.</p>
<p style="text-align:left;">Si no te importa desembolsar algo de dinero, Komodo (http://www.activestate.com/komodo_ide/) y <strong>Wing IDE</strong> (http://www.wingware.com/) son también muy buenas opciones, con montones de características interesantes, como PyDEV, pero mucho más estables y robustos. Además, si desarrollas software libre no comercial puedes contactar con Wing Ware y obtener, con un poco de suerte, una licencia gratuita para Wing IDE Professional.</p>
<p style="text-align:left;">Fuente &#8220;Python para todos&#8221; de<strong> Raul Gonzalez Duque</strong>.<br />
<a href="http://mundogeek.net/tutorial-python/">http://mundogeek.net/tutorial-python/</a></p></blockquote>
<p style="text-align:left;">Por mi lado, tomando la sugerencia de nuestro amigo Raul,  y dado que estoy familiarizado con Eclipse, creo que la mejor eleccion es<strong> PyDEV.</strong></p>
<p style="text-align:left;">
<p style="text-align:left;"><strong>Instalacion de PyDEV</strong></p>
<p style="text-align:left;"><strong>Linux &#8211; Ubuntu, </strong>en el caso de que tengan Ubuntu 8.04 esto es muy facil. Utilizando Synaptic Packet Manager, pueden descargar el paquete pyDev y automaticamente se instalara el IDE Eclipse y el SDK de Eclipse con todas las dependencias y plugins necesarios para pyDev. O desde consola:</p>
<blockquote>
<p style="text-align:left;"><em>sudo aptitude install eclipse-pydev</em></p>
</blockquote>
<p style="text-align:left;">En cuanto al interprete, en el caso de Ubuntu 8.04 creo que viene por defecto. De no ser asi lo bajan de la misma manera:</p>
<blockquote>
<p style="text-align:left;"><em>sudo aptitude install python2.5</em></p>
</blockquote>
<p style="text-align:left;">Para otras formas de instalacion pueden ir a <a href="http://begnu.wordpress.com/2007/09/26/pydev-python-eclipse/">http://begnu.wordpress.com/2007/09/26/pydev-python-eclipse/</a></p>
<p style="text-align:left;">
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=69&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/09/28/python-por-donde-empezar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>
	</item>
		<item>
		<title>Deskew, enderezando una imagen</title>
		<link>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/</link>
		<comments>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 07:56:31 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[OCR]]></category>
		<category><![CDATA[Computer Vision]]></category>
		<category><![CDATA[Deskew]]></category>
		<category><![CDATA[Hough]]></category>
		<category><![CDATA[Images]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/</guid>
		<description><![CDATA[Download:DeskewDemo
Introduccion
Cuando trabajamos con imagenes, sobre todo con documentos digitalizados, una de las distorciones habituales es la rotacion.
En el caso de los las imagenes que contienen texto impreso o figuras rectas (subrayado, cuadros, renglones, etc.) que permitan detectar el grado de inclinacion, es posible rectificar la misma utilizando algunos algoritmos de procesamiento de imagenes y deteccion [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=64&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3>Download:<strong><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/DeskewDemo.rar">DeskewDemo</a></strong></h3>
<h3>Introduccion</h3>
<p>Cuando trabajamos con imagenes, sobre todo con documentos digitalizados, una de las distorciones habituales es la rotacion.</p>
<p>En el caso de los las imagenes que contienen texto impreso o figuras rectas (subrayado, cuadros, renglones, etc.) que permitan detectar el grado de inclinacion, es posible rectificar la misma utilizando algunos algoritmos de procesamiento de imagenes y deteccion de patrones.</p>
<p>Lo primero que deberiamos hacer es encontrar patrones de puntos colineales. Para esto podemos utilizar un algoritmo llamado <a href="http://en.wikipedia.org/wiki/Hough_transform">Hough Transformation</a>.</p>
<p><span id="more-64"></span></p>
<h3>Hough transformation</h3>
<p>A grandes rasgos este algoritmo detecta patrones de puntos colineales, co-circulares, o co-elipticos. En este caso en particular vamos a utilizarlo para detectar lineas.</p>
<p>Como pueden ver este algoritmo convierte un bitmap en un houghmap, un houghmap tiene al igual que el bitmap dos dimensiones. Una de las dimensiones es el angulo de la recta y la otra la distancia al origen.</p>
<p>Mi intencion no es explicar el algoritmo, para ampliar sobre este tema visiten wikipedia <a title="http://en.wikipedia.org/wiki/Hough_transform" href="http://en.wikipedia.org/wiki/Hough_transform">http://en.wikipedia.org/wiki/Hough_transform</a> o lean cualquier libro sobre Computer Vision como por ejemplo <em>&#8220;Hanbook of Computer Algorithms in Image Algebra&#8221;</em>, 2nd Edition by Gerhard, Ritter.</p>
<p>Para tener una idea de que hace una transformacion de Hough, veamos la siguiente imagen:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image11.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb11.png?w=452&#038;h=379" border="0" alt="image" width="452" height="379" /></a></p>
<p>Luego de aplicar una transformacion de Hough y el houghmap queda de la siguiente manera:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image12.png"><img src="http://apirola.files.wordpress.com/2008/08/image-thumb12.png?w=485&#038;h=142" border="0" alt="image" width="485" height="142" /></a></p>
<p>Cada punto en el houghmap representa el angulo de una recta  y su distancia al centro. Se pueden ver que hay dos maximo en la parte superior de la imagen y otros tantos cerca de la mitad. Cada maximo corresponde a una posible recta de la imagen original, en la siguiente figura se puede ver como se representa cada una:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image13.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb13.png?w=522&#038;h=339" border="0" alt="image" width="522" height="339" /></a></p>
<p>Si quisieramos regresar esta imagen a la horizontalidad deberiamos tomar como referencia las lineas que provienen del texto y las dos rectas paralelas a este que se encuentran a la misma altura, es decir en el mismo angulo por ser paralelas.</p>
<p>Para entender mejor como se calcula el algulo de cada recta veamos el siguiente grafico de referencia:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image14.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb14.png?w=512&#038;h=401" border="0" alt="image" width="512" height="401" /></a></p>
<p>La recta inferior se traslada con una linea perpendicular a la misma que pasa por origen y luego se mide el angulo que esta forma con el eje X. La distancia al centro se calcula sobre la recta punteada.  Es decir que si podemos calcular Tita podemos rotar la imagen 90 &#8211; tita grados (horario) para que la misma quede horizontal.</p>
<p>El problema con esta transformada es que tiene mucho costo computacional debido a que por cada punto calcula las N rectas posibles que pasan, cuando en realidad solo nos interesa una fraccion de las mismas y solo una parte de los puntos.</p>
<h3>Optimizacion de Hough para Deskew</h3>
<p>Es posible reducir mucho el tiempo de ejecucion restringiendo el angulo y los puntos admitidos bajo los siguientes criterios.</p>
<h2>Criterio de seleccion de puntos</h2>
<p>No todos lo puntos a la hora de hacer un Deskew son importantes, debemos utilizar solo aquellos que conforman la frontera inferior de las letras y no los que estan dentro o arriba de las mas mismas. En la siguiente imagen vemos que utilizando los pixeles inferiores podemos reducir enormemente el ruido en el mapa de hough dado que transformamos solo los puntos importantes:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image15.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb15.png?w=424&#038;h=186" border="0" alt="image" width="424" height="186" /></a></p>
<p>De esta manera se optienen lineas mas nitidas y maximas mas claras en el mapa de hough. Para hacer esto antes de hacer la transformacion de un punto preguntamos si es opaco y si ademas el punto justo por debajo de este es nitidamente mas claro, si esto se cumple se procede a hacer la transformacion.</p>
<h2>Seleccion de angulo</h2>
<p>Como por lo general una imagen distorcionada por rotacion no suele estarlo por angulos superiores a 20 grados, podemos descartar del mapa hough angulos superiores a 20 e inferiores a -20 grados y el mapa se reduce de la siguiente manera:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image16.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb16.png?w=498&#038;h=139" border="0" alt="image" width="498" height="139" /></a></p>
<p>El houghmap se reduce a casi 1/5 de su dimension en Y (angulo tita). Se ve claramente en esta imagen como esos dos puntos maximos (correspondientes a las dos lineas verticales) en la parte superior desaparecen.</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image17.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb17.png?w=210&#038;h=186" border="0" alt="image" width="210" height="186" align="left" /></a>En esta imagen podemos ver como queda un houghmap luego de realizar estas mejoras.</p>
<p>El mapa tiene menos ruido y los maximos son mas claros, se ha reducido notablemente  la cantidad de lineas incluidas en esta transformacion. Permitiendo una estimacion mas exacta del angulo de skew.</p>
<p>Una vez efectuada la transformacion promediamos los titas de estas rectas y rotamos la imagen segun este promedio.</p>
<h3>Solucion propuesta</h3>
<p>Para implementar estas mejoras he utilizado la libreria <a href="http://code.google.com/p/aforge/">AForge</a> de Adrew Kirillov. Que ya trae una clase para Hough Line Transformation la cual utilice como base para introducir estas mejoras. La nueva clase se llamada FastDeskew y realiza un Auto Deskew.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/apirola.wordpress.com/64/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/apirola.wordpress.com/64/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=64&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/08/24/deskew-enderezando-una-imagen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb11.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb12.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb13.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb14.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb15.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb16.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb17.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Multilingual Controls in C#, easy!</title>
		<link>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/</link>
		<comments>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 18:48:37 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[CultureInfo]]></category>
		<category><![CDATA[Lenguages]]></category>
		<category><![CDATA[Multiples]]></category>
		<category><![CDATA[Resource]]></category>
		<category><![CDATA[ResourceManager]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/</guid>
		<description><![CDATA[ Download demo Multilingual
Introduccion
Una manera rapida de proporcionar aplicaciones en multiples idiomas en C# es utilizar Culture y Embedded Resources.  Pero aun mas facil con MultilingualForm y MultilingualUserControl.
Es posible crear archivos .resx que contengan las definiciones para cada idioma y el neutral. Luego ResourceManager permite acceder a las entradas de un recurso para una determinada [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=33&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><h3><span style="color:#004080;"> </span><strong><span style="color:#004080;">Download demo</span> </strong><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/Multilingual.rar" target="_blank"><strong><span style="font-size:large;">Multilingual</span></strong></a></h3>
<h3>Introduccion</h3>
<p>Una manera rapida de proporcionar aplicaciones en multiples idiomas en C# es utilizar Culture y Embedded Resources.  Pero aun mas facil con <strong>MultilingualForm </strong>y<strong> MultilingualUserControl.</strong></p>
<p>Es posible crear archivos .resx que contengan las definiciones para cada idioma y el neutral. Luego ResourceManager permite acceder a las entradas de un recurso para una determinada cultura de la siguiente manera:</p>
<pre class="code"><span style="color:teal;">CultureInfo </span>ci = <span style="color:teal;">Thread</span>.CurrentThread.CurrentCulture;
<span style="color:teal;">Assembly </span>ass = <span style="color:teal;">Assembly</span>.GetExecutingAssembly();
<span style="color:teal;">ResourceManager </span>rm = <span style="color:blue;">new </span><span style="color:teal;">ResourceManager</span>(<span style="color:blue;">this</span>.GetType().Namespace, ass);
<span style="color:blue;">string </span>res = rm.GetString(<span style="color:maroon;">"tt_hello"</span>, ci);</pre>
<p><span id="more-33"></span></p>
<h2>Que hace ResourceManager</h2>
<p>ResourceManager recupera el recurso indicando el Assembly ass (donde fue embebido) y un string que representa el namespace + el nombre del recurso. Aqui es importante tener en cuenta que existe una convencion respecto al nombre del recurso a fin de permitirle a ResourceManager ubicar el recurso adecuado a la cultura que se utiliza en <span style="color:blue;">string </span>res = rm.GetString(<span style="color:maroon;">&#8220;tt_hello&#8221;</span>, ci);</p>
<p>Internamente ResourceManager en cada invocacion de GetString llama a una funcion privada:</p>
<blockquote>
<pre>protected virtual string <a href="http://www.koders.com/">GetResourceFileName</a> (<a href="http://www.koders.com/">CultureInfo</a> <a href="http://www.koders.com/">culture</a>)</pre>
</blockquote>
<p>Esta funcion le proporciona entonces en base a la cultura enviada como parametro en GetString, el nombre/ruta correcto del recurso almacenado en el assembly, con esto obtiene el recurso llamando a <a href="http://www.koders.com/">Assembly</a>.<a href="http://www.koders.com/">GetManifestResourceStream</a>(<a href="http://www.koders.com/">filename</a>) y luego extrae el ResourceSet, necesario para buscar el valor <span style="color:maroon;">&#8220;tt_hello&#8221;.<br />
</span><br />
<a href="http://apirola.files.wordpress.com/2008/08/image10.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb10.png?w=444&#038;h=74" border="0" alt="image" width="444" height="74" /></a></p>
<p>Para comprender mejor que hace esta clase y la forma en que gestiona los recursos pueden ver el codigo fuente Ximian para Mono en <a title="http://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx" href="http://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx">htp://www.koders.com/csharp/fid91F04E676D783C1D0FBADB4F18E62EB002099753.aspx</a></p>
<p>Por ejemplo veamos para una la siguiente aplicacion llamada Multilingual como gestionar los recursos:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image8.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb8.png?w=260&#038;h=312" border="0" alt="image" width="260" height="312" /></a></p>
<p>En el caso de este proyecto se agregaron tres archivos de recursos. Como se puede ver el nombre <strong>Res.en-US.resx</strong> es requerido para identificar que es un recurso para la cultura en-US. Es necesario tambien definir otro recurso llamado Res.resx que será luego el recurso correspondiente al lenguaje neutro.</p>
<p>Entonces para recalcar, un recurso debe tener un nombre que corresponda con el sisguiente esquema: aaaa.xx-XX.resx, siendo aaaa un nombre cualquiera, en este caso Res, y xx-XX la cultura a la cual responde el recurso.</p>
<p>Es importante destacar que ResourceManager carga un recurso especificamente del basename indicado y del assembly apuntado. Es decir si en Multilingual ejecuto la siguiente instruccion:</p>
<p>Assembly ass = Assembly.GetExecutingAssembly();<br />
<span style="color:teal;">ResourceManager</span>rm = <span style="color:blue;">new</span><span style="color:teal;">ResourceManager</span>(<span style="color:maroon;">&#8220;Multilingual.TestForm.Res&#8221;</span>, ass);</p>
<p>ResourceManager carga el recurso en la ruta &#8220;Multilingual.TestForm.Res&#8221; e ignora los que se encuentran en &#8220;Multilingual.Res&#8221;. Es decir que si utilizamos una arquitectura de plug-ins podemos incluir recursos dentro de la DLL de nuestro plug-in y de esta manera llevar un diccionario indipendiente de ser requerido.</p>
<p>Entonces una vez inicializado ResourceManager para poder traducir cada control de un Form o UserControl se debe tener en el metodo OnLoad todas las llamadas GetStrings necesarios para asignarles los valores extraidos de los recursos:</p>
<p><span style="color:blue;">btn_hello.Text</span> = rm.GetString(<span style="color:maroon;">&#8220;tt_hello&#8221;</span>, ci);</p>
<p>Esto resulta engorroso en formularios extensos y con profundidad.</p>
<h3>Como hacerlo mas facil</h3>
<p>Bien si tubieramos un par de clases que heredan de UserControl o de Form que obtenga en OnLoad el CultureInfo actual, luego recorra recursivamente el arbol completo de controles hijos que posee, identificando aquellos que tengan declarada la propiedad string Text, que verifique sea != String.Empty. y busque en el recurso cual es el valor para esa entrada de texto y cambiarlo si existiese.</p>
<p>Incluso porque no&#8230; manejar tanto recursos especificos del dominio como los superiores, dado el caso de que una definicion no exista en el local que la busque en  los del nivel superior.</p>
<p>Bueno esto es lo que hace la clase <strong>MultilingualForm</strong> y <strong>MultilingualUserControl</strong>. Las hice para no preocuparme por esta funcionoladidad y solo poner en tiempo de diseño los textos correctos en cada control por ejemplo:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image9.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb9.png?w=371&#038;h=242" border="0" alt="image" width="371" height="242" /></a></p>
<p>Cada control traducido por el metodo <strong>DoTranslate</strong> será referenciado en una HashTable que lleva el control de los Text originales y de esta manera permite la traduccion inmediata sin necesidad de reinicializar los controles (para que recuperen sus textos anteriores).</p>
<p>Como pueden ver en el ejemplo solo se requiere llamar a DoTranslate para que todos los controles adopten los textos definidos en el recurso para la cultura seleccionada.</p>
<p>Un Form que hereda de MultilingualForm <strong>no necesita codigo extra</strong> para manejar la traduccion de sus controles.</p>
<p>Aquí se puede ver como MultilingualForm o MultilingualUserControl recorre el arbol de controles identificando controles candidatos:</p>
<div style="border:1px solid gray;overflow:auto;font-size:8pt;width:97.5%;cursor:text;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;max-height:200px;margin:20px 0 10px;padding:4px;">
<div style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> TranslateControls(Control pc)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span> {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span>     <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager != <span style="color:#0000ff;">null</span>)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span>     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span>         <span style="color:#0000ff;">foreach</span> (Control c <span style="color:#0000ff;">in</span> pc.Controls)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span>         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span>             <span style="color:#0000ff;">if</span> (HasTextProperty(c))</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   8:</span>             {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   9:</span>                 <span style="color:#0000ff;">if</span> (c.Text != <span style="color:#006080;">""</span>)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  10:</span>                 {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  11:</span>                     <span style="color:#0000ff;">if</span> (transTable.Contains(c))</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  12:</span>                     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  13:</span>                         <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager.GetString((<span style="color:#0000ff;">string</span>)transTable[c], Culture) != String.Empty)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  14:</span>                         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  15:</span>                             c.Text = <span style="color:#0000ff;">this</span>.resourceManager.GetString((<span style="color:#0000ff;">string</span>)transTable[c], Culture);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  16:</span>                         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  17:</span>                     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  18:</span>                     <span style="color:#0000ff;">else</span></pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  19:</span>                     {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  20:</span>                         <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">this</span>.resourceManager.GetString(c.Text, Culture) != String.Empty)</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  21:</span>                         {</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  22:</span>                             transTable.Add(c, c.Text);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  23:</span>                             c.Text = <span style="color:#0000ff;">this</span>.resourceManager.GetString(c.Text, Culture);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  24:</span>                         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  25:</span>                     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  26:</span>                 }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  27:</span>             }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  28:</span>             <span style="color:#0000ff;">if</span> (c.Controls.Count &gt; 0) TranslateControls(c);</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  29:</span>         }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  30:</span>     }</pre>
<pre style="overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,'Courier New',courier,monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  31:</span> }</pre>
</div>
</div>
<h2>A tener en cuenta</h2>
<p>Siempre utilizar recursos nombrado: Res.xx-XX.resx donde xx-XX es la cultura.</p>
<h3><strong>Download demo</strong></h3>
<blockquote>
<h2><span style="font-size:large;"><strong></strong></span><a href="http://cid-238c4f8a6a8b9ffc.skydrive.live.com/self.aspx/SourceCode/Multilingual.rar" target="_blank"><strong><span style="font-size:large;">Multilingual</span></strong></a></h2>
</blockquote>
<p>Saludos,<br />
Alejandro</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/apirola.wordpress.com/33/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/apirola.wordpress.com/33/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/33/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/33/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/33/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=33&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/08/19/multilingual-controls-in-c-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb10.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb8.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb9.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
		<item>
		<title>Subversion con Visual Studio 2005</title>
		<link>http://apirola.wordpress.com/2008/08/18/subversion-con-visual-studio-2005/</link>
		<comments>http://apirola.wordpress.com/2008/08/18/subversion-con-visual-studio-2005/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 04:18:57 +0000</pubDate>
		<dc:creator>alejamp</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[AnkhSVN]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Visual Studio 2005]]></category>
		<category><![CDATA[VisualSVN]]></category>

		<guid isPermaLink="false">http://apirola.wordpress.com/2008/08/18/subversion-con-visual-studio-2005/</guid>
		<description><![CDATA[Una forma alternativa a SourceSafe de hacer sub versioning con Visual Studio 2005 es utilizando algunas de las posibilidades que brinda Subversion.
Subversion es un sistema open source de control de versionado de codigo, basado en Apache.

Si aun no ha trabajado con Subversion, seria recomendable empezar por aqui http://svnbook.red-bean.com/en/1.2/svn.basic.html
Servidor Subversion
Si no disponemos de un equipo con [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=19&subd=apirola&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://apirola.files.wordpress.com/2008/08/image7.png"><img style="border-right:0;border-top:0;border-left:0;border-bottom:0;margin:0 15px 0 0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb7.png?w=68&#038;h=102" border="0" alt="image" width="68" height="102" align="left" /></a>Una forma alternativa a SourceSafe de hacer sub versioning con Visual Studio 2005 es utilizando algunas de las posibilidades que brinda <a href="http://subversion.tigris.org/">Subversion</a>.</p>
<p>Subversion es un sistema open source de control de versionado de codigo, basado en Apache.</p>
<p><span id="more-19"></span></p>
<p>Si aun no ha trabajado con Subversion, seria recomendable empezar por aqui <a title="http://svnbook.red-bean.com/en/1.2/svn.basic.html" href="http://svnbook.red-bean.com/en/1.2/svn.basic.html">http://svnbook.red-bean.com/en/1.2/svn.basic.html</a></p>
<h2>Servidor Subversion</h2>
<p>Si no disponemos de un equipo con Linux y solo contamos con Windows XP/2000/2003 y queremos evitar instaslar el servidor de  Subversion manualmente, podemos instalar rapidamente un repositorio con <a href="http://www.visualsvn.com/server/">VisualSVN Server</a> (Free). Este  servidor es compatible con cualquier cliente Subversion.</p>
<p>Por su supuesto que si ya tienen un servicio SVN a mano como el de la oficina o algun otro otro <a title="SVN Hosting" href="http://apirola.wordpress.com/2008/10/05/svn-hosting/">servicio svn online</a>.</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image6.png"><img src="http://apirola.files.wordpress.com/2008/08/image-thumb6.png?w=387&#038;h=304" border="0" alt="image" width="387" height="304" /></a></p>
<p>El instalador permite configurar el puerto, usuario administrador, y si deseamos utilizar autenticacion de Windows o autenticacion independiente.</p>
<p>Luego de la instalacion utilizando VisualSVN Console Manager debemos crear un repositorio:</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image2.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb2.png?w=254&#038;h=338" border="0" alt="image" width="254" height="338" /></a></p>
<p>Luego debemos crear usuarios en el caso de haber seleccionado autenticacion por Subversion en lugar de Windows.</p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image3.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb3.png?w=266&#038;h=250" border="0" alt="image" width="266" height="250" /></a></p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image4.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb4.png?w=237&#038;h=305" border="0" alt="image" width="237" height="305" /></a></p>
<p>Presionamos Add&#8230; y creamos un usuario cualquiera.</p>
<h2>Cliente</h2>
<p>Si deseamos integrar a Visual Studio el control del codigo VisualSVN ofrece un plug-in pero lamentablemente no es libre. Una alternativa open source es <a href="http://ankhsvn.open.collab.net/">AnkhSVN</a> 2.0  de Collabnet. Si preferimos acceder a las funciones desde el explorador de Windows siempre podemos recurrir a <a href="http://tortoisesvn.tigris.org/">TortoiseSVN</a>.</p>
<h2>AnkhSVN</h2>
<p>Agrega incorpora cambios en el Solution Explorer que muestra el estado del codigo utilizando iconos, un panel de Control Cambios y varios menus contextuales.</p>
<p>Para comenzar a utilizarlo podemos crear un nuevo proyecto y en el dialogo tildar <strong>Add to Subversion.</strong></p>
<p><a href="http://apirola.files.wordpress.com/2008/08/image5.png"><img style="border-width:0;" src="http://apirola.files.wordpress.com/2008/08/image-thumb5.png?w=94&#038;h=369" border="0" alt="image" width="94" height="369" /></a></p>
<p>Una recomendacion a la hora de trabajar proyectos Visual Studio 200x sobre SVN es que cualquier directorio que se genere dinamicamente en tiempo de compilacion como OBJ y BIN deben ser excluidos del subversionado para evitar colisiones inutiles.</p>
<p>Separar las capas y modulos importantes de la solucion en proyectos ayuda a evitar problemas de coordinacion.</p>
<p>Recuerden que si en el grupo de desarrollo comienzan a gritar muy seguido HAGO COMMIT!, ESPERA QUE HAGO UPDATE, NO QUE ME TIRA CONFLLICTO, ETC. es que algo respecto a la arquitectura de la aplicacion y su distribucion en el repositorio esta mal organizada y distribuidas las tareas de los programadores.</p>
<p>De todas maneras es aconsejable instalar de manera paralela el <a title="Descargar TortoiseSVN" href="http://tortoisesvn.net/downloads">TortoiseSVN </a>(Cliente Windows) que puede correr junto con AnkhSVN sin problemas.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/apirola.wordpress.com/19/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/apirola.wordpress.com/19/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/apirola.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/apirola.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/apirola.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/apirola.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/apirola.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/apirola.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/apirola.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/apirola.wordpress.com/19/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/apirola.wordpress.com/19/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/apirola.wordpress.com/19/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=apirola.wordpress.com&blog=4535158&post=19&subd=apirola&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://apirola.wordpress.com/2008/08/18/subversion-con-visual-studio-2005/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1b00c5591200fc85743b34dbdaf792b2?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alejamp</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb7.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb6.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb2.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb3.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb4.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://apirola.files.wordpress.com/2008/08/image-thumb5.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>
	</item>
	</channel>
</rss>