<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Código Fuente</title>
	<atom:link href="http://salomonrt.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://salomonrt.wordpress.com</link>
	<description>Hay 10 tipos de informáticos: los que saben binario y los que no</description>
	<lastBuildDate>Sat, 21 Jan 2012 19:42:44 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='salomonrt.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Código Fuente</title>
		<link>http://salomonrt.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://salomonrt.wordpress.com/osd.xml" title="Código Fuente" />
	<atom:link rel='hub' href='http://salomonrt.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Tips para ser un buen usuario final (de computadoras)</title>
		<link>http://salomonrt.wordpress.com/2012/01/21/tips-para-ser-un-buen-usuario-final-de-computadoras/</link>
		<comments>http://salomonrt.wordpress.com/2012/01/21/tips-para-ser-un-buen-usuario-final-de-computadoras/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 19:42:38 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Mi punto de vista]]></category>
		<category><![CDATA[consejos para sacar más provecho a una PC]]></category>
		<category><![CDATA[usar una computadora]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=396</guid>
		<description><![CDATA[En la actualidad muchas personas tienen contacto con computadoras, ya sea en su trabajo o en su propia casa, pero muchas de estas personas no saben usarlas; el problema es que ellos creen que si. El saber prender y apagar una PC, hacer un documento de texto, hoja de cálculo, usar un navegador web para [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=396&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En la actualidad muchas personas tienen contacto con computadoras, ya sea en su trabajo o en su propia casa, pero muchas de estas personas no saben usarlas; el problema es que ellos creen que si.</p>
<p>El saber prender y apagar una PC, hacer un documento de texto, hoja de cálculo, usar un navegador web para buscar algo en internet o enviar un correo electrónico en mi opinión no puede describirse como &#8220;saber usar una computadora&#8221;.</p>
<p>A continuación pongo una lista de cosas que creo que debería tomar en cuenta todo aquel que desee ser un buen usuario final (algunos puntos parecerán obvios y algunos probablemente hasta cómicos, pero creanme, es absolutamente necesario enunciarlos, si estudió sistemas, informática, etc. y ha tratado con usuarios finales sabe de lo que hablo):</p>
<p>1. Saber leer y escribir</p>
<p>2. Si ya sabe leer, no tenga miedo de usar esa habilidad (la mayoría de los usuarios finales no leen los manuales, ni siquiera los mensajes que aparecen en pantalla cuando están usando alguna aplicación)</p>
<p>3. Por increíble que parezca, el saber leer y escribir no es suficiente para usar una computadora adecuadamente, es necesario comprender lo que se está leyendo</p>
<p>4. Saber la diferencia entre hardware y software</p>
<p>5. Conocer el hardaware de la computadora que usamos (saber que es un monitor, un mouse, un teclado, un puerto USB, un puerto paralelo, etc.)</p>
<p>6. Conocer la diferencia entre memoria y disco duro. En muchas ocasiones cuando he preguntado a algún usuario final ¿cuánta memoria tiene su PC? he escuchado frases como &#8220;tiene 500 gigas de memoria&#8221;. Uno pensaría &#8220;caray, no tiene una PC, tiene todo un <a href="http://en.wikipedia.org/wiki/Computer_cluster" target="_blank">cluster</a>&#8220;, en realidad, el usuario se estaba refiriendo a la capacidad de almacenamiento del disco duro de su PC y no a la memoria RAM.</p>
<p>7. Saber qué sistema operativo se está usando (si es Ud. usuario final, probablemente le sorprenda saber que existen otros sistemas operativos además de Windows, pero afortunadamente así es) y de preferencia también saber la versión (si es Windows por ejemplo, ayuda saber qué versión de Windows, 3.0, 3.1, 3.11, 95, 95OSR, 98, 98SE, ME, 2000, XP, Vista, 7, etc.). También en innumerables ocasiones cuando he preguntado a un usuario final ¿qué sistema operativo tiene instalado su PC? he recibido como respuesta ¿en dónde veo eso?.</p>
<p>8. Conocer la diferencia entre sistema operativo y cualquier otra aplicación, como por ejemplo una suite de oficina (típicamente una suite de oficina incluye un procesador de palabras, un ahoja de cálculo y un software para presentaciones)</p>
<p>9. Saber usar la aplicación que el sistema operativo de nuestra PC tiene instalada para el manejo de archivos. Esto incluye saber copiar archivos o moverlos de un lugar a otro, renombrar archivos, eliminar archivos, etc.</p>
<p>10. Saber descomprimir un archivo (por lo menos si está en formato zip).Esto incluye saber qué significa que un archivo esté comprimido y la diferencia entre &#8220;ver&#8221; lo que contiene un archivo comprimido y &#8220;descomprimirlo&#8221;</p>
<p>11. Saber usar un navegador web</p>
<p>12. Saber la diferencia entre una página web y una dirección de correo electrónico</p>
<p>13. Saber a que se refiere alguien  cuando nos pregunta ¿qué tipo de archivo es? ó ¿cuál es la ruta del archivo?</p>
<p>14 Entender lo que significa &#8220;formatear el disco duro&#8221;, &#8220;resetear o reiniciar la PC&#8221;, &#8220;respaldar la información&#8221;</p>
<p>15 Recordar la ubicación en donde guardamos nuestros archivos (ya sea que los descarguemos de internet o que los creemos con alguna aplicación)</p>
<p>16. Tener claro que las computadoras &#8220;no piensan&#8221; (tampoco adivinan lo que deseamos hacer). Más de una vez he visto que cuando el apuntador del mouse cambia de forma para indicar que se está realizando algún proceso (en Windows toma la forma de un reloj de arena) el usuario final dice que la computadora &#8220;está pensando&#8221;. Creanme, cuando eso pase (que las computadoras piensen), si habrá que preocuparnos</p>
<p>Sería bueno que los usuarios finales supieran todavía algunas otras cosas más, pero los usuarios finales que sepan por lo menos estos 16 puntos, tendrán una mejor experiencia al usar una computadora, le sacarán mayor provecho a su computadora y será más fácil para la persona de sistemas a la que pidan ayuda cuando la necesiten, el poder ayudarles.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/396/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=396&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2012/01/21/tips-para-ser-un-buen-usuario-final-de-computadoras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Gráfica de barras horizontales en la terminal con C++</title>
		<link>http://salomonrt.wordpress.com/2011/12/14/grafica-de-barras-horizontales-en-la-terminal-con-c/</link>
		<comments>http://salomonrt.wordpress.com/2011/12/14/grafica-de-barras-horizontales-en-la-terminal-con-c/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 01:00:39 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Copiar valores de un vector a otro con la STL]]></category>
		<category><![CDATA[encontrar valor menor y valor mayor en un vector sin ordenarlo]]></category>
		<category><![CDATA[grafica de barras en modo texto con c++]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=390</guid>
		<description><![CDATA[Ya en un post anterior había escrito sobre la STL de C++; el código siguiente simula una gráfica de barras horizontales en modo texto y aprovecho para ejemplificar el uso de algunas funciones y algoritmos de la STL. El programa consiste en pedirle al usuario que capture números positivos y los va almacenando en un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=390&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ya en un post anterior había escrito sobre la <a href="http://www.sgi.com/tech/stl/stl_introduction.html" target="_blank">STL</a> de C++; el código siguiente simula una gráfica de barras horizontales en modo texto y aprovecho para ejemplificar el uso de algunas funciones y algoritmos de la STL.<br />
El programa consiste en pedirle al usuario que capture números positivos y los va almacenando en un vector, para terminar la captura el usuario debe introducir un número negativo. Una vez terminada la captura, se copian los valores almacenados en el vector a otro vector y después se ordenan para que en el vector original los números queden en el mismo orden en que el usuario los fue capturando. Esta parte de copiar los valores de un vector a otro y ordenar los valores en el segundo vector no es necesaria para el funcionamiento del programa, sólo lo pongo para ejemplificar com se haría esto usando la STL.</p>
<p>En el programa utilizo funciones de la STL para encontrar el valor menor y el valor mayor en el vector original sin tener que ordenarlo.</p>
<p>Aquí está el código<br />
Archivo grafica_barrash.cpp</p>
<p><pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;algorithm&gt;
#include &lt;math.h&gt;

using namespace std;

int main()
{
 int i_x=0, i_y=0;
 double dbl_valor=0, dbl_escala=0;
 vector&lt;double&gt; v_valores, v_ordenados;
 vector&lt;double&gt;::iterator v_valores_it, v_ordenados_it;
 vector&lt;double&gt;::const_iterator menor_it, mayor_it, valor_it;

 cout &lt;&lt; &quot;Teclee un número, (cualquier número negativo para terminar):&quot; &lt;&lt; endl;
 /* Mientras el usuario teclee números positivos (incluido el cero), guardamos en el vector
    v_valores los números que el usuario va tecleando
 */
 while (dbl_valor &gt;= 0)
       {
        cin &gt;&gt; dbl_valor;
        if (dbl_valor &gt;= 0)
            v_valores.push_back(dbl_valor);
       }

 cout &lt;&lt; endl &lt;&lt; &quot;Estos son los números que Ud. introdujo:&quot; &lt;&lt; endl;
 // Muestra los valores almacenados en el vector v_valores
 for ( v_valores_it = v_valores.begin(); v_valores_it != v_valores.end(); v_valores_it++)
      cout &lt;&lt; *v_valores_it &lt;&lt; endl;

 // Hace el vector v_ordenados del mismo tamaño que el vector v_valores
 v_ordenados.resize (v_valores.size());
 // Copia los valores del vector v_valores al vector v_ordenados
 copy (v_valores.begin(), v_valores.end(), v_ordenados.begin());
 // Ordena el vector v_ordenados
 std::sort(v_ordenados.begin(), v_ordenados.end());

 cout &lt;&lt; endl &lt;&lt; &quot;Estos son los números ordenados:&quot; &lt;&lt; endl;
 // Muestra los valores almacenados en el vector v_ordenados
 for ( v_ordenados_it = v_ordenados.begin(); v_ordenados_it != v_ordenados.end(); v_ordenados_it++)
      cout &lt;&lt; *v_ordenados_it &lt;&lt; endl;

 menor_it = min_element(v_valores.begin(), v_valores.end());
 mayor_it = max_element(v_valores.begin(), v_valores.end());

 cout &lt;&lt; endl &lt;&lt; &quot;El valor menor es: &quot; &lt;&lt; *menor_it &lt;&lt; endl;
 cout &lt;&lt; &quot;El valor mayor es: &quot; &lt;&lt; *mayor_it &lt;&lt; endl;

 // Obtiene la escala
 dbl_escala = *mayor_it - *menor_it;
 cout &lt;&lt; &quot;La escala es: &quot; &lt;&lt; dbl_escala &lt;&lt; endl &lt;&lt; endl;

 for (i_x=0; i_x&lt;8; i_x++)
      cout &lt;&lt; &quot; &quot;;

 cout &lt;&lt; ceil(*menor_it);
 for (i_x=0; i_x&lt;=34; i_x++)
      cout &lt;&lt; &quot; &quot;;
 cout &lt;&lt; ceil((dbl_escala/2)+*menor_it);
 for (i_x=0; i_x&lt;=34; i_x++)
      cout &lt;&lt; &quot; &quot;;
 cout &lt;&lt; ceil(*mayor_it);
 cout &lt;&lt; endl;
 for (i_x=0; i_x&lt;8; i_x++)
      cout &lt;&lt; &quot; &quot;;
 cout &lt;&lt; &quot;|&quot;;
 for (i_x=0; i_x&lt;=34; i_x++)
      cout &lt;&lt; &quot; &quot;;
 cout &lt;&lt; &quot;|&quot;;
 for (i_x=0; i_x&lt;=34; i_x++)
      cout &lt;&lt; &quot; &quot;;
 cout &lt;&lt; &quot;|&quot; &lt;&lt; endl;

 // Dibuja las barras
 i_x=1;
 for ( v_valores_it = v_valores.begin(); v_valores_it != v_valores.end(); v_valores_it++)
     {
      cout &lt;&lt; &quot;Valor&quot;&lt;&lt; i_x;
      /* Si el valor de x es de un sólo dígito, deja 2 espacios antes de empezar a dibujar la barra, de lo contrario
         deja sólo uno
      */
      cout &lt;&lt; (i_x &lt; 10 ? &quot;  &quot; : &quot; &quot;);
      valor_it = v_valores_it;
      for (i_y=1; i_y&lt;= ((double)(*valor_it - *menor_it)/dbl_escala)*72+1; i_y++)
           cout &lt;&lt; &quot;*&quot;;
      cout &lt;&lt; endl;
      i_x++;
     }

 return 0;
}
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/390/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/390/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/390/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=390&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/12/14/grafica-de-barras-horizontales-en-la-terminal-con-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Implementación de pilas con apuntadores en C</title>
		<link>http://salomonrt.wordpress.com/2011/10/21/implementacion-de-pilas-con-apuntadores-en-c/</link>
		<comments>http://salomonrt.wordpress.com/2011/10/21/implementacion-de-pilas-con-apuntadores-en-c/#comments</comments>
		<pubDate>Sat, 22 Oct 2011 03:37:21 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[aoperaciones aritméticas en notación postfix con pilas en c]]></category>
		<category><![CDATA[checar paréntesis balanceados]]></category>
		<category><![CDATA[función pop en c]]></category>
		<category><![CDATA[función push en c]]></category>
		<category><![CDATA[pilas en c con apuntadores]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=383</guid>
		<description><![CDATA[En este post muestro como implementar las funciones push y pop para el manejo de pilas, y dos problemas clásicos que se pide se solucionen utilizando pilas. El siguiente archivo contiene la implementación de las funciones push y pop para ser utilizadas con caracteres El siguiente es un programa de ejemplo que permite analizar una [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=383&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En este post muestro como implementar las funciones push y pop para el manejo de pilas, y dos problemas clásicos que se pide se solucionen utilizando pilas.</p>
<p>El siguiente archivo contiene la implementación de las funciones push y pop para ser utilizadas con caracteres</p>
<p><pre class="brush: cpp;">
//Archivo pila_char.h
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

typedef struct nodo_s
{
 char dato;
 struct nodo_s *siguiente;
} nodo_t;

typedef nodo_t *ptrNodo;
typedef nodo_t *ptrPila;

/*
    Agrega un nodo al inicio de la lista ligada
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
void push(ptrPila *pila, char x)
{
 // Crea un nuevo nodo
 ptrNodo nodo;
 nodo = (ptrNodo)malloc(sizeof(nodo_t));
 if (nodo != NULL)
    {
     nodo-&gt;dato = x;
     // El apuntador nodo-&gt;siguiente va a apuntar al primer nodo de la lista ligada
     nodo-&gt;siguiente = *pila;
     // pila va a apuntar al nuevo nodo, con esto hacemos que el nuevo nodo sea ahora el primer nodo de la lista ligada
     *pila=nodo;
    }
}

/*
    Elimina el primer nodo de la lista ligada
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
char pop(ptrPila *pila)
{
 // Crea un nuevo nodo
 ptrNodo nodo;
 char x;
 
 // El nuevo nodo va a apuntar al primer nodo de la lista ligada
 nodo = *pila;
 x = (*pila)-&gt;dato;
 // Ahora el segundo nodo de la lista ligada va a ser el primero
 *pila = (*pila)-&gt;siguiente;
 // Borra el primer nodo de la lista ligada
 free(nodo);
 // Regresa el valor que contenía el nodo que se eliminó
 return x;
}

/*
    Regresa 1 si no hay nodos en la lista ligada y cero en caso contrario
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
int pila_vacia(ptrPila *pila)
{
 return (*pila == NULL ? 1:0);
}

/*
   Muestra los datos de los nodos
*/ 
void nodos_pila(ptrNodo nodo)
{
 if (nodo == NULL)
     printf(&quot;La pila está vacia\n&quot;);
 else
     {
      while (nodo != NULL)
            {
             printf(&quot;%c\n&quot;,nodo-&gt;dato);
             nodo = nodo-&gt;siguiente;
            }
      printf(&quot;\n&quot;);
     }
}
</pre></p>
<p>El siguiente es un programa de ejemplo que permite analizar una cadena y determinar si los paréntesis o corchetes están balanceados, las funciones están hechas de tal forma que podemos agregar también llaves, etc. ya que sólo hay que indicar cuál es el caracter que abre y cuál es el caracter que cierra.</p>
<p><pre class="brush: cpp;">
// Archivo pila_parentesis.c

#include &lt;stdio.h&gt;
#include &quot;pila_char.h&quot;

int verifica_balance(char expresion[], char cabre, char ccierra);

int main()
{
 char cadena[]=&quot;2*[x+q(3s-2)]/[((x+1)*x+(s-2))]&quot;;
 int i=0;
 
 // Muestra la cadena
 printf(&quot;La cadena a analizar es la siguiente:\n\n&quot;);
 while (cadena[i] != '&#092;&#048;')
       {
        printf(&quot;%c&quot;, cadena[i]);
        i++;
       }
 
 printf(&quot;\n\n&quot;);
 // Verifica si los paréntesis están balanceados
 if (verifica_balance(cadena, '(', ')') == 1)
     printf(&quot;Los paréntesis están balanceados\n&quot;);
 else
     printf(&quot;Los paréntesis NO están balanceados\n&quot;);
 
 // Verifica si los corchetes están balanceados
 if (verifica_balance(cadena, '[', ']') == 1)
     printf(&quot;Los corchetes están balanceados\n&quot;);
 else
     printf(&quot;Los corchetes NO están balanceados\n&quot;);
 
 return 0;
}

int verifica_balance(char expresion[], char cabre, char ccierra)
{
 int x=0, balanceados=1;
 ptrPila pila = NULL;
 
 // Recorre la cadena
 while (expresion[x] != '&#092;&#048;' &amp;&amp; balanceados == 1)
       {
        // Si el elemento coincide con el caracter que abre, lo ingresa en la pila
        if (expresion[x]==cabre)
            push(&amp;pila, expresion[x]);
        else
            // Si el elemento coincide con el caracter que cierra, lo saca de la pila
            if (expresion[x]==ccierra)
               {
                /* Si la pila está vacía, significa que los caracteres no están balanceados
                   porque se encontró un caracter que cierra sin que exista antes un caracter que abre
                */
                if (pila_vacia(&amp;pila) != 1)
                    pop(&amp;pila);
                else
                    balanceados = 0;
               }
        x++;
       }
 
 /* Si balanceados = 1 pero la pila no está vacía, los caracteres no están balanceados
    porque quedaron caracteres que abren sin tener su caracter que cierra
 */ 
 if (balanceados == 1 &amp;&amp; pila_vacia(&amp;pila) != 1)
     balanceados = 0;

 // Se asegura de dejar la pila vacia
 while (pila_vacia(&amp;pila) != 1)
        pop(&amp;pila);
 
 return balanceados; 
}
</pre></p>
<p>El siguiente archivo contiene la implementación de las funciones push y pop para ser utilizadas con enteros</p>
<p><pre class="brush: cpp;">
// Archivo pila_int.h

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

typedef struct nodo_s
{
 int dato;
 struct nodo_s *siguiente;
} nodo_t;

typedef nodo_t *ptrNodo;
typedef nodo_t *ptrPila;

/*
    Agrega un nodo al inicio de la lista ligada
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
void push(ptrPila *pila, int x)
{
 // Crea un nuevo nodo
 ptrNodo nodo;
 nodo = (ptrNodo)malloc(sizeof(nodo_t));
 if (nodo != NULL)
    {
     nodo-&gt;dato = x;
     // El apuntador nodo-&gt;siguiente va a apuntar al primer nodo de la lista ligada
     nodo-&gt;siguiente = *pila;
     // pila va a apuntar al nuevo nodo, con esto hacemos que el nuevo nodo sea ahora el primer nodo de la lista ligada
     *pila=nodo;
    }
}

/*
    Elimina el primer nodo de la lista ligada
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
int pop(ptrPila *pila)
{
 // Crea un nuevo nodo
 ptrNodo nodo;
 int x=0;
 
 // El nuevo nodo va a apuntar al primer nodo de la lista ligada
 nodo = *pila;
 x = (*pila)-&gt;dato;
 // Ahora el segundo nodo de la lista ligada va a ser el primero
 *pila = (*pila)-&gt;siguiente;
 // Borra el primer nodo de la lista ligada
 free(nodo);
 // Regresa el valor que contenía el nodo que se eliminó
 return x;
}

/*
    Regresa 1 si no hay nodos en la lista ligada y cero en caso contrario
    *pila es el apuntador que apunta al primer nodo de la lista ligada (la cima de la pila)
*/
int pila_vacia(ptrPila *pila)
{
 return (*pila == NULL ? 1:0);
}

void nodos_pila(ptrNodo nodo)
{
 if (nodo == NULL)
     printf(&quot;La pila está vacia\n&quot;);
 else
     {
      while (nodo != NULL)
            {
             printf(&quot;%d\n&quot;,nodo-&gt;dato);
             nodo = nodo-&gt;siguiente;
            }
      printf(&quot;\n&quot;);
     }
}
</pre></p>
<p>Como ejemplo, el clásico programa para hacer operaciones aritméticas en <a href="http://simple.wikipedia.org/wiki/Postfix_notation" target="_blank">notación postfix</a></p>
<p><pre class="brush: cpp;">
// Archivo pila_postfixexpr.c

#include &lt;stdio.h&gt;
#include &quot;pila_int.h&quot;

int main()
{
 char cadena[]=&quot;45+72-*5/&quot;;
 int i=0, num1=0, num2=0, result=0;
 ptrPila pila = NULL;
 
 // Muestra la cadena
 printf(&quot;La cadena a analizar es la siguiente:\n\n&quot;);
 while (cadena[i] != '&#092;&#048;')
       {
        printf(&quot;%c&quot;, cadena[i]);		
        i++;
       }
 
 i=0;
 printf(&quot;\n\n&quot;);
 // Recorre la cadena
 while (cadena[i] != '&#092;&#048;')
       {
        // Si el elemento no es un operador, lo ingresa en la pila
        if (cadena[i]!='+' &amp;&amp; cadena[i]!='-' &amp;&amp; cadena[i]!='*' &amp;&amp; cadena[i]!='/')		   
            push(&amp;pila, ((int)cadena[i])-48);   // El código ASCII de 0 es 48
        else
             {
              num2=pop(&amp;pila);
              num1=pop(&amp;pila);
              switch (cadena[i])
                     {
                      case '+':
                               result = num1+num2;
                               printf(&quot;suma %d + %d = %d\n&quot;,num1, num2, result);
                               push(&amp;pila, result);
                               break;
                      case '-':
                               result = num1-num2;
                               printf(&quot;resta %d - %d = %d\n&quot;,num1, num2, result);
                               push(&amp;pila, result);
                               break;
                      case '*':
                               result = num1*num2;
                               printf(&quot;multiplica %d * %d = %d\n&quot;,num1, num2, result);
                               push(&amp;pila, result);
                               break;
                      case '/':
                               result = num1/num2;
                               printf(&quot;divide %d / %d = %d\n&quot;,num1, num2, result);
                               push(&amp;pila, result);
                               break;
                     }			 
              }
        i++;
       }

 if (pila_vacia(&amp;pila)!=1)
    {
     printf(&quot;\n\nLos elementos en la pila son los siguientes;\n\n&quot;);
     // Muestra los elementos que están en la pila
     nodos_pila(pila);
    }
 
 return 0;
}
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/383/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/383/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/383/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=383&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/10/21/implementacion-de-pilas-con-apuntadores-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalar Sinatra + PostgreSQL + Datamapper en Debian Squeeze</title>
		<link>http://salomonrt.wordpress.com/2011/09/28/instalar-sinatra-postgresql-datamapper-en-debian-squeeze/</link>
		<comments>http://salomonrt.wordpress.com/2011/09/28/instalar-sinatra-postgresql-datamapper-en-debian-squeeze/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 23:53:31 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[instalar sinatra en debian squeeze]]></category>
		<category><![CDATA[sinatra con datamapper y postgresql]]></category>
		<category><![CDATA[Sinatra CRUD]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=360</guid>
		<description><![CDATA[Sinatra es un DSL para desarrollo web utilizando el lenguaje de programación Ruby. A diferencia de Rails, Sinatra NO obliga a seguir el patrón Modelo Vista Controlador (aunque es posible desarrollar aplicaciones web de ese tipo con Sinatra). He notado que la mayoría de las personas que desarrollan aplicaciones web con acceso a base de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=360&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sinatrarb.com/" target="_blank">Sinatra</a> es un <a href="http://en.wikipedia.org/wiki/Domain-specific_language" target="_blank">DSL</a> para desarrollo web utilizando el lenguaje de programación <a href="http://www.ruby-lang.org/es/" target="_blank">Ruby</a>. A diferencia de <a href="http://rubyonrails.org/" target="_blank">Rails</a>, Sinatra NO obliga a seguir el patrón <a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">Modelo Vista Controlador</a> (aunque es posible desarrollar aplicaciones web de ese tipo con Sinatra). He notado que la mayoría de las personas que desarrollan aplicaciones web con acceso a base de datos, utilizan <a href="http://www.mysql.com/" target="_blank">MySQL</a> o incluso <a href="http://www.sqlite.org/" target="_blank">SQLite</a>, pero yo prefiero <a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a> y no hay razón por la que no se pueda utilizar con Sinatra, así que en este post voy a utilizar ambos junto con un <a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">ORM</a> llamado <a href="http://datamapper.org/" target="_blank">Datamapper</a> para crear los modelos y <a href="http://ruby-doc.org/stdlib/libdoc/erb/rdoc/classes/ERB.html" target="_blank">erb</a> para crear las vistas.</p>
<p><strong>Instalar Ruby</strong></p>
<p>Debian Squeeze trae la versión 1.8.7 de Ruby y la versión 1.9.2, vamos a instalar la versión más reciente (note que el paquete debian se llama ruby1.9.1 pero trae la versión 1.9.2 de Ruby)</p>
<p>sudo apt-get install ruby1.9.1</p>
<p>Una vez instalado, creamos un enlace simbólico al que llamaremos simplemente ruby</p>
<p>cd /usr/bin<br />
sudo ln -s ruby1.9.1 ruby</p>
<p><strong>Instalar RubyGems</strong></p>
<p>De la página <a href="http://rubygems.org/pages/download" target="_blank">http://rubygems.org/pages/download</a> descargamos el archivo .zip o .tgz y lo descomprimimos. Si se descarga el archivo rubygems-1.8.10.tgz, al descomprimirlo se crea un directorio rubygems-1.8.10, hay que cambiarse a ese directorio y ejecutar</p>
<p>sudo ruby setup.rb</p>
<p>Ahora creamos un enlace simbólico al que llamaremos gem</p>
<p>cd /usr/bin<br />
sudo ln -s gem1.9.1 gem</p>
<p><strong>Instalar Sinatra</strong></p>
<p>sudo gem install sinatra</p>
<p>Ya tenemos instalado Sinatra, para probarlo, haremos un programa en Ruby con el clásico hola mundo :). El archivo lo guardamos con el nombre holamundo.rb</p>
<p><pre class="brush: ruby;">

# holamundo.rb
require 'sinatra'

get '/' do
'Hola Mundo!'
end

</pre></p>
<p>Ahora desde la terminal tecleamos</p>
<p>ruby holamundo.rb</p>
<p>Y aparece lo siguiente:</p>
<p>== Sinatra/1.2.6 has taken the stage on 4567 for development with backup from WEBrick<br />
[2011-09-26 13:39:22] INFO  WEBrick 1.3.1<br />
[2011-09-26 13:39:22] INFO  ruby 1.9.2 (2010-08-18) [i486-linux]<br />
[2011-09-26 13:39:22] INFO  WEBrick::HTTPServer#start: pid=3076 port=4567</p>
<p>Abrimos un navegador web y nos vamos a</p>
<p>http://localhost:4567</p>
<p>y veremos el texto Hola Mundo!</p>
<p>Para parar la ejecución, vamos a la terminal y tecleamos Ctrl-C y aparece</p>
<p>== Sinatra has ended his set (crowd applauds)<br />
[2011-09-26 13:40:50] INFO  going to shutdown &#8230;<br />
[2011-09-26 13:40:50] INFO  WEBrick::HTTPServer#start done.</p>
<p>Si en lugar del servidor web WEBrick queremos utilizar Thin, debemos instalar los paquetes ruby1.9.1-dev y build-essential</p>
<p>sudo apt-get install ruby1.9.1-dev build-essential</p>
<p>y ahora si instalamos Thin</p>
<p>sudo gem install thin</p>
<p><strong>Instalar PostgreSQL</strong></p>
<p>sudo apt-get install postgresql postgresql-contrib libpq-dev</p>
<p>Debemos poner un password al usuario postgres</p>
<p>sudo passwd postgres</p>
<p>Nos cambiamos al usuario postgres y asignamos un password al usuario postgres dentro de PostgreSQL</p>
<p>su postgres<br />
psql -c &#8220;ALTER USER postgres WITH PASSWORD &#8216;password_aqui&#8217;&#8221; -d template1</p>
<p>Aparece ALTER ROLE y nos muestra nuevamente el prompt</p>
<p>Todavia como el usuario postgres crear un nuevo usuario en PostgreSQL. Para crear el usuario en PostgreSQL vamos a indicar que sea superusuario (-s), que PostgreSQL nos pida indicar el password para dicho usuario (-P) y nos muestre en pantalla los mensajes que esto genere (-e de &#8211;echo)</p>
<p>En este caso el usuario que voy a crear se llamará sysdba y le pondré como password la palabra s3cret</p>
<p>createuser -P -s -e sysdba</p>
<p>Aparece lo siguiente:</p>
<p>Ingrese la contraseña para el nuevo rol:<br />
Ingrésela nuevamente:<br />
CREATE ROLE sysdba PASSWORD &#8216;md51767410185836193fcba975fe021e85b&#8217; SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;</p>
<p>Salimos del usuario postgres con exit</p>
<p>Editamos el archivo /etc/postgresql/8.4/main/pg_hba.conf para indicar que el usuario que acabamos de crear puede accesar a la linea de comandos de PostgreSQL (psql)</p>
<p>sudo nano /etc/postgresql/8.4/main/pg_hba.conf</p>
<p>Agregamos la linea<br />
local   all         sysdba                           md5</p>
<p>en la sección # Database administrative login by UNIX sockets</p>
<p>y queda algo parecido a esto</p>
<p># Database administrative login by UNIX sockets<br />
local   all         postgres                          ident<br />
local   all         sysdba                            md5</p>
<p>Reiniciamos el servidor PostgreSQL</p>
<p>sudo /etc/init.d/postgresql restart</p>
<p>Aparece</p>
<p>Restarting PostgreSQL 8.4 database server: main.</p>
<p>Nos conectamos a la línea de comandos de PostgreSQL con el usuario que creamos (en este caso sysdba) y creamos una base de datos para pruebas</p>
<p>psql -U sysdba template1</p>
<p>Aparece:</p>
<p>psql (8.4.8)<br />
Digite «help» para obtener ayuda.</p>
<p>template1=#</p>
<p>Tecleamos \l para ver la lista de las bases de datos que existen actualmente</p>
<p>template1=# \l<br />
Listado de base de datos<br />
Nombre   |  Dueño   | Codificación | Collation  |   Ctype    |      Privilegios<br />
&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
postgres  | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 |<br />
template0 | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 | =c/postgres<br />
: postgres=CTc/postgres<br />
template1 | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 | =c/postgres<br />
: postgres=CTc/postgres<br />
(3 filas)</p>
<p>template1=#</p>
<p>Crearemos una nueva base de datos (en este caso se llamará development)</p>
<p>template1=# CREATE DATABASE development;<br />
CREATE DATABASE<br />
template1=#</p>
<p>Verificamos que se haya creado la base de datos</p>
<p>template1=# \l<br />
Listado de base de datos<br />
Nombre    |  Dueño   | Codificación | Collation  |   Ctype    |      Privilegios<br />
&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
development | sysdba  | UTF8         | es_MX.utf8 | es_MX.utf8 |<br />
postgres    | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 |<br />
template0   | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 | =c/postgres<br />
: postgres=CTc/postgres<br />
template1   | postgres | UTF8         | es_MX.utf8 | es_MX.utf8 | =c/postgres<br />
: postgres=CTc/postgres<br />
(4 filas)</p>
<p>template1=#</p>
<p>Salimos de la terminal de PostgreSQL</p>
<p>template1=# \q</p>
<p><strong>Instalar el gem para conectarse desde Ruby a PostgreSQL</strong></p>
<p>sudo gem install pg</p>
<p>Para checar que está funcionando, entramos a la linea de comandos de ruby (desde la terminal tecleamos irb1.9.1) y tecleamos</p>
<p>require &#8216;pg&#8217;</p>
<p>Nos debe regresar true. Salimos con quit</p>
<p>$ irb1.9.1<br />
irb(main):001:0&gt; require &#8216;pg&#8217;<br />
=&gt; true<br />
irb(main):002:0&gt; quit</p>
<p><strong>Instalar Datamapper</strong></p>
<p>sudo gem install data_mapper</p>
<p><strong>Instalar el adaptador que permite a Datamapper comunicarse con la base de datos</strong> (en este caso PostgreSQL)</p>
<p>sudo gem install dm-postgres-adapter</p>
<p>Ya tenemos instalado todo lo necesario para desarrollar aplicaciones web con acceso a base de datos utilizando Sinatra!. Para probarlo pongo a continuación un pequeño programa con las vistas y un archivo css.</p>
<p><strong>Programa principal</strong></p>
<p>El programa contiene un modelo en Datamapper llamado Linea, este modelo crea la tabla lineas en la base de datos development que creamos después de que instalamos PostgreSQL La tabla contiene sólo 2 campos; el campo cve_linea que es la llave primaria y el campo linea.</p>
<p>El programa hace las funciones de creación, lectura, actualización, borrado y listado de registros en la tabla</p>
<p><span style="text-decoration:underline;">Archivo sinatra_test.rb</span></p>
<p><pre class="brush: ruby;">

require 'sinatra'
require 'data_mapper'

configure do
# Se conecta a la base de datos
DataMapper.setup(:default, 'postgres://localhost/development')
DataMapper.setup(:default, {
  :adapter  =&gt; 'postgres',
  :host     =&gt; 'localhost',
  :username =&gt; 'sysdba' ,
  :password =&gt; 's3cret',
  :database =&gt; 'development'})
end

# Modelos
class Linea
  include DataMapper::Resource
  property :cve_linea, String, :length =&gt; 4, :required =&gt; true, :key =&gt; true
  property :linea, String, :length =&gt; 30, :required =&gt; true
end

DataMapper.auto_upgrade!

def campo_vacio(campo)
    campo.empty?
end

# menú principal
get '/' do
  erb :index
end

# muestra error debido a que un campo requerido se sejó vacío
get '/campo_vacio' do
  erb :error_campovacio
end

# *******************************
# LINEA
# *******************************

# nueva linea
get '/linea' do
  erb :reg_linea
end

# muestra el listado de lineas
get '/listalineas' do
  @lineas = Linea.all :order =&gt; :cve_linea
  erb :lista_lineas
end

# guarda la información de la linea
post '/linea' do
  @linea = Linea.new(:cve_linea =&gt; params[:cve_linea].upcase, :linea =&gt; params[:linea].upcase)
  if !campo_vacio(params[:cve_linea]) and !campo_vacio(params[:linea])
     if @linea.save
        redirect &quot;/linea/#{@linea.cve_linea}&quot;
     else
         redirect '/linea'
     end
  else
      redirect '/campo_vacio'
  end
end

# muestra los detalles de la linea
get '/linea/:cve_linea' do
  @linea = Linea.get(params[:cve_linea])
  if @linea
     erb :cons_linea
  else
      redirect '/linea'
  end
end

# muestra la forma para editar la linea
get '/editlinea/:cve_linea' do
  @linea = Linea.get(params[:cve_linea])
  if @linea
     erb :edit_linea
  else
      redirect '/listalineas'
  end
end

# muestra la forma para borrar la linea
get '/borralinea/:cve_linea' do
  @linea = Linea.get(params[:cve_linea])
  if @linea
     erb :borra_linea
  else
      redirect '/listalineas'
  end
end

# edita la linea
put '/editlinea/:cve_linea' do
  @linea = Linea.get(params[:cve_linea])
  if @linea
     @linea.linea = params[:linea].upcase
     @linea.save
     redirect '/listalineas'
  end
end

# borra la linea
delete '/borralinea/:cve_linea' do
  @linea = Linea.get(params[:cve_linea])
  if @linea
     @linea.destroy
     redirect '/listalineas'
  end
end

</pre></p>
<p>En el directorio en donde guardamos el programa principal (sinatra_test.rb) creamos dos directorios, uno llamado public y otro llamado views.<br />
Dentro del directorio public creamos otro directorio que llamaremos stylesheets. Dentro de este directorio stylesheets vamos a poner nuestro archivo css (que llamaremos style.css). Sólo contendrá el código que nos permita &#8220;mostrar&#8221; el texto en mayúsculas automáticamente en los campos de captura. el programa sinatra_test.rb es el que convierte a mayúsculas el texto antes de guardarlo en la tabla.</p>
<p>Desde luego, ustedes pueden agregar el código css necesario para embellecer a su gusto la presentación de la aplicación.</p>
<p><span style="text-decoration:underline;">Archivo public/stylesheets/style.css</span></p>
<p><pre class="brush: css;">
.campo_entrada
{
 text-transform: uppercase;
}
</pre></p>
<p>Ahora en el directorio views vamos a crear las <strong>vistas</strong></p>
<p><span style="text-decoration:underline;">Archivo views/layout.erb</span></p>
<p><pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;title&gt;Ejemplo Sinatra&lt;/title&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;meta name=&quot;description&quot; content=&quot;Acceso a base de datos en PostgreSQL&quot; /&gt;
&lt;meta name=&quot;keywords&quot; content=&quot;Sinatra, Ruby, Datamapper&quot; /&gt;
&lt;link href=&quot;/stylesheets/style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;%= yield %&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/error_campovacio.erb</span></p>
<p><pre class="brush: xml;">
&lt;div&gt;
    &lt;p&gt;La información no se guardó debido a que dejó un campo vacío, por favor verifique!
    &lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/index.erb</span></p>
<p><pre class="brush: xml;">
&lt;h1&gt;Menú Principal&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;/linea&quot;&gt;Registro de líneas&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/listalineas&quot;&gt;Listado de líneas&lt;/a&gt;&lt;/p&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/reg_linea.erb</span></p>
<p><pre class="brush: xml;">
&lt;div&gt;
    &lt;form action=&quot;/linea&quot; method=&quot;post&quot; accept-charset=&quot;utf-8&quot;&gt;
      &lt;label&gt;Clave de línea &lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;cve_linea&quot; id=&quot;cve_linea&quot; maxlength=4&gt;
      &lt;br/&gt;
      &lt;label&gt;Línea &lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;linea&quot; id=&quot;linea&quot; maxlength=30&gt;
      &lt;br/&gt;
      &lt;input type=&quot;submit&quot; value=&quot;Guardar&quot;/&gt;
    &lt;/form&gt;
    &lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/cons_linea.erb</span></p>
<p><pre class="brush: xml;">
&lt;div&gt;
    &lt;label&gt;Clave de línea &lt;/label&gt;&lt;%= @linea.cve_linea %&gt;
    &lt;br/&gt;
    &lt;label&gt;Línea &lt;/label&gt;&lt;%= @linea.linea %&gt;
    &lt;p&gt;&lt;a href=&quot;/linea&quot;&gt;Registro de líneas&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/edit_linea.erb</span></p>
<p><pre class="brush: xml;">
&lt;div&gt;
    &lt;form action=&quot;/editlinea/&lt;%= @linea.cve_linea %&gt;&quot; method=&quot;post&quot; accept-charset=&quot;utf-8&quot;&gt;
       &lt;input type=&quot;hidden&quot; name=&quot;_method&quot; value=&quot;put&quot;&gt;
       &lt;label&gt;Clave de línea &lt;/label&gt;&lt;%= @linea.cve_linea %&gt;
       &lt;br/&gt;
       &lt;label&gt;Línea &lt;/label&gt;&lt;input type=&quot;text&quot; name=&quot;linea&quot; id=&quot;linea&quot; maxlength=30 value=&quot;&lt;%= @linea.linea %&gt;&quot;&gt;
       &lt;br/&gt;
       &lt;input type=&quot;submit&quot; value=&quot;Guardar&quot;/&gt;
    &lt;/form&gt;
    &lt;p&gt;&lt;a href=&quot;/listalineas&quot;&gt;Listado de líneas&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/borra_linea.erb</span></p>
<p><pre class="brush: xml;">
&lt;div&gt;
    &lt;p&gt;Se borrará la siguiente línea: &lt;/p&gt;
    &lt;form action=&quot;/borralinea/&lt;%= @linea.cve_linea %&gt;&quot; method=&quot;post&quot; accept-charset=&quot;utf-8&quot;&gt;
       &lt;input type=&quot;hidden&quot; name=&quot;_method&quot; value=&quot;delete&quot;&gt;
       &lt;label&gt;Clave de línea &lt;/label&gt;&lt;%= @linea.cve_linea %&gt;
       &lt;br&gt;
       &lt;label&gt;Línea &lt;/label&gt;&lt;%= @linea.linea %&gt;
       &lt;br/&gt;
       &lt;input type=&quot;submit&quot; value=&quot;Borrar&quot;/&gt;
    &lt;/form&gt;
    &lt;p&gt;&lt;a href=&quot;/listalineas&quot;&gt;Listado de líneas&lt;/a&gt;&lt;/p&gt;
    &lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</pre></p>
<p><span style="text-decoration:underline;">Archivo views/lista_lineas.erb</span></p>
<p><pre class="brush: xml;">
&lt;p&gt;Líneas registradas: &lt;%= @lineas.length %&gt;&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
   &lt;th&gt;Clave de línea&lt;/th&gt;
   &lt;th&gt;Línea&lt;/th&gt;
   &lt;th&gt;&lt;/th&gt;
   &lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;% @lineas.each do |linea| %&gt;
   &lt;tr&gt;
      &lt;td&gt;&lt;%= linea.cve_linea %&gt;&lt;/td&gt;
      &lt;td&gt;&lt;%= linea.linea %&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/editlinea/&lt;%= linea.cve_linea %&gt;&quot;&gt;[editar]&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/borralinea/&lt;%= linea.cve_linea %&gt;&quot;&gt;[borrar]&lt;/a&gt;&lt;/td&gt;
   &lt;/tr&gt;
&lt;% end %&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;/&quot;&gt;Menú Principal&lt;/a&gt;&lt;/p&gt;
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/360/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/360/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/360/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=360&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/09/28/instalar-sinatra-postgresql-datamapper-en-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalar JRE en CentOS 6</title>
		<link>http://salomonrt.wordpress.com/2011/08/09/instalar-jre-en-centos-6/</link>
		<comments>http://salomonrt.wordpress.com/2011/08/09/instalar-jre-en-centos-6/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 01:55:04 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Instalar Java en CentOS 6]]></category>
		<category><![CDATA[JRE en CentOS 6]]></category>
		<category><![CDATA[Plugin de Java para CentOS 6]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=358</guid>
		<description><![CDATA[CentOS 6 viene con Firefox 3.6.9, para instalar el plugin de Java en dicho navegador en esta versión de CentOS hay que hacer lo siguiente (básicamente son los pasos que indica la página de Java, sólo que ahi tienen algunos errores, al menos al momento en que estoy escribiendo este post): Descargar de la página [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=358&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>CentOS 6 viene con Firefox 3.6.9, para instalar el plugin de Java en dicho navegador en esta versión de CentOS hay que hacer lo siguiente (básicamente son los pasos que indica la página de Java, sólo que ahi tienen algunos errores, al menos al momento en que estoy escribiendo este post):</p>
<p>Descargar de la página de Java el paquete (archivo RPM)</p>
<p>Cerrar Firefox</p>
<p>Desde la terminal, cambiarse al usuario root</p>
<p>Ir al directorio en donde se desea hacer la instalación y poner ahi el archivo RPM; en mi caso fue el archivo jre-6u26-linux-i586.rpm.bin y lo instalé en /usr/local</p>
<p>Agregar permisos de ejecución al archivo RPM tecleando chmod a+x jre-6u26-linux-i586.rpm.bin</p>
<p>Ejecutar el archivo tecleando ./jre-6u26-linux-i586.rpm.bin</p>
<p>Ir al directorio /usr/lib/firefox-3.6 y crear el directorio plugins</p>
<p>cd /usr/lib/firefox-3.6</p>
<p>mkdir plugins</p>
<p>Ir al directorio plugins y crear ahi un enlace simbólico al archivo libnpjp2.so de la instalación de Java</p>
<p>cd plugins</p>
<p>ln -s /usr/java/jre1.6.0_26/lib/i386/libnpjp2.so</p>
<p>Para comprobar la instalación, abrir Firefox y en la barra de direcciones teclear about:plugins (se muestran los plguins que están instalados y debe aparecer entre ellos el de Java).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/358/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/358/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/358/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=358&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/08/09/instalar-jre-en-centos-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>Funciones básicas para listas simplemente ligadas en C</title>
		<link>http://salomonrt.wordpress.com/2011/08/09/funciones-basicas-para-listas-simplemente-ligadas-en-c/</link>
		<comments>http://salomonrt.wordpress.com/2011/08/09/funciones-basicas-para-listas-simplemente-ligadas-en-c/#comments</comments>
		<pubDate>Tue, 09 Aug 2011 19:53:50 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[insertar números en orden usando listas ligadas]]></category>
		<category><![CDATA[listas ligadas en c]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=347</guid>
		<description><![CDATA[En este post voy a poner un archivo de cabecera que hice para poder crear programas que utilicen listas simplemente ligadas, contiene las funciones básicas y está diseñado para manejar enteros, pero es muy fácil hacer la implementación de un archivo de cabecera que acepte otro tipo de datos (char, etc.). La estructura básica es [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=347&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>En este post voy a poner un archivo de cabecera que hice para poder crear programas que utilicen listas simplemente ligadas, contiene las funciones básicas y está diseñado para manejar enteros, pero es muy fácil hacer la implementación de un archivo de cabecera que acepte otro tipo de datos (char, etc.).</p>
<p>La estructura básica es la siguiente</p>
<p><pre class="brush: cpp;">

typedef struct nodo_s
{
 int dato;
 struct nodo_s *siguiente;
} nodo_t;

</pre></p>
<p>Implementé una función para crear un nodo con el valor que contendrá el campo llamado dato, una función para insertar un nodo, para eliminar un nodo, para saber si la lista está vacía y una función que muestra todos los nodos de la lista.</p>
<p><pre class="brush: cpp;">

// Archivo listasimple_int.h

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

typedef struct nodo_s
{
 int dato;
 struct nodo_s *siguiente;
} nodo_t;

typedef nodo_t *ptrNodo;
typedef nodo_t *ptrLista;

/*
Crea un nuevo nodo y en el campo dato almacena el valor que recibe como parámetro
regresa el nodo recien creado
*/
ptrNodo crea_nodo(int valor)
{
 ptrNodo nuevo_nodo = (ptrNodo)malloc(sizeof(nodo_t));
 if (nuevo_nodo != NULL)
    {
     nuevo_nodo-&gt;dato = valor;
     nuevo_nodo-&gt;siguiente = NULL;
    }

 return nuevo_nodo;
}

/*
Agrega a la lista que recibe como parámetro, un nodo enseguida del nodo que recibe como parámetro
Si el nodo que recibe como parámetro es NULL, significa que se desea insertar el nodo al inicio de la lista
*/
void inserta_despues(ptrLista *lista, ptrNodo nodo, int valor)
{
 ptrNodo nuevo_nodo = crea_nodo(valor);

 if (nodo != NULL)
    {
     /* El apuntador nuevo_nodo-&gt;siguiente va a apuntar a la misma dirección a donde apunta
        el apuntador &quot;siguiente&quot; del nodo que recibe como parámetro
     */
     nuevo_nodo-&gt;siguiente = nodo-&gt;siguiente;
     /* El apuntador &quot;siguiente&quot; del nodo que recibe como parámetro va a apuntar al nodo recien creado
        con esto, el nodo recien creado se ha insertado adelante del nodo que se recibe como parámetro
     */
     nodo-&gt;siguiente = nuevo_nodo;
    }
 else
    {
     // Si la lista no está vacía, hace que el apuntador &quot;siguiente&quot; del nuevo nodo apunte al primer elemento de la lista
     if (*lista != NULL)
         nuevo_nodo-&gt;siguiente = *lista;
     // Hace que la lista apunte hacia el nuevo nodo para que sea el primer nodo de la lista
     *lista = nuevo_nodo;
    }
}

/*
  Elimina el nodo que se encuentra enseguida del nodo que recibe como parámetro
  Si el nodo que recibe como parámetro es NULL, y la lista no está vacía,
  significa que se desea borrar el primer nodo de la lista
*/
int elimina_despues(ptrLista *lista, ptrNodo nodo)
{
 int x=0;
 ptrNodo borrar_nodo = NULL;

 if (nodo != NULL)
    {
     if (nodo-&gt;siguiente != NULL)
        {
         /* El apuntador borrar_nodo va a apuntar a la misma dirección a donde apunta
            el apuntador &quot;siguiente&quot; del nodo que recibe como parámetro
         */
         borrar_nodo = nodo-&gt;siguiente;
         /* El apuntador &quot;siguiente&quot; del nodo que recibe como parámetro va a apuntar al nodo que está
            a continuación del que se va a borrar
         */
         nodo-&gt;siguiente = borrar_nodo-&gt;siguiente;
        }
    }
 else
     {
      // Si la lista no está vacia, significa que quiere borrar el primer nodo de la lista
      if (*lista != NULL)
         {
          borrar_nodo = *lista;
          *lista = borrar_nodo-&gt;siguiente;
         }
     }

 /* Si el apuntador &quot;siguiente&quot; del nodo que recibe como parámetro apunta a NULL, significa que el apuntador
    que se recibió como parámetro es el último de la lista, por lo tanto, no hay nodo siguiente
    Otro caso por el cual borrar_nodo puede ser null, es que la lista esté vacía, y también es imposible hacer la eliminación de un nodo
 */
 if (borrar_nodo != NULL)
    {
     x=borrar_nodo-&gt;dato;
     free(borrar_nodo);
    }
 else
     printf(&quot;Borrado prohibido\n&quot;);

 return x;
}

/*
  Regresa 1 si no hay nodos en la lista ligada y cero en caso contrario
  *lista es el apuntador que apunta a la lista ligada
*/
int lista_vacia(ptrLista *lista)
{
 return (*lista == NULL ? 1:0);
}

/*
  Muestra los datos de los nodos
*/
void nodos_lista(ptrNodo nodo)
{
 if (nodo == NULL)
     printf(&quot;La lista está vacia\n&quot;);
 else
     {
      while (nodo != NULL)
            {
             printf(&quot;%d&quot;,nodo-&gt;dato);
             nodo = nodo-&gt;siguiente;
             if (nodo != NULL)
                 printf(&quot; -&gt; &quot;);
            }
      printf(&quot;\n&quot;);
     }
}

</pre></p>
<p>A continuación muestro un programa muy sencillo para que sirva de ejemplo de cómo utilizar este archivo de cabecera, el programa pide al usuario que vaya insertando números enteros y los va insertando en orden en una lista simplemente ligada; cuando el usuario no quiera introducir más números, debe introducir el número cero. Después, el programa da opción a borrar un número de la lista.</p>
<p><pre class="brush: cpp;">

//      ordena_listasimple.c
//
//      Hecho por Salomón Rincón Torres &lt;rtmex@yahoo.com&gt;
//

#include &lt;stdio.h&gt;
#include &quot;listasimple_int.h&quot;

int main()
{
 int numero=0, insertado=0, encontrado=0;
 ptrLista lista = NULL;
 ptrNodo nodo = NULL;

do
  {
   insertado = 0;
   printf(&quot;Este programa recibe números y los va insertando en orden ascendente en una lista simplemente ligada\n&quot;);
   printf(&quot;Vaya introduciendo los números (introduzca cero para salir del programa)\n&quot;);
   scanf(&quot;%d&quot;, &amp;numero);

   if (numero!=0)
      {
       if (lista_vacia(&amp;lista) == 1)
           inserta_despues(&amp;lista, NULL, numero);
       else
           {
            nodo = lista;
            if (numero &lt;= nodo-&gt;dato)
                // Inserta el número al inicio de la lista
                inserta_despues(&amp;lista, NULL, numero);
            else
                while (nodo != NULL &amp;&amp; insertado == 0)
                      {
                       if (numero &gt; nodo-&gt;dato)
                          {
                           if (nodo-&gt;siguiente != NULL)
                              {
                               if (numero &gt; nodo-&gt;siguiente-&gt;dato)
                                   nodo = nodo-&gt;siguiente;
                               else
                                   {
                                    inserta_despues(&amp;lista, nodo, numero);
                                    insertado = 1;
                                   }
                              } /* if */
                           else
                               {
                                inserta_despues(&amp;lista, nodo, numero);
                                insertado = 1;
                               }
                          } /* if */
                      } /* while */
           } /* else */
       printf(&quot;\n\nLos elementos en la lista son los siguientes;\n\n&quot;);
       // Muestra los elementos que están en la lista
       nodos_lista(lista);
      } /* if */
  }
while (numero!=0);

printf(&quot;\n\nLa lista quedó con los siguientes elementos:\n\n&quot;);
// Muestra los elementos que están en la lista
nodos_lista(lista);

if (lista_vacia(&amp;lista) != 1)
   {
    printf(&quot;\nDato a borrar\n&quot;);
    scanf(&quot;%d&quot;, &amp;numero);

    nodo = lista;
    if (nodo != NULL)
        // Verifica si el número que se desea borrar es el primero de la lista
        if (nodo-&gt;dato == numero)
            elimina_despues(&amp;lista, NULL);
        else
            {
             while (nodo != NULL &amp;&amp; encontrado == 0)
                   {
                    if (nodo-&gt;siguiente != NULL)
                       {
                        if (nodo-&gt;siguiente-&gt;dato==numero)
                            encontrado = 1;
                       }
                    if (encontrado == 0)
                        nodo = nodo-&gt;siguiente;
                   }
             if (encontrado == 1)
                 elimina_despues(&amp;lista, nodo);
            }

    printf(&quot;\n\nLa lista final quedó con los siguientes elementos:\n\n&quot;);
    // Muestra los elementos que están en la lista
    nodos_lista(lista);
   }
return 0;
}

</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/347/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/347/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/347/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=347&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/08/09/funciones-basicas-para-listas-simplemente-ligadas-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>FLISOL Puebla 2011</title>
		<link>http://salomonrt.wordpress.com/2011/03/14/flisol-puebla-2011/</link>
		<comments>http://salomonrt.wordpress.com/2011/03/14/flisol-puebla-2011/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 03:29:52 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[difusión del software libre en Puebla]]></category>
		<category><![CDATA[flisol 2011]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=341</guid>
		<description><![CDATA[Como cada año, Puebla vuelve a participar en el Festival Latinoamericano de Instalación de Software Libre. En esta ocasión será el 9 de Abril, a continuación les dejo un banner con la información y la liga al sitio. http://flisol.info/FLISOL2011/Mexico/Puebla Yo estaré participando con una ponencia (Introducción al Software Libre) Además de que pueden llevar sus [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=341&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Como cada año, Puebla vuelve a participar en el Festival Latinoamericano de Instalación de Software Libre. En esta ocasión será el 9 de Abril, a continuación les dejo un banner con la información y la liga al sitio.</p>
<p><a href="http://salomonrt.files.wordpress.com/2011/03/banner-200x200.jpg"><img class="aligncenter size-full wp-image-342" title="Banner 200x200" src="http://salomonrt.files.wordpress.com/2011/03/banner-200x200.jpg?w=450" alt=""   /></a></p>
<p><a href="http://flisol.info/FLISOL2011/Mexico/Puebla" target="_blank">http://flisol.info/FLISOL2011/Mexico/Puebla</a></p>
<p>Yo estaré participando con una ponencia (Introducción al Software Libre)</p>
<p>Además de que pueden llevar sus equipos para que les instalen alguna distribución de GNU/Linux, les recomiendo que asistan a las conferencias, hay desde nivel básico (como la que yo voy a impartir) y nivel más avanzado, además de talleres y juegos.</p>
<p>Es un evento gratuito y el objetivo es dar a conocer el software libre, así que vale la pena que se den una vuelta ese día (es Sábado)</p>
<p>El programa completo está en la liga arriba mencionada</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/341/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/341/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=341&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/03/14/flisol-puebla-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2011/03/banner-200x200.jpg" medium="image">
			<media:title type="html">Banner 200x200</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalación de Debian Squeeze en Lenovo Ideapad S12</title>
		<link>http://salomonrt.wordpress.com/2011/02/07/instalacion-de-debian-squeeze-en-lenovo-ideapad-s12/</link>
		<comments>http://salomonrt.wordpress.com/2011/02/07/instalacion-de-debian-squeeze-en-lenovo-ideapad-s12/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 19:37:04 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[cuenta de msn en Empathy]]></category>
		<category><![CDATA[Instalar Debian 6 desde USB]]></category>
		<category><![CDATA[Instalar Debian 6 en Lenovo Ideapad S12]]></category>
		<category><![CDATA[wireless en Lenovo S12 con Debian Squeeze]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=317</guid>
		<description><![CDATA[Debemos descargar los archivos necesarios para hacer una memoria usb desde la cual podamos arrancar la Netbook e instalar Debian Squeeze. Ir a http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/ y entrar a la opción hd-media que aparece del lado izquierdo Descargar el archivo boot.img.gz Ir a http://cdimage.debian.org/debian-cd/6.0.0/i386/iso-cd/ y descargar la imagen iso netinstall de Debian 6  (debian-6.0.0-i386-netinst.iso). Insertar la memoria [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=317&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Debemos descargar los archivos necesarios para hacer una memoria usb desde la cual podamos arrancar la Netbook e instalar Debian Squeeze.</p>
<p>Ir a <a href="http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/" target="_blank">http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-i386/current/images/</a> y entrar a la opción hd-media que aparece del lado izquierdo</p>
<p><a href="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian11.png"><img class="aligncenter size-full wp-image-321" title="ftpservice_debian1" src="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian11.png?w=450&#038;h=139" alt="" width="450" height="139" /></a>Descargar el archivo boot.img.gz</p>
<p><a href="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian2.png"><img class="aligncenter size-full wp-image-322" title="ftpservice_debian2" src="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian2.png?w=450&#038;h=130" alt="" width="450" height="130" /></a>Ir a <a href="http://cdimage.debian.org/debian-cd/6.0.0/i386/iso-cd/" target="_blank">http://cdimage.debian.org/debian-cd/6.0.0/i386/iso-cd/</a> y descargar la imagen iso netinstall de Debian 6  (debian-6.0.0-i386-netinst.iso).</p>
<p>Insertar la memoria usb y desde la terminal teclear df -k, que en mi caso muestra la siguiente información:</p>
<p>Filesystem           1K-blocks      Used Available Use% Mounted on<br />
/dev/hda1              4806904   3638732    923988  80% /<br />
tmpfs                   501760         0    501760   0% /lib/init/rw<br />
udev                     10240       744      9496   8% /dev<br />
tmpfs                   501760         0    501760   0% /dev/shm<br />
/dev/hda3             33309260   3991576  27625640  13% /home<br />
/dev/sda1               244476    217996     26480  90% /media/usb0</p>
<p>Lo que significa que la usb está en /dev/sda1.</p>
<p>Desmontar la memoria usb:</p>
<p>sudo umount /dev/sda1</p>
<p>Copiar el archivo boot.img.gz a la memoria usb usando el comando zcat</p>
<p>zcat boot.img.gz &gt; /dev/sda1</p>
<p>Volver a montar la memoria usb, copiar la imagen iso y desmontar la memoria</p>
<p>sudo mount /dev/sda1 /media/usb0</p>
<p>sudo cp debian-6.0.0-i386-netinst.iso /media/usb0</p>
<p>sudo umount /dev/sda1</p>
<p>Ahora ya podemos utilizar la memoria usb para arrancar la Netbook desde ahi (hay que configurar en el BIOS de la Netbook que la usb sea el primer dispositivo de arranque)</p>
<p><strong>Configuración de la tarjeta de red inalámbrica</strong></p>
<p>Debian Squeeze no configura la tarjeta de red inalámbrica que viene con la Lenovo Ideapad S12, que es el modelo BCM4312 de Broadcom Corporation. Para lograr que funcione, se deben seguir los siguientes pasos (que están en <a href="http://wiki.debian.org/wl" target="_blank">http://wiki.debian.org/wl</a>)</p>
<p>Agregar a nuestro archivo /etc/apt/sources.list los repositorios non-free y contrib</p>
<p>deb http://ftp.us.debian.org/debian/ squeeze main contrib non-free</p>
<p>Depués de guardar el archivo, hacer el correspondiente sudo apt-get update e instalar los paquetes module-assistant y wireless-tools</p>
<p>sudo apt-get install module-assistant wireless-tools</p>
<p>Para los siguientes pasos, les sugiero que se cambien al usuario root, ya que algunos no funcionan simplemente usando sudo.</p>
<p>Usando module assitant, construir e instalar el paquete broadcom-sta-modules</p>
<p>m-a a-i broadcom-sta</p>
<p>Hay que poner en la lista negra (blacklist) el módulo brcm80211 para evitar que exista conflicto con el soporte para las tarjetas de red inalámbrica  BCM4313, BCM43224 y BCM43225</p>
<p>echo blacklist brcm80211 &gt;&gt; /etc/modprobe.d/broadcom-sta-common.conf</p>
<p>Se debe reconstruir el sistema de archivos inicial que se carga en memoria RAM cuando inicia GNU/Linux para que siempre estén bloqueados los módulos que se difinieron en /etc/modprobe.d/broadcom-sta-common.conf</p>
<p>update-initramfs -u -k $(uname -r)</p>
<p>Descargar de la memoria los módulos que causan conflicto con el módulo wl</p>
<p>modprobe -r b44 b43 b43legacy ssb brcm80211</p>
<p>Cargar el módulo wl</p>
<p>modprobe wl</p>
<p>Y con eso queda funcionando la tarjeta de red inalámbrica en Debian Squeeze en la Netbook Lenovo Ideapad S12</p>
<p><strong>Configuración del cliente de mensajería en GNOME</strong></p>
<p>Debian Squeeze instalado con el escritorio GNOME trae como cliente de mensajerría el paquete Empathy que por  default sólo trae la opción de usar cuentas de jabber, chat de facebook y google talk.</p>
<p>Para poder usar una cuenta de msn (como hotmail por ejemplo), hay que instalar el paquete telepathy-butterfly</p>
<p>sudo apt-get install telepathy-butterfly</p>
<p><strong>Instalación del plugin de Flash</strong></p>
<p>Para ver videos en Youtube, debemos tener instalado el plugin de flash, así que para instalarlo ejecutamos</p>
<p>sudo apt-get install flashplugin-nonfree</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/317/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/317/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/317/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=317&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2011/02/07/instalacion-de-debian-squeeze-en-lenovo-ideapad-s12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian11.png" medium="image">
			<media:title type="html">ftpservice_debian1</media:title>
		</media:content>

		<media:content url="http://salomonrt.files.wordpress.com/2011/02/ftpservice_debian2.png" medium="image">
			<media:title type="html">ftpservice_debian2</media:title>
		</media:content>
	</item>
		<item>
		<title>Instalación de LTSP 5 en Debian Lenny</title>
		<link>http://salomonrt.wordpress.com/2010/10/28/instalacion-de-ltsp-5-en-debian-lenny/</link>
		<comments>http://salomonrt.wordpress.com/2010/10/28/instalacion-de-ltsp-5-en-debian-lenny/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 02:49:04 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Por diversión, y otros temas]]></category>
		<category><![CDATA[clientes ligeros con GNU/Linux]]></category>
		<category><![CDATA[diskless thin clients with Linux]]></category>
		<category><![CDATA[LTSP 5 en Lenny]]></category>
		<category><![CDATA[reutilizar computadora vieja.]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=309</guid>
		<description><![CDATA[LTSP (Linux Terminal Server Project) es un software que nos permite soportar thin clients (clientes ligeros) desde un servidor GNU/Linux. Instalar un servidor LTSP nos permite reutilizar hardware con pocos recursos como clientes, incluso sin disco duro, ya que todos los procesos se ejecutan en el servidor. A continuación describo las pruebas que hice con [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=309&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://ltsp.org/" target="_blank">LTSP (Linux Terminal Server Project)</a> es un software que nos permite soportar <a href="http://es.wikipedia.org/wiki/Cliente_liviano" target="_blank">thin clients </a>(clientes ligeros) desde un servidor GNU/Linux.</p>
<p>Instalar un servidor LTSP nos permite reutilizar hardware con pocos recursos como clientes, incluso sin disco duro, ya que todos los procesos se ejecutan en el servidor.</p>
<p>A continuación describo las pruebas que hice con LTSP 5 y Debian Lenny.</p>
<p>Como servidor estoy utilizando una PC con procesador Pentium 4 a 1.8Ghz, 512MB RAM y disco duro de 20GB. Tiene instalado Debian Lenny con XFCE</p>
<p>La máquina más antigua que he podido hacer funcionar como thin client para este proyecto hasta el momento es una PC con procesador Pentium II a 400Mhz con 256MB RAM, sin disco duro, la tarjeta de red que tiene no soporta <a href="http://es.wikipedia.org/wiki/Preboot_Execution_Environment" target="_blank">PXE</a> y el Bios de la tarjeta madre no trae la opción para arrancar via red.</p>
<p>La configuración que yo hice es la siguiente:</p>
<p>El servidor tiene dos tarjetas de red (eth0 y eth1), eth0 está conectada al ruteador que da acceso a internet y eth1 esta conectada a un switch al que estan conectados los clientes. Asigné direcciones IP fijas a ambas tarjetas de red, a eth0 le asigné la dirección IP 192.168.1.73 y a eth1 la dirección IP 10.0.0.254.</p>
<p>Estos son los pasos que hay que hacer.</p>
<p>1. Instalar el paquete ltsp-server-standalone</p>
<p>sudo apt-get install ltsp-server-standalone</p>
<p>2. Editar el archivo /etc/network/interfaces para que quede de la siguiente forma (los valores para eth0 dependerán de la red en donde tengamos el router que nos proporciona la salida a internet, en esta caso la dirección IP del router es 192.168.1.254):</p>
<p>auto lo<br />
iface lo inet loopback</p>
<p>auto eth0<br />
iface eth0 inet static<br />
address 192.168.1.73<br />
netmask 255.255.255.0<br />
network 192.168.0.0<br />
broadcast 192.168.0.255<br />
gateway 192.168.1.254</p>
<p>auto eth1<br />
iface eth1 inet static<br />
address 10.0.0.254<br />
netmask 255.255.255.0<br />
network 10.0.0.0<br />
broadcast 10.0.0.255</p>
<p>3. Ejecutar</p>
<p>sudo /etc/init.d/networking restart</p>
<p>4. Editar los archivos /etc/dhcp3/dhcpd.conf y /etc/ltsp/dhcpd.conf para que queden de la siguiente forma:</p>
<p>authoritative;</p>
<p>subnet 10.0.0.0 netmask 255.255.255.0 {<br />
range 10.0.0.1 10.0.0.250;<br />
option domain-name &#8220;ltsp.local&#8221;;<br />
option domain-name-servers 10.0.0.254;<br />
option broadcast-address 10.0.0.255;<br />
option routers 10.0.0.254;<br />
next-server 10.0.0.254;<br />
#    get-lease-hostnames true;<br />
option subnet-mask 255.255.255.0;<br />
option root-path &#8220;/opt/ltsp/i386&#8243;;<br />
if substring( option vendor-class-identifier, 0, 9 ) = &#8220;PXEClient&#8221; {<br />
filename &#8220;/ltsp/i386/pxelinux.0&#8243;;<br />
} else {<br />
filename &#8220;/ltsp/i386/nbi.img&#8221;;<br />
}<br />
}</p>
<p>5. Ejecutar</p>
<p>sudo /etc/init.d/dhcp3-server start</p>
<p>Y debe aparecer el siguiente mensaje:</p>
<p>* Starting DHCP server dhcpd3</p>
<p>6. Editar el archivo /etc/default/dhcp3-server para indicarle cuál tarjeta de red utilizará el servidor DHCP (en este caso, eth1)</p>
<p>INTERFACES=&#8221;eth1&#8243;</p>
<p>7. Construir las imágenes para los clientes</p>
<p>sudo ltsp-build-client</p>
<p>Esto puede tardar un buen rato; al final aparece el siguiente mensaje:</p>
<p>información: la instalación del cliente LTSP se completó satisfactoriamente</p>
<p>8. Editar el archivo /etc/exports y agregar la siguiente linea</p>
<p>/opt/ltsp       *(ro,no_root_squash,async)</p>
<p>y ejecutar sudo invoke-rc.d nfs-kernel-server reload</p>
<p>9. Editar /etc/default/tftpd-hpa y cambiamos la linea RUN_DAEMON=&#8221;no&#8221; por</p>
<p>RUN_DAEMON=&#8221;yes&#8221;</p>
<p>10. Editar /etc/inetd.conf para comentar la linea de tftp para que quede asi:</p>
<p>#tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot</p>
<p>después reiniciar inetd ejecutando</p>
<p>sudo invoke-rc.d openbsd-inetd restart</p>
<p>también se debe reiniciar tftpd-hpa ejecutando</p>
<p>sudo invoke-rc.d tftpd-hpa restart</p>
<p>Aquellas PC que vayan a usar como clientes que tengan tarjeta de red con soporte PXE y tarjeta madre con Bios que se pueda configurar para arrancar via tarjeta de red, no necesitan hacer el paso número 11, sólo configuren la PC para que arranque desde la tarjeta de red como primera opción (esto lo hacen en el Bios)</p>
<p>11. Generar el floppy de arranque para los terminales que no cuentan con tarjeta de red capaz de arrancar via PXE</p>
<p>11.1 De la página <a href="http://rom-o-matic.net/" target="_blank">http://rom-o-matic.net/</a> generar una imágen floppy bootable image (.dsk) seleccionando all-drivers en la opción &#8220;Choose a NIC type&#8221;</p>
<p>11.2 Después de descargada la imágen, crear un floppy a partir de ella</p>
<p>sudo dd if=gpxe-1.0.1-gpxe.dsk of=/dev/fd0</p>
<p>12. Si al arrancar el cliente, éste se cicla en la pantalla del logo, o si después de pedir el usuario y contraseña, aún introduciendo el usuario y contraseña correctos vuelve a pedir el usuario y contraseña, ejecutar en el servidor el comando</p>
<p>sudo /usr/sbin/ltsp-update-sshkeys</p>
<p>y reiniciar el cliente para volver a intentar hacer el login</p>
<div id="_mcePaste" class="mcePaste" style="overflow:hidden;position:absolute;left:-10000px;top:285px;width:1px;height:1px;"><!-- 		@page { size: 21.59cm 27.94cm; margin: 2cm } 		PRE { font-family: "DejaVu Sans Mono", monospace } 		P { margin-bottom: 0.21cm } -->&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">1. Instalar el paquete ltsp-server-standalone</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo apt-get install ltsp-server-standalone</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Times New Roman;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;"><span style="font-family:Nimbus Mono L;">2. Editar el archivo /etc/network/interfaces para que quede de la siguiente forma (los valores para eth0 dependerán de la red en donde tengamos el router que nos proporciona la salida a internet, en esta caso la dirección IP del router es 192.168.1.254):</span></span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">auto lo</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">iface lo inet loopback</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">auto eth0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">iface eth0 inet static</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">address 192.168.1.73</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">netmask 255.255.255.0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">network 192.168.0.0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">broadcast 192.168.0.255</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">gateway 192.168.1.254</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">auto eth1</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">iface eth1 inet static</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">address 10.0.0.254</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">netmask 255.255.255.0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">network 10.0.0.0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">broadcast 10.0.0.255</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">3. Ejecutar</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo /etc/init.d/networking restart</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Times New Roman;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;"><span style="font-family:Nimbus Mono L;">4. Editar los archivos /etc/dhcp3/dhcpd.conf y /etc/ltsp/dhcpd.conf </span><span style="color:#000000;"><span style="font-family:Nimbus Mono L;">para que queden de la siguiente forma:</span></span></span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">authoritative;</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">subnet 10.0.0.0 netmask 255.255.255.0 {</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">range 10.0.0.1 10.0.0.250;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option domain-name “ltsp.local”;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option domain-name-servers 10.0.0.254;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option broadcast-address 10.0.0.255;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option routers 10.0.0.254;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">next-server 10.0.0.254;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">#    get-lease-hostnames true;</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option subnet-mask 255.255.255.0;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">option root-path “/opt/ltsp/i386”;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">if substring( option vendor-class-identifier, 0, 9 ) = “PXEClient” {</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">filename “/ltsp/i386/pxelinux.0”;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">} else {</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">filename “/ltsp/i386/nbi.img”;</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="background:transparent none repeat scroll 0 0;"> <span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;">}</span></span></span><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"> </span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">}</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">5. Ejecutar </span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo /etc/init.d/dhcp3-server start</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">Y debe aparecer el siguiente mensaje:</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">* Starting DHCP server dhcpd3                           [ OK ]</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">6. Editar el archivo /etc/default/dhcp3-server para indicarle cuál tarjeta de red utilizará el servidor DHCP (en este caso, eth1)</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">INTERFACES=&#8221;eth1&#8243;</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">7. Construir las imágenes para los clientes</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo ltsp-build-client</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">Esto puede tardar un buen rato; al final aparece el siguiente mensaje:</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">información: la instalación del cliente LTSP se completó satisfactoriamente</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">8. Editar el archivo /etc/exports y agregar la siguiente linea</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">/opt/ltsp       *(ro,no_root_squash,async)</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">y ejecutar sudo invoke-rc.d nfs-kernel-server reload</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">9. Editar /etc/default/tftpd-hpa y cambiamos la linea RUN_DAEMON=&#8221;no&#8221; por</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">RUN_DAEMON=&#8221;yes&#8221; </span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">10. Editar /etc/inetd.conf para comentar la linea de tftp para que quede asi:</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">#tftp           dgram   udp     wait    root  /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;"><span style="color:#000000;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">después reiniciar inetd ejecutando</span></span></span></span></p>
<pre style="text-align:left;"><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;">sudo invoke-rc.d openbsd-inetd restart</span></span>

<span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;">también se debe reiniciar </span></span><span style="font-family:Nimbus Mono L,monospace;">tftpd-hpa </span><span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;">ejecutando</span></span>

<span style="font-family:Nimbus Mono L,monospace;"><span style="font-size:x-small;">sudo invoke-rc.d tftpd-hpa restart</span></span></pre>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">11. Generar el floppy de arranque para los terminales que no cuentan con tarjeta de red capaz de arrancar via PXE</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">11.1 De la página http://rom-o-matic.net/ generar una imágen floppy bootable image (.dsk) seleccionando all-drivers en la opción &#8220;Choose a NIC type&#8221;</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">11.2 Después de descargada la imágen, crear un floppy a partir de ella</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo dd if=gpxe-1.0.1-gpxe.dsk of=/dev/fd0</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">12. Si al arrancar el cliente, éste se cicla en la pantalla del logo, o si después de pedir el usuario y contraseña, aún introduciendo el usuario y contraseña correctos vuelve a pedir el usuario y contraseña, ejecutar en el servidor el comando</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">sudo /usr/sbin/ltsp-update-sshkeys</span></span></span></span></p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;">&nbsp;</p>
<p style="background:transparent none repeat scroll 0 0;margin-bottom:0;line-height:100%;orphans:2;" lang="es-MX"><span style="color:#000000;"><span style="font-family:Nimbus Mono L;"><span style="font-size:x-small;"><span style="background:transparent none repeat scroll 0 0;">y reiniciar el cliente para volver a intentar hacer el login</span></span></span></span></p>
</div>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/309/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=309&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2010/10/28/instalacion-de-ltsp-5-en-debian-lenny/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
		<item>
		<title>red inalámbrica vs red con cable</title>
		<link>http://salomonrt.wordpress.com/2010/07/28/red-inalambrica-vs-red-con-cable/</link>
		<comments>http://salomonrt.wordpress.com/2010/07/28/red-inalambrica-vs-red-con-cable/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 19:07:17 +0000</pubDate>
		<dc:creator>rtmex</dc:creator>
				<category><![CDATA[Por diversión, y otros temas]]></category>
		<category><![CDATA[red inalámbrica o cableada]]></category>
		<category><![CDATA[ventajas de red por cable contra red inalámbrica]]></category>
		<category><![CDATA[wireless vs wired network]]></category>

		<guid isPermaLink="false">http://salomonrt.wordpress.com/?p=296</guid>
		<description><![CDATA[Desde hace algún tiempo lo inalámbrico está de moda, en la mayoría de los casos cuando algún cliente necesita que se le instale una red de área local (LAN), lo primero que se le ocurre es que sea inalámbrica. Incluso varios proveedores de internet de banda ancha (ya sea compañias telefónicas o de televisión por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=296&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Desde hace algún tiempo lo inalámbrico está de moda, en la mayoría de los casos cuando algún cliente necesita que se le instale una red de área local (LAN), lo primero que se le ocurre es que sea inalámbrica. Incluso varios proveedores de internet de banda ancha (ya sea compañias telefónicas o de televisión por cable) anuncian promociones en las cuales dan el &#8220;modem&#8221; inalámbrico grátis, como si fuera lo máximo.</p>
<p>La verdad es que es mucho mejor una red cableada que una inalámbrica, y a continuación voy a explicar las principales razones.</p>
<p><strong>Velocidad</strong></p>
<p>Los estándares para redes inalámbricas más utilizados son el IEEE 802.11a, 802.11b, 802.11g y 802.11n.</p>
<p>El estándar IEEE 802.11b es el más lento de todos los anteriores ya que permite una velocidad máxima de transmisión de 11Mbps (megabits por segundo). Funciona en la banda de 2.4Ghz.</p>
<p>El estándar IEEE 802.11a permite una velocidad máxima de transmisión de 54Mbps y funciona en la banda de 5Ghz. El utilizar la banda de 5Ghz en lugar de la banda de 2.4Ghz es una ventaja ya que la banda de 2.4Ghz está más saturada ya que es la misma banda que utilizan los teléfonos inalámbricos y los hornos de microondas, por lo que es más factible que haya interferencia.</p>
<p>El estándar IEEE 802.11g al igual que el 802.11a permite una velocidad máxima de transmisión de 54Mbps pero funciona en la banda de 2.4Ghz. Esto permite que clientes que utilizan el estándar IEEE 802.11b se puedan conectar a la red, pero la velocidad de transmisión general de la red disminuye a 22Mbps para los clientes que se conecten con el estándar 802.11g y a 11Mbps (su máximo permitido) para los clientes que se conecten con el estándar 802.11b.</p>
<p>El estándar IEEE 802.11n permite una velocidad máxima de transmisión de hasta 600Mbps aunque en la actualidad, ningún fabricante ha desarrollado equipos que alcancen está velocidad, la mayoría de los equipos que funcionan con este estándar alcanzan velocidades de transmisión de 300Mbps y recientemente TrendNet anunció el lanzamiento de un router que dicen alcanza hasta 450Mbps. Este estándar puede trabajar en la banda de 2.4Ghz, en la banda de 5Ghz, o en las 2 bandas al mismo tiempo.</p>
<p>Así que la velocidad máxima de transmisión que se tiene actualmente en una red inalámbrica es de 600Mbps (en realidad 300Mps, pero asumiendo que ya se estuvieran fabricando equipos que alcanzaran el máximo permitido por el estándar). Por otro lado, una red cableada utilizando cable UTP categoría 5e permite velocidades de transmisión de hasta 1Gigabit (1000 Mbps); es decir, casi el doble.</p>
<p><strong>Seguridad</strong></p>
<p>La seguridad en las redes inalámbricas siempre ha sido una de sus principales debilidades, desde el protocolo de cifrado WEP que es el más debil hastal el WPA2 que es considerado de los más seguros actualmente.</p>
<p>Algunas ligas que demuestran esto</p>
<p><a href="http://wepcrack.sourceforge.net/" target="_blank">http://wepcrack.sourceforge.net/</a><br />
<a href="http://docs.alkaloid.net/index.php/Cracking_WEP_and_WPA_Wireless_Networks" target="_blank">http://docs.alkaloid.net/index.php/Cracking_WEP_and_WPA_Wireless_Networks</a><br />
<a href="http://sectools.org/crackers.html" target="_blank">http://sectools.org/crackers.html</a><br />
<a href="http://www.youtube.com/watch?v=VVbWBoR4E64" target="_blank">http://www.youtube.com/watch?v=VVbWBoR4E64</a><br />
<a href="http://www.corelan.be:8800/index.php/2009/02/24/cheatsheet-cracking-wpa2-psk-with-backtrack-4-aircrack-ng-and-john-the-ripper/" target="_blank">http://www.corelan.be:8800/index.php/2009/02/24/cheatsheet-cracking-wpa2-psk-with-backtrack-4-aircrack-ng-and-john-the-ripper/</a></p>
<p>Obviamente se pueden tomar medidas adicionales como filtrar por MAC address la conexión a la red, pero si se tiene un número considerable de clientes esto no es posible.</p>
<p>La única forma de conectar un equipo a una red cableada es por un medio físico, es decir, conectando un cable a un puerto de un router, switch, etc. que esté conectado a la red, (sin considerar desde luego redes que tienen aceeso a internet, ya que internet es una red pública, pero este caso también aplica a las redes inalámbricas).</p>
<p><strong>Estabilidad</strong></p>
<p>Hay muchos factores que afectan las conexiones en una red inalámbrica:</p>
<p>Los materiales de construcción del lugar en donde se va a instalar la red (si son techos o paredes muy gruesas o hay muchas estructuras metálicas, etc.)</p>
<p>Si hay muchas redes cercanas en la misma banda, la velocidad se ve afectada porque se interfieren unas con otras</p>
<p>Telefonos inalámbricos, portones automáticos, hornos de microondas y cualquier dispositivo que utilize la misma banda que utiliza la red inalámbrica que se instala puede causar interferencia</p>
<p>En una red cableada, la mayoría de las fallas se deben a un cable o un puerto en mal estado.</p>
<p><strong>Conclusión</strong></p>
<p>Las redes inalámbricas tienen una sola ventaja sobre las redes con cable: &#8220;la movilidad&#8221;. Si realmente no requiere de estarse conectando a la red en cualquier lugar de su casa u oficina, no vale la pena instalar una red inalámbrica. Y note que dije &#8220;no requiere&#8221;, que es diferente a &#8220;no le gustaría&#8221;, es decir, es muy cómodo poder conetarnos a la red desde cualquier ubicación del edificio en cualquier momento, pero si no es indispensable, no se lo recomiendo.</p>
<p>Hay casos en los que a pesar de las ventajas de una red cableada, el requerimiento que se tiene se soluciona mejor con una red inalámbrica. Por ejemplo, supongamos que quiere instalar cámaras IP en medio de un área grande, descubierta y sin paredes cercanas, por ejemplo el estacionamiento de un campus en una universidad, en donde sólo existen los postes de las luminarias cada ciertos metros de separación entre ellos. Una opción sería pasar el cable de red de forma subterranea, pero muy probablmente sería mas costoso y llevaría más tiempo que hacer una instalación inalámbrica.</p>
<p><strong>Entónces ¿cómo decidir?</strong></p>
<p>La recomendación es:</p>
<p>&#8220;Si nada le impide cablear, instale una red cableada y no una inalámbrica&#8221;. Aunque puede tener una red hibrida, en dónde sólo haya una área en donde exista conexión inalámbrica, si no es absolutamente necesario la conexión sin cables, entónces instale sólo su red por cable.</p>
<p>¿Cuándo instalar una red inalámbrica en lugar de una red cableada?</p>
<p>A continuación menciono 3 ejemplos, pero puede haber más:</p>
<p>Hay ocasiones en donde no permiten hacer el cableado, ya sea porque son edificios muy viejos considerados monumentos o porque los dueños insisten en que no se vea el cable, o la canaleta, ducto, etc. por donde se va a pasar el cable y no hay ni techo ni piso falso para poder pasar el cable de forma oculta.</p>
<p>Casos como el del estacionamiento no techado de un campus universitario descrito anteriormente, en donde por costo y tiempo es más conveniente la solución inalámbrica</p>
<p>Se pretende conectar dos edificios separados y no se puede pasar cable de uno a otro</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/salomonrt.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/salomonrt.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/salomonrt.wordpress.com/296/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=salomonrt.wordpress.com&amp;blog=6104541&amp;post=296&amp;subd=salomonrt&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://salomonrt.wordpress.com/2010/07/28/red-inalambrica-vs-red-con-cable/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05ea6e8f29d78ee311776cd883b8b0d1?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">rtmex</media:title>
		</media:content>
	</item>
	</channel>
</rss>
