<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>MilMazz</title>
	
	<link>http://blog.milmazz.com.ve</link>
	<description>MilMazz, es el weblog personal de Milton Mazzarri, estudiante de Ingeniería de Sistemas y entusiasta por la filosofía detrás del Software Libre. Intento discutir temas afines a la Tecnología, Internet, Software Libre y algunos otros tópicos que llaman mi atención.</description>
	<lastBuildDate>Tue, 16 Mar 2010 05:54:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/milmazz/blog" /><feedburner:info uri="milmazz/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>milmazz/blog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Sistema de manejo y seguimiento de proyectos: Trac</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/mpv_hVq83O4/sistema-de-manejo-y-seguimiento-de-proyectos-trac</link>
		<comments>http://blog.milmazz.com.ve/archivos/2010/03/16/sistema-de-manejo-y-seguimiento-de-proyectos-trac#comments</comments>
		<pubDate>Tue, 16 Mar 2010 05:54:43 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[Ingeniería del Software]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/?p=263</guid>
		<description><![CDATA[Trac es un sistema multiplataforma desarrollado y mantenido por Edgewall Software, el cual está orientado al seguimiento y manejo de proyectos de desarrollo de software haciendo uso de un enfoque minimalista basado en la Web, su misión es ayudar a los desarrolladores a escribir software de excelente calidad mientras busca no interferir con el proceso [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/trac_logo.png"><img class="alignleft size-full wp-image-272" src="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/trac_logo.png" alt="Trac logo" width="214" height="61" /></a><a title="Trac, Edgewall Software" href="http://trac.edgewall.org">Trac</a> es un sistema multiplataforma desarrollado y mantenido por <a title="Edgewall Software" href="http://edgewall.org">Edgewall Software</a>, el cual está orientado al seguimiento y manejo de proyectos de desarrollo de <em>software</em> haciendo uso de un enfoque minimalista basado en la <em>Web</em>, su misión es ayudar a los desarrolladores a escribir software de excelente calidad mientras busca no interferir con el proceso y políticas de desarrollo. Incluye un sistema <em>wiki</em> que es adecuado para el manejo de la base de conocimiento del proyecto, fácil integración con sistemas de control de versiones<sup>1</sup>. Además incluye una interfaz para el seguimiento de tareas, mejoras y reporte de errores por medio de un completo y totalmente personalizable sistema de <em>tickets</em>, todo esto con el fin de ofrecer una interfaz integrada y consistente para acceder a toda información referente al proyecto de desarrollo de software. Además, todas estas capacidades son extensibles por medio de <em>plugins</em> o complementos desarrollados específicamente para Trac.</p>
<h4>Breve historia de Trac</h4>
<p>El origen de Trac no es una idea original, algunos de sus objetivos se basan en los diversos sistemas de manejo y seguimiento de errores que existen en la actualidad, particularmente del sistema <a title="CVSTrac" href="http://cvstrac.org/">CVSTrac</a> y sus autores.</p>
<p>Trac comenzó como la <a href="http://trac.edgewall.org/wiki/TracHistory">reimplementación</a> del sistema CVSTrac en el lenguaje de programación <a title="Python Programming Language" href="http://www.python.org">Python</a> y como ejercicio de entretenimiento, además de utilizar la base de datos embebida <a href="http://www.sqlite.org">SQLite</a><sup>2</sup>. En un corto lapso de tiempo, el alcance de estos esfuerzos iniciales crecieron en gran medida, se establecieron metas y en el presente Trac presenta un curso de desarrollo propio.</p>
<p>Los desarrolladores de <em>Edgewall Software</em> esperan que Trac sea una plataforma viable para explorar y expandir el cómo y qué puede hacerse con sistemas de manejo de proyectos de desarrollo de software basados en sistemas wiki.</p>
<h4>Características de Trac</h4>
<p>A continuación se presenta una descripción breve de las distintas características de Trac.</p>
<h5>Herramienta de código abierto para el manejo de proyectos</h5>
<p>Trac es una herramienta ligera para el manejo de proyectos basada en la <em>Web</em>, desarrollada en el lenguaje de programación Python. Está enfocada en el manejo de proyectos de desarrollo de software, aunque es lo suficientemente flexible para usarla en muchos tipos de proyectos. Al ser una herramienta de <a href="http://trac.edgewall.org/wiki/TracLicense">código abierto</a>, si Trac no llena completamente sus necesidades, puede aplicar los cambios necesarios usted mismo, escribir complementos o <em>plugins</em>, o contratar a alguien calificado que lo haga por usted.</p>
<h5>Sistema de tickets</h5>
<div id="attachment_273" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/tickets.png"><img class="size-medium wp-image-273" src="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/tickets-300x193.png" alt="Vista de tickets en Trac" width="300" height="193" /></a><p class="wp-caption-text">Tickets activos para el hito 0.12 de Trac, ordenados por última fecha de modificación</p></div>
<p>El sistema de <em>tickets</em> le permite hacer seguimiento del progreso en la resolución de problemas de programación particulares, requerimientos de nuevas características, problemas e ideas, cada una de ellas en su propio <em>ticket</em>, los cuales son enumerados de manera ascendente. Puede resolver o reconciliar aquellos <em>tickets</em> que buscan un mismo objetivo o donde más de una persona reporta el mismo requerimiento. Permite hacer búsquedas o filtrar <em>tickets</em> por severidad, componente del proyecto, versión, responsable de atender el <em>ticket</em>, entre otros.</p>
<p>Para mejorar el seguimiento de los <em>tickets</em> Trac ofrece la posibilidad de activar notificaciones vía correo electrónico, de este modo se mantiene informado a los desarrolladores de los avances en la resolución de las actividades planificadas.</p>
<h5>Vista de progreso</h5>
<p>Existen varias maneras convenientes de estar al día con los acontecimientos y cambios que ocurren dentro de un proyecto. Puede establecer hitos y ver un mapa del progreso (así como los logros históricos) de manera resumida. Además, puede visualizar desde una interfaz centralizada los cambios ocurridos cronológicamente en el wiki, hitos, tickets y repositorios de código fuente, comenzando con los eventos más recientes, toda esta información es accesible vía <em>Web</em> o de manera alternativa Trac le ofrece la posibilidad de exportar esta información a otros formatos como el RSS, permitiendo que los usuarios puedan observar esos cambios fuera de la interfaz centralizada de Trac, así como la notificación por correo electrónico.</p>
<div id="attachment_274" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/milestone.png"><img class="size-medium wp-image-274" src="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/milestone-300x221.png" alt="vista de progreso del proyecto" width="300" height="221" /></a><p class="wp-caption-text">Vista del avance del proyecto para un hito particular</p></div>
<h5>Vista del repositorio en línea</h5>
<p>Una de las características de mayor uso en Trac es el navegador o visor del repositorio en línea, se le ofrece una interfaz bastante amigable para el sistema de control de versiones que esté usando<sup>3</sup>. Este visualizador en línea le ofrece una manera clara y elegante de observar el código fuente resaltado, así como también la comparación de ficheros, apreciando fácilmente las diferencias entre ellos.</p>
<div id="attachment_277" class="wp-caption aligncenter" style="width: 285px"><a href="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/code.png"><img class="size-medium wp-image-277" src="http://blog.milmazz.com.ve/wp-content/uploads/2010/03/code-275x300.png" alt="Visor de código fuente en Trac" width="275" height="300" /></a><p class="wp-caption-text">Cambios entre revisiones en trunk/setup.py</p></div>
<h5>Manejo de usuarios</h5>
<p>Trac ofrece un sistema de permisología para controlar cuales usuarios pueden acceder o no a determinadas secciones del sistema de manejo y seguimiento del proyecto, esto se logra a través de la interfaz administrativa. Además, esta interfaz es posible integrarla con la definición de permisos de lectura y escritura de los usuarios en el sistema de control de versiones, de ese modo se logra una<br />
administración centralizada de usuarios.</p>
<h5>Wiki</h5>
<p>El sistema wiki es ideal para mantener la base de conocimientos del proyecto, la cual puede ser usada por los desarrolladores o como medio para ofrecerles recursos a los usuarios. Tal como funcionan otros sistemas wiki, puede permitirse la edición compartida. La sintaxis del sistema wiki es bastante sencilla, si esto no es suficiente, es posible integrar en Trac un editor <acronym title="What You See Is What You Get">WYSIWYG</acronym> (lo que se ve es lo que se obtiene, por sus siglas en inglés) que facilita la edición de los documentos.</p>
<h5>Características adicionales</h5>
<p>Al ser Trac un sistema modular puede ampliarse su funcionalidad por medio de complementos o <em>plugins</em>, desde sistemas anti-spam hasta diagramas de Gantt o sistemas de seguimiento de tiempo.</p>
<ol class="footnotes"><li id="footnote_0_263" class="footnote">Por defecto Trac se integra con <em>subversion</em></li><li id="footnote_1_263" class="footnote">Hoy día también se le da soporte a <a href="http://www.postgresql.org">PostgreSQL</a>, mayor detalle en <a href="http://trac.edgewall.org/wiki/DatabaseBackend">Database Backend</a></li><li id="footnote_2_263" class="footnote">Por defecto Trac se integra con <em>subversion</em>, la integración con otros sistemas es posible gracias a <em>plugins</em> o complementos.</li></ol><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mpv_hVq83O4:wwOQP_mXXlo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mpv_hVq83O4:wwOQP_mXXlo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mpv_hVq83O4:wwOQP_mXXlo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mpv_hVq83O4:wwOQP_mXXlo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mpv_hVq83O4:wwOQP_mXXlo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mpv_hVq83O4:wwOQP_mXXlo:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2010/03/16/sistema-de-manejo-y-seguimiento-de-proyectos-trac/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2010/03/16/sistema-de-manejo-y-seguimiento-de-proyectos-trac</feedburner:origLink></item>
		<item>
		<title>Pylint: Análisis estático del código en Python</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/50VXbvkbjNI/pylint-analisis-estatico-del-codigo-en-python</link>
		<comments>http://blog.milmazz.com.ve/archivos/2010/03/13/pylint-analisis-estatico-del-codigo-en-python#comments</comments>
		<pubDate>Sat, 13 Mar 2010 05:01:48 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[pylint]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/?p=261</guid>
		<description><![CDATA[Básicamente el análisis estático del código se refiere al proceso de evaluación del código fuente sin ejecutarlo, es en base a este análisis que se obtendrá información que nos permita mejorar la línea base de nuestro proyecto, sin alterar la semántica original de la aplicación.
Pylint es una herramienta que todo programador en Python debe considerar [...]]]></description>
			<content:encoded><![CDATA[<p>Básicamente el análisis estático del código se refiere al proceso de evaluación del código fuente sin ejecutarlo, es en base a este análisis que se obtendrá información que nos permita mejorar la línea base de nuestro proyecto, sin alterar la semántica original de la aplicación.</p>
<p><a href="http://www.logilab.org/project/pylint">Pylint</a> es una herramienta que todo programador en Python debe considerar en su proceso de integración continua (<abbr title="Ejemplo">Ej.</abbr> <a href="http://bitten.edgewall.org/" title="A continuous integration plugin for Trac">Bitten</a>), básicamente su misión es analizar código en Python en busca de errores o síntomas de mala calidad en el código fuente. Cabe destacar que por omisión, la guía de estilo a la que se trata de apegar Pylint es la descrita en el <a href="http://www.python.org/dev/peps/pep-0008/">PEP-8</a>.</p>
<p>Es importante resaltar que Pylint no sustituye las labores de revisión continua de alto nivel en el Proyecto, con esto quiero decir, su estructura, arquitectura, comunicación con elementos externos como bibliotecas, diseño, entre otros.</p>
<p>Tome en cuenta que Pylint puede arrojar falsos positivos, esto puede entenderse al recibir una alerta por parte de Pylint de alguna cuestión que usted realizó conscientemente. Ciertamente algunas de las advertencias encontradas por Pylint pueden ser peligrosas en algunos contextos, pero puede que en otros no lo sea, o simplemente Pylint haga revisiones de cosas que a usted realmente no le importan. Puede ajustar la configuración de Pylint para no ser informado acerca de ciertos tipos de advertencias o errores.</p>
<p>Entre la serie de revisiones que hace Pylint al código fuente se encuentran las siguientes:</p>
<ul>
<li>Revisiones básicas:
<ul>
<li>Presencia de cadenas de documentación (<em>docstring</em>).</li>
<li>Nombres de módulos, clases, funciones, métodos, argumentos, variables.</li>
<li>Número de argumentos, variables locales, retornos y sentencias en funciones y métodos.</li>
<li>Atributos requeridos para módulos.</li>
<li>Valores por omisión no recomendados como argumentos.</li>
<li>Redefinición de funciones, métodos, clases.</li>
<li>Uso de declaraciones globales.</li>
</ul>
</li>
<li>Revisión de variables:
<ul>
<li>Determina si una variable o <code>import</code> no está siendo usado.</li>
<li>Variables indefinidas.</li>
<li>Redefinición de variables proveniente de módulos <em>builtins</em> o de ámbito externo.</li>
<li>Uso de una variable antes de asignación de valor.</li>
</ul>
</li>
<li>Revisión de clases:
<ul>
<li>Métodos sin <code>self</code> como primer argumento.</li>
<li>Acceso único a miembros existentes vía <code>self</code></li>
<li>Atributos no definidos en el método <code>__init__</code></li>
<li>Código inalcanzable.</li>
</ul>
</li>
<li>Revisión de diseño:
<ul>
<li>Número de métodos, atributos, variables locales, entre otros.</li>
<li>Tamaño, complejidad de funciones, métodos, entre otros.</li>
</ul>
</li>
<li>Revisión de <em>imports</em>:
<ul>
<li>Dependencias externas.</li>
<li><em>imports</em> relativos o importe de todos los métodos, variables vía <code>*</code> (<em>wildcard</em>).</li>
<li>Uso de <em>imports</em> cíclicos.</li>
<li>Uso de módulos obsoletos.</li>
</ul>
</li>
<li>Conflictos entre viejo/nuevo estilo:
<ul>
<li>Uso de <code>property</code>, <code>__slots__</code>, <code>super</code>.</li>
<li>Uso de <code>super</code>.</li>
</ul>
</li>
<li>Revisiones de formato:
<ul>
<li>Construcciones no autorizadas.</li>
<li>Sangrado estricto del código.</li>
<li>Longitud de la línea.</li>
<li>Uso de <code>&lt;&gt;</code> en vez de <code>!=</code>.</li>
</ul>
</li>
<li>Otras revisiones:
<ul>
<li>Notas de alerta en el código como <code>FIXME</code>, <code>XXX</code>.</li>
<li>Código fuente con caracteres non-ASCII sin tener una declaración de <em>encoding</em>. <a href="http://www.python.org/dev/peps/pep-0263/" title="Defining Python Source Code Encodings">PEP-263</a></li>
<li>Búsqueda por similitudes o duplicación en el código fuente.</li>
<li>Revisión de excepciones.</li>
<li>Revisiones de tipo haciendo uso de inferencia de tipos.</li>
</ul>
</li>
</ul>
<p>Mientras Pylint hace el análisis estático del código muestra una serie de mensajes así como también algunas estadísticas acerca del número de advertencias y errores encontrados en los diferentes ficheros. Estos mensajes son clasificados bajo ciertas categorías, entre las cuales se encuentran:</p>
<dl>
<dt>Refactorización</dt>
<dd>Asociado a una violación en alguna <em>buena práctica</em>.</dd>
<dt>Convención</dt>
<dd>Asociada a una violación al estándar de codificación.</dd>
<dt>Advertencia</dt>
<dd>Asociadas a problemas de estilo o errores de programación menores.</dd>
<dt>Error</dt>
<dd>Asociados a errores de programación importantes, es probable que se trate de un <em>bug</em>.</dd>
<dt>Fatal</dt>
<dd>Asociados a errores que no permiten a Pylint avanzar en su análisis.</dd>
</dl>
<p>Un ejemplo de este reporte lo puede ver a continuación:</p>
<pre><code>Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |969    |1721     |-752.00    |
+-----------+-------+---------+-----------+
|refactor   |267    |182      |+85.00     |
+-----------+-------+---------+-----------+
|warning    |763    |826      |-63.00     |
+-----------+-------+---------+-----------+
|error      |78     |291      |-213.00    |
+-----------+-------+---------+-----------+</code></pre>
<p>Cabe resaltar que el formato de salida del ejemplo utilizado está en modo texto, usted puede elegir entre: coloreado, texto, msvs (Visual Estudio) y HTML.</p>
<p>Pylint le ofrece una sección dedicada a los reportes, esta se encuentra inmediatamente después de la sección de mensajes de análisis, cada uno de estos reportes se enfocan en un aspecto particular del proyecto, como el número de mensajes por categorías (mostrado arriba), dependencias internas y externas de los módulos, número de módulos procesados, el porcentaje de errores y advertencias encontradas por módulo, el total de errores y advertencias encontradas, el porcentaje de clases, funciones y módulos con <em>docstrings</em> y su respectiva comparación con un análisis previo (si existe). El porcentaje de clases, funciones y módulos con nombres correctos (de acuerdo al estándar de codificación), entre otros.</p>
<p>Al final del reporte arrojado por Pylint podrá observar una puntuación general por su código, basado en el número y la severidad de los errores y advertencias encontradas a lo largo del código fuente. Estos resultados suelen motivar a los desarrolladores a mejorar cada día más la calidad de su código fuente.
</p>
<p>Si usted ejecuta Pylint varias veces sobre el mismo código, podrá ver el puntaje de la corrida previa junto al resultado de la corrida actual, de esta manera puede saber si ha mejorado la calidad de su código o no.</p>
<pre><code>Global evaluation
-----------------
Your code has been rated at 7.74/10 (previous run: 4.64/10)
If you commit now, people should not be making nasty comments about you on c.l.py</code></pre>
<p>Una de las grandes ventajas de Pylint es que es totalmente configurable, además, se pueden escribir complementos o <em>plugins</em> para agregar una funcionalidad que nos pueda ser útil.</p>
<p>Si usted quiere probar desde ya Pylint le recomiendo seguir la guía introductoria descrita en <a href="http://www.logilab.org/card/pylint_tutorial">Pylint tutorial</a>. Si desea una mayor ayuda respecto a los códigos indicados por Pylint, puede intentar el comando <code>pylint --help-msg=CODIGO</code>, si eso no es suficiente, le recomiendo visitar el wiki <a href="http://pylint-messages.wikidot.com/">PyLint Messages</a> para obtener una rápida referencia de los mensajes arrojados por Pylint, organizados de varias maneras para hacer más fácil y agradable la búsqueda. Además de encontrar explicaciones de cada mensaje, especialmente útiles para aquellos programadores que recién comienzan en Python.</p>
<h4>Referencias</h4>
<ul>
<li><a href="http://www.logilab.org/card/pylintfeatures">Pylint features</a></li>
<li><a href="http://www.logilab.org/card/pylint_tutorial">Pylint tutorial</a></li>
<li><a href="http://www.logilab.org/card/pylint_manual">Pylint User Manual</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=50VXbvkbjNI:P57SrGN9S5A:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=50VXbvkbjNI:P57SrGN9S5A:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=50VXbvkbjNI:P57SrGN9S5A:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=50VXbvkbjNI:P57SrGN9S5A:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=50VXbvkbjNI:P57SrGN9S5A:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=50VXbvkbjNI:P57SrGN9S5A:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2010/03/13/pylint-analisis-estatico-del-codigo-en-python/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2010/03/13/pylint-analisis-estatico-del-codigo-en-python</feedburner:origLink></item>
		<item>
		<title>Consideraciones para el envío de cambios en Subversion</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/ig3mglL0FiI/consideraciones-para-el-envio-de-cambios-en-subversion</link>
		<comments>http://blog.milmazz.com.ve/archivos/2010/03/12/consideraciones-para-el-envio-de-cambios-en-subversion#comments</comments>
		<pubDate>Fri, 12 Mar 2010 06:18:02 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[Ingeniería del Software]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/?p=250</guid>
		<description><![CDATA[Hoy día pareciese que los sistemas de control de versiones centralizados están pasando de moda ante la aparición de sistemas de control de versiones descentralizados poderosos como Git, del cual espero poder escribir en próximos artículos. Sin embargo, puede que la adopción de estos sistemas descentralizados tarden en controlar el mundo de los SCM, al [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy día pareciese que los sistemas de control de versiones centralizados están pasando de moda ante la aparición de sistemas de control de versiones descentralizados poderosos como <a title="Git, the fast version control system" href="http://git-scm.com/">Git</a>, del cual espero poder escribir en próximos artículos. Sin embargo, puede que la adopción de estos sistemas descentralizados tarden en controlar el mundo de los <acronym title="Source Code Management">SCM</acronym>, al menos por ahora las métricas de <a href="http://www.ohloh.net">ohloh.net</a> indican que <a href="http://subversion.tigris.org/">Subversion</a> sigue siendo bastante empleado, mayor detalle en el artículo <a title="Subversion - As Strong As Ever" href="http://blogs.open.collab.net/svn/2009/11/subversion-as-strong-as-ever.html">Subversion &#8211; As Strong As Ever</a>.</p>
<p>En este artículo se expondrán algunas políticas que suelen definirse para la sana convivencia entre colaboradores de un proyecto de desarrollo de software, estas reglas no solo aplican a Subversion en particular, son de uso común en otros sistemas de control de versiones centralizados.</p>
<h3>Analice bien los cambios hechos antes de enviarlos</h3>
<p>Cualquier cambio en la línea base de su proyecto puede traer consecuencias, tome en cuenta que los demás desarrolladores obtendrán sus cambios una vez que estén en el repositorio centralizado. Si usted no se preocupó por validar que todo funcionara correctamente antes de enviar sus cambios, <em>es probable que algún compañero le recrimine por su irresponsabilidad</em>, esto afecta de cierta forma el anillo de confianza entre los colaboradores del proyecto.</p>
<h3>Nunca envíe cambios que hagan fallar la construcción del proyecto</h3>
<p>Siempre verifique que su proyecto compile, si el proyecto presenta errores debido a los cambios hechos por usted atiendalos inmediatamente, evite los errores de sintaxis, tenga siempre presente respetar las políticas de estilo de código definidas para su proyecto.</p>
<p>Si ha ingresado nuevos ficheros o directorios al proyecto recuerde ejecutar el comando <code>svn add</code> para programar la adición en Subversion, si omite este paso es posible que su copia de trabajo funcione o compile, pero la del resto de sus compañeros no, <em>evite de nuevo ser recriminado por los demás colaboradores del proyecto</em>.</p>
<p>Si su proyecto pretende ser multiplataforma, trate de imaginar las consecuencias de sus cambios bajo otro sistema operativo o arquitectura. Por ejemplo, he visto más de una vez este tipo de error:</p>
<pre><code>path = "dir/subdir/fichero.txt" # Malo
path = os.path.join(os.path.dirname(__file__),
                    'dir', 'subdir', 'fichero.txt') # Correcto</code></pre>
<h3>Pruebe los cambios antes de hacer el envío</h3>
<p>Antes de realizar un envío al repositorio centralizado actualice su copia de trabajo (<code>svn up</code>), verifique que las pruebas unitarias, regresión de su proyecto arrojan resultados positivos, de igual manera haga pruebas funcionales del sistema.</p>
<p>Al momento de hacer la actualización de su copia de trabajo tome nota de los ficheros editados por los demás colaboradores del proyecto, verifique que no existan conflictos, nuevos ficheros que no haya considerado, entre otros. Una vez que haya solventado la actualización de su copia de trabajo, construya (su proyecto tiene un sistema de autoconstrucción, ¿verdad?) el paquete, inicie su aplicación que contiene los cambios locales y asegúrese que el comportamiento obtenido sea igual al esperado.</p>
<h3>Promueva un histórico de cambios descriptivo</h3>
<p>El histórico de cambios debe ser comprensible por cualquier colaborador del proyecto solamente con la información suministrada en dicho registro, evite depender de información fuera del contexto del envío de cambios. Se le recomienda colocar toda la información importante que no pueda obtenerse a partir de un <code>svn diff</code> del código fuente.</p>
<h3>¿Está corrigiendo un error?</h3>
<p>Si usted está reparando un error en la aplicación que se encuentra presente en la rama principal de desarrollo (<em>trunk</em>), considere seriamente portar esa reparación a otras ramas de desarrollo (<em>branches</em>) en el caso que su proyecto posea una versión estable que requiere actualmente de mantenimiento. Trate en lo posible de aprovechar el mismo <em>commit</em> para enviar la corrección de la rama principal de desarrollo (<em>trunk</em>) y las ramas de mantenimiento.</p>
<p>Si el error fue reportado a través del sistema de seguimiento de errores (usted mantiene un sistema de seguimiento de errores, ¿verdad?), agregue en el registro del mensaje de envío el número del ticket, boleto o reporte que usted está atendiendo. Seguidamente proceda a cerrar el ticket o boleto en el sistema de seguimiento de errores.</p>
<h3>No agregue ficheros generados por otras herramientas al repositorio</h3>
<p>No agregue ficheros innecesarios al repositorio, el origen de estos ficheros suele ser:</p>
<ul>
<li>Proceso de autoconstrucción (Ej. distutils, autotools, scons, entre otros).</li>
<li>Herramientas de verificación de calidad del código (Ej. PyLint, CppLint, entre otros).</li>
<li>Herramientas para generar documentación (Ej. Doxygen, Sphinx, entre otros).</li>
</ul>
<p>Estos ficheros generados por otras herramientas no es necesario versionarlos, puede considerarlos <em>cache</em>, este tipo de datos son localmente generados como resultado de operaciones I/O o cálculos, las herramientas deben ser capaces de regenerar o restaurar estos datos a partir del código presente en el repositorio central.</p>
<h3>Realice envíos atómicos</h3>
<p>Recuerde que SVN le brinda la posibilidad de enviar más de un fichero en un solo <em>commit</em>. Por lo tanto, envíe todos los cambios relacionados en múltiples ficheros, incluso si los cambios se extienden a lo largo de varios directorios en un mismo <em>commit</em>. De esta manera, se logra que SVN se mantenga en un estado compatible antes y después del <em>commit</em>.</p>
<p>Recuerde asegurarse al enviar un cambio al repositorio central reflejar un solo propósito, el cual puede ser la corrección de un error de programación o bug, agregar una nueva funcionalidad al sistema, ajustes de estilo del código o alguna tarea adicional.</p>
<h3>Separe los ajustes de formato de código de otros envíos</h3>
<p>Ajustar el formato del código, como la sangría, los espacios en blanco, el largo de la línea incrementa considerablemente los resultados del <code>diff</code>, si usted mezcla los cambios asociados al ajuste de formato de código con otros estará dificultando un posterior análisis al realizar un <code>svn diff</code>.</p>
<h3>Haga uso intensivo de la herramienta de seguimiento de errores</h3>
<p>Trate en lo posible de crear enlaces bidireccionales entre el conjunto de cambios hechos en el repositorio de subversion y la herramienta de seguimientos de errores tanto como sea posible.</p>
<ul>
<li>Trate de hacer una referencia al <em>id</em> o número del <em>ticket</em> al cual está dando solución desde su mensaje de registro o <em>log</em> previo a realizar el <em>commit</em>.</li>
<li>Cuando agregue información o responda a un <em>ticket</em>, ya sea para describir su avance o simplemente para cerrar el <em>ticket</em>, indique el número o números de revisión que atienden o responden a dichos cambios.</li>
</ul>
<h3>Indique en el registro de envío el resultado del merge</h3>
<p>Cuando usted está enviando el resultado de un <em>merge</em>, asegúrese de indicar sus acciones en el registro de envío, tanto aquello que fue fusionado como los números de revisiones que fueron tomadas en cuenta. Ejemplo:</p>
<pre><code>Fusión de las revisiones 10:40 de /branches/foo a /trunk.</code></pre>
<h3>Tenga claro cuando es oportuno crear una rama</h3>
<p>Esto es un tema polémico. Sin embargo, dependiendo del proyecto en el que esté involucrado usted puede definir una estrategia o mezcla de ellas para manejar el desarrollo del proyecto. Generalmente puede encontrar lo siguiente:</p>
<p>Los proyectos que requieren un alto manejo y supervisión recurren a estrategias de siempre crear ramas, acá puede encontrarse que cada colaborador crea o trabaja en una rama privada para cada tarea de codificación. Cuando el trabajo individual ha finalizado, algún responsable, ya sea el fundador del proyecto, un revisor técnico, analiza los cambios hechos por el colaborador y hace la fusión con la línea principal de desarrollo. En estos casos la rama principal de desarrollo suele ser bastante estable. Sin embargo, este modo de trabajo conlleva normalmente a crear mayores conflictos en la etapa de fusión o <em>merge</em>, además, las labores de fusión bajo este esquema son constantemente requeridas.</p>
<p>Existe otro enfoque que permite mantener una línea base de desarrollo estable, el cual consiste en crear ramas de desarrollo solo cuando se ameritan. Sin embargo, esto requiere que los colaboradores tengan mayor dominio del uso de Subversion y una constante comunicación entre ellos. Además de aumentar el número de pruebas antes de cada envío al repositorio centralizado.</p>
<p>Estudie, analice las distintas opciones y defina un método para la creación de ramas en su proyecto. Una vez definido, es sumamente importante que cada colaborador tenga clara esta estrategia de trabajo.</p>
<p>Las estrategias antes mencionadas y otras más pueden verse en detalle en:</p>
<ul>
<li><a href="http://blogs.open.collab.net/svn/2007/11/branching-strat.html">Branching Strategy Questioned</a>.</li>
<li><a href="http://www.codinghorror.com/blog/2007/10/software-branching-and-parallel-universes.html">Software Branching and Parallel Universes</a>.</li>
<li><a href="http://svnbook.red-bean.com/en/1.1/ch04.html">Branching and Merging</a></li>
<p>.</ul>
<h3>Los sistemas de control de versiones no substituyen la comunicación entre los colaboradores</h3>
<p>Por último pero no menos importante, los sistemas de control de versiones no substituyen la comunicación entre los desarrolladores o colaboradores del proyecto de software. Cuando usted tenga planes de hacer un cambio que pueda afectar una cantidad de código considerable en su proyecto, establezca un control de cambios, haga un análisis de las posibles consecuencias o impacto de los mismos, difunda esta información a través de una lista de discusión (usted mantiene una lista de discusión para desarrolladores, ¿verdad?) y espere la respuesta, preocupaciones, sugerencias de los demás colaboradores, quizá juntos se encuentre un modo más eficaz de aplicar los cambios.</p>
<h4>Referencias:</h4>
<ul>
<li><a href="http://www.slideshare.net/mza/subversion-best-practices">Subversion Best Practices</a> (presentación)</li>
<li><a href="http://www.marten-online.com/source-versioning/svn-commit-basic-policy-guide.html">SVN commit basic policy guide</a></li>
<li><a href="http://svn.apache.org/repos/asf/subversion/trunk/doc/user/svn-best-practices.html">Subversion Best Practices</a></li>
<li><a href="http://www.red-bean.com/fitz/presentations/2006-06-28-AC-EU-Subversion-best-practices.pdf">Subversion Best Practices</a> (presentación)</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=ig3mglL0FiI:JzhiSOKPkq8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=ig3mglL0FiI:JzhiSOKPkq8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=ig3mglL0FiI:JzhiSOKPkq8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=ig3mglL0FiI:JzhiSOKPkq8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=ig3mglL0FiI:JzhiSOKPkq8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=ig3mglL0FiI:JzhiSOKPkq8:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2010/03/12/consideraciones-para-el-envio-de-cambios-en-subversion/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2010/03/12/consideraciones-para-el-envio-de-cambios-en-subversion</feedburner:origLink></item>
		<item>
		<title>Configurando nuestras interfaces de red con ifupdown</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/mIiNU5Pc4Q4/configurando-nuestras-interfaces-de-red-con-ifupdown</link>
		<comments>http://blog.milmazz.com.ve/archivos/2008/09/20/configurando-nuestras-interfaces-de-red-con-ifupdown#comments</comments>
		<pubDate>Sat, 20 Sep 2008 07:04:32 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ifdown]]></category>
		<category><![CDATA[ifup]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/?p=233</guid>
		<description><![CDATA[Si usted es de esas personas que suele mover su máquina portátil entre varias redes que no necesariamente proveen DHCP y usualmente vuelve a configurar sus preferencias de conexión, seguramente este artículo llame su atención puesto que se explicará acerca de la configuración de diversos perfiles de conexión vía línea de comandos.
En los sistemas Debian [...]]]></description>
			<content:encoded><![CDATA[<p>Si usted es de esas personas que suele mover su máquina portátil entre varias redes que no necesariamente proveen <a href="http://es.wikipedia.org/wiki/DHCP" rel="help" title="DHCP">DHCP</a> y usualmente vuelve a configurar sus preferencias de conexión, seguramente este artículo llame su atención puesto que se explicará acerca de la configuración de diversos <em>perfiles de conexión</em> vía línea de comandos.</p>
<p>En los sistemas <a href="http://www.debian.org" title="Debian &sect; El Sistema Operativo Universal" rel="help">Debian</a> y los basados en él, <a href="http://www.ubuntu.com" title="Ubuntu Home Page">Ubuntu</a> por ejemplo, para lograr la configuración de las redes existe una herramienta de alto nivel que consiste en los comandos <code>ifup</code> e <code>ifdown</code>, adicionalmente se cuenta con el fichero de configuración <code>/etc/network/interfaces</code>. También el paquete <code>wireless-tools</code> incluye un script en <code>/etc/network/if-pre-up.d/wireless-tools</code> que hace posible preparar el hardware de la interfaz inalámbrica antes de darla de alta, dicha configuración se hace a través del comando <code>iwconfig</code>.</p>
<p>Para hacer uso de las ventajas que nos ofrece la herramienta de alto nivel <code>ifupdown</code>, en primer lugar debemos editar el fichero <code>/etc/network/interfaces</code> y establecer nuestros <em>perfiles</em> de la siguiente manera:</p>
<pre><code>auto lo
iface lo inet loopback

# Conexión en casa usando WPA
iface home inet dhcp
    wpa-driver wext
    wpa-ssid foo
    wpa-psk baz
    wpa-keymgmt WPA-PSK
    wpa-pairwise TKIP CCMP
    wpa-group TKIP CCMP
    wpa-proto WPA RSN

# Conexión en la oficina
# sin DHCP
iface office inet static
    wireless-essid bar
    wireless-key s:egg
    address 192.168.1.97
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1
    dns-search company.com #search@resolv.conf
    dns-nameservers 192.168.1.2 192.168.1.3 #nameserver@resolv.conf

# Conexión en reuniones
iface meeting inet dhcp
	wireless-essid ham
	wireless-key s:jam</code></pre>
<p>En este ejemplo se encuentran 3 configuraciones particulares (<code>home</code>, <code>work</code> y <code>meeting</code>), la primera de ellas define que nos vamos a conectar con un <em>Access Point</em> cuyo <em>ssid</em> es <code>foo</code> con un tipo de cifrado WPA-PSK/WPA2-PSK, esto fue explicado en detalle en el artículo <a href="http://blog.milmazz.com.ve/archivos/2008/02/05/haciendo-el-cambio-de-ipw3945-a-iwl3945" rel="help">Haciendo el cambio de ipw3945 a iwl3945</a>. La segunda configuración indica que nos vamos a conectar a un <em>Access Point</em> con una IP estática y configuramos los parámetros <code>search</code> y <code>nameserver</code> del fichero <code>/etc/resolv.conf</code> (para más detalle lea la documentación del paquete <code>resolvconf</code>). Finalmente se define una configuración similar a la anterior, pero en este caso haciendo uso de DHCP.</p>
<p>Llegados a este punto es importante aclarar lo que <code>ifupdown</code> considera una <em>interfaz lógica</em> y una <em>interfaz física</em>. La <strong>interfaz lógica</strong> es un valor que puede ser asignado a los parámetros de una interfaz física, en nuestro caso <code>home</code>, <code>office</code>, <code>meeting</code>. Mientras que la <strong>interfaz física</strong> es lo que propiamente conocemos como la interfaz, en otras palabras, lo que regularmente el <em>kernel</em> reconoce como <code>eth0</code>, <code>wlan0</code>, <code>ath0</code>, <code>ppp0</code>, entre otros.</p>
<p>Como puede verse en el ejemplo previo las definiciones adyacentes a <code>iface</code> hacen referencia a <strong>interfaces lógicas</strong>, no a interfaces físicas.</p>
<p>Ahora bien, para dar de alta la <em>interfaz física</em> <code>wlan0</code> haciendo uso de la <em>interfaz lógica</em> <code>home</code>, como superusuario puede hacer lo siguiente:</p>
<pre><code># ifup wlan0=home</code></pre>
<p>Si usted ahora necesita reconfigurar la <em>interfaz física</em> <code>wlan0</code>, pero en este caso particular haciendo uso de la <em>interfaz lógica</em> <code>work</code>, primero debe dar de baja la interfaz física <code>wlan0</code> de la siguiente manera:</p>
<pre><code># ifdown wlan0</code></pre>
<p>Seguidamente deberá ejecutar el siguiente comando:</p>
<pre><code># ifup wlan0=work</code></pre>
<p>Es importante hacer notar que tal como está definido ahora el fichero <code>/etc/network/interfaces</code> ya no es posible dar de alta la interfaz física <code>wlan0</code> ejecutando solamente lo siguiente:</p>
<pre><code>ifup wlan0</code></pre>
</p>
<p>La razón de este comportamiento es que el comando <code>ifup</code> utiliza el nombre de la <em>interfaz física</em> como el nombre de la <em>interfaz lógica</em> por omisión y evidentemente ahora <strong>no</strong> está definido en el ejemplo un nombre de interfaz lógica igual a <code>wlan0</code>.</p>
<p>En un próximo artículo se harán mejoras en la definición del fichero <code>/etc/network/interfaces</code> y su respectiva integración con una herramienta para la detección de redes que tome como entrada una lista de perfiles de redes candidatas, cada una de ellas incluyendo casos de pruebas. Teniendo esto como entrada ya no será necesario indicar la <em>interfaz lógica</em> a la que se hace referencia ya que la herramienta se encargará de probar todos los <em>perfiles</em> en paralelo y elegirá aquella que cumpla en primera instancia con los casos de prueba. De modo tal que ya podremos dar de alta nuestra <em>interfaz física</em> con solo hacer <code>ifup wlan0</code>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mIiNU5Pc4Q4:yyZjgKcjdD0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mIiNU5Pc4Q4:yyZjgKcjdD0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mIiNU5Pc4Q4:yyZjgKcjdD0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mIiNU5Pc4Q4:yyZjgKcjdD0:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mIiNU5Pc4Q4:yyZjgKcjdD0:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mIiNU5Pc4Q4:yyZjgKcjdD0:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2008/09/20/configurando-nuestras-interfaces-de-red-con-ifupdown/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2008/09/20/configurando-nuestras-interfaces-de-red-con-ifupdown</feedburner:origLink></item>
		<item>
		<title>subversion: Recuperar cambios y eliminaciones hechas</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/mS6llDGATJs/subversion-recuperar-cambios-y-eliminaciones-hechas</link>
		<comments>http://blog.milmazz.com.ve/archivos/2008/08/12/subversion-recuperar-cambios-y-eliminaciones-hechas#comments</comments>
		<pubDate>Tue, 12 Aug 2008 05:35:42 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/?p=232</guid>
		<description><![CDATA[Muchos compañeros de trabajo y amigos en general que recién comienzan con el manejo de sistemas de control de versiones centralizados, en particular subversion, regularmente tienen inquietudes en cuanto al proceso de recuperación de cambios una vez que han sido enviados al repositorio, así como también la recuperación de ficheros y directorios que fueron eliminados [...]]]></description>
			<content:encoded><![CDATA[<p>Muchos compañeros de trabajo y amigos en general que recién comienzan con el manejo de sistemas de control de versiones centralizados, en particular <em>subversion</em>, regularmente tienen inquietudes en cuanto al proceso de recuperación de cambios una vez que han sido enviados al repositorio, así como también la recuperación de ficheros y directorios que fueron eliminados en el pasado. Trataré de explicar algunos casos en base a ejemplos para que se tenga una idea más clara del problema y su respectiva solución.</p>
<p>En el primero de los casos se tiene recuperar la revisión previa a la actual, suponga que usted mantiene un repositorio de recetas, una de ellas en particular es la ensalada <em>caprese</em>, por error o descuido añadió el ingrediente <em>Mostaza tipo Dijón</em> a la lista, si usted posee siquiera un lazo con italinos sabe que está cometiendo un error que puede devenir en escarnio público, desprecio e insultos.</p>
<pre><code>~/svn/wc/trunk$ svn diff -r 2:3 ${URL}/trunk/caprese
Index: caprese
===================================================================
--- caprese	(revision 2)
+++ caprese	(revision 3)
@@ -7,3 +7,4 @@
  - Albahaca fresca
  - Aceite de oliva
  - Pimienta
+ - Mostaza tipo Dijon</code></pre>
<p>Note que el comando anterior muestra las diferencias entre las revisiones 2 y 3 del repositorio, en el resumen se puede apreciar que en la revisión 3 ocurrió el <em>error</em>. Un modo rápido de recuperarlo es como sigue.</p>
<pre><code>~/svn/wc/trunk$ svn merge -c -3 ${URL}/trunk/caprese
--- Reverse-merging r3 into 'caprese':
U    caprese</code></pre>
<p>En este caso particular se están aplicando las diferencias entre las revisiones <strong>consecutivas</strong> a la copia de trabajo. Es hora de verificar que los cambios hechos sean los deseados:</p>
<pre><code>~/svn/wc/trunk$ svn status
M      caprese
~/svn/wc/trunk$ svn diff
Index: caprese
===================================================================
--- caprese	(revision 3)
+++ caprese	(working copy)
@@ -7,4 +7,3 @@
  - Albahaca fresca
  - Aceite de oliva
  - Pimienta
- - Mostaza tipo Dijon</code></pre>
<p>Una vez verificado enviamos los cambios hechos al repositorio a través de comando <code>svn commit</code>. </p>
<p>Seguramente usted se estará preguntando ahora que sucede si las revisiones del ficheros no son consecutivas como en el caso mostrado previamente. En este caso es importante hacer notar que la opción <code>-c 3</code> es equivalente a <code>-r 2:3</code> al usar el comando <code>svn merge</code>, en nuestro caso particular <code>-c -3</code> es equivalente a <code>-r 3:2</code> (a esto se conoce como una fusión reversa), substituyendo la opción <code>-c</code> (o <code>--changes</code>) en el caso previo obtenemos lo siguiente:</p>
<pre><code>~/svn-tests/wc/trunk$ svn merge -r 3:2 ${URL}/trunk/caprese
--- Reverse-merging r3 into 'caprese':
U    caprese</code></pre>
<p><strong>Referencias:</strong> <code>svn help merge</code>, <code>svn help diff</code>, <code>svn help status</code>.</p>
<h4>Recuperando ficheros o directorios eliminados</h4>
<p>Una manera bastante sencilla de recuperar ficheros o directorios eliminados es haciendo uso de comando <code>svn cp</code> o <code>svn copy</code>, una vez determinada la revisión del fichero o directorio que desea recuperar la tarea es realmente sencilla:</p>
<pre><code>~/svn-tests/wc/trunk$ svn cp ${URL}/trunk/panzanella@6 panzanella
A         panzanella</code></pre>
<p>En este caso se ha duplicado la revisión 6 del fichero <code>panzanella</code> en la copia de trabajo local, se ha programado para su adición incluyendo su historial, esto último puede verificarse en detalle al observar el signo <strong>&#8216;+&#8217;</strong> en la cuarta columna del comando <code>svn status</code>.</p>
<pre><code>~/svn-tests/wc/trunk$ svn status
A  +   panzanella</code></pre>
<p><strong>Referencias:</strong> <code>svn help copy</code>, <code>svn help status</code>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mS6llDGATJs:Nie60LJsnV8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mS6llDGATJs:Nie60LJsnV8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mS6llDGATJs:Nie60LJsnV8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mS6llDGATJs:Nie60LJsnV8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=mS6llDGATJs:Nie60LJsnV8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=mS6llDGATJs:Nie60LJsnV8:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2008/08/12/subversion-recuperar-cambios-y-eliminaciones-hechas/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2008/08/12/subversion-recuperar-cambios-y-eliminaciones-hechas</feedburner:origLink></item>
		<item>
		<title>Haciendo el cambio de ipw3945 a iwl3945</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/a4YUu-GKJik/haciendo-el-cambio-de-ipw3945-a-iwl3945</link>
		<comments>http://blog.milmazz.com.ve/archivos/2008/02/05/haciendo-el-cambio-de-ipw3945-a-iwl3945#comments</comments>
		<pubDate>Tue, 05 Feb 2008 09:35:01 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[debian]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[ipw3945]]></category>
		<category><![CDATA[iwl3945]]></category>
		<category><![CDATA[wireless]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/archivos/2008/02/05/haciendo-el-cambio-de-ipw3945-a-iwl3945/</guid>
		<description><![CDATA[Si usted es de esas personas que cuenta con una tarjeta inalámbrica Intel Corporation PRO/Wireless 3945, seguramente sabrá que existen al menos dos proyectos que le dan soporte. El primero de ellos es ipw3945 y se encuentra obsoleto, el desarrollo pasó al proyecto iwlwifi.
Aprovechando que recientemente ha ingresado a la versión inestable de Debian la [...]]]></description>
			<content:encoded><![CDATA[<p>Si usted es de esas personas que cuenta con una tarjeta inalámbrica <em>Intel Corporation PRO/Wireless 3945</em>, seguramente sabrá que existen al menos dos proyectos que le dan soporte. El primero de ellos es <a href="http://ipw3945.sourceforge.net/">ipw3945</a> y se encuentra <strong>obsoleto</strong>, el desarrollo pasó al proyecto <a href="http://intellinuxwireless.org/">iwlwifi</a>.</p>
<p>Aprovechando que recientemente ha ingresado a la versión inestable de <a href="http://www.debian.org/">Debian</a> la serie del kernel <code>2.6.24</code>, este contiene el nuevo modulo <code>iwl3945</code> que reemplaza al viejo <code>ipw3945</code>. Una de las ventajas de este cambio es que ya no hay necesidad de tener activo el demonio <code>ipw3945d</code>. Sin embargo, aun se necesita del <em>firmware</em> que se encuentra en la sección <code>non-free</code> del repositorio de <a href="http://www.debian.org/">Debian</a>.</p>
<p>Hasta donde he leído el plan será remover los paquetes <code>ipw3945-modules-*</code> e <code>ipw3945d</code> de los repositorios de Debian (al menos en <em>testing</em> y en <em>unstable</em>) una vez que la serie <code>2.6.24</code> del kernel llegue a la versión de pruebas (<em>testing</em>). Aquellos que se encuentren hoy día en la versión inestable (<em>unstable</em>) de Debian deberán cambiar el driver desde <code>ipw3945</code> a <code>iwl3945</code>. Para aquellos que trabajan en <em>etch</em> también es posible usar el driver <code>iwl3945</code> si actualiza su versión del kernel por medio del repositorio <a href="http://backports.org/">etch-backports</a> (el nuevo <em>stack</em> <code>mac80211</code> que usa <code>iwlwifi</code> se encuentra a partir de la versión del kernel <code>2.6.22</code>).</p>
<p>Las instrucciones que verá a continuación se han aplicado en <em>Debian inestable</em>, si usted desea instalar <code>iwlwifi</code> en etch puede seguir estas <a href="http://nanonanonano.net/linux/debian/iwlwifi" title="iwlwifi driver under Debian GNU/Linux">instrucciones</a>.</p>
<p>Obteniendo algunos datos de interés antes de proceder con la actualización.</p>
<p>Versión del kernel:</p>
<pre><code>$ uname -r
2.6.22-3-686</code></pre>
<p>Verifique que en realidad tiene una tarjeta <em>Intel Corporation PRO/Wireless 3945</em></p>
<pre><code>$ lspci -nn | grep Wireless
03:00.0 Network controller [0280]: Intel Corporation PRO/Wireless 3945ABG Network Connection [8086:4227] (rev 02)</code></pre>
<h4>Paquetes necesarios</h4>
<p>Ahora bien, es necesario instalar el nuevo <em>kernel</em> y el <em>firmware</em> necesario para hacer funcionar a <code>iwlwifi</code></p>
<pre><code># aptitude install linux-image-2.6-686 \\
linux-image-2.6.24-1-686 \\
firmware-iwlwifi</code></pre>
<h4>Evitando problemas</h4>
<p>Verifique que no existe alguna entrada que haga referencia al modulo <code>ipw3945</code> en el fichero <code>/etc/modules</code>. Para ello recurrimos a <strong>Perl</strong> que nos facilita la vida.</p>
<pre><code># perl -i -ne 'print unless /^ipw3945/' /etc/modules</code></pre>
<p>Debido a algunos problemas que se presentan en el paquete <a href="http://packages.debian.org/network-manager">network-manager</a> si anteriormente ha venido usando el modulo <code>ipw3945</code> se recomienda <strong>eliminar</strong> la entrada que genera <code>udev</code> para dicho modulo en el fichero <code>/etc/udev/rules.d/z25_persistent-net.rules</code>, la entrada es similar a la siguiente:</p>
<pre><code># PCI device 0x8086:0x4227 (ipw3945)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:13:02:4c:12:12", NAME="eth2"</code></pre>
<h4>Fichero /etc/network/interfaces</h4>
<p>Este paso es opcional, agregamos la nueva interfaz <code>wlan0</code> al fichero <code>/etc/network/interfaces</code> y procedemos a configurarla de acuerdo a nuestras necesidades.</p>
<pre><code>auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-ssid foo
wpa-psk baz
wpa-key-mgmt WPA-PSK
wpa-pairwise TKIP CCMP
wpa-group TKIP CCMP
wpa-proto WPA RSN</code></pre>
<p>En este caso particular se está indicando que nos vamos a conectar a un <em>Access Point</em> cuyo <code>ssid</code> es <code>foo</code> con tipo de cifrado WPA-PSK/WPA2-PSK, haciendo uso del driver <code>wext</code> que funciona como <em>backend</em> para <code>wpa_supplicant</code>. Es de hacer notar que el driver <code>wext</code> es utilizado por todos los adaptadores <em>Intel Pro Wireless</em>, eso incluye <code>ipw2100</code>, <code>ipw2200</code> e <code>ipw3945</code>.</p>
<p>Para hacer funcionar <strong>WPA</strong> recuerde que debe haber instalado previamente el paquete <code>wpasupplicant</code>.</p>
<pre><code># aptitude install wpasupplicant</code></pre>
<p>De igual manera se le recuerda adaptar todos aquellos parámetros como <code>wpa-ssid</code> y <code>wpa-psk</code> a aquellos adecuados en su caso. En particular el campo <code>wpa-psk</code> lo puede generar con el siguiente comando:</p>
<pre><code>$ wpa_passphrase su_ssid su_passphrase</code></pre>
<p>Aunque mi recomendación es usar el comando <code>wpa_passphrase</code> de la siguiente manera.</p>
<pre><code>$ wpa_passphrase su_ssid</code></pre>
<p>Posteriormente deberá introducir <code>su_passphrase</code> desde la entrada estándar, esto evitará que <code>su_passphrase</code> quede en el historial de comandos.</p>
<p>Para mayor detalle de los campos expuestos en la configuración del fichero <code>/etc/network/interfaces</code> se le recomienda leer la documentación expuesta en <code>/usr/share/doc/wpasupplicant/README.modes.gz</code>.</p>
<p>Una vez concluidos estos pasos reiniciamos el sistema y seleccionamos en nuestro <em>Gestor de Arranque</em> (ej. GRUB) la versión del <em>kernel</em> recien instalada. Al momento de iniciar su sesión verifique que su tarjeta inalámbrica esté funcionando, de lo contrario haga las revisiones que se indican en la siguiente sección.</p>
<h4>En caso de persistir los problemas</h4>
<p>Remueva y reinserte el modulo <code>iwl3945</code></p>
<pre><code># modprobe -r iwl3945
# modprobe iwl3945</code></pre>
<p>De manera adicional compruebe que <code>udev</code> haya generado una nueva entrada para <code>iwl3945</code>.</p>
<pre><code>$ cat /etc/udev/rules.d/z25_persistent-net.rules
...
# PCI device 0x8086:0x4227 (iwl3945)
SUBSYSTEM=="net", DRIVERS=="?*", ATTR{address}=="00:13:02:4c:12:12", ATTR{type}=="1", NAME="<strong>wlan0</strong>"</code></pre>
<p>Finalmente, reestablecemos la interfaz de red.</p>
<pre><code># ifdown wlan0
# ifup wlan0</code></pre>
<h4>Elimine ipw3945</h4>
<p>Una vez verificado el correcto funcionamiento del módulo <code>iwl3945</code> puede eliminar con seguridad todo aquello relacionado con el modulos <code>ipw3945</code>.</p>
<pre># aptitude --purge remove firmware-ipw3945 \\
ipw3945-modules-$(uname -r) \\
ipw3945-source ipw3945d</pre>
<p>Estas instrucciones también aplican para el modulo <code>iwl4965</code>. Mayor información en <a href="http://wiki.debian.org/iwlwifi">Debian Wiki &sect; iwlwifi</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=a4YUu-GKJik:OMHyqhDbwzM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=a4YUu-GKJik:OMHyqhDbwzM:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=a4YUu-GKJik:OMHyqhDbwzM:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=a4YUu-GKJik:OMHyqhDbwzM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=a4YUu-GKJik:OMHyqhDbwzM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=a4YUu-GKJik:OMHyqhDbwzM:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2008/02/05/haciendo-el-cambio-de-ipw3945-a-iwl3945/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2008/02/05/haciendo-el-cambio-de-ipw3945-a-iwl3945</feedburner:origLink></item>
		<item>
		<title>Activado el registro de participantes del V Foro Mundial de Conocimiento Libre</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/-McWyBnAKck/activado-el-registro-de-participantes-del-v-foro-mundial-de-conocimiento-libre</link>
		<comments>http://blog.milmazz.com.ve/archivos/2007/10/29/activado-el-registro-de-participantes-del-v-foro-mundial-de-conocimiento-libre#comments</comments>
		<pubDate>Mon, 29 Oct 2007 22:11:06 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[Anuncios]]></category>
		<category><![CDATA[Noticias]]></category>
		<category><![CDATA[software+libre]]></category>
		<category><![CDATA[solve]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/archivos/2007/10/29/activado-el-registro-de-participantes-del-v-foro-mundial-de-conocimiento-libre/</guid>
		<description><![CDATA[ Hace pocos minutos la Comisión para la Plataforma Tecnológica del V Foro Mundial de Conocimiento Libre tomó la decisión de hacer pública la aplicación para el registro de participantes.
El V Foro Mundial de Conocimiento Libre es un evento que se llevará a cabo desde el 19 al 23 de Noviembre del año 2007 en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.milmazz.com/wp-content/uploads/2007/10/vfmcl-logo.png" alt="Logotipo del VFCML" class="alignright" style="border: 0pt none " /> Hace pocos minutos la <em>Comisión para la Plataforma Tecnológica</em> del <strong>V Foro Mundial de Conocimiento Libre</strong> tomó la decisión de hacer pública la aplicación para el <a href="https://registro.foromundial.solve.net.ve" title="Registro de participantes del V Foro Mundial de Conocimiento Libre">registro de participantes</a>.</p>
<p>El <strong>V Foro Mundial de Conocimiento Libre</strong> es un evento que se llevará a cabo desde el 19 al 23 de Noviembre del año 2007 en las instalaciones del <em>Centro de Convenciones del Hotel Intercontinental Guayana</em> de la Ciudad de Puerto Ordaz, Edo. Bolívar, en Venezuela. Para mayor información acerca del evento puede visitar la página oficial del evento <a href="http://foromundial.solve.net.ve" title="V FMCL">V Foro Mundial de Conocimiento Libre</a>.</p>
<p>En el <a href="http://foromundial.solve.net.ve/registro-vfmcl">comunicado oficial</a> emitido por la Comisión para la Plataforma Tecnológica del evento se les recomienda a todas aquellas personas que deseen aclarar alguna inquietud sobre el <strong>V Foro Mundial de Conocimiento Libre</strong> hagan uso del <a href="http://foromundial.solve.net.ve/contacto" title="Formulario de contacto">formulario de contacto</a> que se ha habilitado para tal fin.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=-McWyBnAKck:3T38OUkQAnE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=-McWyBnAKck:3T38OUkQAnE:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=-McWyBnAKck:3T38OUkQAnE:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=-McWyBnAKck:3T38OUkQAnE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=-McWyBnAKck:3T38OUkQAnE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=-McWyBnAKck:3T38OUkQAnE:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2007/10/29/activado-el-registro-de-participantes-del-v-foro-mundial-de-conocimiento-libre/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2007/10/29/activado-el-registro-de-participantes-del-v-foro-mundial-de-conocimiento-libre</feedburner:origLink></item>
		<item>
		<title>Configurando el sonido (HDA Intel) en Lenovo 3000 c200 en Debian GNU/Linux</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/r6IO90031nI/configurando-el-sonido-hda-intel-en-lenovo-3000-c200-en-debian-gnulinux</link>
		<comments>http://blog.milmazz.com.ve/archivos/2007/10/06/configurando-el-sonido-hda-intel-en-lenovo-3000-c200-en-debian-gnulinux#comments</comments>
		<pubDate>Sun, 07 Oct 2007 01:14:58 +0000</pubDate>
		<dc:creator>Santiago Lunar M.</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[alsa]]></category>
		<category><![CDATA[lenovo]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/archivos/2007/10/06/configurando-el-sonido-hda-intel-en-lenovo-3000-c200-en-debian-gnulinux/</guid>
		<description><![CDATA[La situación poco común se presentó con un portátil Lenovo, específicamente un 3000 c200; el computador en cuestión mostraba la tarjeta funcionando, como si estuviera todo normal, pero sucede que no había sonido en lo absoluto por más altos que estuvieran los indicadores gráficos del volumen. Indagando por Google me encontré que ya han habido [...]]]></description>
			<content:encoded><![CDATA[<p>La situación poco común se presentó con un portátil <a href="http://www.lenovo.com" title="www.lenovo.com">Lenovo</a>, específicamente un 3000 c200; el computador en cuestión mostraba la tarjeta funcionando, como si estuviera todo normal, pero sucede que <strong>no había sonido en lo absoluto</strong> por más altos que estuvieran los indicadores gráficos del volumen. Indagando por <a href="http://www.google.com">Google</a> me encontré que ya han habido muchos casos similares, no solamente para laptops Lenovo, sino para la mayoría que incluye ese tipo de tarjetas y me encontré con una solución en un <a href="http://help.ubuntu.com/community/HdaIntelSoundHowto">foro</a> que me funcionó perfecto. Acá voy a tratar de explicar paso a paso todo lo que hice para que funcionara como debe ser.</p>
<p>Lo primero que se hizo fué asegurarse que se trata realmente de una tarjeta HDA Intel, con la siguiente línea de comandos:</p>
<pre><code>$ lspci | grep High</code></pre>
<p>&#8230;a lo que se obtuvo la siguiente respuesta:</p>
<pre><code>00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02)</code></pre>
<p>&#8230;donde se puede verificar que se trata de la <acronym title="High Definition Audio">HDA</acronym> de la familia ICH7 de la <a href="http://www.intel.com">Intel</a>. Una vez verificado ésto, se procede a instalar algunos paquetes necesarios para que todo funcione de manera correcta, que son los siguientes:</p>
<ul>
<li>build-essentials</li>
<li>gettext</li>
<li>libncurses5-dev</li>
</ul>
<p>Ésto se logró con el aptitude, con la siguiente línea de comandos:</p>
<pre><code>$ sudo aptitude install el_paquete_que_quiero_instalar</code></pre>
<p>Luego hay que descargar las cabeceras del kernel que se está usando. Para ésto, la manera más fácil de hacerlo fué instalando el paquete <strong>module-assistant</strong> y haciendo lo siguiente en una terminal:</p>
<pre><code>$ sudo m-a update
$ sudo m-a prepare</code></pre>
<p>Y el programa automáticamente va a saber cuáles cabeceras descargar y el directorio donde ponerlas. Cuando estén instalados éstos tres paquetes también se va a necesitar descargar de la <a href="http://www.alsa-project.org">página del Proyecto Alsa</a> tres archivos necesarios y que son nombrados a continuación:</p>
<ul>
<li><a href="ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.14.tar.bz2">alsa-driver-1.0.14.tar.bz2</a></li>
<li><a href="ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.14a.tar.bz2">alsa-lib-1.0.14a.tar.bz2</a></li>
<li><a href="ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.14.tar.bz2">alsa-utils-1.0.14.tar.bz2</a></li>
</ul>
<p>Se pueden descargar con un gestor de descargas preferido, ésto se hizo con <strong>wget</strong>, utilizando la línea de comandos:</p>
<pre><code>$ wget -c http://www.alsa-project.org/alsa-driver-1.0.14.tar.bz2</code></pre>
<p>&#8230;y así para cada uno de los archivos. Cuando se tengan los tres archivos, se copian a la carpeta <code>/usr/src/alsa/</code> la cual, probablemente no existe todavía en el sistema y por lo tanto tendrá que ser creada; ésto se puede lograr con la siguiente línea de comandos:</p>
<pre><code>$ sudo mkdir /usr/src/alsa</code></pre>
<p>&#8230;cuando se tenga el directorio, se copian los tres archivos tar.gz al mismo; ésto se puede lograr con:</p>
<pre><code>$ sudo cp alsa* /usr/src/alsa/</code></pre>
<p>Luego hay que descomprimir los ficheros tar.gz con:</p>
<pre><code>$ sudo tar xvf el_archivo_que_vamos_a_descomprimir.tar.gz</code></pre>
<p>Una vez descomprimidos nos ubicamos en la primera carpeta que va a ser alsa-driver-1.0.14/ y compilamos el alsa para las tarjetas HDA Intel con las siguientes líneas de comandos:</p>
<pre><code>$ sudo ./configure --with-cards=hda-intel
$ sudo make
$ sudo make install</code></pre>
<p>Luego vamos a necesitar compilar los otros 2 paquetes restantes, para ello, nos ubicamos en la carpeta correspondiente y hacemos en una terminal lo siguiente:</p>
<pre><code>$ sudo ./configure
$ sudo make
$ sudo make install</code></pre>
<p>Ésto se va a hacer tanto para <em>alsa-lib</em> como para <em>alsa-utils</em>, pues el procedimiento es el mismo. Cuando se hayan compilado los tres paquetes el sistema ya debería ser capaz de reconocer correctamente la tarjeta y por lo tanto debe haber sonido; Ésto puedes ser verificado (1) Abriendo un reproductor de preferencia y reproduciendo algo de musica ó (2) Se puede hacer con la siguiente línea:</p>
<pre><code>$ cat /dev/urandom &gt;&gt; /dev/dsp/ </code></pre>
<p>Con lo cual se obtendrá un sonido algo parecido a unos aplausos, pero en realidad son sonidos producidos aleatoriamente.</p>
<p>Ésto debería ser todo. En las máquinas que se configuraron, cuando se conectaban los audífonos en el panel lateral, el sonido salía tanto por los audífonos como por las cornetas y al parecer se solucionó con una reiniciada, pero sino quieres reiniciar entonces lo que tienes que hacer es <q>tumbar</q> los módulos que se crearon y volverlos a cargar, tal cual reiniciaras el sistema:</p>
<pre><code>$ sudo modprobe -r snd_hda_intel652145
$ sudo modprobe -r snd_pcm
$ sudo modprobe -r snd_page_alloc</code></pre>
<p>Luego para cargarlos hacemos las mismas línea, pero sin la opción -r.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=r6IO90031nI:xhPA32epTl4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=r6IO90031nI:xhPA32epTl4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=r6IO90031nI:xhPA32epTl4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=r6IO90031nI:xhPA32epTl4:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=r6IO90031nI:xhPA32epTl4:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=r6IO90031nI:xhPA32epTl4:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2007/10/06/configurando-el-sonido-hda-intel-en-lenovo-3000-c200-en-debian-gnulinux/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2007/10/06/configurando-el-sonido-hda-intel-en-lenovo-3000-c200-en-debian-gnulinux</feedburner:origLink></item>
		<item>
		<title>Transmission 0.72 en Debian y Ubuntu GNU/Linux AMD64</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/x9_cQcf4qKw/transmission-072-en-debian-y-ubuntu-gnulinux-amd64</link>
		<comments>http://blog.milmazz.com.ve/archivos/2007/07/08/transmission-072-en-debian-y-ubuntu-gnulinux-amd64#comments</comments>
		<pubDate>Sun, 08 Jul 2007 21:52:20 +0000</pubDate>
		<dc:creator>Santiago Lunar M.</dc:creator>
				<category><![CDATA[Distribuciones]]></category>
		<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[bittorrent]]></category>
		<category><![CDATA[transmission]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/archivos/2007/07/08/transmission-072-en-debian-y-ubuntu-gnulinux-amd64/</guid>
		<description><![CDATA[Bien, en realidad, no he podido esperar a tenerlo trabajando al 100%, se trata de la versión 0.72 de Transmission, el que a mi parecer, es el mejor cliente BitTorrent que jamás haya existido. Según lo describen en la página, cito textualmente: &#8220;Transmission has been built from the ground up to be a lightweight, yet [...]]]></description>
			<content:encoded><![CDATA[<p>Bien, en realidad, no he podido esperar a tenerlo trabajando al 100%, se trata de la versión 0.72 de <a href="http://transmission.m0k.org/about.php">Transmission</a>, el que a mi parecer, es el mejor cliente <a href="http://es.wikipedia.org/wiki/BitTorrent">BitTorrent</a> que jamás haya existido. Según lo describen en la página, cito textualmente: &#8220;<em>Transmission has been built from the ground up to be a lightweight, yet powerful BitTorrent client. Its simple, intuitive interface is designed to integrate tightly with whatever computing environment you choose to use. Transmission strikes a balance between providing useful functionality without feature bloat. Furthermore, it is free for anyone to use or modify</em>&#8220;. Su instalación es <strong>muy fácil</strong>, ya que lo único que tenemos que hacer, es bajarnos el .deb (sí, el .deb, imagínense lo fácil que nos va a resultar) de la página de nuestros amígos de <a href="http://www.getdeb.net/app.php?name=Transmission">GetDeb</a> y luego usar una terminal ó el instalador de paquetes GDebi (aún más fácil) para instalar el paquete.</p>
<p>En el primer de los casos, usando la terminal, lo único que tenemos que hacer en escribir la siguiente línea de comandos:<br />
<code>$ sudo dpkg -i transmission_0.72-0~getdeb1_amd64.deb</code></p>
<p><code></code><br />
&#8230;esperar a que termine el proceso de instalación y ya podrás ejecutar el Transmission desde <em>Aplicaciones &#8211;&gt; Internet &#8211;&gt; Transmission</em>.</p>
<p>Para el segundo de los casos, usando el instalador GDebi, tan sólo hay que hacer click encima del .deb con el botón derecho del ratón y seleccionamos la opción <em>Abrir con &#8220;Instalador de paquetes GDebi&#8221;</em> y luego click en el botón <em>Instalar el paquete</em>, finalmente esperar a que finalice la instalación del paquete y listo!. Una de las cosas que, debo admitir, más me gusta de ésta nueva versión, es que ahora podemos minimizar la aplicación en la bandeja del sistema <img src='http://blog.milmazz.com.ve/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  .</p>
<p>Para más información de Transmission, visite su <a href="http://transmission.m0k.org/index.php">Página Oficial</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=x9_cQcf4qKw:0_m3qyPjW-g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=x9_cQcf4qKw:0_m3qyPjW-g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=x9_cQcf4qKw:0_m3qyPjW-g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=x9_cQcf4qKw:0_m3qyPjW-g:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=x9_cQcf4qKw:0_m3qyPjW-g:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=x9_cQcf4qKw:0_m3qyPjW-g:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2007/07/08/transmission-072-en-debian-y-ubuntu-gnulinux-amd64/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2007/07/08/transmission-072-en-debian-y-ubuntu-gnulinux-amd64</feedburner:origLink></item>
		<item>
		<title>Recuperando una antigua Logitech Quickcam Express</title>
		<link>http://feedproxy.google.com/~r/milmazz/blog/~3/S31l04TzHdo/recuperando-una-antigua-logitech-quickcam-express</link>
		<comments>http://blog.milmazz.com.ve/archivos/2007/05/14/recuperando-una-antigua-logitech-quickcam-express#comments</comments>
		<pubDate>Tue, 15 May 2007 01:45:53 +0000</pubDate>
		<dc:creator>milmazz</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Ocio]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[logitech]]></category>

		<guid isPermaLink="false">http://blog.milmazz.com.ve/archivos/2007/05/14/recuperando-una-antigua-logitech-quickcam-express/</guid>
		<description><![CDATA[No se porque motivo o razón comencé a revisar en unas cajas de mi cuarto, cuando de repente me encontré con la primera cámara web que compre, de hecho, vino como accesorio a mi máquina de escritorio Compaq Presario 5006LA. Así que me pregunté, ¿será que todavía funciona esta reliquia?.
Lo primero que hice fue conectar [...]]]></description>
			<content:encoded><![CDATA[<p>No se porque motivo o razón comencé a revisar en unas cajas de mi cuarto, cuando de repente me encontré con la primera cámara web que compre, de hecho, vino como accesorio a mi máquina de escritorio <em>Compaq Presario 5006LA</em>. Así que me pregunté, ¿será que todavía funciona esta reliquia?.</p>
<p>Lo primero que hice fue conectar el dispositivo en cuestión a mi portátil actual, enseguida ejecuté el comando:</p>
<pre><code>$ lsusb | grep -i logitech
Bus 002 Device 002: ID 046d:0840 Logitech, Inc. QuickCam Express</code></pre>
<p>Una vez conocido el <em>PCI ID</em> (046d:0840) del dispositivo realicé una búsqueda rápida en <a href="http://www.google.com" rel="help">Google</a> y llegué a un sitio muy interesante, en donde podemos obtener una descripción de los <a href="http://www.qbik.ch/usb/devices/" hreflang="en" rel="help">dispositivos USB para Linux</a>, al usar la función de <a href="http://www.qbik.ch/usb/devices/search.php" title="Search Database" hreflang="en">búsqueda en la base de datos</a> del sitio mencionado previamente ingreso el dato correspondiente al <strong>Vendor ID</strong> (en mi caso, <strong>046d</strong>), posteriormente filtre los resultados por el <strong>Product ID</strong> (en mi caso, <strong>0840</strong>), sentía que ya estaba dando con la solución a mi problema, había encontrado información detallada acerca de mi <a href="http://www.qbik.ch/usb/devices/showdev.php?id=2405">Logitech Quickcam Express</a>. Al llegar acá descubrí el <a href="http://qce-ga.sourceforge.net/" title="Linux QuickCam USB Web Camera Driver Project" hreflang="en">Linux QuickCam USB Web Camera Driver Project</a>.</p>
<p>En la página principal del <a href="http://qce-ga.sourceforge.net/" title="Linux QuickCam USB Web Camera Driver Project" hreflang="en">Linux QuickCam USB Web Camera Driver Project</a> observo que mi <em>vejestorio</em> de cámara es soportada por el <em>driver</em> <code>qc-usb</code>.</p>
<p>Con la información anterior decido hacer uso del manejador de paquetes <code>aptitude</code> y en los resultados avisté el nombre de un paquete <code>qc-usb-source</code>, así que <strong>definitivamente</strong> nuestra salvación es <code>module-assistant</code>.</p>
<pre><code># aptitude install qc-usb-source \\
build-essential \\
module-assistant \\
modconf \\
linux-headers-`uname -r`
# m-a update
# m-a prepare
# m-a a-i qc-usb
</code></pre>
<p>Una vez realizado el paso anterior recurro a la utilidad de configuración de módulos en <a href="http://www.debian.org" title="El Sistema Operativo Universal" rel="help">Debian</a> <code>modconf</code> e instalo el módulo <code>quickcam</code><code>, el cual se encuentra en </code><code>/lib/modules/2.6.18-4-686/misc/quickcam.ko</code> y verificamos.</p>
<pre><code># tail /var/log/messages
May 14 21:16:57 localhost kernel: Linux video capture interface: v2.00
May 14 21:16:57 localhost kernel: quickcam: QuickCam USB camera found (driver version QuickCam USB 0.6.6 $Date: 2006/11/04 08:38:14 $)
May 14 21:16:57 localhost kernel: quickcam: Kernel:2.6.18-4-686 bus:2 class:FF subclass:FF vendor:046D product:0840
May 14 21:16:57 localhost kernel: quickcam: Sensor HDCS-1000/1100 detected
May 14 21:16:57 localhost kernel: quickcam: Registered device: /dev/video0
May 14 21:16:57 localhost kernel: usbcore: registered new driver quickcam</code></pre>
<p>Como puede observarse el dispositivo es reconocido y se ha registrado en <code>/dev/video0</code>. En este instante que poseemos los módulos del driver <code>qc-sub</code> para nuestro <em>kernel</em>, podemos instalar la utilidad <code>qc-usb-utils</code>, esta utilidad nos permitirá modificar los parámetros de nuestra <em>Logitech QuickCam Express</em>.</p>
<pre><code># aptitude install qc-usb-utils</code></pre>
<p>Ahora podemos hacer una prueba rápida de nuestra cámara, comienza la diversión, juguemos un poco con <code>mplayer</code>.</p>
<pre><code>$ mplayer tv:// -tv driver=v4l:width=352:height=288:outfmt=rgb24:device=/dev/video0:noaudio -flip</code></pre>
<p>A partir de ahora podemos probar más aplicaciones <img src='http://blog.milmazz.com.ve/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=S31l04TzHdo:3CeGENcLaUk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=S31l04TzHdo:3CeGENcLaUk:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=S31l04TzHdo:3CeGENcLaUk:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=S31l04TzHdo:3CeGENcLaUk:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/milmazz/blog?a=S31l04TzHdo:3CeGENcLaUk:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/milmazz/blog?i=S31l04TzHdo:3CeGENcLaUk:V_sGLiPBpWU" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://blog.milmazz.com.ve/archivos/2007/05/14/recuperando-una-antigua-logitech-quickcam-express/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.milmazz.com.ve/archivos/2007/05/14/recuperando-una-antigua-logitech-quickcam-express</feedburner:origLink></item>
	</channel>
</rss>
