<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.5" -->
<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/"
	>

<channel>
	<title>TechNotes</title>
	<link>http://technotes.jovianstorm.com</link>
	<description>Codename: Chona</description>
	<pubDate>Mon, 13 Aug 2007 17:45:48 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.5</generator>
	<language>en</language>
			<item>
		<title>Structs, tipos y listas enlazadas</title>
		<link>http://technotes.jovianstorm.com/2007/08/13/structs-tipos-y-listas-enlazadas.html</link>
		<comments>http://technotes.jovianstorm.com/2007/08/13/structs-tipos-y-listas-enlazadas.html#comments</comments>
		<pubDate>Mon, 13 Aug 2007 16:07:04 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Programación</dc:subject><dc:subject>c</dc:subject><dc:subject>programacion</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2007/08/13/structs-tipos-y-listas-enlazadas.html</guid>
		<description><![CDATA[Cada vez que retomo la programación en C después de haberme dado más de un mes para oxidarme, hay algo que, por más que lo utilice, siempre tengo que volver a consultar: las structs. Una struct nos permite tener un registro con varios campos en una sola variable, pero no voy a explicar mucho más [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez que retomo la programación en C después de haberme dado más de un mes para <em>oxidarme</em>, hay algo que, por más que lo utilice, siempre tengo que volver a consultar: las <em>structs</em>. Una struct nos permite tener un registro con varios campos en una sola variable, pero no voy a explicar mucho más aquí. Voy a hablar de las distintas formas en las que se pueden declarar, que es lo que siempre olvido.</p>
<p>La declaración de una struct tiene la forma <code class="inline">struct <em>nombre_opcional</em> { campos };</code>. La forma más usual, al menos en mi caso, de declarar una struct y luego definir una variable con ese tipo es esta:</p>
<div class="igBar"><span id="lc-9"><a href="#" onclick="javascript:showPlainTxt('c-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-9">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> complejo <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">float</span> real, imaginario;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> complejo n; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>En ella creo una struct simple con dos campos, que son la parte real e imaginaria de un número complejo, y declaro la variable <em>n</em> como complejo. Aquí puede verse como el uso de una struct es similar al de un tipo, pero hay que recordar que es necesario que la declaración de la variable esté precedida de la palabra <code class="inline">struct</code>, como se ve en el ejemplo, pues los nombres de las structs no se incluyen de forma independiente en la tabla de símbolos del compilador, sólo asociados al modificador <em>struct</em>.</p>
<p><a id="more-12"></a><br />
Si no vamos a usar muchas variables del mismo tipo, podemos hacer la declaración de <em>n</em> en un sólo paso, y podemos incluso omitir el nombre de la struct (por eso es opcional), como se ve en este otro ejemplo:</p>
<div class="igBar"><span id="lc-10"><a href="#" onclick="javascript:showPlainTxt('c-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-10">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">float</span> real, imaginario;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> n; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>En este caso la variable <em>n</em> es también un número complejo, pero si quisiéramos otra variable del mismo tipo en otro lugar del programa, tendríamos que reescribir toda esta declaración.</p>
<p>Si queremos evitar evitar tener que pasar por el <em>tedioso trabajo</em> <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  de escribir la palabra struct cada vez que vamos a declarar una variable con el tipo struct complejo, podemos usar <code class="inline">typedef</code>. Typedef es una sentencia que permite crear nuevos nombres de tipo a partir de los tipos ya existentes. Su sintaxis es <code class="inline">typedef tipo_anterior alias</code>. Esto lo hacemos normalmente porque el tipo original es más complicado de escribir o porque un nuevo nombre añade información semántica de valor y hace el código más legible. Siguiendo con el ejemplo de los números complejos, podría crear un tipo llamado simplemente complejo de la siguiente forma:</p>
<div class="igBar"><span id="lc-11"><a href="#" onclick="javascript:showPlainTxt('c-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-11">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">float</span> real, imaginario;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> complejo;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">complejo n; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Como vemos, en este caso se omite el nombre de la struct, de modo que es anónima, pero no nos hará falta porque, como estamos definiendo un nuevo tipo, podemos referirnos a ella con el nombre de éste: <em>complejo</em>. Hay que prestar especial atención al hecho de que, en esta ocasión, a la hora de declarar la variable <em>n</em>, no es necesario usar la palabra struct, ahora complejo se encuentra en la tabla de símbolos del compilador de forma independiente. En este caso podríamos haber indicado un nombre a la struct, pero no nos habría servido para nada, incluso podría haberse llamado <em>complejo</em>, igual que el tipo, pues al ir asociada a la palabra struct no existirían conflictos de nombres. Más abajo hay un ejemplo que puede aclarar este punto.</p>
<p>Para seguir explicando las diferentes posibilidades voy a dejar de lado los números complejos y usaré para los ejemplos siguientes una de las estructuras clásicas con las que cualquier programador tiene que enfrentarse alguna vez: una lista simplemente enlazada. En este caso usaré una lista de enteros. Las explicaciones, no obstante, son aplicables a cualquier struct que incluya entre sus campos algún puntero a sí misma.</p>
<p>La forma más común de crear esta estructura en la siguiente:</p>
<div class="igBar"><span id="lc-12"><a href="#" onclick="javascript:showPlainTxt('c-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-12">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> nodo <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">int</span> valor;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">struct</span> nodo *siguiente;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> nodo *lista; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ahora, si queremos crear un tipo nuevo para la struct que representa un nodo de la lista, <strong>NO</strong> podemos hacer esto:</p>
<div class="igBar"><span id="lc-13"><a href="#" onclick="javascript:showPlainTxt('c-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-13">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">int</span> valor</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; elem *siguiente;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> elem;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">elem *lista; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>El problema es que el tipo que se está definiendo no se encuentra disponible hasta que se ha terminado de definir (parece lógico, ¿no?), de modo que no podemos crear el puntero siguiente usando el nombre <em>elem</em>, porque en ese momento no se encuentra en la tabla de símbolos. Hay varias formas de resolver esto. La primera, y más usual, es darle un nombre a la struct y usarlo para declarar el puntero siguiente, en lugar de usar el nombre del tipo:</p>
<div class="igBar"><span id="lc-14"><a href="#" onclick="javascript:showPlainTxt('c-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-14">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> nodo <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">int</span> valor;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">struct</span> nodo *siguiente;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> elem;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">elem *lista; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Pero si esta mezcla no es de tu agrado, hay una forma en la que se puede usar el nombre del nuevo tipo para el puntero siguiente, y es declarando la struct y el tipo primero y definiendo los campos después:</p>
<div class="igBar"><span id="lc-15"><a href="#" onclick="javascript:showPlainTxt('c-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-15">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> nodo elem;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> nodo <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">int</span> valor;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; elem *siguiente;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">elem *lista; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Así, cuando llega la declaración del puntero siguiente, la sentencia que crea el tipo ha concluido y éste se encuentra ya en la tabla de símbolos. Aunque pueda parecer menos directa, es la que más me gusta y creo que la usaré a partir de ahora a menos que el caso concreto aconseje lo contrario. </p>
<p>Siguiendo este último ejemplo, podemos ver en este recorte lo que decía más arriba, que el nombre de la struct no es un identificador por sí sólo, así que podemos usarlo también para definir el tipo:</p>
<div class="igBar"><span id="lc-16"><a href="#" onclick="javascript:showPlainTxt('c-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">C:</span>
<div id="c-16">
<div class="c">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> nodo nodo;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #993333;">struct</span> nodo <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #993333;">int</span> valor;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; nodo *siguiente;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> ;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">nodo *lista; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ahora lo más probable es que cuando vuelva a pasar un tiempo sin escribir en C, se me olviden muchas cosas excepto esta. En cualquier caso, espero que este post te haya sido de tanta utilidad como a mi <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Algunas de mis lecturas para formarme, además del libro <em>The C Programming Language</em>, de Kernighan y Ritchie, han sido estas <a href="http://www.netalive.org/codersguild/posts/1753.shtml">fuente 1</a>, <a href="http://vergil.chemistry.gatech.edu/resources/programming/c-tutorial/lists.html">fuente 2</a>, <a href="http://stsdas.stsci.edu/bps/linked_list.html">fuente 3</a> y <a href="http://www.thescripts.com/forum/post1972774-16.html">fuente 4</a>.
</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2007/08/13/structs-tipos-y-listas-enlazadas.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Opciones en las direcciones de Gmail</title>
		<link>http://technotes.jovianstorm.com/2007/04/20/opciones-en-las-direcciones-de-gmail.html</link>
		<comments>http://technotes.jovianstorm.com/2007/04/20/opciones-en-las-direcciones-de-gmail.html#comments</comments>
		<pubDate>Fri, 20 Apr 2007 22:53:24 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Tips</dc:subject><dc:subject>correo electrónico</dc:subject><dc:subject>email</dc:subject><dc:subject>gmail</dc:subject><dc:subject>tip</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2007/04/20/opciones-en-las-direcciones-de-gmail.html</guid>
		<description><![CDATA[Gmail ofrece a sus usuarios la posibilidad de recibir su correo aún cuando se han aplicado algunas modificaciones a la dirección. La opción más conocida es la de usar el signo de la suma '+', para añadir cualquier cosa a la parte de usuario de la dirección. Por ejemplo, si mi dirección de correo es [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mail.google.com/" title="Página de entrada de Gmail">Gmail</a> ofrece a sus usuarios la posibilidad de recibir su correo aún cuando se han aplicado algunas modificaciones a la dirección. La opción más conocida es la de usar el signo de la suma '<strong>+</strong>', para añadir cualquier cosa a la parte de usuario de la dirección. Por ejemplo, si mi dirección de correo es <strong>pipo@gmail.com</strong>, el correo enviado a <strong>pipo+loquesea@gmail.com</strong> me llegará también a mí. Esto resulta especialmente útil para mejorar la clasificación del correo mediante filtros.</p>
<p>Otra de estas opciones, que descubrí hoy por casualidad, es la de añadir puntos:</p>
<blockquote cite="http://mail.google.com/support/bin/answer.py?ctx=%67mail&#038;hl=es&#038;answer=10313"><p>Gmail no reconoce los puntos (.) como caracteres en un nombre de usuario. De este modo, puedes añadir y eliminar puntos de tu nombre de usuario con el fin de variar la dirección de correo electrónico. Los mensajes enviados a tu.nombredeusuario@gmail.com y a t.u.n.o.m.b.r.e.d.e.u.s.u.a.r.i.o@gmail.com se recibirán en la misma bandeja de entrada, ya que los caracteres del nombre de usuario son los mismos.</p></blockquote>
<p>Esto puede ser muy útil para los usuarios, aunque en mi caso quien más se ha beneficiado de esto son los <em>spammers</em> que me han seguido desde mis viejas cuentas de correo, que tenían un punto, a la de Gmail, que no lo tiene. Por fortuna, el filtro antispam que incorpora Gmail es lo suficientemente bueno como para que no sea una molestia.</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2007/04/20/opciones-en-las-direcciones-de-gmail.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Python en Windows sin ventana de DOS</title>
		<link>http://technotes.jovianstorm.com/2007/02/19/python-en-windows-sin-ventana-de-dos.html</link>
		<comments>http://technotes.jovianstorm.com/2007/02/19/python-en-windows-sin-ventana-de-dos.html#comments</comments>
		<pubDate>Mon, 19 Feb 2007 23:00:13 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Windows</dc:subject>
	<dc:subject>Tips</dc:subject><dc:subject>windows python gui tip</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2007/02/19/python-en-windows-sin-ventana-de-dos.html</guid>
		<description><![CDATA[En Windows se puede ejecutar un programa escrito en Python haciendo doble clic sobre él, pues se asocian los archivos de extensión .py al intérprete durante la instalación de éste. Aún cuando el programa que se ejecuta es una aplicación gráfica, se abre una ventana de DOS, que está ahí para dejar disponibles la entrada [...]]]></description>
			<content:encoded><![CDATA[<p>En Windows se puede ejecutar un programa escrito en Python haciendo doble clic sobre él, pues se asocian los archivos de extensión .py al intérprete durante la instalación de éste. Aún cuando el programa que se ejecuta es una aplicación gráfica, se abre una ventana de DOS, que está ahí para dejar disponibles la entrada y salida estándar y la salida de errores. Sin embargo, muchas veces no interesa que aparezca, pues puede resultar molesta, o incluso confundir a usuarios poco avanzados que usen la aplicación.</p>
<p>La forma más sencilla que he encontrado para evitar que aparezca esta ventana de DOS con los programas Python es cambiar la extensión del ejecutable principal <strong>de .py a .pyw</strong>, con esto en vez de abrirse con python.exe, se abrirá con pythonw.exe, que está pensado especialmente para estos casos <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2007/02/19/python-en-windows-sin-ventana-de-dos.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problemas al compilar blas-atlas en Gentoo</title>
		<link>http://technotes.jovianstorm.com/2007/02/02/problemas-al-compilar-blas-atlas-en-gentoo.html</link>
		<comments>http://technotes.jovianstorm.com/2007/02/02/problemas-al-compilar-blas-atlas-en-gentoo.html#comments</comments>
		<pubDate>Fri, 02 Feb 2007 17:35:14 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Linux</dc:subject><dc:subject>blas atlas</dc:subject><dc:subject>gentoo</dc:subject><dc:subject>linux</dc:subject><dc:subject>octave</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2007/02/02/problemas-al-compilar-blas-atlas-en-gentoo.html</guid>
		<description><![CDATA[Esta es una de esas entradas que pongo aquí sobre todo para evitar olvidarme si me enfrento de nuevo al mismo problema.
Ayer estaba en la biblioteca estudiando para un examen de control digital y necesitaba usar octave para hacer algunas pruebas. Descubrí con horror que iba mal cuando se quedó colgado al pedirle las raíces [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una de esas entradas que pongo aquí sobre todo para evitar olvidarme si me enfrento de nuevo al mismo problema.</p>
<p>Ayer estaba en la biblioteca estudiando para un examen de control digital y necesitaba usar <a href="http://en.wikipedia.org/wiki/GNU_Octave" title="Octave en la Wikipedia en inglés">octave</a> para hacer algunas pruebas. Descubrí con horror que iba mal cuando se quedó colgado al pedirle las raíces de un polinomio:</p>
<p><code>octave:1> v = roots([1 3 2 0 2])</code></p>
<p>Tuve que interrumpir la operación con el típico <strong>Ctrl+C</strong> porque, además, el octave estaba usando en ese momento el 100% de CPU según <a href="http://man-wiki.net/index.php/1:top" title="Página de manual de top">top</a>. Lo sorprendente es que al volver a intentar la misma operación, en vez de colgarse, me mostró este error:</p>
<p><code>octave:1> v = roots([1 3 2 0 2])<br />
error: dgeev failed to converge<br />
error: evaluating assignment expression near line 65, column 9<br />
error: evaluating if command near line 62, column 5<br />
error: evaluating if command near line 59, column 3<br />
error: called from `roots' in file `/usr/share/octave/2.1.73/m/polynomial/roots.m'<br />
error: evaluating assignment expression near line 1, column 3</code></p>
<p>El problema no sólo aparecía con la función <code>roots</code>, sino con muchas otra de las que necesitaba, que quizá usaban ésta en su código. Un poco de investigación al llegar a casa me hizo saber que el problema estaba en que había compilado la versión de octave ofrecida como estaba por Gentoo sin <a href="http://en.wikipedia.org/wiki/Blas" title="Basic Linear Algebra Subprograms en la Wikipedia en inglés">Blas</a> entre sus <em>uses</em>. En el <em>Changelog</em> de octave decía que en la versión más reciente (2.1.73-r2), <em>Blas</em> había dejado de ser opcional.</p>
<p>Desenmascaré entonces esta versión de octave y comenzó la instalación de <strong>blas-atlas</strong>, que es una de las implementaciones de ¡<em>Blas</em> disponibles. Pero duró poco, la instalación se detuvo con un mensaje en pantalla que decía que tenía que ejecutar la instalación en modo interactivo. Seguí los pasos indicados pero, independientemente de las opciones que escogiese en el proceso, la compilación fallaba.</p>
<p>En <a href="http://forums.gentoo.org/viewtopic-p-3751744.html#3751744" title="Solución propuesta en el foro de Gentoo">un hilo del foro de Gentoo</a> donde había un usuario quejándose del mismo problema que yo, el desarrollador encargado del <em>ebuild</em> de octave en Gentoo aconsejaba desenmascarar las últimas versiones de <em>blas-atlas</em> y <em>blas-lapack</em> (además de dos de sus dependencias que también estaban enmascaradas). Hecho esto repetí el intento de instalación y esta vez no sólo me hizo menos preguntas que antes sino que aparentemente estaba funcionando.</p>
<p>El proceso de compilación de <em>blas-atlas</em> es largo, y por la salida que ofrece en ocasiones parece que ha entrado en un ciclo infinito. Pero no pierdas la calma, que no es así; cada iteración es diferente y no se ciclan, así que resiste la tentación de cancelar. No puedo decir cuanto tardó porque me fui a dormir, pero esta mañana, cuando le pregunté a octave de nuevo por las raíces del mismo polinomio de ayer, me respondió esto rápidamente:</p>
<p><code>octave:1> v = roots([1 3 2 0 2])<br />
v =<br />
  -1.79051 + 0.55231i<br />
  -1.79051 - 0.55231i<br />
   0.29051 + 0.69660i<br />
   0.29051 - 0.69660i</code></p>
<p>Una advertencia, aunque aparece en pantalla antes de empezar: Si tienes un procesador que ajusta su velocidad a las necesidades del software, desactiva esta opción y deja una velocidad fija de procesador durante la compilación, porque <em>blas-atlas</em> hace pruebas de rendimiento para optimizarse y una velocidad variable del procesador puede traer resultados no deseados.</p>
<p>Eso es todo, Jake out.
</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2007/02/02/problemas-al-compilar-blas-atlas-en-gentoo.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La codificación de caracteres en Python</title>
		<link>http://technotes.jovianstorm.com/2007/02/01/la-codificacion-de-caracteres-en-python.html</link>
		<comments>http://technotes.jovianstorm.com/2007/02/01/la-codificacion-de-caracteres-en-python.html#comments</comments>
		<pubDate>Thu, 01 Feb 2007 00:26:39 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Programación</dc:subject><dc:subject>python programación tips</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2007/02/01/la-codificacion-de-caracteres-en-python.html</guid>
		<description><![CDATA[Cuando escribimos un script en Python y éste contiene cadenas de caracteres que no están escritas en inglés, es posible que éstas contengan caracteres que no se encuentran entre los definidos por el ASCII. En este caso, si no se le dice a Python cómo debe tratarlas, éste se queja.
Tomemos, por ejemplo, este script que [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando escribimos un script en Python y éste contiene cadenas de caracteres que no están escritas en inglés, es posible que éstas contengan caracteres que no se encuentran entre los definidos por el ASCII. En este caso, si no se le dice a Python cómo debe tratarlas, éste se queja.</p>
<p>Tomemos, por ejemplo, este script que tan sólo muestra en pantalla una cadena de texto:</p>
<div class="igBar"><span id="lpython-20"><a href="#" onclick="javascript:showPlainTxt('python-20'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-20">
<div class="python">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"># Las tildes no están a salvo en los comentarios</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Las tildes no están a salvo en las cadenas de texto"</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Si ejecutamos este script tal como está ahora, tendremos una desagradable sorpresa:</p>
<p><code>jake@aurora /tmp $ chmod u+x encoding.py<br />
jake@aurora /tmp $ ./encoding.py<br />
sys:1: DeprecationWarning: Non-ASCII character '\xc3' in file ./encoding.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details<br />
Las tildes no están a salvo en las cadenas de texto</code></p>
<p>La URL que devuelve el intérprete corresponde a una propuesta de extensión de Python (PEP), aceptada hace tiempo, que indica <a href="http://www.python.org/dev/peps/pep-0263/" title="Defining Python Source Code Encodings">cómo especificar la codificación de caracteres</a> no ASCII.</p>
<p>Básicamente, lo que dice es que Python interpreta todo como ASCII a menos que se le indique lo contrario con <strong>un comentario especial que tiene que estar en la primera o la segunda línea</strong> y debe casar con la expresión regular: <code class="inline">coding[:=]\s*([-\w.]+)</code>. Esto significa que si usas <a href="http://www.vim.org/">Vim</a> o <a href="http://www.gnu.org/software/emacs/" title="Página del editor Emacs en gnu.org" title="Página del editor Vim">emacs</a> para editar el código python puedes utilizar la sintaxis propia de cada uno para indicarle al editor la codificación del archivo y así <em>matar dos pájaros de un tiro</em>. Además, como bien dice el artículo, se puede usar incluso el lenguaje natural; podría escribir:</p>
<div class="igBar"><span id="lpython-21"><a href="#" onclick="javascript:showPlainTxt('python-21'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-21">
<div class="python">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"># Este archivo usa el encoding: utf-8</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"># Las tildes no están a salvo en los comentarios</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Las tildes no están a salvo en las cadenas de texto"</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Aunque yo prefiero usar la sintaxis de Vim, que es, dicho sea de paso, mi editor favorito <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="igBar"><span id="lpython-22"><a href="#" onclick="javascript:showPlainTxt('python-22'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PYTHON:</span>
<div id="python-22">
<div class="python">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"># vim: set fileencoding=utf-8 :</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;"># Las tildes no están a salvo en los comentarios</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"Las tildes no están a salvo en las cadenas de texto"</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Y si ejecutamos esta nueva versión vemos que ahora no hay quejas:</p>
<p><code>jake@aurora /tmp $ ./encoding.py<br />
Las tildes no están a salvo en las cadenas de texto</code></p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2007/02/01/la-codificacion-de-caracteres-en-python.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comprobaciones de particiones en el arranque</title>
		<link>http://technotes.jovianstorm.com/2006/12/20/comprobaciones-de-particiones-en-el-arranque.html</link>
		<comments>http://technotes.jovianstorm.com/2006/12/20/comprobaciones-de-particiones-en-el-arranque.html#comments</comments>
		<pubDate>Wed, 20 Dec 2006 02:58:00 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Linux</dc:subject><dc:subject>disco duro</dc:subject><dc:subject>hardware</dc:subject><dc:subject>linux</dc:subject><dc:subject>ubuntu</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2006/12/20/comprobaciones-de-particiones-en-el-arranque.html</guid>
		<description><![CDATA[Resulta muy molesto, y más en un portátil, que las comprobaciones de las particiones ext3 se hagan en Linux (al menos en Ubuntu) automáticamente durante el arranque. En muchas ocasiones enciendo el ordenador con prisa, con la única intención de consultar algún detalle rápido. Y entonces se programa una comprobación de una de las particiones [...]]]></description>
			<content:encoded><![CDATA[<p>Resulta muy molesto, y más en un portátil, que las comprobaciones de las particiones ext3 se hagan en Linux (al menos en Ubuntu) automáticamente durante el arranque. En muchas ocasiones enciendo el ordenador con prisa, con la única intención de consultar algún detalle rápido. Y entonces se programa una comprobación de una de las particiones de mi disco duro. Es una situación dificil, pues la operación no puede cancelarse ni tampoco reiniciar resuelve el problema. En estas ocasiones no parece quedar más remedio que esperar.</p>
<p>No obstante, la frecuencia de estas comprobaciones puede configurarse. Pueden incluso ser desactivadas. Una rápida lectura a la página de manual del programa <code class="inline">tune2fs</code> me llevó a la solución:<br />
<code>jake@aurora:~$ sudo tune2fs -i 100d -c 100 /dev/sda5<br />
tune2fs 1.39 (29-May-2006)<br />
Se pone la cuenta de montajes máxima a 100<br />
Setting interval between checks to 8640000 seconds</code></p>
<p>Con esto, las comprobaciones sobre la partición /dev/sda se harán cada 100 veces que se reinicie el ordenador (antes estaba a 20) o bien cada 180 días, lo que ocurra antes.</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2006/12/20/comprobaciones-de-particiones-en-el-arranque.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cuidado con Ubuntu en los portátiles Dell</title>
		<link>http://technotes.jovianstorm.com/2006/12/12/cuidado-con-ubuntu-en-los-portatiles-dell.html</link>
		<comments>http://technotes.jovianstorm.com/2006/12/12/cuidado-con-ubuntu-en-los-portatiles-dell.html#comments</comments>
		<pubDate>Tue, 12 Dec 2006 01:13:15 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Linux</dc:subject><dc:subject>bios</dc:subject><dc:subject>dell</dc:subject><dc:subject>dell inspiron 640m</dc:subject><dc:subject>hardware</dc:subject><dc:subject>linux</dc:subject><dc:subject>ubuntu</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2006/12/12/cuidado-con-ubuntu-en-los-portatiles-dell.html</guid>
		<description><![CDATA[La semana pasada tuve un momento de crisis. Cuando fui a encender a Aurora (Dell Inspiron 640m) me encontré con una pantalla negra que únicamente tenía este texto:
Time-of-day clock stopped
Al reiniciar volvía a aparecer la misma pantalla y no podía tan siquiera acceder a la BIOS.
El servicio de atención al cliente de Dell no era [...]]]></description>
			<content:encoded><![CDATA[<p>La semana pasada tuve un momento de <em>crisis</em>. Cuando fui a encender a Aurora (Dell Inspiron 640m) me encontré con una pantalla negra que únicamente tenía este texto:</p>
<p><code>Time-of-day clock stopped</code></p>
<p>Al reiniciar volvía a aparecer la misma pantalla y no podía tan siquiera acceder a la BIOS.</p>
<p>El servicio de atención al cliente de Dell no era una opción, pues no está operativo los sábados. Un poco de investigación me llevó a un informe de errores con título <a href="https://launchpad.net/distros/ubuntu/+source/linux-source-2.6.17/+bug/43745" title="Ubuntu corrupts real time clock on some Dell laptops">Ubuntu corrompe el reloj de tiempo real en algunos portátiles Dell</a>. Allí decía que quitando la pila de la BIOS y volviendo a ponerla se resolvía el problema. Esta me pareció una solución interesante, pero eso fue antes de saber que la pila está debajo del teclado y que tenía que desarmar medio portátil para llegar a ella. Por suerte, Dell pone a disposición de sus clientes una fabulosas instrucciones, con fotos y detalles de cuidado, para desmontar cada modelo de portátil de la marca e identificar las distintas partes (son los llamados <em>manuales de servicio</em>, que sólo están disponibles en inglés). En mi caso, seguí las <a href="http://support.euro.dell.com/support/edocs/systems/ins640m/en/SM/coinbatt.htm">instrucciones específicas para cambiar la pila de la BIOS del Inspiron 640m</a>. Claro que, después de efectuar esta operación, tuve que volver a configurar todos los parámetros de la BIOS para dejarlos como los tenía antes de la <em>crisis</em>.</p>
<p>Esta fotografía la tomé durante el proceso, justo después de haberle quitado la pila a Aurora. El rectángulo azul indica la posición de la pila.</p>
<p class="center"><a href="http://technotes.jovianstorm.com/wp-content/images/20061212/auroras_guts.jpg"><img src="http://technotes.jovianstorm.com/wp-content/images/20061212/_auroras_guts.jpg" width="500" height="375" alt="El interior de Aurora" title="El interior de Aurora"  /></a>
<p>Esta experiencia ha servido con creces para que me plantee probar otras distribuciones. Tengo ahora <a href="http://www.gentoo.org/" title="Página de la distribución Gentoo Linux">Gentoo</a> en el punto de mira, y es más que probable que sea la próxima.
</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2006/12/12/cuidado-con-ubuntu-en-los-portatiles-dell.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Escoger el orden de tarjetas de sonido con Alsa en Ubuntu</title>
		<link>http://technotes.jovianstorm.com/2006/12/06/escoger-el-orden-de-tarjetas-de-sonido-con-alsa-en-ubuntu.html</link>
		<comments>http://technotes.jovianstorm.com/2006/12/06/escoger-el-orden-de-tarjetas-de-sonido-con-alsa-en-ubuntu.html#comments</comments>
		<pubDate>Wed, 06 Dec 2006 03:27:27 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Linux</dc:subject><dc:subject>alsa</dc:subject><dc:subject>linux</dc:subject><dc:subject>tarjeta de sonido</dc:subject><dc:subject>ubuntu</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2006/12/06/escoger-el-orden-de-tarjetas-de-sonido-con-alsa-en-ubuntu.html</guid>
		<description><![CDATA[Uno de los problemas que tuve al actualizar la distribución de Ubuntu Linux de Asimov de Dapper Drake a Edgy Eft tenía que ver con el sonido.
Asimov tiene una tarjeta de sonido incluida en la placa, que nunca uso, porque tengo una Sound Blaster 128 PCI que sí uso. Dapper nunca reconoció la primera, pero [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los problemas que tuve al actualizar la distribución de Ubuntu Linux de Asimov de Dapper Drake a Edgy Eft tenía que ver con el sonido.</p>
<p>Asimov tiene una tarjeta de sonido incluida en la placa, que nunca uso, porque tengo una Sound Blaster 128 PCI que sí uso. Dapper nunca reconoció la primera, pero Edgy sí, y ahora había tomado el control del sonido del sistema. Yo quería poner la Sound Blaster como principal, pero teniendo ambas disponibles.</p>
<p>Encontré la solución en <a href="http://ubuntuforums.org/showthread.php?t=114551">este hilo del foro de Ubuntu</a>. Ejecuté:</p>
<p><code>jake@asimov:~$ cat /proc/asound/modules<br />
 0 snd_via82xx<br />
 1 snd_ens1371</code></p>
<p>Como puede verse, la tarjeta <em>VIA</em>, incluida en la placa base, estaba la primera.</p>
<p>Edité entonces la configuración de Alsa en <strong>/etc/modprobe.d/alsa-base</strong>. Ojo aquí, pues, por alguna razón que desconozco, en el foro se indica otro nombre de archivo que en mi caso no existía, y la configuración de Alsa la encontré en /etc/modprobe.d/alsa-base, como he dicho.</p>
<p><code>jake@asimov:~$ sudo vi /etc/modprobe.d/alsa-base</code></p>
<p>Añadí estas dos líneas al final:</p>
<p><code>options snd-ens1371 index=0<br />
options snd-via82xx index=1</code></p>
<p>Fíjate en que el guión bajo (_) de antes se sustituye aquí por un guión (-). El parámetro index indica en el orden en que se tomarán las tarjetas en el sistema (empezando por cero). Para que estos cambios se hiciesen efectivos en el sistema, ejecuté:</p>
<p><code>$ sudo update-modules</code></p>
<p>Y reinicié la máquina. Al volver a entrar, mi tarjeta principal ya era la Sound Blaster:</p>
<p><code>jake@asimov:~$ cat /proc/asound/modules<br />
 0 snd_ens1371<br />
 1 snd_via82xx</code></p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2006/12/06/escoger-el-orden-de-tarjetas-de-sonido-con-alsa-en-ubuntu.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Actualización de Ubuntu: de Dapper a Edgy</title>
		<link>http://technotes.jovianstorm.com/2006/12/06/actualizacion-de-ubuntu-de-dapper-a-edgy.html</link>
		<comments>http://technotes.jovianstorm.com/2006/12/06/actualizacion-de-ubuntu-de-dapper-a-edgy.html#comments</comments>
		<pubDate>Wed, 06 Dec 2006 01:23:33 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Linux</dc:subject><dc:subject>edgy eft</dc:subject><dc:subject>imagen iso</dc:subject><dc:subject>kernel</dc:subject><dc:subject>linux</dc:subject><dc:subject>ubuntu</dc:subject><dc:subject>usplash</dc:subject>
		<guid isPermaLink="false">http://technotes.jovianstorm.com/2006/12/06/actualizacion-de-ubuntu-de-dapper-a-edgy.html</guid>
		<description><![CDATA[Asimov tiene instalado Windows 2000 Professional y Ubuntu Linux. A finales de octubre se publicó una nueva versión de Ubuntu: Edgy Eft. Una semana después tuve tiempo de actualizar mi Dapper Drake. Aunque podría haber hecho una actualización por red, decidí descargar el CD de instalación. Entre los disponibles para descarga, escogí ubuntu-6.10-alternate-i386.iso, ahora no [...]]]></description>
			<content:encoded><![CDATA[<p>Asimov tiene instalado Windows 2000 Professional y <a href="http://www.ubuntu.com/" title="Página oficial de Ubuntu Linux">Ubuntu Linux</a>. A finales de octubre se publicó una nueva versión de Ubuntu: Edgy Eft. Una semana después tuve tiempo de actualizar mi Dapper Drake. Aunque podría haber hecho una actualización por red, decidí descargar el CD de instalación. Entre los disponibles para descarga, escogí <strong>ubuntu-6.10-alternate-i386.iso</strong>, ahora no recuerdo por qué (estos olvidos son los que quiero evitar con este blog <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<p>Normalmente no grabo estas isos hasta que necesito llevarlas a algún otro lugar, y no era el caso. De modo que seguí estos pasos para evitar grabar el CD.</p>
<p>Primero copié la imagen iso en /media</p>
<p><code>$ sudo cp  ubuntu-6.10-alternate-i386.iso /media</code></p>
<p>Luego creé el directorio /media/edgycd y añadí esta línea al /etc/ftab</p>
<p><code>/media/ubuntu-6.10-alternate-i386.iso   /media/edgycd   iso9660 loop</code></p>
<p>De este modo puedo montar la iso como si estuviese poniendo el CD con solo hacer:</p>
<p><code>$ sudo mount /media/edgycd</code></p>
<p>Siguiendo las instrucciones de <a href="http://www.debianadmin.com/upgrade-ubuntu-dapper-to-ubuntu-edgy-eft.html#comment-399">Este comentario</a> hice esto una vez montado:</p>
<p><code>$ gksu sh /media/edgycd/cdromupgrade</code></p>
<p>Y ahí comenzó directamente la actualización, preguntándome si quería descargar de la red los paquetes que no estuviesen en el CD-ROM. Por supuesto, respondí que sí.</p>
<p>Pasó un buen rato descargando e instalando paquetes. Acepté todas las modificaciones que me mostró y al final reinicié.</p>
<p><a id="more-4"></a></p>
<h3> Los gráficos de arranque: Usplash</h3>
<p>En el menú de selección de grub escogí el kernel para 386 y en el siguiente paso la pantalla se puso en negro y me mostró un error de frecuencia. El monitor de Asimov es un TFT LG FLATRON L1750SQ, de 17" que soporta 1280x1024@75Hz. Me enteré de que se trataba de un problema de los gráficos que se muestran durante el arranque y encontré la solución <a href="https://launchpad.net/distros/ubuntu/+source/usplash/+bug/63156">aquí</a>. Funcionó a la primera, ya me aparecía la imagen de inicio. Venía a decir (traduzco)</p>
<blockquote><p>
Intenta esto en la línea de comandos:<br />
$ sudo nano /etc/usplash.conf</p>
<p>Debería parecerse a esto:</p>
<blockquote><p># Usplash configuration file<br />
xres=1024<br />
yres=768
</p></blockquote>
<p>Si haces cambios, asegúrate de que ejecutas luego este comando:<br />
$ sudo update-initramfs -u
</p></blockquote>
<h3>Los kernels <em>anticuados</em> de Dapper</h3>
<p>Los kernels que tenía instalados en Dapper eran los dos últimos disponibles en los repositorios oficiales de la rama 2.6 para i386 y k7. En Edgy, las versiones especializadas, como k7 o 686 han sido sustituidas por una sola llamada <strong>generic</strong>. Al parecer la razón es que no merecía la pena el esfuerzo de mantener desarrollos paralelos porque al final las diferencias no eran notables. Como yo no había personalizado mi kernel en Dapper, podía borrarlos con tranquilidad una vez comprobado, eso sí, que los nuevos funcionaban bien.</p>
<p>Todas las pruebas anteriores las había hecho con el de i383 y cuando probé el generic no funcionó. Se quedaba todo parado en el arranque. Investigando un poco encontré la solución (otra vez) en <a href="http://ubuntuforums.org/showpost.php?p=1660092&#038;postcount=6" title="Hilo del foro de Ubuntu">este hilo del foro de Ubuntu</a>, donde se explica que la actualización a Edgy no creó el script <strong>initramfs</strong> para el kernel genérico, de modo que el problema se resuelve creándolo manualmente:</p>
<p><code>jake@asimov:~$ sudo mkinitramfs -o /boot/initrd.img-2.6.17-10-generic<br />
jake@asimov:~$ sudo update-grub</code></p>
<p>Antes de reiniciar, y como al menos ya tenía el de i386 que funcionaba bien, usé <strong>aptitude</strong> para quitar todos los núcleos anteriores. Busqué primero todos los kernels instalados:</p>
<p><code>jake@asimov:~$ sudo aptitude search linux-image | grep ^i<br />
i   linux-image-2.6.15-26-386     - Linux kernel image for version 2.6.15 on 386.<br />
i A linux-image-2.6.15-26-k7      - Linux kernel image for version 2.6.15 on AMD K7 SMP/UP<br />
i A linux-image-2.6.15-27-386     - Linux kernel image for version 2.6.15 on 386.<br />
i A linux-image-2.6.15-27-k7      - Linux kernel image for version 2.6.15 on AMD K7 SMP/UP<br />
i   linux-image-2.6.17-10-386     - Linux kernel image for version 2.6.17 on i386<br />
i   linux-image-2.6.17-10-generic - Linux kernel image for version 2.6.17 on x86/x86_64<br />
i   linux-image-386               - Linux kernel image on 386.<br />
i   linux-image-generic           - Generic Linux kernel image<br />
i   linux-image-k7                - Obsoleted by: linux-image-generic<br />
</code></p>
<p>La primera columna indica si un paquete está instalado (i) o no (p), pero con <code class="inline">grep ^i</code> se filtran las líneas que empiezan por <strong>i</strong>, de modo que sólo se muestran los instalados. Tomé los nombres de los que tenían número inferior a 2.6.17 y los  eliminé todos con aptitude:</p>
<p><code>jake@asimov:~$ sudo aptitude purge linux-image-2.6.15-26-386 linux-image-2.6.15-26-k7 linux-image-2.6.15-27-386 linux-image-2.6.15-27-k7 linux-image-k7</code></p>
<p>Fíjate en que eliminé también el paquete <em>dummy</em> <code class="inline">linux-image-k7</code> porque, debido a los mencionados cambios en la política de variantes del núcleo, ya no tenía sentido tenerlo instalado.</p>
<p>Cuando terminó la desinstalación, el aptitude se encargó de reconfigurar el grub para que se guardasen los cambios. Y entonces sí que era momento de reiniciar, para ver un grub limpio, y comprobar que el kernel genérico funcionaba correctamente.</p>
<p>En efecto, tras estos cambios, todo parecía estar en orden. El menú de grub se veía mucho más limpio y el kernel genérico se cargó sin problemas.</p>
<h3>Edgy vs Mplayer</h3>
<p>Mplayer es mi reproductor de vídeo favorito, por eso lo tenía instalado en Dapper. Pero Edgy decidió que mplayer no era bueno y lo desinstaló sin preguntarme. Yo, por otra parte, decidí que lo quería de vuelta y lo volví a instalar <img src='http://technotes.jovianstorm.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Cuando instalo mplayer, normalmente suelo poner estos 4 paquetes:</p>
<ul>
<li>mplayer</li>
<li>mplayer-skins</li>
<li>mplayer-fonts</li>
<li>mplayer-doc</li>
</ul>
<p>Comprobé cuales de ellos no estaban instalados:</p>
<p><code>jake@asimov:~$ sudo aptitude search mplayer | egrep ' mplayer(\-doc\b|\-fonts\b|-skins\b| )'<br />
c   mplayer          - The Ultimate Movie Player For Linux<br />
i   mplayer-doc      - The Ultimate Movie Player For Linux (Docum<br />
c   mplayer-fonts    - Fonts for mplayer<br />
i   mplayer-skins    - Skins for the Ubuntu mplayer Package</code></p>
<p>Y ví que mplayer y mplayer-fonts aparecía como eliminado aunque con archivos de configuración presentes (es lo que indica la c). Parecía un problema de solución simple:</p>
<p><code>jake@asimov:~$ sudo aptitude install mplayer mplayer-fonts</code></p>
<p>Y efectivamente, lo fue. Ya podía volver a ver vídeos con mi reproductor favorito. Además, los archivos de configuración anteriores se mantuvieron tras la instalación, de modo que no tuve que configurar nada más nada.</p>
<h3>Fin (o casi)</h3>
<p>Después de resolver estos problemas y un pequeño percance con el sonido que ya comentaré en otro post, el sistema estaba actualizado y funcionando correctamente.
</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2006/12/06/actualizacion-de-ubuntu-de-dapper-a-edgy.html/feed/</wfw:commentRss>
		</item>
		<item>
		<title>¡Hola mundo!</title>
		<link>http://technotes.jovianstorm.com/2006/12/05/hola-mundo.html</link>
		<comments>http://technotes.jovianstorm.com/2006/12/05/hola-mundo.html#comments</comments>
		<pubDate>Tue, 05 Dec 2006 23:13:48 +0000</pubDate>
		<dc:creator>Jake</dc:creator>
		
	<dc:subject>Sin clasificar</dc:subject><dc:subject>hardware</dc:subject>
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Comienzo este proyecto con el más que conocido &#171;¡Hola Mundo!&#187; que tanto hemos visto al dar los primeros pasos en un nuevo lenguaje de programación. No voy a describir en este post el propósito de este weblog, pues ya lo he hecho en la sección Acerca de.
Tan sólo quiero hacer dos cosas en esta entrada.
La [...]]]></description>
			<content:encoded><![CDATA[<p>Comienzo este proyecto con el más que conocido &laquo;¡Hola Mundo!&raquo; que tanto hemos visto al dar los primeros pasos en un nuevo lenguaje de programación. No voy a describir en este post el propósito de este weblog, pues ya lo he hecho en la sección <em>Acerca de</em>.</p>
<p>Tan sólo quiero hacer dos cosas en esta entrada.</p>
<p>La primera es darte la bienvenida, y transmitirte mi deseo de que encuentres razones para acompañarme un largo tiempo.</p>
<p>La segunda es, para ir entrando en calor, presentarte mis máquinas.</p>
<p>En la foto puedes ver, de izquierda a derecha a <strong>Aurora</strong>, <strong>Asimov</strong> y <strong>Nostromo</strong>. He puesto la foto en <a href="http://www.flickr.com/" title="Flickr, comunidad de compartición de fotografías">flickr</a> y le he añadido notas, así que si sigues el enlace podrás ver con más exactitud qué es cada cosa (pasa el ratón sobre la imagen en la página de flickr y saldrán las notas)</p>
<p class="center"><a href="http://www.flickr.com/photos/jovianjake/312186000/" title="Photo Sharing"><img src="http://static.flickr.com/100/312186000_3c84d5546c.jpg" width="500" height="164" alt="Ah! Machines!" /></a></p>
<ul>
<li>Aurora es un Dell Inspiron 640m con un procesador Centrino Duo a 2GHz y 2GB de RAM</li>
<li>Asimov es un <em>sin marca</em> con un procesador AMD Sempron 2600 (1,6 GHz) y 512 MB de RAM</li>
<li>Nostromo es un Dell Optiplex GX240 con un procesador Intel Pentium IV a 1.50GHz, y 512 MB de RAM</li>
</ul>
<p>Sé que no es entrar mucho en detalle, pero supongo que con el tiempo te iré contando un poco más de cada uno (probablemente cuando me den problemas).</p>
]]></content:encoded>
			<wfw:commentRss>http://technotes.jovianstorm.com/2006/12/05/hola-mundo.html/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
