<?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>il libero &#187; Software</title>
	<atom:link href="http://www.miltonpividori.com.ar/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miltonpividori.com.ar</link>
	<description>Blog de Milton Pividori</description>
	<lastBuildDate>Mon, 02 Jan 2012 04:12:27 +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>Esa cosa NoSQL</title>
		<link>http://www.miltonpividori.com.ar/2011/06/11/esa-cosa-nosql/</link>
		<comments>http://www.miltonpividori.com.ar/2011/06/11/esa-cosa-nosql/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 14:36:22 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=1050</guid>
		<description><![CDATA[Probably the worst thing about relational databases is that they are so good in what they are doing. Good enough to conquer the entire market on data storage and hold it for decades. Wait! That is a bad thing? How? It is a bad thing because relational databases are appropriate for a wide range of [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
Probably the worst thing about relational databases is that they are so good in what they are doing. Good enough to conquer the entire market on data storage and hold it for decades.</p>
<p>Wait! That is a bad thing? How?</p>
<p>It is a bad thing because relational databases are appropriate for a wide range of tasks, but not for every task [...]
</p></blockquote>
<p>Hace tiempo ya que sigo el <a href="http://ayende.com/blog">blog de Ayende Rahien</a>, uno de los principales desarrolladores de NHibernate (aunque él lo niega y dice que es el que más habla de NHibernate, no el que más desarrolla). Además es también el autor de RavenDB, una base de datos NoSQL para .NET.</p>
<p>Hace un tiempo en el trabajo, donde utilizamos Java, por distintos motivos se estuvo evaluando cambiar la base de datos actual (Apache Derby) por una <a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> (la candidata era <a href="http://code.google.com/p/orient/">OrientDB</a>). Al final no se realizó el cambio, pero me sirvió para enterarme un poco mejor de lo que se trata toda esta movida, y no solamente tener ideas sueltas sobre el tema.</p>
<p>Me gustaría compartir en este post una serie de artículos de Ayende sobre estas bases de datos. No son posts introductorios, sino que va a las preguntas más importantes como: ¿cuándo usamos una base NoSQL? De todos los tipos que hay, ¿cuál sirve para cada de problema? etc.</p>
<p><span id="more-1050"></span><br />
El año pasado escribió una introducción a este tipo de bases de datos, que pueden <a href="http://ayende.com/blog/archive/2010/03/27/that-no-sql-thing.aspx">acá</a>.</p>
<p>En su blog también hay otros post interesantes, sobre cada tipo de base NoSQL:</p>
<ul>
<li><a href="http://ayende.com/Blog/archive/2010/03/29/that-no-sql-thing-keyvalue-stores.aspx">Key/Value store</a> (<a href="http://ayende.com/Blog/archive/2010/04/07/that-no-sql-thing-ndash-key-value-stores-ndash.aspx">operaciones</a> y <a href="http://ayende.com/Blog/archive/2010/04/08/that-no-sql-thing-ndash-key-value-stores-ndash-again.aspx">usos</a>)</li>
<ul>
<li>Key/Value store – sharding</li>
<li>Key/Value store &#8211; replication</li>
<li>Key/Value store – eventually consistent</li>
</ul>
<li><a href="http://ayende.com/Blog/archive/2010/04/11/that-no-sql-thing-ndash-document-databases.aspx">Document Databases</a> (<a href="http://ayende.com/Blog/archive/2010/04/19/that-no-sql-thing-document-databases-ndash-usages.aspx">usos</a> y <a href="http://ayende.com/Blog/archive/2010/04/21/that-no-sql-thing-modeling-documents-in-a-document-database.aspx">como</a> <a href="http://ayende.com/Blog/archive/2010/05/04/document-databases-are-not-relational.aspx">modelar</a> este tipo de bases)</li>
<li><a href="http://ayende.com/Blog/archive/2010/05/06/that-no-sql-thing-graph-databases.aspx">Graph Databases</a> (<a href="http://ayende.com/Blog/archive/2010/05/07/that-no-sql-thing-scaling-graph-databases.aspx">scaling</a>)</li>
<li><a href="http://ayende.com/Blog/archive/2010/05/14/that-no-sql-thing-column-family-databases.aspx">Column (Family) Databases</a></li>
<li><a href="http://ayende.com/Blog/archive/2010/05/09/that-no-sql-thing-why-do-i-need-that-again.aspx">Why do I need that again?</a></li>
</ul>
<p>Como hay varios <em>flavours</em>, si vamos a usar una base NoSQL, lo primero sería repasar cuándo se usa cada tipo, sus puntos fuertes y débiles, y ver si eso se ajusta nuestras necesidades o no.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2011/06/11/esa-cosa-nosql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu, impresoras idénticas, udev</title>
		<link>http://www.miltonpividori.com.ar/2011/02/22/ubuntu-impresoras-identicas-udev/</link>
		<comments>http://www.miltonpividori.com.ar/2011/02/22/ubuntu-impresoras-identicas-udev/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 13:47:49 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=1004</guid>
		<description><![CDATA[Hace un tiempo, en la empresa de mi viejo, compramos dos impresoras Samsung ML-1665. Son impresoras láser y se están utilizando para imprimir facturas. La máquina de la caja, a la cual están conectadas, tiene Ubuntu 10.04. Después de seguir un excelente howto para instalarlas, la primera fue detectada correctamente y comenzó a funcionar a [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un tiempo, en la empresa de mi viejo, compramos dos impresoras Samsung ML-1665. Son impresoras láser y se están utilizando para imprimir facturas. La máquina de la caja, a la cual están conectadas, tiene Ubuntu 10.04. Después de seguir un excelente <a href="http://ubuntuforums.org/showthread.php?t=341621">howto</a> para instalarlas, la primera fue detectada correctamente y comenzó a funcionar a la perfección.</p>
<p>Al conectar la segunda impresora, exactamente igual que la primera, la detección fue también satifactoria. Aunque surgió un pequeño gran problema: al imprimir sobre ésta última, la impresión se realizaba sobre la primera. Observando la configuración de ambas, me percaté de que tenían exactamente el mismo Device URI.</p>
<p>La solución fue bastante rápida: editar el archivo /etc/cups/printers.conf, y cambiar el device URI, que era algo así como &#8220;usb:/Samsung&#8230;&#8221; por &#8220;file:/dev/usblp0&#8243;, y la otra impresora por &#8220;file:/dev/usblp1&#8243;. Con esto el problema fue resuelto y todo comenzó a funcionar como uno esperaba. Aunque no tardó en surgir otro inconveniente.</p>
<p><span id="more-1004"></span><br />
Después de un tiempo de estar funcionando todo de mil maravillas, la cajera me comenta un día que, para sorpresa de ella, las facturas A se imprimían en la impresora para las facturas B, y viceversa. Me había comentado que no fue mucho problema, ya que simplemente cambió las hojas y tema resuelto. Pero desde ese mismo instante no me quedé muy tranquilo.</p>
<p>Después de un tiempo recibo una nueva llamada: las impresoras estaban enloquecidas. Todos los días, al encender la PC, los puertos se cambiaban. Lo que en el principio era una pequeña molestia, ahora se estaba transformando en una situación bastante irritante. No estaba seguro cómo solucionarlo, así que por lo tanto intenté una actualización del sistema, lo que en apariencias lo había solucionado. Duró uno o dos meses más hasta que el problema reapareció.</p>
<p>Entonces esa vez me puse a buscar un poco más, a preguntar, y me encontré con <a href="http://en.wikipedia.org/wiki/Udev">udev</a>. Este componente del kernel Linux, encargado de gestionar dispositivos, permite, entre muchas cosas, crear reglas para: nombrarlos de una forma distinta (cambiar &#8220;sda1&#8243; por &#8220;mi_disco&#8221;), agregar links simbólicos cuando se cumplan ciertas condiciones, ejecutar comandos ante ciertos eventos, y mil cosas más.</p>
<p>Lo que tuve que hacer, entonces, es buscar algún tipo de información en los atributos de cada impresora, que sea único para la misma. Para esto utilicé el comando udevadm:</p>
<pre class="brush: bash; title: ; notranslate">
$ udevadm info -a -p  $(udevadm info -q path -n /dev/usblp0)

[...]

  looking at parent device '/devices/pci0000:00/0000:00:1d.3/usb5/5-2':
    KERNELS==&quot;5-2&quot;
    SUBSYSTEMS==&quot;usb&quot;
    DRIVERS==&quot;usb&quot;
    ATTRS{configuration}==&quot;&quot;
    ATTRS{bNumInterfaces}==&quot; 1&quot;
    ATTRS{bConfigurationValue}==&quot;1&quot;
    ATTRS{bmAttributes}==&quot;c0&quot;
    ATTRS{bMaxPower}==&quot;  0mA&quot;
    ATTRS{urbnum}==&quot;1368&quot;
    ATTRS{idVendor}==&quot;04e8&quot;
    ATTRS{idProduct}==&quot;3301&quot;
    ATTRS{bcdDevice}==&quot;0100&quot;
    ATTRS{bDeviceClass}==&quot;00&quot;
    ATTRS{bDeviceSubClass}==&quot;00&quot;
    ATTRS{bDeviceProtocol}==&quot;00&quot;
    ATTRS{bNumConfigurations}==&quot;1&quot;
    ATTRS{bMaxPacketSize0}==&quot;16&quot;
    ATTRS{speed}==&quot;12&quot;
    ATTRS{busnum}==&quot;5&quot;
    ATTRS{devnum}==&quot;2&quot;
    ATTRS{version}==&quot; 1.10&quot;
    ATTRS{maxchild}==&quot;0&quot;
    ATTRS{quirks}==&quot;0x0&quot;
    ATTRS{authorized}==&quot;1&quot;
    ATTRS{manufacturer}==&quot;Samsung Electronics Co., Ltd.&quot;
    ATTRS{product}==&quot;ML-1660 Series&quot;
    ATTRS{serial}==&quot;Z526BKDZ800022B.&quot;
</pre>
<p>El atributo <em>serial</em> es el que difiere en cada impresora, por lo tanto utilicé éste para crear un archivo <em>/etc/udev/rules.d/impresoras.rules</em> con las siguientes reglas:</p>
<pre class="brush: bash; title: ; notranslate">
SUBSYSTEMS==&quot;usb&quot;, ATTRS{product}==&quot;ML-1660 Series&quot;, ATTRS{serial}==&quot;Z526BKAZ301606A.&quot;, SYMLINK+=&quot;impr_fa&quot;
SUBSYSTEMS==&quot;usb&quot;, ATTRS{product}==&quot;ML-1660 Series&quot;, ATTRS{serial}==&quot;Z526BKDZ800022B.&quot;, SYMLINK+=&quot;impr_fb&quot;
</pre>
<p>Una vez guardado el archivo, hacen un &#8220;service udev reload&#8221;, desenchufan y vuelven a enchufar las impresoras, y verán que aparecen los dispositivos &#8220;impr_fa&#8221; e &#8220;impr_fb&#8221;. Ahora estos serán siempre fijos y aputarán siempre al mismo dispositivo físico (en teoría, les cuento en unos meses). Tal cual lo que estaba buscando. Si hacemos un &#8220;ls&#8221; vemos:</p>
<pre class="brush: bash; title: ; notranslate">
$ ls -l /dev/impr*
lrwxrwxrwx 1 root root 7 2011-02-22 07:34 /dev/impr_fa -&gt; usb/lp1
lrwxrwxrwx 1 root root 7 2011-02-22 10:25 /dev/impr_fb -&gt; usb/lp0
</pre>
<p>Pueden encontrar más información sobre cómo escribir reglas udev en <a href="http://reactivated.net/writing_udev_rules.html">este link</a>. A mí me vino muy bien para las impresoras, pero se podrían hacer cosas interesantes con pendrives y otros dispositivos.</p>
<p>Cuando les mostré esto a <a href="http://www.cesarsandrigo.com.ar/">César</a> y a <a href="http://nacho.larrateguy.com.ar/">Nacho</a>, nos preguntábamos si en Windows será posible hacer algo similar. Una de las respuestas fue: <em>&#8220;estas cosas [impresoras enloquecidas] no pasan en Windows&#8221;</em> <img src='http://www.miltonpividori.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  y <em>&#8220;seguramente debe tener alguna forma de configurarlo&#8221;</em>. Solo por curiosidad: ¿alguien tiene alguna información al respecto?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2011/02/22/ubuntu-impresoras-identicas-udev/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gtk3 y HTML5</title>
		<link>http://www.miltonpividori.com.ar/2010/11/24/gtk3-y-html5/</link>
		<comments>http://www.miltonpividori.com.ar/2010/11/24/gtk3-y-html5/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 12:50:34 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=941</guid>
		<description><![CDATA[Hoy me encontré con un impresionante video en el Planet GNOME: Ojalá los bindings para Mono no se retrasen mucho.]]></description>
			<content:encoded><![CDATA[<p>Hoy me encontré con un impresionante video en el <a href="http://planet.gnome.org/">Planet GNOME</a>:</p>
<p><object type="application/x-shockwave-flash" data="http://www.vimeo.com/moogaloop.swf" width="480" height="322" id="vvq-143-vimeo-1" style="visibility: visible; "><param name="wmode" value="opaque"><param name="allowfullscreen" value="true"><param name="allowscriptacess" value="always"><param name="flashvars" value="wmode=opaque&amp;allowfullscreen=true&amp;allowscriptacess=always&amp;server=www.vimeo.com&amp;clip_id=17132064&amp;show_portrait=0&amp;show_title=1&amp;show_byline=1&amp;fullscreen=1"></object></p>
<p>Ojalá los bindings para Mono no se retrasen mucho.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2010/11/24/gtk3-y-html5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Cuál es mi estrategia para ser un mejor desarrollador?</title>
		<link>http://www.miltonpividori.com.ar/2010/05/21/%c2%bfcual-es-mi-estrategia-para-ser-un-mejor-desarrollador/</link>
		<comments>http://www.miltonpividori.com.ar/2010/05/21/%c2%bfcual-es-mi-estrategia-para-ser-un-mejor-desarrollador/#comments</comments>
		<pubDate>Fri, 21 May 2010 20:07:18 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=866</guid>
		<description><![CDATA[Hace unos días, por twitter, me entero de un post de hace unos dos años de Angel &#8220;Java&#8221; López. ¿Qué hago para ser mejor en lo que me gusta? Algunos puntos que se mencionan, para reforzar o para comenzar a implementar si todavía no lo hago: Hay mejores desarrolladores que yo. Tengo que ver cómo [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días, por twitter, me entero de <a href="http://ajlopez.wordpress.com/2008/09/21/codethinked-what-is-your-strategy-for-becoming-a-better-developer/">un post de hace unos dos años</a> de <a href="http://ajlopez.wordpress.com/">Angel &#8220;Java&#8221; López</a>. ¿Qué hago para ser mejor en lo que me gusta?</p>
<p>Algunos puntos que se mencionan, para reforzar o para comenzar a implementar si todavía no lo hago:</p>
<ul>
<li><strong>Hay mejores desarrolladores que yo</strong>. Tengo que ver cómo trabajan y así obtener algunos tips para superarme a mí mismo.</li>
<li><strong>Leer</strong>. Tanto blogs como código fuente de otros. Hay muchísimo conocimiento ahí afuera.</li>
<li><strong>Lo que aprendo y se, lo comparto</strong>. Esto ayuda muchísimo a reforzar el conocimiento. Si les muestro a los demás lo que pienso y hago puedo obtener valioso feedback para saber si realmente estoy haciéndolo bien. Además esto me puede ayudar a identificar problemas específicos y contar con la experiencia de otros para resolverlos.</li>
<li><strong>Hablar</strong>. Entrar en contacto con mi grupo local o en la facultad y dar una charla de lo que se. Además esto hace que los demás me conozcan. Pero sobre todo, como dice López, cuando enseño, aprendo. Interesante para los que se sientan llamados a la docencia.</li>
<li><strong>Practicar</strong>. Jugar e implementar algo para probar una idea. Luego publicarlo y mostrarlo a los demás. Por ejemplo escribir un intérprete: en esto Ángel López es experto, de vez en cuando escribe uno y lo publica en su blog.</li>
<li><strong>Aprender cosas nuevas</strong>. Ir más allá de lo que se. Un lenguaje, una plataforma, una técnica de programación, una metodología&#8230;</li>
</ul>
<p>Y si bien ya está implícito, yo agregaría uno más: siempre mantener un cierto <strong>aire de inconformismo</strong> con lo que hacemos. El software siempre se puede mejorar, siempre podemos ser un poco mejores en lo que hacemos.</p>
<p>¿Ustedes qué estrategia tienen?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2010/05/21/%c2%bfcual-es-mi-estrategia-para-ser-un-mejor-desarrollador/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>TDD con Python</title>
		<link>http://www.miltonpividori.com.ar/2009/12/26/tdd-con-python/</link>
		<comments>http://www.miltonpividori.com.ar/2009/12/26/tdd-con-python/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 14:42:06 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=804</guid>
		<description><![CDATA[Excelente serie de videos donde se muestra cómo hacer TDD con Python. Como dice Angel &#8220;Java&#8221; López en un post, cuando uno comienza a hacer TDD, luego no puede dejarlo. Además las herramientas utilizadas me encantaron, sobre todo pyTDDmon, que en una ventanita en colores rojo y verde nos indica el estado actual de los [...]]]></description>
			<content:encoded><![CDATA[<p>Excelente serie de videos donde se muestra cómo hacer TDD con Python. Como dice Angel &#8220;Java&#8221; López en <a href="http://msmvps.com/blogs/lopez/archive/2009/12/24/python_2D00_tdd_2D00_example.aspx">un post</a>, cuando uno comienza a hacer TDD, luego no puede dejarlo. Además las herramientas utilizadas me encantaron, sobre todo pyTDDmon, que en una ventanita en colores rojo y verde nos indica el estado actual de los tests de unidad.</p>
<p>Este es el primero de la serie:</p>
<p><object width="450" height="340"><param name="movie" value="http://www.youtube.com/v/sD6qzJNQEpE&#038;hl=es_ES&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/sD6qzJNQEpE&#038;hl=es_ES&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="450" height="340"></embed></object></p>
<p>Los demás videos los pueden encontrar <a href="http://www.youtube.com/watch?v=QTrGVf39Unk">en</a> <a href="http://www.youtube.com/watch?v=ATsCl00OyDU">estos</a> <a href="http://www.youtube.com/watch?v=YPDjWgYor0Y">links</a>.</p>
<p>Es muy buena la explicación de &#8220;Java&#8221; Lopez:</p>
<blockquote><p>
Implementa algo sencillo: código que dado un string con una URL, identificar el protocolo, el dominio, y el recurso que está contenida en esa dirección. En TDD, se va escribiendo el test, el código que pasa el test, y se va progresando de a poco. No hace falta escribir el código correcto y completo desde el principio. Como en otras tantas actividades, el “baby-step”, el “pequeños pasos” de avance, nos ayuda para ir incrementalmente produciendo el resultado esperado.</p>
<p>Noten el ciclo rojo-verde-refactor, el código mínimo que se agrega en cada tests (a veces, retornando valores puestos a mano, sólo para pasar los tests), refactorizando el test si hay código duplicado, las micro-decisiones de diseño que se van tomando, etc… Excelente trabajo para mostrar en video!
</p></blockquote>
<p>Además otra cosa interesante, no directamente relacionado con TDD pero si con las pruebas de unidad, es la cantidad de veces que el autor prueba distintas implementaciones sin preocuparse, ya que tiene toda una suite de tests para saber si la misma es válida. Eso es algo hermoso <img src='http://www.miltonpividori.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En <a href="http://www.makinggoodsoftware.com">Making Good Software</a>, leí una vez un post muy interesante titulado <a href="http://www.makinggoodsoftware.com/2009/11/21/tdd-is-not-about-testing/">&#8220;TDD is not about testing!!!&#8221;</a> que me llamó mucho la atención al principio. Mucha gente piensa que escribir los tests primero es hacer TDD, lo cual es incorrecto. TDD es una práctica de diseño, y es todo un proceso:</p>
<p><a href="http://www.miltonpividori.com.ar/wp-content/uploads/2009/12/Test-driven_development.png"><img src="http://www.miltonpividori.com.ar/wp-content/uploads/2009/12/Test-driven_development-300x215.png" alt="Test-driven development" title="Test-driven development" width="300" height="215" class="aligncenter size-medium wp-image-805" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/12/26/tdd-con-python/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Si usás Buildbot con Mercurial&#8230;</title>
		<link>http://www.miltonpividori.com.ar/2009/11/28/si-usas-buildbot-con-mercurial/</link>
		<comments>http://www.miltonpividori.com.ar/2009/11/28/si-usas-buildbot-con-mercurial/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 19:14:42 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=749</guid>
		<description><![CDATA[&#8230; y la versión de Buildbot es la 0.7.11p3 (la última al momento de escribir este post) y Mercurial 1.3.1, que son las versiones que están en Karmic, quizá tengas un problema cuando el Build Slave intenta bajar el código del repositorio para comenzar el ciclo de compilación/testing. Buildbot permite configurar de varias formas el [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230; y la versión de <a href="http://buildbot.net/">Buildbot</a> es la 0.7.11p3 (la última al momento de escribir este post) y <a href="http://mercurial.selenic.com/">Mercurial</a> 1.3.1, que son las versiones que están en Karmic, quizá tengas un problema cuando el Build Slave intenta bajar el código del repositorio para comenzar el ciclo de compilación/testing.</p>
<div id="attachment_757" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.miltonpividori.com.ar/wp-content/uploads/2009/11/overview.png"><img src="http://www.miltonpividori.com.ar/wp-content/uploads/2009/11/overview-300x180.png" alt="Arquitectura de Buildbot" title="overview" width="300" height="180" class="size-medium wp-image-757" /></a><p class="wp-caption-text">Arquitectura de Buildbot</p></div>
<p>Buildbot permite <a href="http://djmitche.github.com/buildbot/docs/0.7.11/#Source-Checkout">configurar de varias formas el modo en que va a obtener el código fuente del proyecto y cómo realizará las actualizaciones subsiguientes</a>. Por ejemplo, el modo &#8220;update&#8221; hace que las operaciones de checkout/update se ejecuten en el directorio de trabajo, y no en uno independiente, como en el modo &#8220;copy&#8221; o &#8220;clobber&#8221;, que mantienen un directorio separado y limpio del repositorio (en el caso de Mercurial, &#8220;copia de trabajo&#8221; en el caso de Subversion) y hacen una copia del mismo para realizar la compilación (esto asegura que siempre se compile todo y que no influyan archivos generados en procesos anteriores, además de otros problemas menos comunes pero que existen).</p>
<p>El problema que estuve teniendo es cuando utilizo Mercurial. Al intentar traer el código fuente, Buildbot entra en un bucle infinito donde realiza el checkout (clone), borra el directorio, otra vez clone y asi&#8230; me pareció rarísimo el comportamiento. Versiones anteriores de Buildbot con versiones anteriores de Mercurial funcionan bien.</p>
<p>En uno de los pasos para realizar el checkout/update, Buildbot verifica si ha cambiado la URL del repositorio. Si esto es así, entonces hace clobbering, o sea, vuelve a bajar todos los cambios (checkout) y obviamente no realiza un update, aunque el modo no sea &#8220;clobbering&#8221;. Para saber si dicha URL ha cambiado, ejecuta un &#8220;hg paths default&#8221; en el directorio de trabajo y lo compara con la URL asignada en el archivo de configuración central del Build Master.</p>
<p>El bug está en que al ejecutar &#8220;hg paths default&#8221; Mercurial 1.3.1 devuelve el password oculto con asteriscos:</p>
<pre class="brush: bash; title: ; notranslate">
$ hg paths default 

http://miltondp:***@url.mi_proyecto.com/path/al/repo
</pre>
<p>&#8230; y, obviamente, la URL asignada en el archivo de configuración está completa (sin el password oculto). Al compararse ambas, son distintas, y por lo tanto siempre se hace clobbering.</p>
<p><span id="more-749"></span><br />
Rápidamente me fijé si Mercurial poseía alguna opción para mostrar el password en la salida de &#8220;hg paths&#8221;. No posee dicha opción por lo visto, pero me encontré con <a href="http://www.selenic.com/pipermail/mercurial-devel/2009-February/010529.html">un parche</a> que alguien envió alguna vez, el cual parece que nunca fue incluido. El mismo agrega la opción &#8220;&#8211;show-passwords&#8221; para mostrar la URL completa al ejecutar &#8220;hg paths&#8221;. Lo pueden bajar <a href="http://www.miltonpividori.com.ar/files/mercurial_commands.patch">aquí</a>. El archivo a parchear es <em>&#8220;/usr/lib/pymodules/python2.6/mercurial/commands.py&#8221;</em>.</p>
<p>También hay que parchear Buildbot para que utilice esta nueva opción al comparar los repositorios. Este otro parche lo pueden bajar desde <a href="http://www.miltonpividori.com.ar/files/buildbot_commands.patch">este lugar</a>. Tener en cuenta que el archivo a parchear tiene el mismo nombre que el de Mercurial. El path del mismo es <em>&#8220;/usr/lib/python2.6/dist-packages/buildbot/slave/commands.py&#8221;</em></p>
<p>No se olviden de reiniciar el servicio de Buildbot, y de borrar los archivos .pyc de Python (por lo visto a veces funciona aunque no lo borremos). Ahora el ciclo funciona como uno espera:</p>
<p><a href="http://www.miltonpividori.com.ar/wp-content/uploads/2009/11/buildbot.png"><img src="http://www.miltonpividori.com.ar/wp-content/uploads/2009/11/buildbot-257x300.png" alt="buildbot" title="buildbot" width="257" height="300" class="aligncenter size-medium wp-image-763" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/11/28/si-usas-buildbot-con-mercurial/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Gtk+: trabajando con TreeViews</title>
		<link>http://www.miltonpividori.com.ar/2009/06/22/gtk-trabajando-con-treeviews/</link>
		<comments>http://www.miltonpividori.com.ar/2009/06/22/gtk-trabajando-con-treeviews/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 13:32:47 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[Facultad]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[Mono/.NET]]></category>
		<category><![CDATA[Proyectos]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=668</guid>
		<description><![CDATA[Este post puede ser útil para los que utilicen el widget TreeView de Gtk+ (no importa el lenguaje mientras haya bindings), y necesiten activar por código celdas en modo edición. Hay algunas cuestiones a tener en cuenta. Para el Proyecto Final de Carrera estamos desarrollando un sistema de nivel operativo, con funciones de facturación y [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miltonpividori.com.ar/wp-content/uploads/2009/06/edicion-treeview1.png" alt="edicion-treeview1" title="edicion-treeview1" width="186" height="69" class="alignright size-full wp-image-685" /></p>
<p>Este post puede ser útil para los que utilicen el widget <a href="http://library.gnome.org/devel/gtk/unstable/GtkTreeView.html">TreeView</a> de <a href="http://www.gtk.org/">Gtk+</a> (no importa el lenguaje mientras haya bindings), y necesiten activar por código celdas en modo edición. Hay algunas cuestiones a tener en cuenta.</p>
<p>Para el Proyecto Final de Carrera estamos desarrollando un sistema de nivel operativo, con funciones de facturación y demás. Necesitamos manejar un TreeView con campos editables, y al finalizar la edición de uno de ellos es necesario dar el foco a otro campo en modo edición, listo para que el usuario comience a cargar datos sin tocar el mouse.</p>
<p><span id="more-668"></span><br />
Lo primero que hicimos fue conectar un método al evento <a href="http://library.gnome.org/devel/gtk/unstable/GtkCellRendererText.html#GtkCellRendererText-edited">Edited</a> del <a href="http://library.gnome.org/devel/gtk/unstable/GtkCellRendererText.html">CellRendererText</a> de la columna correspondiente. De esta forma, cuando terminamos la edición en el primer campo, podemos colocar allí el código correspondiente para actualizar el modelo del TreeView y otras operaciones más, entre ellas (la que nos interesa) dar el foco al segundo campo en modo edición. La parte final de este método (el evento se activa al finalizar la edición) había quedado así:</p>
<pre class="brush: csharp; title: ; notranslate">
/* ... */

this.tvItems.SetCursor(path,
					   this.tvcCodigoProducto,
					   true);
</pre>
<p>Hay que tener cuidado al utilizar la función <a href="http://library.gnome.org/devel/gtk/unstable/GtkTreeView.html#gtk-tree-view-set-cursor">SetCursor</a>. En algunos casos, si no la usamos cuidadosamente, el TreeView no se comportará en forma correcta. Esos casos son por ejemplo cuando el usuario, al estar editando el campo, hace click en otra fila. Esto hace que se dispare el evento <em>Edited</em>, y por lo tanto se activa el modo edición en el segundo campo (SetCursor), pero el foco lo tiene otra fila, y esto hace que el funcionamiento sea incorrecto.</p>
<p>La solución es, antes de ejecutar SetCursor, verificar qué tipo de evento ha ocurrido. En nuestro caso, ejecutamos dicha función sólo si se ha oprimido la tecla <em>Return</em>. El código queda así:</p>
<pre class="brush: csharp; title: ; notranslate">
/* Una vez editada la cantidad, automáticamente
 * pasamos el foco al campo de 'código' en modo
 * edición, pero en una nueva fila. A esto lo hacemos
 * únicamente si el usuario presionó la tecla Enter */

Gdk.Event ev = Gtk.Application.CurrentEvent;

if (ev.Type == Gdk.EventType.KeyPress) {
	Gdk.EventKey evKey = (Gdk.EventKey)ev;

	if (evKey.Key == Gdk.Key.Return)
		this.tvItems.SetCursor(path,
							   this.tvcCodigoProducto,
							   true);
}
</pre>
<p>Lo cual es más lógico también: si se hace click en otra fila, seguramente es porque se quiere editar otro ítem y por lo tanto no es correcto forzar el foco en otro lugar. Además, como se dijo, esto hacía que el TreeView quede en un estado inconsistente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/06/22/gtk-trabajando-con-treeviews/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>sl: Steam Locomotive</title>
		<link>http://www.miltonpividori.com.ar/2009/05/06/sl-steam-locomotive/</link>
		<comments>http://www.miltonpividori.com.ar/2009/05/06/sl-steam-locomotive/#comments</comments>
		<pubDate>Wed, 06 May 2009 15:08:25 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Humor]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=650</guid>
		<description><![CDATA[¿Nunca escribieron LS o sl cuando en realidad quisieron ejecutar &#8220;ls&#8221; en la terminal? Bueno, si les pasó, habrán visto que en Ubuntu salta el siguiente mensaje: La primera vez que lo vi me pareció extraño, así que instalé el paquete &#8220;sl&#8221; como me sugería. La descripción del paquete es esta: Me imagino que tendrán [...]]]></description>
			<content:encoded><![CDATA[<p>¿Nunca escribieron <em>LS</em> o <em>sl</em> cuando en realidad quisieron ejecutar &#8220;ls&#8221; en la terminal? Bueno, si les pasó, habrán visto que en Ubuntu salta el siguiente mensaje:</p>
<pre class="brush: plain; title: ; notranslate">
$ sl
El programa «sl» no está instalado actualmente.  Puede instalarlo escribiendo:
sudo apt-get install sl
bash: sl: orden no encontrada
</pre>
<p>La primera vez que lo vi me pareció extraño, así que instalé el paquete &#8220;sl&#8221; como me sugería. La descripción del paquete es esta:</p>
<pre class="brush: plain; title: ; notranslate">
Correct you if you type `sl' by mistake
Sl is a program that can display animations aimed to correct you
if you type 'sl' by mistake.
SL stands for Steam Locomotive.
</pre>
<p>Me imagino que tendrán ahora la intriga de qué es lo que pasa si ejecutan &#8220;sl&#8221;. Simplemente tengan cuidado <img src='http://www.miltonpividori.com.ar/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/05/06/sl-steam-locomotive/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netboot install con dnsmasq</title>
		<link>http://www.miltonpividori.com.ar/2009/04/09/netboot-install-con-dnsmasq/</link>
		<comments>http://www.miltonpividori.com.ar/2009/04/09/netboot-install-con-dnsmasq/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 21:15:01 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=625</guid>
		<description><![CDATA[Tengo en mi casa un Pentium III de 800 MHz con 128 MBs de RAM. Es de César y la vamos a utilizar para el proyecto. No tiene lectora de CD y no tiene soporte para bootear por la red. Les muestro en este post lo que tuve que hacer para instalar Ubuntu Server en [...]]]></description>
			<content:encoded><![CDATA[<p>Tengo en mi casa un Pentium III de 800 MHz con 128 MBs de RAM. Es de César y la vamos a utilizar para el proyecto. No tiene lectora de CD y no tiene soporte para bootear por la red. Les muestro en este post lo que tuve que hacer para instalar Ubuntu Server en una máquina así, de esta forma si lo tienen que hacer se ahorran trabajo.</p>
<p><span id="more-625"></span></p>
<h3>Escenario</h3>
<p>La máquina que tendrá el servidor DHCP, TFTP y compartirá Internet es mi notebook, que se llama <em>wasabi</em> (a mí si me gusta el nombre <img src='http://www.miltonpividori.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). La PC target se llamará <em>tellus</em>. Desde mi notebook me conecto a un router via wifi (el cual me brinda Internet), y a tellus por cable. La interfaz de la primer conexión es wlan0, y la de la segunda eth0.</p>
<h3>Procedimiento</h3>
<h4>wasabi</h4>
<ul>
<li>En wasabi solamente es necesario tener dnsmasq instalado (hará de servidor DHCP y además tiene un server TFTP incluido).</li>
<li>La IP de wasabi será 192.168.0.1</li>
<li>Editamos las opciones en /etc/dnsmasq.conf. Agregamos las siguientes lineas (asegúrense de que el archivo no tenga otras opciones conflictivas activadas):</li>
</ul>
<pre class="brush: plain; title: ; notranslate">
listen-address=192.168.0.1
interface=eth0

dhcp-no-override
dhcp-range=192.168.0.30,192.168.0.60,12h

dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/var/ftpd
</pre>
<ul>
<li>Coloquen el CD de Ubuntu Server (o la versión que sea) en su lectora, y copien los archivos necesarios para realizar la instalación por red:</li>
</ul>
<pre class="brush: plain; title: ; notranslate">
$ sudo cp -ar /media/cdrom0/install/netboot/* /var/ftpd
</pre>
<ul>
<li>Otra opción al paso anterior es bajarse los archivos desde Internet, para <a href="http://archive.ubuntu.com/ubuntu/dists/intrepid/main/installer-i386/current/images/netboot/netboot.tar.gz">Intrepid</a> o para <a href="http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/netboot.tar.gz">Jaunty</a> por ejemplo.</li>
<li># sudo service dnsmasq restart</li>
<li>En este punto ya tenemos andando dnsmasq, como servidor DHCP, DNS y TFTP.</li>
<li>Activamos IP Masquerading:</li>
</ul>
<pre class="brush: plain; title: ; notranslate">
# echo 1 &gt; /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
</pre>
<ul>
<li>Como les dije, tellus no puede bootear directamente por red, así que es necesario crear un disquette con <a href="http://www.rom-o-matic.net/">gPXE</a>. Tienen que elegir el modelo de placa de red exacto de la máquina target (tellus en este caso) para poder bootear, traer la imagen desde wasabi y arrancar la instalación. Una vez bajada, pueden grabarla en un disquette (que difícil conseguir un disquette estos días&#8230; y uno que ande) con <a href="http://www.manpagez.com/man/1/dd/">dd</a> en GNU/Linux o <a href="http://www.chrysocome.net/rawwrite">rawwritewin</a> en Windows.</li>
</ul>
<h4>tellus</h4>
<ul>
<li>Colocan el disquette creado y bootean desde él. Deberían ver cómo la máquina target pide una IP y arranca el instalador de Ubuntu.</li>
</ul>
<p>Listo, eso es todo. Un inconveniente que tuve fue resuelto con la opción &#8220;dhcp-no-override&#8221; que les mostré arriba, para dnsmasq. Resulta que en modo normal no arma paquetes DHCP del todo estándar, y que hacían tellus no pueda encontrar la opción de &#8220;archivo de booteo&#8221; al recibir el paquete DHCP.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/04/09/netboot-install-con-dnsmasq/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mono C# Shell</title>
		<link>http://www.miltonpividori.com.ar/2009/02/12/mono-c-shell/</link>
		<comments>http://www.miltonpividori.com.ar/2009/02/12/mono-c-shell/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 18:41:42 +0000</pubDate>
		<dc:creator>miltondp</dc:creator>
				<category><![CDATA[Mono/.NET]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Libre]]></category>

		<guid isPermaLink="false">http://www.miltonpividori.com.ar/?p=593</guid>
		<description><![CDATA[El otro día necesitaba saber bien cómo funcionaba el método Remove de la clase StringBuilder en Mono. Entonces hice lo siguiente: Si, funcionaba como me lo imaginaba Esta shell para C# está disponible en la versión 2.2 de Mono.]]></description>
			<content:encoded><![CDATA[<p>El otro día necesitaba saber bien cómo funcionaba el método <em>Remove</em> de la clase <em>StringBuilder</em> en Mono. Entonces hice lo siguiente:</p>
<pre class="brush: plain; title: ; notranslate">
miltondp@wasabi:~$ csharp
Mono C# Shell, type &quot;help;&quot; for help

Enter statements below.
csharp&gt; using System.Text;
csharp&gt; var a = new StringBuilder(&quot;Milton&quot;);
csharp&gt; a.Remove(a.Length-1,1);
Milto
csharp&gt; a.Remove(a.Length-1,1);
Milt
csharp&gt; a.Remove(a.Length-1,1);
Mil
csharp&gt; a.Remove(a.Length-1,1);
Mi
csharp&gt; a.Remove(a.Length-1,1);
M
csharp&gt; a.Remove(a.Length-1,1); 

csharp&gt;
</pre>
<p>Si, funcionaba como me lo imaginaba <img src='http://www.miltonpividori.com.ar/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Esta shell para C# está disponible en la versión 2.2 de Mono.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miltonpividori.com.ar/2009/02/12/mono-c-shell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

