<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9034270376130887246</id><updated>2012-01-31T00:09:35.970+01:00</updated><category term='-'/><title type='text'>Just a little bit freak</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-2551649949568889781</id><published>2012-01-25T22:19:00.014+01:00</published><updated>2012-01-26T23:26:01.229+01:00</updated><title type='text'>El mecanismo de conexiones, señales y slots en Qt</title><content type='html'>Este post asume que el lector tiene ciertos conocimientos en programación C++ y en la librería Qt. Si no sabes de que te estoy hablando, es mejor que dediques tu tiempo a leer otro sitio, porque te vas a aburrir de lo lindo. Avisado quedas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-zCsCyZ4Wvls/TyB00ywTcpI/AAAAAAAAALk/xy9mGbE4L4Y/s1600/qtimagen.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/-zCsCyZ4Wvls/TyB00ywTcpI/AAAAAAAAALk/xy9mGbE4L4Y/s200/qtimagen.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5701685578577441426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;=== La base teórica ===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El mecanismo de señales y slots es una de las características mas importantes de la librería Qt, probablemente la que le diferencia de otros framework para desarrollar interfaces de usuario.&lt;br /&gt;&lt;br /&gt;Las señales y los slots se usan para las comunicaciones entre los objetos del interfaz. En general, la señal (signal) parte de un objeto "emisor" y llega a un objeto "receptor". El objeto receptor decide si ejecuta un slot y finaliza el proceso, o emite una nueva señal que propaga el evento hacia otro objeto receptor. El proceso se puede repetir.&lt;br /&gt;&lt;br /&gt;Como ejemplo sencillo, imagina un botón de "Apagar". Cuando el usuario lo pulsa, el boton genera la señal clicked(). Y en respuesta a esa señal, el sistema ejecuta un slot que hace un apagado ordenado de todo el sistema.&lt;br /&gt;&lt;br /&gt;Para establecer una conexión entre la señal emitida por un objeto "emisor" y un slot que ejecuta el objeto "receptor", se usa el metodo connect() y las macros SIGNAL() y SLOT(). La sintaxis es esta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    connect(emisor, SIGNAL(signal_emitida()), receptor, SLOT(slot_doaction()));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cuando el widget "emisor" genera la señal "signal_emitida", el widget "receptor" ejecuta el código del slot "slot_doaction". La llamada connect, y las macros SIGNAL() y SLOT() forman parte de la sintaxis de Qt, y no son parte del estandar C++. Para compilarlas, se usa un meta-object compiler (moc) que traduce estas macros en C++ estándar. Esta parte escapa del propósito de este post , aunque si sientes interés, no dudes en preguntarme.&lt;br /&gt;&lt;br /&gt;Algunas consideraciones a tener en cuenta:&lt;br /&gt;&lt;br /&gt;    * Una misma señal puede conectarse a distintos slots&lt;br /&gt;    * Distintas señales pueden conectarse a un mismo slot&lt;br /&gt;    * Una señal puede conectarse a otra señal, lo que emite una segunda signal en el widget receptor inmediatamente después de recibir la primera.&lt;br /&gt;&lt;br /&gt;La lista de parámetros de la señal signal_emitida(signature) debe coincidir con la lista de parámetros del slot_doaction(signature). Pero el slot slot_doaction(signature) puede tener menos parámetros que los que tiene la señal signal_emitida(signature), en cuyo caso los parámetros adicionales son simplemente ignorados. Aunque parezca un poco extraño, fíjate que tiene sentido, ya que Qt es capaz de ignorar argumentos sobrantes, pero en ningún caso puede inventar argumentos de la nada. Algunos ejemplos para aclarar este punto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;                   Signals      Slots                   ¿isOK?&lt;br /&gt;    rangeChanged(int, int)      setRange(int, int)      OK&lt;br /&gt;    valueChanged(int)           setValue()              OK&lt;br /&gt;    clicked()                   setValue(int)           NOK&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Todas las clases que heredan de QObject (o alguna de sus subclases como QWidget), pueden contener señales, slots y conexiones. Pero para que sea posible definirlas, es necesario que la clase mencione la macro Q_OBJECT al comienzo de su declaración. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;=== Sintaxis en la práctica ===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo de como se realiza una conexión. Para ello, necesitamos dos clases ("Emisor" y "Receptor") que sean agregaciones de una clase contenedora W (dos partes componentes, o si lo prefieres, dos variables de W). Para enviar un mensaje desde "Emisor" hasta "Receptor" haríamos la siguiente conexión en W (pongo pseudocódigo para que te quedes con la idea):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    class W: public QObject&lt;br /&gt;    {&lt;br /&gt;        Q_OBJECT&lt;br /&gt;        ...&lt;br /&gt;        Emisor e;&lt;br /&gt;        Receptor r;&lt;br /&gt;        connect(e, SIGNAL(signalChangePos()), r, SLOT(slotChangePosition()));&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    class Emisor: public QObject&lt;br /&gt;    {&lt;br /&gt;        Q_OBJECT&lt;br /&gt;        ...&lt;br /&gt;        signal signalChangePos();&lt;br /&gt;        ...&lt;br /&gt;        emit signalChangePos();&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;    class Receptor: public QObject&lt;br /&gt;    {&lt;br /&gt;        Q_OBJECT&lt;br /&gt;        ...&lt;br /&gt;        slot slotChangePosition();&lt;br /&gt;    };&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Veamos ahora la declaración de una clase MiWidget que maneja señales y slots. MiWidget hereda de QWidget, y a su vez QWidget hereda de QObject:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    class MiWidget : public QWidget&lt;br /&gt;    {&lt;br /&gt;        Q_OBJECT // Macro es necesaria cuando la clase define sus propias señales o slots&lt;br /&gt;&lt;br /&gt;    public:&lt;br /&gt;        MiWidget(QWidget *parent = 0);&lt;br /&gt;        void foo(QString &amp;text);&lt;br /&gt;&lt;br /&gt;    signals: // señales emitidas por esta clase&lt;br /&gt;        void findnext(const QString &amp;str);&lt;br /&gt;        void findprev(const QString &amp;str);&lt;br /&gt;&lt;br /&gt;    private slots: // slots de esta clase&lt;br /&gt;        void enableFindButton(const QString &amp;text);&lt;br /&gt;    };&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Supongamos que el metodo foo emite una signal, veamos como se realiza la implementación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    void MiWidget::foo(QString &amp;text)&lt;br /&gt;    {&lt;br /&gt;        emit findprev(text); // se emite la señal findprev con el texto "text"&lt;br /&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;=== Un ejemplo práctico ===&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un escenario común ocurre cuando quieres pasar valores constantes en la sentencia connect. Esto ocurre por ejemplo cuando quieres implementar un teclado QWERTY usando QPushButtons como teclas. Podrías pensar que lo lógico es implementar algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    connect(key_q, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('q')));&lt;br /&gt;    connect(key_w, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('w')));&lt;br /&gt;    connect(key_e, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('e')));&lt;br /&gt;    connect(key_r, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('r')));&lt;br /&gt;    connect(key_t, SIGNAL(pressed()), panelTexto, SLOT(keyPressed('t')));&lt;br /&gt;    ... &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pero esto no es valido en Qt, y no te funcionaría. Para implementar un teclado, la opción fácil sería usar un montón de QPushButton, y asignar a cada uno un slot diferente. La implementación sería como esto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    connect(key_q, SIGNAL(pressed()), panelTexto, SLOT(press_q()));&lt;br /&gt;    connect(key_w, SIGNAL(pressed()), panelTexto, SLOT(press_w()));&lt;br /&gt;    connect(key_e, SIGNAL(pressed()), panelTexto, SLOT(press_e()));&lt;br /&gt;    connect(key_r, SIGNAL(pressed()), panelTexto, SLOT(press_r()));&lt;br /&gt;    connect(key_t, SIGNAL(pressed()), panelTexto, SLOT(press_t()));&lt;br /&gt;    ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y la lista de slots:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    private slots:&lt;br /&gt;        void press_q();&lt;br /&gt;        void press_w();&lt;br /&gt;        void press_e();&lt;br /&gt;        void press_r();&lt;br /&gt;        void press_t();&lt;br /&gt;        ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Parece una exageración tener 102 slots, todos prácticamente con el mismo código. Pero, ¿a caso se te ocurre alguna alternativa mejor? Para hacer esto de una forma mas eficiente y sencilla de mantener, con un único slot, se usa la clase QSignalMapper. Con su ayuda, podríamos hacer esto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    signalMapper = new QSignalMapper;&lt;br /&gt;&lt;br /&gt;    signalMapper-&gt;setMapping(key_q, QChar('q'));&lt;br /&gt;    signalMapper-&gt;setMapping(key_w, QChar('w'));&lt;br /&gt;    signalMapper-&gt;setMapping(key_e, QChar('e'));&lt;br /&gt;    signalMapper-&gt;setMapping(key_r, QChar('r'));&lt;br /&gt;    signalMapper-&gt;setMapping(key_t, QChar('t'));&lt;br /&gt;    ...&lt;br /&gt;&lt;br /&gt;    // Conexiones de los button con el signal mapper&lt;br /&gt;    connect(key_q, SIGNAL(pressed()), signalMapper, SLOT(map());&lt;br /&gt;    connect(key_w, SIGNAL(pressed()), signalMapper, SLOT(map());&lt;br /&gt;    connect(key_e, SIGNAL(pressed()), signalMapper, SLOT(map());&lt;br /&gt;    connect(key_r, SIGNAL(pressed()), signalMapper, SLOT(map());&lt;br /&gt;    connect(key_t, SIGNAL(pressed()), signalMapper, SLOT(map());&lt;br /&gt;&lt;br /&gt;    // Y conexion del signal mapper con el slot genérico&lt;br /&gt;    connect(signalMapper, SIGNAL(mapped(QChar)), panelTexto, SLOT(setText(QChar)));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y en el slot setText() irias pintando los distintos caracteres en el objeto "panelTexto", según la tecla pulsada por el usuario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-2551649949568889781?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/2551649949568889781/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=2551649949568889781' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2551649949568889781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2551649949568889781'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2012/01/el-mecanismo-de-conexiones-senales-y.html' title='El mecanismo de conexiones, señales y slots en Qt'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zCsCyZ4Wvls/TyB00ywTcpI/AAAAAAAAALk/xy9mGbE4L4Y/s72-c/qtimagen.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-808297273486551927</id><published>2011-03-25T19:20:00.047+01:00</published><updated>2012-01-31T00:09:35.978+01:00</updated><title type='text'>Mens sana in corpore sano</title><content type='html'>El deporte ha formado parte de mi vida desde que tengo uso de razón, y probablemente así siga siendo hasta el día que me falle la salud. Empecé a practicarlo con 11 años, y desde entonces hasta hoy, 23 años después, ahí seguimos, a tope. Para mi ya forma parte de una filosofía de vida. Vivir sin el deporte sería como vivir sin dormir, o vivir sin comer.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-D8E19uvjGtk/TY24L9cndZI/AAAAAAAAALI/uYAvdhKevxs/s1600/mens-sana-ics.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 198px; height: 200px;" src="http://2.bp.blogspot.com/-D8E19uvjGtk/TY24L9cndZI/AAAAAAAAALI/uYAvdhKevxs/s200/mens-sana-ics.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5588325228249314706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nunca destaqué por tener unas cualidades atléticas sobresalientes. No obstante, el esfuerzo y las ganas continuas de mejorar me han llevado a labrar un historial deportivo del que hoy en día me siento, por que no decirlo, orgulloso. Y precisamente se trata de este historial deportivo del que hoy os voy a hablar en este post:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Futbol ==&lt;br /&gt;&lt;br /&gt;[1987-1988]&lt;br /&gt;Escuela infantil de futbol Selma Junior (Castellón)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Baloncesto ==&lt;br /&gt;&lt;br /&gt;Recuerdo mis años como jugador de baloncesto con muchísima nostalgia. Con los años he perdido contacto con demasiada gente, decenas de compañeros de equipo, entrenadores, fisioterapeutas... De todos vosotros guardo muy buenos recuerdos. Me acuerdo de aquella remontada ganando "in extremis" contra el equipo valenciano de "La Salle", uno de los mejores de toda la Comunidad Valenciana, después de perder la primera parte por mas de 25 puntos, y el pabellón de Grapa repleto de gente rugiendo y aplaudiendo... Todavía se me pone la piel de gallina. Me acuerdo muchas veces de todos vosotros.&lt;br /&gt;&lt;br /&gt;[1987-1988]&lt;br /&gt;Escuela infantil de baloncesto Taugres Castellón&lt;br /&gt;&lt;br /&gt;[1988-1989]&lt;br /&gt;Escuela infantil de baloncesto Taugres Castellón&lt;br /&gt;Seleccionado como cantera del club en la "Operación Altura '89"&lt;br /&gt;&lt;br /&gt;[1989-1990]&lt;br /&gt;Temporada completa en el Cadete B club de baloncesto Taugres Castellón&lt;br /&gt;&lt;br /&gt;[1990-1991]&lt;br /&gt;Temporada completa en el Cadete A club de baloncesto Taugres Castellón&lt;br /&gt;&lt;br /&gt;[1991-1992]&lt;br /&gt;Temporada completa en el Juvenil A club de baloncesto Atletic Basquet Castelló (ABC)&lt;br /&gt;Parte de la temporada doblo entrenamientos con el juvenil B del mismo club&lt;br /&gt;&lt;br /&gt;[1992-1993]&lt;br /&gt;Temporada completa en el Juvenil A club de baloncesto Ceramicas Gaya&lt;br /&gt;&lt;br /&gt;[1993-1994]&lt;br /&gt;Pretemporada e inicio de temporada con el Junior/Senior club de baloncesto Ceramicas Gaya &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Rutas en bicicleta ==&lt;br /&gt;&lt;br /&gt;La fecha indica la primera vez que realicé la ruta, aunque algunas son rutas habituales de entrenamiento. Como por ejemplo la subida al Desert de les Palmes, con un desnivel de mas de 700 metros de altura, la he realizado decenas de veces. Precisamente en el descenso de esa carretera tuve mi primer (y único) accidente con la bicicleta. Me rompí dos dedos de la mano contra un coche en un accidente que me podría haber costado la vida.&lt;br /&gt;&lt;br /&gt;[1991]&lt;br /&gt;Castellon - San Juan de Moro - Castellon (36Km)&lt;br /&gt;Castellon - Onda - Castellon (48Km)&lt;br /&gt;&lt;br /&gt;[1992]&lt;br /&gt;Castellon - San Juan de Moro - Villafames - Borriol - Castellon (56Km)&lt;br /&gt;Castellon - Borriol - Cabanes - Castellon (56Km)&lt;br /&gt;Castellon - Magdalena - Desert de les Palmes - Castellon (30Km)&lt;br /&gt;&lt;br /&gt;[1993]&lt;br /&gt;Castellon - San Juan de Moro - Alcora - Castellon (42Km)&lt;br /&gt;Grao de Castellon - Oropesa - Grao de Castellon (36Km)&lt;br /&gt;Castellon - Borriol - Atzaneta - Benafigos (58km)&lt;br /&gt;&lt;br /&gt;[1994]&lt;br /&gt;Grao de Castellon - Magdalena - Desert de les Palmes - Grao de Castellón (25Km)&lt;br /&gt;Grao de Castellon - Pico del Bartolo - Grao de Castellon (29Km)&lt;br /&gt;Castellon - Villafames - Costur - Castellon (60km)&lt;br /&gt;Grao de Castellon - Oropesa (por la costa) - Grao de Castellon (36Km)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Gimnasios fitness ==&lt;br /&gt;&lt;br /&gt;El fitness forma parte del deporte que practico habitualmente 3 o 4 días por semana. Algún día os hablaré sobre mis rutinas de entrenamiento, de las que hay para hablar largo y tendido.&lt;br /&gt;&lt;br /&gt;[01/1995 - 01/2004]&lt;br /&gt;Gimnasio en mi casa&lt;br /&gt;&lt;br /&gt;[02/2004 - 07/2004]&lt;br /&gt;Gimnasio Amstelpark, Amsterdam (Holanda)&lt;br /&gt;&lt;br /&gt;[08/2004 - 11/2004]&lt;br /&gt;Gimnasio en mi casa&lt;br /&gt;&lt;br /&gt;[12/2004 - 02/2005]&lt;br /&gt;Gimnasio Club Estudio Praga, Madrid&lt;br /&gt;&lt;br /&gt;[02/2005 - 06/2006]&lt;br /&gt;[Gimnasio Muscle Gracia, Bilbao (Vizcaya)&lt;br /&gt;&lt;br /&gt;[07/2006 - Actualmente]&lt;br /&gt;Gimnasio Balla Shen Dragon, Terrassa (Barcelona)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Montañismo ==&lt;br /&gt;&lt;br /&gt;Mi pasión por la naturaleza no queda bien reflejada en esta lista de montañas tan corta. Espero y deseo poder ampliar esta lista en los próximos años:&lt;br /&gt;&lt;br /&gt;[8/1994]&lt;br /&gt;Pico del Bartolo (724m)&lt;br /&gt;Parque natural del Desert de les Palmes (Castellón)&lt;br /&gt;Ruta en bicicleta partiendo desde Castellón de la Plana.&lt;br /&gt;&lt;br /&gt;[5/2009]&lt;br /&gt;Pico de San Jerónimo (1224m)&lt;br /&gt;Parque natural de la muntanya de Montserrat (Barcelona)&lt;br /&gt;Ruta corriendo partiendo desde Monistrol de Montserrat.&lt;br /&gt;&lt;br /&gt;[7/2009]&lt;br /&gt;Pico La Mola (1104m)&lt;br /&gt;Parque Natural Sant Llorenç del Munt (Barcelona)&lt;br /&gt;Ruta de trekking partiendo desde Sant Feliu del Raco.&lt;br /&gt;&lt;br /&gt;[4/2011]&lt;br /&gt;Pico del Collbaix (547m)&lt;br /&gt;Parque natural Sant Llorenç del Munt (Manresa, Barcelona)&lt;br /&gt;Ruta de trekking partiendo desde San Joan de Vilatorrada.&lt;br /&gt;&lt;br /&gt;[4/2011]&lt;br /&gt;Pico del Penyagolosa (1814m)&lt;br /&gt;Parque natural del Penyagolosa (Castellón)&lt;br /&gt;Ruta de trekking partiendo desde la Hermita de San Juan de Penyagolosa.&lt;br /&gt;&lt;br /&gt;[07/2011]&lt;br /&gt;Pico del Montcau (1066m)&lt;br /&gt;Parque Natural Sant Llorenç del Munt (Barcelona)&lt;br /&gt;Ruta de trekking partiendo desde el Coll d'Estenalles y pasando por la Mola.&lt;br /&gt;&lt;br /&gt;[07/2011]&lt;br /&gt;Pico superior del Pedraforca (2497m)&lt;br /&gt;Parque Natural del Cadí-Moixeró (Barcelona)&lt;br /&gt;Ruta de trekking partiendo desde el parking del mirador de gresolet.&lt;br /&gt;&lt;br /&gt;[08/2011]&lt;br /&gt;Ruta circular desde Benafigos por el Rio Montlleo (945m)&lt;br /&gt;Parque natural del Penyagolosa (Castellón)&lt;br /&gt;http://es.wikiloc.com/wikiloc/view.do?id=995398&lt;br /&gt;Video &lt;a href="http://www.youtube.com/watch?v=_fqIqwCHeGA"&gt;1/2&lt;/a&gt; y &lt;a href="http://www.youtube.com/watch?v=XdLHMK_3mnU&amp;feature=related"&gt;2/2&lt;/a&gt; en YouTube.&lt;br /&gt;&lt;br /&gt;[08/2011]&lt;br /&gt;Ronda Vallesana Terrassa&lt;br /&gt;Parque natural de Sant Llorenç del Munt i l'Obac&lt;br /&gt;http://es.wikiloc.com/wikiloc/view.do?id=1261016&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Carreras populares ==&lt;br /&gt;&lt;br /&gt;Soy corredor habitual desde que dejé el baloncesto con 18 años. A 15km de entrenamiento semanales, distancia que supero holgadamente todas las semanas, calculo que mis piernas deben haber corrido mas de 10.000km. Desde hace unos 6 años, me aficioné a participar en carreras populares. Estas son algunas de las carreras en las que he participado:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-laXTlzUjnpM/TYzmvznIuWI/AAAAAAAAALA/vlS_tNYfTUs/s1600/IMAG0083.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://2.bp.blogspot.com/-laXTlzUjnpM/TYzmvznIuWI/AAAAAAAAALA/vlS_tNYfTUs/s200/IMAG0083.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5588094946642540898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;09/2007&lt;br /&gt;I travessa Circutor - Monasterio Montserrat (23km: 4h 30m)&lt;br /&gt;&lt;br /&gt;10/2007&lt;br /&gt;II gran premio 42 y pico Castellón (10km: 49m 47s)&lt;br /&gt;&lt;br /&gt;10/2008&lt;br /&gt;Cursa de fons a Sant Muç, Rubi (10Km: 48m 56s)&lt;br /&gt;&lt;br /&gt;09/2008&lt;br /&gt;Cursa festa major Matadepera (10km: 51m 49s)&lt;br /&gt;&lt;br /&gt;04/2008&lt;br /&gt;Mullat i Corre circuit de Montmelo (10km: 47m 27s)&lt;br /&gt;&lt;br /&gt;09/2008&lt;br /&gt;II travessa Circutor - Monasterio Montserrat (23km: 4h 05m)&lt;br /&gt;&lt;br /&gt;01/2009&lt;br /&gt;IX mitja marató de Terrassa (21Km: 2h 0m 45s)&lt;br /&gt;&lt;br /&gt;07/2009&lt;br /&gt;XXX Cursa Festa Major Terrassa (8km: 37m 35s)&lt;br /&gt;&lt;br /&gt;07/2009&lt;br /&gt;XXVII Cursa atlètica popular Ca n'Anglada (6km: 25m 02s)&lt;br /&gt;&lt;br /&gt;09/2009&lt;br /&gt;Cursa festa major Matadepera (10km: 52m 44s)&lt;br /&gt;&lt;br /&gt;10/2009&lt;br /&gt;III travessa Viladecavalls - Monasterio Montserrat (23km: 3h 52m)&lt;br /&gt;&lt;br /&gt;07/2010&lt;br /&gt;XXXI Cursa Festa Major Terrassa (8km: 39m 53s)&lt;br /&gt;&lt;br /&gt;09/2010&lt;br /&gt;Cursa festa major Matadepera (10km: 49m 44s)&lt;br /&gt;&lt;br /&gt;09/2010&lt;br /&gt;Cursa Mercè en Barcelona (10km: 44m 44s)&lt;br /&gt;&lt;br /&gt;01/2011&lt;br /&gt;Cursa Santi Centelles de Terrassa (5Km: 22m 35s)&lt;br /&gt;&lt;br /&gt;04/2011&lt;br /&gt;IV Carrera a pie costa Azahar (10km: 45m 59s)&lt;br /&gt;&lt;br /&gt;05/2011&lt;br /&gt;XI Cursa de Muntanya de Rubí (11km: 1h 10m 16s)&lt;br /&gt;&lt;br /&gt;06/2011&lt;br /&gt;XXVII Cursa atlètica popular Pla de Bonaire (7km: 32m 22s)&lt;br /&gt;&lt;br /&gt;06/2011&lt;br /&gt;XXIX Cursa atlètica popular Sant Llorenç (5.5km: 22m 30s)&lt;br /&gt;&lt;br /&gt;06/2011&lt;br /&gt;I Cursa popular Grao de Castellò (5km: 21m 31s)&lt;br /&gt;&lt;br /&gt;07/2011&lt;br /&gt;XXXII Cursa Festa Major Terrassa (7.5km: 37m 59s)&lt;br /&gt;&lt;br /&gt;07/2011&lt;br /&gt;XXIX Cursa atlètica popular Ca n'Anglada (6km: 23m 24s)&lt;br /&gt;&lt;br /&gt;09/2011&lt;br /&gt;Cursa festa major Matadepera (10km: 46m 39s)&lt;br /&gt;&lt;br /&gt;09/2011&lt;br /&gt;Cursa Mercè en Barcelona (10km: 44m 41s)&lt;br /&gt;&lt;br /&gt;10/2011&lt;br /&gt;V travessa Viladecavalls - Monasterio Montserrat (23km: 3h 54m)&lt;br /&gt;&lt;br /&gt;01/2012&lt;br /&gt;XIII mitja marató de Terrassa (21km: 1h 56m 17s)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Entrenamiento running ==&lt;br /&gt;&lt;br /&gt;Zonas donde realizo (o he realizado en el pasado) entrenamientos habitualmente. En muchas de ellas me podéis encontrar entrenando hoy en día.&lt;br /&gt;&lt;br /&gt;Camino de la Fileta (Castellón)&lt;br /&gt;Camino del rio seco (Castellón)&lt;br /&gt;Avd. Ferrandis Salvador (Castellón)&lt;br /&gt;Camino de la Plana (Castellón)&lt;br /&gt;Camino Serradal (Castellón)&lt;br /&gt;Avd. del Mar (Castellón)&lt;br /&gt;Amstelpark, Amstelveen (Holanda)&lt;br /&gt;Paseo del Museo Guggenheim (Bilbao)&lt;br /&gt;Carretera del Desert de les Palmes (Castellón)&lt;br /&gt;Avenida del Valles, Terrassa (Barcelona)&lt;br /&gt;Parc Vallparadis, Terrassa (Barcelona)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;== Planes para el futuro ==&lt;br /&gt;&lt;br /&gt;Por supuesto, seguir corriendo todas las carreras populares que me queden cerca. Mi próxima carrera será el día 16 de Abril en mi querida ciudad natal. Participaré en la IV carrera a pié, costa de Azahar.&lt;br /&gt;&lt;br /&gt;Aunque desde hace un par de años ronda por mi cabeza la palabra "Triatlon", me atrae mucho la idea de juntar la bicicleta, piscina y running en una sola prueba. Pronto espero poder comprar una buena bicicleta para entrenar la prueba en condiciones. También necesitaré una piscina para entrenar la natación. Aunque mi presupuesto de momento no está para muchas alegrías.&lt;br /&gt;&lt;br /&gt;También me gustaría comprar un GPS para aventurarme mas a menudo por la montaña haciendo trekkings de muchos kilómetros y varios días. El Camino de Santiago empezando en los Pirineos encajaría muy bien en este apartado.&lt;br /&gt;&lt;br /&gt;Esperemos que las lesiones nos respeten durante muchos años para seguir disfrutar de todos estos proyectos durante mucho tiempo... ¿Alguien se anima con alguno de ellos? :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-808297273486551927?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/808297273486551927/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=808297273486551927' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/808297273486551927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/808297273486551927'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2011/03/mens-sana-in-corpore-sano.html' title='Mens sana in corpore sano'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-D8E19uvjGtk/TY24L9cndZI/AAAAAAAAALI/uYAvdhKevxs/s72-c/mens-sana-ics.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-1208392805972763611</id><published>2011-02-05T17:58:00.006+01:00</published><updated>2011-02-05T21:32:20.616+01:00</updated><title type='text'>Contraseñas seguras y faciles de recordar</title><content type='html'>Es el momento de elegir una contraseña para un nuevo servicio online que estamos dando de alta. Dicha decisión, aunque todavía hay gente que no se lo plantea, es trascendental para proteger la privacidad de los datos confidenciales de carácter personal que vamos a proporcionar al proveedor de dicho servicio: cuentas bancarias, tarjetas de crédito. CV, ofertas de trabajo, y un largo sin fin de datos personales privados.&lt;br /&gt;&lt;br /&gt;Finalizado el proceso de alta, la única barrera que protege a nuestros datos confidenciales de la curiosidad ajena es dicha contraseña. Por ello, dicha contraseña debería ser elegida con toda la cautela y el máximo recelo posible, puesto que todos conocemos las consecuencias de exponer información sensible y los peligros que eso conlleva.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/TU2CP2TC04I/AAAAAAAAAK4/0gaGim_Q1lU/s1600/proper_password.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 128px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/TU2CP2TC04I/AAAAAAAAAK4/0gaGim_Q1lU/s200/proper_password.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5570251522912211842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para elegir una contraseña segura, hay que tener en cuenta algunas recomendaciones de lo mas básicas:&lt;br /&gt;&lt;br /&gt;    - Debe ser fácil de recordar pero difícil de adivinar&lt;br /&gt;    - Es obligatorio usar un mínimo de 8 caracteres&lt;br /&gt;    - Debe combinar letras con dígitos numéricos&lt;br /&gt;    - No debe utilizarse la misma contraseña para acceder a distintos servicios online&lt;br /&gt;    - No deben utilizarse palabras que aparezcan en un diccionario&lt;br /&gt;&lt;br /&gt;La gente acumula cuentas de usuario en distintos servicios online. Con el paso del tiempo tienden a olvidar las contraseñas elegidas. Para evitar ese olvido, muchos optan por elegir contraseñas fáciles de adivinar, basadas en su propio nombre, edad, fecha de nacimiento, dni, matricula de tu coche, profesión, comida favorita, el nombre de tu perro o de tu gato, etc. Y muchas veces esa misma contraseña fácil de recordar, se utiliza en todos y cada uno de los servicios online registrados. Podéis imaginaros la dimensión del problema.&lt;br /&gt;&lt;br /&gt;En este post se propone un método para resolver este problema.&lt;br /&gt;&lt;br /&gt;La solución propuesta se basa en dos inputs que combinados adecuadamente mediante un algoritmo que definiremos nosotros mismos, generan como output la contraseña segura. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    f_algoritmo_secreto(servicio_online, semilla) = contraseña&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como inputs tendremos el nombre identificativo del servicio online donde estamos registrando la cuenta, y una semilla secreta única para todas nuestras contraseñas. El algoritmo combina los dos inputs para obtener como output la contraseña segura. &lt;br /&gt;&lt;br /&gt;Vamos a explicar todo esto con un ejemplo sencillo para que se entienda mejor. Sea f_algoritmo_secreto una función que concatena las cadenas semilla y servicio_online, aplicando la función de hash md5 sobre el resultado de su concatenación, y del md5 resultante extrae los 10 primeros caracteres como contraseña de salida. Sea "supersecreto" la cadena semilla. Veamos algunos ejemplos de aplicación con distintos servicios online:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Portal gmail --&gt; md5sum[ "gmailsupersecreto" ] = 6037becb2f&lt;br /&gt;    Portal facebook --&gt; md5sum[ "facebooksupersecreto" ] = ca713f6ce3&lt;br /&gt;    Maquina amd64 --&gt; md5sum[ "amd64supersecreto" ] = ea816a9399&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por tanto, el password para la cuenta de gmail sería "6037becb2f", para la cuenta de facebook sería "ca713f6ce3" y para la cuenta en la maquina amd64 sería "ea816a9399". Como veis se trata de passwords dificiles de memorizar incluso para aquellos que estuvieran mirando vuestro teclado mientras pulsais las teclas.&lt;br /&gt;&lt;br /&gt;Aqui teneis un sencillo bash shell script que os resuelve el problema sin mayor complicación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  #! /bin/bash&lt;br /&gt;&lt;br /&gt;  echo -ne "Online service: "&lt;br /&gt;  read READ&lt;br /&gt;&lt;br /&gt;  stty -echo&lt;br /&gt;  read -p "Supersecret seed: " SEED&lt;br /&gt;  echo -ne "\n"&lt;br /&gt;  stty echo&lt;br /&gt;&lt;br /&gt;  echo -ne "$READ$SEED" | md5sum | cut -b 1-10&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El secreto del método reside tanto en el algoritmo_secreto como en la cadena semilla. &lt;br /&gt;&lt;br /&gt;Aunque el algoritmo_secreto cayera en manos ajenas, el método continúa protegido por la semilla. Esta semilla deberíais interiorizarla como si fuera vuestro propio nombre, tendrían que torturaros para obtenerla (aunque ojito por donde viajais :-) Pero obviamente es mas fácil recordar esa semilla que todas y cada una de las distintas contraseñas de los distintos servicios online en los que tenemos alguna cuenta registrada.&lt;br /&gt;&lt;br /&gt;Este método (y cualquier variante basada en el mismo principio) cumple todas y cada una de las recomendaciones básicas que se han enumerado al comienzo de este post para garantizar la elección de una contraseña segura.&lt;br /&gt;&lt;br /&gt;Quede claro que se trata de una propuesta concreta para explicar el método con un ejemplo. No os recomiendo en absoluto que uséis este mismo método tal y como esta publicado. Así que ¡aya vosotros! que este mismo método ya lo conocen todos los lectores de este blog! ;) Aunque con pequeñas modificaciones debería ser sencillo adaptarlo a vuestras propias necesidades personales.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-1208392805972763611?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/1208392805972763611/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=1208392805972763611' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/1208392805972763611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/1208392805972763611'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2011/02/contrasenas-seguras-y-faciles-de.html' title='Contraseñas seguras y faciles de recordar'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/TU2CP2TC04I/AAAAAAAAAK4/0gaGim_Q1lU/s72-c/proper_password.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-8319367495877223404</id><published>2011-01-15T19:53:00.011+01:00</published><updated>2011-01-15T20:44:54.721+01:00</updated><title type='text'>Cuestionario open source</title><content type='html'>Hoy me apetece plantearos una serie de preguntitas relacionadas con sistemas Linux para que mantengáis vuestras mentes en forma. Veamos quien es el primero en contestar todas las preguntas correctamente. Los recursos de los que dispongo para premiar al ganador son mas bien escasos, así que el ganador tendrá que conformarse con la satisfacción de ser el primero en lograrlo. ¡Que no es poco! Cualquier día os llaman desde alguna empresa internacional cañera planteando preguntas de este estilo y entonces, ..., ¡entonces tendréis vuestro merecido premio! :-)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/TTHzFewTQbI/AAAAAAAAAKg/LQSzUc7F2QI/s1600/Estudiar.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 148px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/TTHzFewTQbI/AAAAAAAAAKg/LQSzUc7F2QI/s200/Estudiar.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5562494290259820978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Redes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Como contacta un cliente DHCP con el servidor DHCP para pedirle una IP cuando el cliente DHCP todavía no tiene ninguna dirección IP asignada?&lt;br /&gt;&lt;br /&gt;¿Que comando se usa para cambiar el ESSID de un interfaz wifi? ¿Y para habilitar/deshabilitar el modo promiscuo del interfaz?&lt;br /&gt;&lt;br /&gt;¿Que protocolo de red utiliza el mecanismo de ventana deslizante? ¿Podríais explicarme brevemente en qué consiste?&lt;br /&gt;&lt;br /&gt;¿De cuantas direcciones de host efectivas dispones en una subred con una mascara de red con 27 bits habilitados a 1?&lt;br /&gt;&lt;br /&gt;¿Cuantos enteros necesitas en una plataforma x86 para almacenar una dirección IPv4?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sistema:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Cual es el uso de los runlevels en un sistema Linux?&lt;br /&gt;&lt;br /&gt;¿Cual es la diferencia entre los ficheros fstab y mtab situados en el directorio /etc?&lt;br /&gt;&lt;br /&gt;¿Para que se usa el comando modprobe y en qué se diferencia del comando insmod?&lt;br /&gt;&lt;br /&gt;Dime el comando opuesto a 'cat'.&lt;br /&gt;&lt;br /&gt;¿Cual es la diferencia entre los números "major" y "minor" de todos los ficheros dispositivo situados en /dev?. ¿Que llamada al sistema se usa para generar dichos ficheros dispositivo?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Desarrollo:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Cual es la llamada al sistema usada para crear un proceso? Explícame también el significado de los posibles valores de retorno de esta llamada.&lt;br /&gt;&lt;br /&gt;¿Cual es el uso del modificador 'friend' en un método de C++?. Los métodos friend, deben ser, ¿public, protected, o private?&lt;br /&gt;&lt;br /&gt;¿Cual es el significado del Set User ID SUID bit cuando se aplica sobre binarios? ¿Tiene alguna utilidad aplicado sobre directorios?&lt;br /&gt;&lt;br /&gt;¿Para que se usa el comando built-in 'export' del bash shell script?&lt;br /&gt;&lt;br /&gt;¿Que comando se usa para eliminar la información de debug de un binario compilado con gcc/g++?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-8319367495877223404?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/8319367495877223404/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=8319367495877223404' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/8319367495877223404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/8319367495877223404'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2011/01/cuestionario-open-source.html' title='Cuestionario open source'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/TTHzFewTQbI/AAAAAAAAAKg/LQSzUc7F2QI/s72-c/Estudiar.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-2753641493898681258</id><published>2010-11-20T20:42:00.022+01:00</published><updated>2010-11-21T11:05:28.221+01:00</updated><title type='text'>Retos para desarrolladores</title><content type='html'>Entre crisis, abogados, hipotecas, y tareas del hogar (aunque éstas últimas no terminen nunca para mi frustración), últimamente he tenido poco tiempo libre para disfrutar de mi afición como programador, que aunque también sea mi profesión, no deja de ser un hobbie con el disfruto de mi tiempo libre.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"Busca un trabajo que te guste y no tendrás que trabajar un sólo día de tu vida". &lt;br /&gt;Cita sabia del filosofo chino Confucio.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Cansado ya de dedicar mi tiempo libre a resolver problemas de mi vida cotidiana que me divierten mas bien poco, me aportan mas bien nada, y me limitan mi capacidad de aprendizaje y mejora continua de mis aptitudes profesionales, hoy por fin encontré el día perfecto para pasar un buen rato con mi buen amigo 'Dellone' (así es como bauticé este verano a mi primer portátil Dell)&lt;br /&gt;&lt;br /&gt;Era una tarde de Sábado gris, lluviosa y fría. Otro de esos días perfectos en los que no se me ocurría nada mejor que sentarte delante del portátil y disfrutar junto al calor de sus ventiladores resolviendo alguna de las muchas tareas que tenia pendientes en mi lista de TODOs personales.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/TOgqhi_QDJI/AAAAAAAAAKM/ZyxEWAXpg6g/s1600/programming_challenge.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 98px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/TOgqhi_QDJI/AAAAAAAAAKM/ZyxEWAXpg6g/s200/programming_challenge.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541726097295543442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La tarea elegida hoy fue resolver el reto para desarrolladores publicados en el portal &lt;a href="http://challenge.greplin.com/"&gt;The Greplin Programming Challenge&lt;/a&gt;. Conocí estos retos gracias a un compañero de trabajo, a quien desde aquí le agradezco la información porque he pasado una tarde muy entretenida. Gracias Dani! ;)&lt;br /&gt;&lt;br /&gt;Sobre el nivel del reto, comentar que son tres problemas que exigen unos conocimientos en algorítmica de lo mas básicos. En todo caso, es el tercer reto el que exige un poquito de imaginación para dar con la solución. Pero poco mas. Todo aquel con experiencia 'picando código' debería poder resolverlos sin mayores problemas.&lt;br /&gt;&lt;br /&gt;Las soluciones que publico han sido desarrolladas en C, que a mi es el lenguaje que más me gusta. Pero el lenguaje usado para resolverlos es indiferente, podéis usar el que mas os guste (o el que mas os disguste, hay mucho masoca suelto por ahí...)&lt;br /&gt;&lt;br /&gt;El primer reto se introduce con esta explicación:&lt;pre&gt; The Greplin Programming Challenge&lt;br /&gt; &lt;br /&gt; Level 1&lt;br /&gt; &lt;br /&gt; ----------------------------------------&lt;br /&gt;&lt;br /&gt; Embedded in this block of text is the password for level 2.&lt;br /&gt; The password is the longest substring that is the same in reverse.&lt;br /&gt; &lt;br /&gt; As an example, if the input was "I like racecars that go fast"&lt;br /&gt; the password would be "racecar".&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La solución que propongo al primer reto es esta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include stdio.h&lt;br /&gt;#include string.h&lt;br /&gt;&lt;br /&gt;const char g_cad[] = &lt;br /&gt;"Fourscoreandsevenyearsagoourfaathersbroughtforthonthiscontainentanewnationconceivedinz"&lt;br /&gt;"LibertyanddedicatedtothepropositionthatallmenarecreatedequalNowweareengagedinagreahtci"&lt;br /&gt;"vilwartestingwhetherthatnaptionoranynartionsoconceivedandsodedicatedcanlongendureWeare"&lt;br /&gt;"qmetonagreatbattlefiemldoftzhatwarWehavecometodedicpateaportionofthatfieldasafinalrest"&lt;br /&gt;"ingplaceforthosewhoheregavetheirlivesthatthatnationmightliveItisaltogetherfangandprope"&lt;br /&gt;"rthatweshoulddothisButinalargersensewecannotdedicatewecannotconsecratewecannothallowth"&lt;br /&gt;"isgroundThebravelmenlivinganddeadwhostruggledherehaveconsecrateditfaraboveourpoorponwe"&lt;br /&gt;"rtoaddordetractTgheworldadswfilllittlenotlenorlongrememberwhatwesayherebutitcanneverfo"&lt;br /&gt;"rgetwhattheydidhereItisforusthelivingrathertobededicatedheretotheulnfinishedworkwhicht"&lt;br /&gt;"heywhofoughtherehavethusfarsonoblyadvancedItisratherforustobeherededicatedtothegreattd"&lt;br /&gt;"afskremainingbeforeusthatfromthesehonoreddeadwetakeincreaseddevotiontothatcauseforwhic"&lt;br /&gt;"htheygavethelastpfullmeasureofdevotionthatweherehighlyresolvethatthesedeadshallnothave"&lt;br /&gt;"diedinvainthatthisnationunsderGodshallhaveanewbirthoffreedomandthatgovernmentofthepeop"&lt;br /&gt;"lebythepeopleforthepeopleshallnotperishfromtheearth";&lt;br /&gt;&lt;br /&gt;int is_str_palindrome(const char * init, const char * end)&lt;br /&gt;{&lt;br /&gt;    while ((*init == *end) &amp;&amp; (init &lt;= end)) {&lt;br /&gt;        init++;&lt;br /&gt;        end--;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return (init &gt;= end);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;    int l = strlen(g_cad);&lt;br /&gt;    int i, j, ibest, lbest;&lt;br /&gt;&lt;br /&gt;    ibest = lbest = 0;&lt;br /&gt;&lt;br /&gt;    for (j = l - 1; j &gt; 0; j--) {&lt;br /&gt;        for (i = 0; i &lt; j; i++) {&lt;br /&gt;            if (is_str_palindrome(g_cad+i, g_cad+j))&lt;br /&gt;                if (j-i &gt; lbest) {&lt;br /&gt;                    ibest = i;&lt;br /&gt;                    lbest = j-i+1;&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    printf("Solution to challenge 1 is '%.*s'\n", lbest, g_cad+ibest);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El segundo reto se introduce con esta explicación:&lt;pre&gt; The Greplin Programming Challenge&lt;br /&gt; &lt;br /&gt; Level 2&lt;br /&gt; &lt;br /&gt; ----------------------------------------&lt;br /&gt;&lt;br /&gt; Congratulations.  You have reached level 2.&lt;br /&gt; &lt;br /&gt; To get the password for level 3, write code to find the first prime&lt;br /&gt; fibonacci number larger than a given minimum.  For example, the first&lt;br /&gt; prime fibonacci number larger than 10 is 13.&lt;br /&gt;&lt;br /&gt; When you are ready, go here or call this automated&lt;br /&gt; number (415) 799-9454.&lt;br /&gt; &lt;br /&gt; You will receive additional instructions at that time.  For the second portion&lt;br /&gt; of this task, note that for the number 12 we consider the sum of the prime divisors&lt;br /&gt; to be 2 + 3 = 5.  We do not include 2 twice even though it divides 12 twice.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La solución que propongo al segundo reto es esta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include stdio.h&lt;br /&gt;&lt;br /&gt;unsigned long next_fibonacci()&lt;br /&gt;{&lt;br /&gt;    static unsigned long a = 0;&lt;br /&gt;    static unsigned long b = 1;&lt;br /&gt;    unsigned long nf = a + b;&lt;br /&gt;&lt;br /&gt;    a = b;&lt;br /&gt;    b = nf;&lt;br /&gt;&lt;br /&gt;    return nf;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned long next_prime()&lt;br /&gt;{&lt;br /&gt;    static unsigned long prime = 0;&lt;br /&gt;    unsigned long tested = prime + 1;&lt;br /&gt;&lt;br /&gt;    while (1) {&lt;br /&gt;        if (is_prime(tested)) {&lt;br /&gt;            prime = tested;&lt;br /&gt;            return prime;&lt;br /&gt;        } else {&lt;br /&gt;            tested++;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int is_prime(unsigned long tested)&lt;br /&gt;{&lt;br /&gt;    unsigned long divisor;&lt;br /&gt;&lt;br /&gt;    for (divisor = (tested / 2); divisor &gt; 1; divisor--)&lt;br /&gt;        if ((tested % divisor) == 0)&lt;br /&gt;            return 0;&lt;br /&gt;&lt;br /&gt;    return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;    unsigned long given_minimum = 227000;&lt;br /&gt;    unsigned long X;&lt;br /&gt;&lt;br /&gt;    while ((X = next_fibonacci()) &lt; given_minimum)&lt;br /&gt;        ;&lt;br /&gt;&lt;br /&gt;    while (!is_prime(X))&lt;br /&gt;        X = next_fibonacci();&lt;br /&gt;&lt;br /&gt;    X += 1;&lt;br /&gt;&lt;br /&gt;    int np = next_prime(); // 1&lt;br /&gt;&lt;br /&gt;    int challenge2 = 0;&lt;br /&gt;&lt;br /&gt;    while (X != 1) {&lt;br /&gt;        np = next_prime();&lt;br /&gt;&lt;br /&gt;        if ((X % np) == 0) {&lt;br /&gt;            while ((X % np) == 0)&lt;br /&gt;                X = X / np;&lt;br /&gt;            challenge2 += np;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    printf("Solution to challenge 2 is %d\n", challenge2);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y por ultimo, el tercer reto se introduce con esta explicación: &lt;pre&gt; The Greplin Programming Challenge&lt;br /&gt; &lt;br /&gt; Level 3&lt;br /&gt; &lt;br /&gt; ----------------------------------------&lt;br /&gt;&lt;br /&gt; Congratulations.  You have reached the final level.&lt;br /&gt; &lt;br /&gt; For the final task, you must find all subsets of an array&lt;br /&gt; where the largest number is the sum of the remaining numbers.&lt;br /&gt; For example, for an input of:&lt;br /&gt;&lt;br /&gt; (1, 2, 3, 4, 6)&lt;br /&gt;&lt;br /&gt; the subsets would be&lt;br /&gt;&lt;br /&gt; 1 + 2 = 3&lt;br /&gt; 1 + 3 = 4&lt;br /&gt; 2 + 4 = 6&lt;br /&gt; 1 + 2 + 3 = 6&lt;br /&gt; &lt;br /&gt; Here is the list of numbers you should run your code on.&lt;br /&gt; The password is the number of subsets.  In the above case the&lt;br /&gt; answer would be 4.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Y la solución que propongo al tercer reto, es esta:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;#include stdio.h&lt;br /&gt;#include math.h&lt;br /&gt;&lt;br /&gt;/* Input param */&lt;br /&gt;int g_set[] = { 3, 4, 9, 14, 15, 19, 28, 37, 47, 50, 54, 56, 59, 61, 70, 73, 78, 81, 92, 95, 97, 99 };&lt;br /&gt;&lt;br /&gt;int g_setlen = sizeof(g_set) / sizeof(int);&lt;br /&gt;&lt;br /&gt;int is_membership(int v)&lt;br /&gt;{&lt;br /&gt;    int i;&lt;br /&gt;&lt;br /&gt;    for (i = 0; i &lt; g_setlen; i++)&lt;br /&gt;        if (g_set[i] == v) {&lt;br /&gt;            return 1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int is_onebit(int v)&lt;br /&gt;{&lt;br /&gt;    int i;&lt;br /&gt;    for (i = 0; i &lt; g_setlen; i++)&lt;br /&gt;        if (v == (pow(2, i)))&lt;br /&gt;            return 1;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;    int mask;&lt;br /&gt;    int m;&lt;br /&gt;    int aux;&lt;br /&gt;    int pos;&lt;br /&gt;    unsigned int N = pow(2, g_setlen);&lt;br /&gt;    int challenge3 = 0;&lt;br /&gt;&lt;br /&gt;    for (mask = 1; mask &lt; N; mask++)&lt;br /&gt;    {&lt;br /&gt;        if (is_onebit(mask))&lt;br /&gt;            continue;&lt;br /&gt;&lt;br /&gt;        aux = mask;&lt;br /&gt;        pos = 0;&lt;br /&gt;        m = 0;&lt;br /&gt;        while (aux != 0) {&lt;br /&gt;            if (aux &amp; 0x01)&lt;br /&gt;                m += g_set[pos];&lt;br /&gt;            aux = aux &gt;&gt; 1;&lt;br /&gt;            pos++;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        if (is_membership(m))&lt;br /&gt;            challenge3++;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    printf("Solution to challenge 3 is %d\n", challenge3);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Todos los desarrolladores que estáis leyendo esto conocéis la sensación de satisfacción inmensa que produce dar con la solución al problema y "avanzar al siguiente nivel". Pienso que esa es la droga que nos metemos los que trabajamos en esto y nos mantiene tan enganchados a esta entretenida profesión (si, somos unos jonkies!! :) Y este es el premio que obtendréis al terminar el reto:&lt;pre&gt; The Greplin Programming Challenge&lt;br /&gt;&lt;br /&gt; The End&lt;br /&gt;&lt;br /&gt; ----------------------------------------&lt;br /&gt;&lt;br /&gt; Congratulations.  You completed the challenge.  Your completion code is 118-170-234969.&lt;br /&gt;&lt;br /&gt; We'd love to talk to you - send your completion code, the code you wrote&lt;br /&gt; during the challenge, and your resume to&lt;br /&gt;&lt;br /&gt; USER at SUBDOMAIN dot DOMAIN&lt;br /&gt;&lt;br /&gt; Even if you're not looking for a job, we'd love to hear what you thought&lt;br /&gt; about the challenge.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La dirección de correo la protejo para evitar spam innecesario a los organizadores. Eso si, si alguno de los lectores esta en paro, y tiene en mente trabajar en Estados Unidos, igual es ésta vuestra oportunidad. !Al menos intentadlo! :)&lt;br /&gt;&lt;br /&gt;Para los que sigáis con el gusanillo de resolver mas problemas de este estilo, os dejo aqui otro enlace a un reto para desarrolladores bastante famosillo, &lt;a href="http://projecteuler.net/"&gt;The Euler Project&lt;/a&gt;, con mas de 300 problemas que resolver, un gran número de participantes registrados repartidos por los cinco continentes, y un ranking en el que estareis compitiendo contra todos ellos. Si alguien se aburre con este reto, que hable conmigo que está contratado! :P&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/TOgssJdNOOI/AAAAAAAAAKU/Whjde_k-SXE/s1600/euler.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 146px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/TOgssJdNOOI/AAAAAAAAAKU/Whjde_k-SXE/s200/euler.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5541728478443682018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como veis en la imagen adjunta, solo he podido terminar los 7 primeros. La falta de tiempo libre me obliga a mantener abandonadas algunas tareas que me gustaría continuar a medida que recupere el control de mi tiempo libre. Animo a todos los lectores que compartan mi afición a que lo intenten, pregunten dudas, compartan las soluciones, y así poder comentarlas y buscar entre todos la solución óptima en cuanto a coste computacional, etc. Espero que lo disfrutéis. Y ya sobran mas explicaciones. ¡A programar se ha dicho!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-2753641493898681258?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/2753641493898681258/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=2753641493898681258' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2753641493898681258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2753641493898681258'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/11/retos-para-programadores.html' title='Retos para desarrolladores'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/TOgqhi_QDJI/AAAAAAAAAKM/ZyxEWAXpg6g/s72-c/programming_challenge.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-2116272179047479133</id><published>2010-10-23T16:59:00.030+02:00</published><updated>2010-10-24T10:32:44.924+02:00</updated><title type='text'>Hiputecado</title><content type='html'>Compré un piso en Abril de 2007 en plena burbuja inmobiliaria por un precio bastante razonable para lo que se movía en aquellos momentos, ante la alocada escalada de precios que me hizo creer que era de las últimas oportunidades que tendría en mi vida para tener algo mio en propiedad. Y es que los precios de venta ya rozaban lo prohibitivo...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/TMMImBlkqxI/AAAAAAAAAKA/4iIcPJb00rU/s1600/hipo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 109px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/TMMImBlkqxI/AAAAAAAAAKA/4iIcPJb00rU/s200/hipo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5531274216695180050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5 meses después de firmar el contrato de arras para comprar un piso sobre plano, la burbuja me estalló en las manos. A mi, como a muchos otros amigos, conocidos y familiares. Mucha gente de mi edad, rondando los 30 años. Jóvenes ilusionados con tener su propia vivienda, habían puesto todos sus ahorros en manos de unos promotores que poco tiempo después se declararon insolventes, en quiebra. El desconocimiento del sector, de los riesgos de una operación tan arriesgada, de la legislación que regula este mercado, la confianza de que "todo iba bien" y que "nada malo podía pasar", hizo que mucha gente entregara cantidades de dinero a cuenta sin ser avaladas por el banco. Muchísima gente sigue hoy en día en los juzgados gastando su dinero en abogados para intentar recuperar parte de aquel dinero, muchos otros lo han perdido ya todo. Historias realmente lamentables.&lt;br /&gt;&lt;br /&gt;Es de recordar que el Articulo 47 de la Constitución Española, dice textualmente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    "Todos los españoles tienen derecho a disfrutar de una vivienda digna&lt;br /&gt;    y adecuada. Los poderes públicos promoverán las condiciones necesarias&lt;br /&gt;    y establecerán las normas pertinentes para hacer efectivo este derecho,&lt;br /&gt;    regulando la utilización del suelo de acuerdo con el interés general&lt;br /&gt;    para impedir la especulación"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Se trata de un derecho fundamental de todos los ciudadanos españoles. A estas alturas, ya no creo que haya ningún poder público de este país que se preocupe realmente por atender las verdaderas necesidades de los ciudadanos. Ellos siguen sonrientes, contando chistes delante de los suyos sobre las habilidades o las carencias de sus opositores. Es indignante, frustrante, vergonzoso y un largo sin fin de adjetivos que podrían seguir describiendo la situación política lamentable que vivimos en este país.&lt;br /&gt;&lt;br /&gt;Gracias a todos ellos, muchos otros al igual que yo seremos la generación de los pringados de este país. Los pringados que pagaremos los excesos cometidos por algunos a los que hoy en día les importa un pimiento que estemos en crisis. Mientras ellos disfrutarán de lo ganado en tiempos de bonanza, otros lo estaremos pagando el resto de nuestras vidas. Y muy caro.&lt;br /&gt;&lt;br /&gt;De los pocos que después de un largo calvario de abogados de mas de 4 años, hemos tenido la "suerte" (muy entre comillas) de que terminen la construcción de nuestra vivienda, debemos hacer frente ahora a la hipoteca, por un importe hoy por hoy muy por encima de su valor real de tasación en el mercado. A sabiendas de que los precios seguirán cayendo en los próximos meses y, probablemente, años. O eso o perder el 100% de las cantidades anticipadas. Pagar el resto de mi vida por un bien que no tiene la mitad de su valor. Viva las leyes de este país.&lt;br /&gt;&lt;br /&gt;Para intentar reducir el coste de dicha vivienda al máximo, he tenido que aprender en muy pocos días muchos términos nuevos relacionados con el mundillo de los economistas: indices de referencias, hipotecas a tipo fijo o variable, diferenciales sobre el euribor, comisiones de apertura, amortización, cancelación, productos vinculados, suelos o techos de interés, y un largo etcétera. Y hacer números por mi cuenta para sacar mis propias conclusiones.&lt;br /&gt;&lt;br /&gt;Mucha gente me dice... ¡es que hay que saber un poco de todo! No lo veo justo. Daría lo que fuera por ver a todos los economistas, abogados, jueces, etc. que manejan ordenadores para su trabajo a diario, se vieran en la obligación de aprender a manejarse con conceptos informáticos como ensambladores, juegos de instrucciones, compiladores, linkers, librerías, herencia, polimorfismo, estructuras de datos, clases, objetos, constructores, variables, punteros, estructuras, uniones, debuggers, ... stack overflow.&lt;br /&gt;&lt;br /&gt;Como ingeniero tengo conocimientos matemáticos mas que suficientes para sacar a flote la triste realidad de los datos económicos que se ocultan detrás de las hipotecas. En lo que sigue intentaré explicaros como funciona esto de las hipotecas, como se realiza el cálculo de la cuota mensual y como funciona el tema de los intereses. Veremos también algunos datos que conviene tener en cuenta para ahorraros bastantes euros durante todo el pago de vuestra hipoteca.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Calculo de la cuota mensual&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Veamos primero como se calcula la cuota que se paga cada mes de una hipoteca. Este dato se obtiene aplicando una formula que depende de estas 3 variables:&lt;br /&gt;&lt;br /&gt;- Capital solicitad (€): es la cantidad de dinero que le pides al banco.&lt;br /&gt;- Plazo de amortización (meses): es el tiempo que vas a tardar en devolverle el capital solicitado al banco&lt;br /&gt;- Interes anual o TAE (%): es el interés aplicado cada año sobre el capital que le seguimos debiendo al banco (capital no amortizado).&lt;br /&gt;&lt;br /&gt;Con estos tres datos tenemos todo lo necesario. Veamos un ejemplo práctico para entenderlo mejor. Pediremos al banco un crédito de 12.000€ a devolver en 2 años y a un tipo de interés TAE del 6% anual.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Capital solicitado = C = 12000€&lt;br /&gt;    Plazo de amortización = n = 24 meses&lt;br /&gt;    TAE = 6%&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A partir de estos 3 datos, se extrae el índice "i" de interés, como:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    TAE mensual = 6% / 12 meses = 0.5%&lt;br /&gt;    Indice del interés = i = TAE mensual / 100 = 0.5 / 100 = 0.005&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A partir de las variables anteriores, calculamos la cuota mensual de una hipoteca aplicando esta ecuación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Cuota Mensual Hipoteca = C * i / [ 1 - (1 + i)**-n ]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;donde 2**3 = 2*2*2 = 8 (es la operación "elevado a"). En nuestro caso concreto&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    C = 12000€&lt;br /&gt;    i = 0.005&lt;br /&gt;    n = 24 meses&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Sustituyendo las variables calculadas en la ecuación, y haciendo el cálculo, tenemos el resultado de la cuota mensual:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Cuota Mensual = 12000 * 0.005 / [ 1 - (1 + 0.005)**(-24) ] = 531.85€ / mes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No fue fácil encontrar esta formula. Pero me hizo gracia leer en el sitio donde la encontré que muchos de los banqueros que gestionan este tipo de productos financieros ni siquiera saben de donde se obtiene esta cantidad. Será por las primas anuales que cobran, demostrando que hay nivel...&lt;br /&gt;&lt;br /&gt;La siguiente tabla demuestra como se amortiza el capital pendiente a lo largo de los 24 meses del plazo de amortización &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Año Mes     Cuota       Interés     Amortización        Capital pendiente&lt;br /&gt;    =========================================================================&lt;br /&gt;    0   0                                                   12.000,00 €&lt;br /&gt;    1   1       531,85 €    60,00 €     471,85 €            11.528,15 €&lt;br /&gt;    1   2       531,85 €    57,64 €     474,21 €            11.053,95 €&lt;br /&gt;    1   3       531,85 €    55,27 €     476,58 €            10.577,37 €&lt;br /&gt;    1   4       531,85 €    52,89 €     478,96 €            10.098,41 €&lt;br /&gt;    1   5       531,85 €    50,49 €     481,36 €            9.617,05 €&lt;br /&gt;    1   6       531,85 €    48,09 €     483,76 €            9.133,29 €&lt;br /&gt;    1   7       531,85 €    45,67 €     486,18 €            8.647,11 €&lt;br /&gt;    1   8       531,85 €    43,24 €     488,61 €            8.158,50 €&lt;br /&gt;    1   9       531,85 €    40,79 €     491,05 €            7.667,44 €&lt;br /&gt;    1   10      531,85 €    38,34 €     493,51 €            7.173,93 €&lt;br /&gt;    1   11      531,85 €    35,87 €     495,98 €            6.677,96 €&lt;br /&gt;    1   12      531,85 €    33,39 €     498,46 €            6.179,50 €&lt;br /&gt;    2   13      531,85 €    30,90 €     500,95 €            5.678,55 €&lt;br /&gt;    2   14      531,85 €    28,39 €     503,45 €            5.175,09 €&lt;br /&gt;    2   15      531,85 €    25,88 €     505,97 €            4.669,12 €&lt;br /&gt;    2   16      531,85 €    23,35 €     508,50 €            4.160,62 €&lt;br /&gt;    2   17      531,85 €    20,80 €     511,04 €            3.649,58 €&lt;br /&gt;    2   18      531,85 €    18,25 €     513,60 €            3.135,98 €&lt;br /&gt;    2   19      531,85 €    15,68 €     516,17 €            2.619,81 €&lt;br /&gt;    2   20      531,85 €    13,10 €     518,75 €            2.101,06 €&lt;br /&gt;    2   21      531,85 €    10,51 €     521,34 €            1.579,72 €&lt;br /&gt;    2   22      531,85 €    7,90 €      523,95 €            1.055,77 €&lt;br /&gt;    2   23      531,85 €    5,28 €      526,57 €            529,20 €&lt;br /&gt;    2   24      531,85 €    2,65 €      529,20 €            0,00 €&lt;br /&gt;&lt;br /&gt;    =====================================&lt;br /&gt;&lt;br /&gt;    IMPORTE TOTAL = 12764,33€&lt;br /&gt;    Intereses = 764,33€&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Como vemos, a medida que se amortiza capital (se reduce la deuda contraída con el banco) se van reduciendo los intereses, puesto que los interese solo se aplican sobre el capital pendiente de ser amortizado.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Carencia de capital&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Algunos bancos ofrecen unas hipotecas con un periodo de carencia inicial en el que el hipotecado pasa un tiempo (de 1 a 5 años) durante el cual solo paga intereses, sin amortizar capital. Para entender esto, vamos a aplicar una carencia de capital de 6 meses al ejemplo anterior. Por tanto, durante los 6 primeros meses pagaremos intereses pero no amortizaremos capital.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Año Mes     Cuota       Interés     Amortización        Capital Pendiente&lt;br /&gt;    =========================================================================&lt;br /&gt;    0   0                                                   12.000,00 €&lt;br /&gt;    1   1       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   2       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   3       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   4       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   5       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   6       60,00 €     60,00 €     -   €               12.000,00 €&lt;br /&gt;    1   7       698,78 €    60,00 €     638,78 €            11.361,22 €&lt;br /&gt;    1   8       698,78 €    56,81 €     641,97 €            10.719,24 €&lt;br /&gt;    1   9       698,78 €    53,60 €     645,18 €            10.074,06 €&lt;br /&gt;    1   10      698,78 €    50,37 €     648,41 €            9.425,65 €&lt;br /&gt;    1   11      698,78 €    47,13 €     651,65 €            8.774,00 €&lt;br /&gt;    1   12      698,78 €    43,87 €     654,91 €            8.119,09 €&lt;br /&gt;    2   13      698,78 €    40,60 €     658,19 €            7.460,90 €&lt;br /&gt;    2   14      698,78 €    37,30 €     661,48 €            6.799,42 €&lt;br /&gt;    2   15      698,78 €    34,00 €     664,78 €            6.134,64 €&lt;br /&gt;    2   16      698,78 €    30,67 €     668,11 €            5.466,53 €&lt;br /&gt;    2   17      698,78 €    27,33 €     671,45 €            4.795,09 €&lt;br /&gt;    2   18      698,78 €    23,98 €     674,81 €            4.120,28 €&lt;br /&gt;    2   19      698,78 €    20,60 €     678,18 €            3.442,10 €&lt;br /&gt;    2   20      698,78 €    17,21 €     681,57 €            2.760,53 €&lt;br /&gt;    2   21      698,78 €    13,80 €     684,98 €            2.075,55 €&lt;br /&gt;    2   22      698,78 €    10,38 €     688,40 €            1.387,15 €&lt;br /&gt;    2   23      698,78 €    6,94 €      691,85 €            695,30 €&lt;br /&gt;    2   24      698,78 €    3,48 €      695,30 €            0,00 €&lt;br /&gt;&lt;br /&gt;    ======================&lt;br /&gt;&lt;br /&gt;    IMPORTE TOTAL = 12938,05€&lt;br /&gt;    Intereses = 938,05€&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Indudablemente puede ser una buena idea contar con un periodo de carencia cuando por distintas razones no podemos hacer frente a las primeras mensualidades de nuestra hipoteca. No obstante, conviene hacer hincapié en los aspectos negativos. Una vez transcurrido el periodo de carencia, vemos como las cuotas aumentan de manera considerable, puesto que tenemos que devolver el mismo capital prestado (no hemos amortizado todavía capital) en menos tiempo. Otro inconveniente es el aumento del importe total por intereses, ya que durante el periodo de carencia, estamos pagando el máximo de intereses al banco, al no estar amortizando capital.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cosas obvias que conviene recordar&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para finalizar, quisiera mostraros algunos datos extras que os deberían resultar muy útiles para entender como se puede ahorrar dinero al pagar una hipoteca. &lt;br /&gt;&lt;br /&gt;Primero, anticipar las amortizaciones parciales de capital para reducir el coste total de la operación. Supongamos una hipoteca de 100.000€ a un 3% TAE a devolver durante 10 años. Vamos a amortizar 20.000€ en distintos momentos desde que se solicita el préstamo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Año de amortización parcial     Interes total&lt;br /&gt;    ==================================================&lt;br /&gt;    1                               12725€&lt;br /&gt;    2                               13053€&lt;br /&gt;    3                               13379€&lt;br /&gt;    4                               13701€&lt;br /&gt;    5                               14020€&lt;br /&gt;    6                               14339€&lt;br /&gt;    7                               14649€&lt;br /&gt;    8                               14960€&lt;br /&gt;    9                               15267€&lt;br /&gt;    nunca                           15872€&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;De la tabla anterior se deduce que cuanto antes amorticemos capital, mas barata nos resultará la hipoteca, puesto que nos beneficiaremos durante mas tiempo de la reducción de capital pendiente de devolución, y por tanto de la reducción de intereses pagados por ese capital pendiente que le debemos al banco.&lt;br /&gt;&lt;br /&gt;Obviamente, para poder amortizar hay que tener una alta capacidad de ahorro. Dicha capacidad de ahorro queda mermada por las distintas vinculaciones que nos exigen las entidades bancarias para poder ofrecer un buen diferencial con el índice de referencia (generalmente el euribor): planes de pensiones, fondos de inversión, seguros de hogar y de vida, etc. No soy un experto en la materia, pero según estos cálculos, yo aconsejaría huir de dichas vinculaciones como de la peste.&lt;br /&gt;&lt;br /&gt;Segundo, devolver al banco lo antes posible el dinero que nos ha prestado, para lo cual interesa que el plazo de amortización (n) sea lo menor posible. La siguiente tabla muestra el interés total pagado por una cantidad de 100.000€ solicitada al banco a un interés TAE dado, y devuelto durante los años indicados.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    TAE(%)          (10 años)       (20 años)       (30 años)       (40 años)&lt;br /&gt;    ===========================================================================&lt;br /&gt;    0.0%            0€              0€              0€              0€&lt;br /&gt;    1.0%            5124€           10374€          15790€          21365€&lt;br /&gt;    2.0%            10416€          21412€          33063€          45342€&lt;br /&gt;    3.0%            15852€          33103€          51777€          71807€&lt;br /&gt;    4.0%            21494€          45435€          71869€          100571€&lt;br /&gt;    5.0%            27278€          58389€          93255€          131398€&lt;br /&gt;    6.0%            33224€          71943€          115838€         164026€&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;En la tabla anterior se observa como, a un misma tasa de interés anual TAE, cuanto menos tiempo tardemos en devolver el dinero prestado, menos nos costará el total de la operación. Dicho de otro modo, cuanto mas años tardamos en devolver el dinero, mas pagamos. Que nadie se equivoque. No se trata de picos despreciables de pocos euros. Fijaros en la barbaridad de intereses que se le pagan al banco por 100.000€ a un 6% durante 40 años: 164026€, ¡¡solo en concepto de intereses!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusiones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La conclusión de todo esto: si os lo podéis permitir, no os hipotequéis. Cualquier otra opción es mejor: plantearos la opción de vivir de alquiler. No se está nada mal y disfrutareis mucho mas de vuestras vidas. Esperar que os toque alguna herencia o incluso comprar lotería y a ver si hay suerte.&lt;br /&gt;&lt;br /&gt;Mientras tanto, ahorrar todo el dinero que podáis, y si algún día decidís comprar, pagad el piso en metálico. Esa es la única opción que mínimamente garantiza el cumplimiento del Articulo 47 de la Constitución Española. Lo demás, es un error imperdonable. Un robo de guante blanco al amparo de la Ley.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-2116272179047479133?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/2116272179047479133/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=2116272179047479133' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2116272179047479133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2116272179047479133'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/10/hipotecas-para-todos.html' title='Hiputecado'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/TMMImBlkqxI/AAAAAAAAAKA/4iIcPJb00rU/s72-c/hipo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-9045086181538137820</id><published>2010-09-25T11:24:00.019+02:00</published><updated>2010-09-27T21:20:20.074+02:00</updated><title type='text'>Documentación técnica en el idioma de Cervantes</title><content type='html'>Los documentos técnicos cumplen el propósito de informar de lo que se ha hecho en una actividad determinada en términos técnicos y de forma que sea legible y comprensible dentro de su contexto. En la documentación técnica existen unos criterios determinados para su elaboración. En este articulo intentaremos mencionar los principales a tener en cuenta. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/TJ3DLadUQDI/AAAAAAAAAJ4/F7XKcOmdOFg/s1600/tech-writter.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 160px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/TJ3DLadUQDI/AAAAAAAAAJ4/F7XKcOmdOFg/s200/tech-writter.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5520783319074357298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lenguaje&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un documento técnico se escribe en lenguaje técnico. El lenguaje técnico evita la utilización de palabras con significados ambiguos. El lenguaje técnico es preciso en los significados, abunda en la aplicación de los términos técnicos propios del dominio sobre el que se habla, y estructura el contenido a base de frases cortas y directas. Esto último significa que el lenguaje técnico no utiliza recursos como tropos, metáforas ni otros elementos propios del lenguaje literario.&lt;br /&gt;&lt;br /&gt;El documento técnico debe mantener la corrección técnica del contenido y de la estructura con respecto a los objetivos y naturaleza del proyecto. La utilización de términos fuera del dominio técnico, de metodologías o técnicas no contrastadas, de resultados incoherentes, de afirmaciones o conclusiones no fundamentadas, etc., es síntoma inequívoco de incorrección técnica.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Gramática&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Las frases deben aplicar construcciones gramaticales regulares: en primer lugar, el sintagma nominal (sujeto y complementos). En segundo lugar, el sintagma verbal (verbo y complementos). También se suelen utilizar frases relativas que extienden el significado (-frase principal- que -frase relativa-).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sujeto&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El lenguaje técnico utiliza el sujeto impersonal o reflexivo, tal y como se está aplicando en el presente documento:&lt;br /&gt;&lt;pre&gt;    "se puede ver"&lt;br /&gt;    "se describe"&lt;/pre&gt;&lt;br /&gt;A veces, también se usa la primera persona del plural cuando el autor pretende implicarse con el lector en una actividad determinada que se está realizando en el momento presente&lt;br /&gt;&lt;pre&gt;    "vamos a poner el dispositivo en marcha"&lt;br /&gt;    "veamos el resultado"&lt;/pre&gt;&lt;br /&gt;Debemos huir de la aplicación de la primera persona del singular&lt;br /&gt;&lt;pre&gt;    "yo incluyo el informe"&lt;br /&gt;    "yo conecto el módulo"&lt;/pre&gt;&lt;br /&gt;Cuando se quiere enfatizar o recalcar información relativa al autor, se puede utilizar términos estereotipados como&lt;br /&gt;&lt;pre&gt;    "el autor"&lt;br /&gt;    "el que suscribe"&lt;/pre&gt;&lt;br /&gt;Y cuando se quiere mencionar la participación activa del lector, usaremos&lt;br /&gt;&lt;pre&gt;    "el usuario"&lt;br /&gt;    "el lector"&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Tiempos verbales&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hay que ser cuidadoso en el uso de los tiempos verbales de las frases y párrafos. No es correcto mezclar pretéritos, presentes y futuros en un mismo documento o sección del documento. En un documento o parte del mismo donde se describe una actividad o un conjunto de actividades ya realizadas y concluidas, se suele aplicar el pretérito perfecto:&lt;br /&gt;&lt;pre&gt;    "se ha procedido al cálculo del promedio"&lt;br /&gt;    "se han establecido los requisitos fundamentales"&lt;/pre&gt;&lt;br /&gt;A veces, también se puede combinar con el pretérito imperfecto cuando se refiere a acciones puntuales&lt;br /&gt;&lt;pre&gt;    "el programa dio un error"&lt;br /&gt;    "saltó la alarma en el momento en que"&lt;/pre&gt;&lt;br /&gt;Cuando se describe un procedimiento a realizar, normalmente se utiliza el presente de indicativo&lt;br /&gt;&lt;pre&gt;    "se abre el menú de edición"&lt;br /&gt;    "se selecciona la opción"&lt;/pre&gt;&lt;br /&gt;Cuando se describe el contenido que se incluye a continuación en una sección, subsección o apartado del documento, se puede utilizar el futuro imperfecto así,&lt;br /&gt;&lt;pre&gt;    "se mostrará el resultado del proyecto"&lt;br /&gt;    "se va a mostrar el resultado del proyecto"&lt;/pre&gt;&lt;br /&gt;Finalmente, para indicar acciones que el lector debe realizar, se aplica el imperativo&lt;br /&gt;&lt;pre&gt;    "véase la Figura"&lt;/pre&gt;&lt;br /&gt;o las siguientes construcciones&lt;br /&gt;&lt;pre&gt;    "hay que"&lt;br /&gt;    "se debe"&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Narración&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La narración o descripción debe ser fluida y fácil de leer, cuidando especialmente la corrección ortográfica y terminológica. Deben evitarse las frases rebuscadas, el uso del lenguaje coloquial, o la inserción no justificada de citas, tablas, figuras, etc. que no aporten nada al texto. El texto debe componerse a base de frases cortas separadas por puntos y seguidos. Su extensión debe adecuarse a los objetivos establecidos al comienzo del documento. Todos los elementos técnicos que deban ser citados o presentados exhaustivamente se deben poner en anexos al cuerpo del documento. Incluso se puede incluir una relación de abreviaturas, términos comunes o un glosario de términos técnicos para evitar confusiones semánticas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Inserciones de figuras y tablas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Debe adecuarse la cantidad de tablas y figuras al contenido del documento, evitando incluir demasiadas tablas y figuras que no aporten casi nada al texto. Es mejor alternar descripciones textuales con tablas y figuras. Salvo necesidades concretas, no es necesario explicar profusamente una figura o una tabla con texto suplementario.&lt;br /&gt;&lt;br /&gt;La inserción de referencias a figuras y tablas puede hacerse de dos formas distintas: conexa e inconexa. La forma de inserción inconexa consiste en utilizar la construcción&lt;br /&gt;&lt;pre&gt;    "(Véase la Figura 27)"&lt;/pre&gt;&lt;br /&gt;como una frase independiente entre paréntesis. La forma de inserción conexa consiste en utilizar un párrafo introductorio que establece una relación con el contenido y/o descripción de la figura o tabla:&lt;br /&gt;&lt;pre&gt;    "En la Figura 27 se puede apreciar que...",&lt;br /&gt;    "existe un indicador, tal como se muestra en la Figura 27..."&lt;/pre&gt;&lt;br /&gt;Por otra parte, los términos "Figura" y "Tabla" deben aparecer en el texto con la inicial en mayúscula.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bibliografía y referencias&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En muchos documentos técnicos habitualmente se incluye información que proviene de otro u otros documentos distintos. Es costumbre y por supuesto, ético, citar las fuentes externas que proporcionan dicha información.&lt;br /&gt;&lt;br /&gt;Internet provee de algunas herramientas como &lt;a href="http://www.dustball.com/cs/plagiarism.checker/"&gt;esta &lt;/a&gt; que permiten descubrir si el contenido de un documento ha sido plagiado. Por tanto, debemos referenciar a nuestras fuentes para evitar incurrir en el delito de plagio.&lt;br /&gt;&lt;br /&gt;Respecto a la bibliografía, en un documento técnico hay que distinguir por un lado la inserción de las referencias a las fuentes, y por otro lado, la relación detallada de dichas fuentes.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Inserción de las referencias a las fuentes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La inserción de referencias a una fuente de información externa, sea libro, articulo de investigación u otro tipo de obra, se hace mediante paréntesis siguiendo estas normas:&lt;br /&gt;&lt;br /&gt;Cuando la referencia tiene un solo autor, se incluye el primer apellido de éste y el año de publicación con todas las cifras:&lt;br /&gt;&lt;pre&gt;    (Tanembaum, 2001)&lt;/pre&gt;&lt;br /&gt;Cuando la referencia tiene más de un autor, la estructura es la misma salvo que, en lugar de poner todos los apellidos, se añade al apellido del primer autor la terminación "et al.":&lt;br /&gt;&lt;pre&gt;    (Harmelen et al., 2004)&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Relación de referencias&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La relación de referencias se hace en un capitulo o sección independiente del documento. Se recopilan todos los datos relativos a cada una de las fuentes, ordenadas alfabéticamente de menor a mayor por el apellido del primer autor.&lt;br /&gt;&lt;br /&gt;El formato con el que deben citarse las referencias bibliográficas depende de si la fuente es un libro, un capitulo de un libro, un articulo de revista, una obra no publicada, una dirección web, etc.. Se muestran algunos ejemplos a nivel orientativo:&lt;br /&gt;&lt;br /&gt;Referencia a un libro:&lt;br /&gt;&lt;pre&gt;    [Alonso, 2009]: Alonso J.A. Redes privadas virtuales. 1ª ed. Ra-ma,&lt;br /&gt;    Madrid, 2009.&lt;/pre&gt;&lt;br /&gt;Referencia a un artículo de investigación:&lt;br /&gt;&lt;pre&gt;    [Siebes, 2005]: Siebes R. pNear: combining content clustering and&lt;br /&gt;    distributed hash tables. Vrije Universiteit Amsterdam. The netherland,&lt;br /&gt;    2005.&lt;/pre&gt;&lt;br /&gt;Referencia a una URL:&lt;br /&gt;&lt;pre&gt;    [Castell, 2010]: Castell A.I. Documentación&lt;br /&gt;    técnica en el idioma de Cervantes.&lt;br /&gt;    http://aicastell.blogspot.com/2010/09/documentacion-tecnica-en-el-idioma-de.html.&lt;br /&gt;    Acceso el 25/09/2010.&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Estructura del documento&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El documento se divide en secciones, subsecciones y apartados. Salvo en contadas excepciones, no se recomienda llegar a un mayor nivel de división. En todos ellos, la unidad de redacción y de estilo es el párrafo, compuesto por un conjunto de frases. Al párrafo se le aplican una serie de características de formato y aspecto como son la separación de párrafos, interlineado, justificación entre margenes, tipo y tamaño de letra, etc.&lt;br /&gt;&lt;br /&gt;De forma muy genérica, podemos organizar la estructura de un documento técnico con los siguientes apartados:&lt;br /&gt;&lt;pre&gt;    Portada&lt;br /&gt;    Información visible sobre el titulo del documento y nombre del autor.&lt;br /&gt;&lt;br /&gt;    Resumen&lt;br /&gt;    Objetivos, descripción, resultados y conclusiones del trabajo resumidos&lt;br /&gt;    en no mas de 500 y no menos de 300 palabras.&lt;br /&gt;&lt;br /&gt;    Palabras clave&lt;br /&gt;    5 términos alusivos al contenido y propósitos del documento para poder&lt;br /&gt;    aplicar una indexación del mismo.&lt;br /&gt;&lt;br /&gt;    Indice&lt;br /&gt;    Relación de secciones y subsecciones, sin llegar a los apartados.&lt;br /&gt;&lt;br /&gt;    Introducción&lt;br /&gt;    Objetivos del documento, descripción del contexto general, planteamiento&lt;br /&gt;    del problema, descripción resumida del contenido del resto del documento.&lt;br /&gt;&lt;br /&gt;    Descripción&lt;br /&gt;    Descripción detallada de todo el trabajo realizado.&lt;br /&gt;&lt;br /&gt;    Resultados&lt;br /&gt;    Descripción de los resultados obtenidos en el trabajo realizado.&lt;br /&gt;&lt;br /&gt;    Conclusiones&lt;br /&gt;    Redacción de las conclusiones obtenidas, interpretación de los&lt;br /&gt;    resultados, de las afirmaciones fundamentadas y de las posibles&lt;br /&gt;    ampliaciones en sucesivos trabajos.&lt;br /&gt;&lt;br /&gt;    Bibliografía&lt;br /&gt;    Relación de referencias utilizadas durante la redacción del documento&lt;br /&gt;&lt;br /&gt;    Anexos&lt;br /&gt;    Inclusión de anexos con información complementaria sobre la que se&lt;br /&gt;    aporta en el cuerpo del documento. Esta sección es opcional.&lt;br /&gt;&lt;br /&gt;    Indice de tablas&lt;br /&gt;    Relación de las tablas contenidas en el documento.&lt;br /&gt;&lt;br /&gt;    Indice de figuras&lt;br /&gt;    Relación de las figuras contenidas en el documento.&lt;br /&gt;&lt;br /&gt;    Terminología&lt;br /&gt;    Relación de términos y abreviaciones utilizados en el documento con una&lt;br /&gt;    breve explicación de su significado para evitar confusiones al lector.&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Herramientas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por último, en la elaboración de toda la documentación se debe contar por supuesto con el apoyo de herramientas informáticas del estilo de Open Office o LaTeX. La persona encargada de llevar a cabo la documentación técnica debe tener los conocimientos suficientes de estos programas para obtener el debido provecho.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-9045086181538137820?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/9045086181538137820/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=9045086181538137820' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/9045086181538137820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/9045086181538137820'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/09/documentacion-tecnica-en-el-idioma-de.html' title='Documentación técnica en el idioma de Cervantes'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/TJ3DLadUQDI/AAAAAAAAAJ4/F7XKcOmdOFg/s72-c/tech-writter.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3911526715741058924</id><published>2010-08-12T15:53:00.055+02:00</published><updated>2010-11-27T10:47:33.689+01:00</updated><title type='text'>Exigiendo la devolución del impuesto Windows</title><content type='html'>Mi viejo portatil ACER ASPIRE comprado hace algo mas de 6 años durante mi instancia en Bilbao murió el pasado 29 de Julio de 2010 de un calentón. Descanse en paz. Lo usaba como servidor y lo tenía horas y horas funcionando sin parar. No sé como aguantó tanto tiempo a mas de 65ºC de continuo. La reparación no es excesivamente cara, pero si puede tardar algunos meses, ya que se fundió la tarjeta grafica NVIDIA y según me comenta el fabricante, es una tarjeta integrada en la placa y será dificil encontrar otra de recambio exactamente igual. Y ya veremos si finalmente la encuentran.&lt;br /&gt;&lt;br /&gt;Sin portatil no se puede vivir (la gente antiguamente no sé como lo hacían :-) asi que tuve que buscar un sustituto de urgencia. Tras un día de lo mas movidito en el que recorrí los centros comerciales "de mitja Catalunya", finalmente compré un &lt;a href="http://busqueda.dell.es/1/1/90991-azul-hielo-dell-inspiron-15-ordenador-portatil.html"&gt;DELL INSPIRON&lt;/a&gt; de lo mas básico en el Carrefour del centro comercial La Maquinista, en Barcelona, que será mi compañero de viaje los próximos años. Equipado con un Intel Core i3 con 4GB de RAM y 500GB de HD con una ATI Radeon muy sencilla, 3 puertos USB y salidas de video VGA y HDMI. Todo por 616€, iva incl. Es curioso que el propio fabricante lo venda en su página web mas caro de lo que a mi me costó en Carrefour.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://devolucion.org"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 126px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/TGQJmycLEyI/AAAAAAAAAJo/0QDJxIX6ZR8/s200/precio_pc1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5504535206533206818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por mucho que Mr. Gates y sus amiguitos ricos hayan decidido donar la mitad de sus fortunas a quien sabe que causa, yo ya esto jarto de pagar licencias a Microsoft que nunca he utilizado ni usaré, así que me he decidido a reclamar lo que para mi es un derecho lícito: solicitar la devolución del impuesto Microsoft. &lt;br /&gt;&lt;br /&gt;Contactados fabricante y establecimiento telefónicamente, ambos dos me negaron la devolución. Así que solicité la hoja de reclamaciones a Carrefour y les puse una reclamación por escrito que ayer mismo presenté en la Oficina Municipal de Información al Consumidor, OMIC, de Terrassa. Os reproduzco la reclamación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"Adquirido un portátil de la marca Dell el día 31/07/10 en el establecimiento Carrefour del&lt;br /&gt;centro comercial la Maquinista (Barcelona),&lt;br /&gt;&lt;br /&gt;rechazo usar el sistema operativo privativo Microsoft Windows que viene preinstalado en el &lt;br /&gt;equipo, al no ofrecer el establecimiento Carrefour ni el fabricante Dell ninguna alternativa para &lt;br /&gt;comprar ni ese (ni otro portátil) instalado sin ese software.&lt;br /&gt;&lt;br /&gt;Siguiendo las indicaciones mencionadas en el acuerdo de Licencia del Software de Dell, no he &lt;br /&gt;aceptado las condiciones de dicha licencia, he desinstalado todo el software preinstalado en el &lt;br /&gt;equipo, reinstalandolo con un sistema operativo libre (Ubuntu Linux), y me he puesto en contacto &lt;br /&gt;telefónico con el fabricante y con el establecimiento para proceder a la devolución del software&lt;br /&gt;distribuido con el equipo y al reembolso de la cantidad abonada por ese software que ya queda &lt;br /&gt;demostrado que no voy a usar.&lt;br /&gt;&lt;br /&gt;Fabricante y establecimiento se niegan a reembolsar la cantidad abonada por dicho software, &lt;br /&gt;alegando que el equipo se vende como un pack indivisible. Esto incumple los términos de la &lt;br /&gt;Licencia de Software de Dell que se distribuye con la compra del portátil (ver el documento &lt;br /&gt;adjunto), que otorgan al cliente la posibilidad de rechazar el software preinstalado.&lt;br /&gt;&lt;br /&gt;Además, el establecimiento Carrefour me comunica en el momento de presentar esta reclamación, que &lt;br /&gt;al desinstalar el software, como consta que ya he hecho, pierdo la garantía del producto &lt;br /&gt;adquirido, desentendiéndose del producto en caso de presentar algún defecto de fabricación en los &lt;br /&gt;próximos meses, dejándome en una situación bastante injusta, alegando una clausula que yo no&lt;br /&gt;he visto escrita en ningún documento.&lt;br /&gt;&lt;br /&gt;Soy ingeniero de software, y me gano la vida profesionalmente desarrollando software para el &lt;br /&gt;sistema operativo Linux. Ni fabricante ni comercio me han dado alternativa alguna para elegir, y &lt;br /&gt;me están obligando en contra de mi voluntad (y de mis necesidades profesionales) a usar/abonar un &lt;br /&gt;producto que no necesito, privándome de la libertad para elegir libremente el software que deseo&lt;br /&gt;ejecutar en el portátil adquirido.&lt;br /&gt;&lt;br /&gt;En otros países de la Unión Europea como es el caso de &lt;a href="http://devolucion.org/forum/t-128130/en-italia-es-obligatorio-devolver-el-impuesto-windows-ya-crearon-jurisprudencia"&gt;Italia&lt;/a&gt; (todavía no en España) se ha creado &lt;br /&gt;legislación especifica en esta materia para exigir a los fabricantes que devuelvan el importe de &lt;br /&gt;las licencias a los clientes que rechacen sus términos y soliciten la devolución. Es indignante &lt;br /&gt;que los consumidores españoles tengamos que estar discriminados en este sentido, y ante la &lt;br /&gt;arrogancia y el abuso de poder de los fabricantes, tengamos que mostrar una total y absoluta &lt;br /&gt;sumisión por falta de leyes que defiendan nuestros intereses como consumidores, intereses que &lt;br /&gt;considero son de interés general.&lt;br /&gt;&lt;br /&gt;Y para que conste la indignación y el rechazo a esta situación de monopolio tan desfavorable para &lt;br /&gt;los intereses de los consumidores, interpongo esta reclamación ante el organismo competente."&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No tengo mucha esperanza de lograrlo. Los españoles somos por naturaleza demasiado conformistas y mientras no lleguen quejas de este tipo a la administración pública en masa, no creo que cambien mucho las cosas. Pero me sentía en la obligación moral de intentarlo. Y así lo he hecho.&lt;br /&gt;&lt;br /&gt;Os seguiré informando a medida que avancen los trámites. Mientras tanto, seguiré disfrutando de éste fantástico portatil reinstalado con X-Ubuntu con el que acabo de escribir mi primer post. Esto va como un tiro! :-)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 09/09/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hoy por fin he recibido noticias de este asunto. Y mal pintan las cosas desde buen comienzo. Aunque sinceramente, tampoco esperaba lo contrario. La junta arbitral de consumo de Terrassa me ha enviado este correo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Bon dia,&lt;br /&gt; &lt;br /&gt;Per tal de donar tràmit a la seva reclamació caldrà que ens ompli i reenvïi el formulari &lt;br /&gt;adjunt de sol.licitud d'arbitratge, ja que proposarem a l'empresa reclamada resoldre el &lt;br /&gt;conflicte a travès de la mediació o l'arbitratge de consum.&lt;br /&gt;&lt;br /&gt;En tractar-se d'uns procediments de voluntària acceptació per part de l'empresa, si no vol &lt;br /&gt;acceptar aquestes vies s'haurà d'arxivar la vostra sol.licitud, fet del qual en seríeu &lt;br /&gt;informat.&lt;br /&gt; &lt;br /&gt;Atentament,&lt;br /&gt; &lt;br /&gt;Ajuntament de Terrassa&lt;br /&gt;Junta Arbitral de Consum de Terrassa&lt;br /&gt;Àrea d'Acció Social i Drets Civils&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta tarde les he hecho llegar la documentación. Aunque queda clarito en el segundo párrafo del mail lo que presumiblemente va a ocurrir: la empresa Carrefour no consta en el censo de empresas adheridas al sistema arbitral de consumo de Barcelona, que por lo visto es, ojito señores, de ¡CARACTER VOLUNTARIO!. Por tanto si la empresa rechaza el arbitraje (ya lo doy por hecho), la única alternativa posible es la vía judicial (abogado, costes judiciales, etc.). Una barrera económica dificil de franquear (sobre todo para el sufrido consumidor) que vé con resignación como sus reclamaciones terminan en la fábrica de reciclado convertidas en papel de WC. &lt;br /&gt;&lt;br /&gt;Y ahora, que alguien modifique la definición de la palabra "justicia" de la &lt;a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=justicia"&gt;RAE&lt;/a&gt; por favor, porque obviamente tiene varios bugs! &lt;br /&gt;&lt;br /&gt;Vamos a esperar antes de adelantar acontecimientos... Os seguiré informando cuando tenga mas noticias.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 13/09/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Me solicitan entregar copias por triplicado de toda la documentación que ya entregué en el OMIC en el momento de presentar la reclamación. Esta claro que mi tiempo no vale nada para esta gente. Mañana tendré que ir a hacer las fotocopias y el Miercoles a entregarles "de nuevo" la documentación. ¡Si es que no tengo nada mejor que hacer!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 17/10/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Recibo la notificación de la admisión a trámite de la reclamación:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"Us notifico que en data 21 de setembre de 2010, el president de la Junta Arbitral de&lt;br /&gt;Consum de terrassa ha resolt admetre a tràmit la reclamació que vàreu presentar contra &lt;br /&gt;l'empresa CARREFOUR LA MAQUINISTA a l'empara del Reial Decret 231/08 del 15 de febrer, que &lt;br /&gt;va entrar en vigor el 25 d'agost de 2008, pel qual es regula el sistema arbitral de consum.&lt;br /&gt;&lt;br /&gt;En aquest sentit s'ha proposat a l'empresa de resoldre el conflicte a través de la mediació &lt;br /&gt;o l'arbitratge de consum. En tractar-se d'uns procediments de voluntària acceptació per part &lt;br /&gt;de l'empresa, si no vol acceptar aquestes vies s'haurà d'arxivar la vostra sol.licitut, fet &lt;br /&gt;del qual en seríeu informat.&lt;br /&gt;&lt;br /&gt;La secretaria de la Junta."&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 21/10/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Respuesta de Carrefour la Maquinista a la solicitud de arbitraje voluntario solicitada por el OMIC de Terrassa. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"Muy sres. mios:&lt;br /&gt;&lt;br /&gt;En relación a la reclamación de Angel Ivan Castell Rovira  que se nos ha notificado, le &lt;br /&gt;comunicamos que no podemos someternos al arbitraje propuesto, por las razones que &lt;br /&gt;argumentamos a continuación.&lt;br /&gt;&lt;br /&gt;Cuando el cliente realizó la compra del portátil se le informó y como él mismo pudo &lt;br /&gt;comprobar que todos los ordenadores portátiles y de sobremesa se venden con licencia. Por lo &lt;br /&gt;tanto, si él no deseaba adquirir un portátil con licencia Windows, no debería haberlo &lt;br /&gt;adquirido debido a que en todo momento era consciente de las características del artículo.&lt;br /&gt;&lt;br /&gt;Esperando que estas alegaciones sean suficientes para mantenerles informados de la &lt;br /&gt;situación, nos mantendremos a su disposición para cualquier duda o consulta.&lt;br /&gt;&lt;br /&gt;Atentamente,&lt;br /&gt;&lt;br /&gt;Andrés Carrasco Piernas.&lt;br /&gt;Responsable de Atención al Cliente&lt;br /&gt;Carrefour la Maquinista."&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Recibo esta resolución el 22/11/2010 (si si, un mes mas tarde). &lt;br /&gt;&lt;br /&gt;Fijaros en los motivos argumentados por Carrefour: EL VENDEDOR INFORMA AL COMPRADOR DE LAS CARACTERÍSTICAS DEL PRODUCTO ADQUIRIDO, MOTIVO POR EL CUAL EL VENDEDOR ADQUIERE EL DERECHO DE INCUMPLIR EL ACUERDO DE LICENCIA DEL SOFTWARE QUE ACOMPAÑA A DICHO PRODUCTO. &lt;br /&gt;&lt;br /&gt;Dicho de otra forma: EL COMPRADOR, EN EL MOMENTO EN QUE ES INFORMADO, PIERDE EL DERECHO DE RECLAMAR LOS TÉRMINOS DE UNA LICENCIA ¡¡QUE ESTA PAGANDO!!.&lt;br /&gt;&lt;br /&gt;Obviamente, esto no puede ser legal. Si tan seguros están de su afirmación, ¿por que no aceptaron el  arbitraje voluntario? Si los vendedores incumplen las licencias con las que venden sus propios productos, ¿que sentido tienen esas licencias?. ¿A caso los legitiman a nosotros como compradores, también para incumplirlas? Microsoft debería darle las gracias a Carrefour, porque de ser así, esto podría acabar con su negocio millonario...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 22/11/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Recibo la notificación de archivo por no aceptación, sellada en fecha 26/10/2010 (ojo con las fechas, porque o correos va muy lento o en la OMIC de Terrassa tienen mucho trabajo acumulado...).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;"En relació a la sol.licitud d'arbitratge referenciada presentada per vostès contra &lt;br /&gt;l'empresa CARREFOUR LA MAQUINISTA, no ha estat acceptat l'arbitrarge per part de l'empresa &lt;br /&gt;esmentada i, el president de la Junta Arbitral de Consum de Terrassa, ha ordenat l'arxiu de &lt;br /&gt;les actuacions, deixant oberta la via judicial a la qual vostè pot recórrer en defensa dels &lt;br /&gt;seus drets.&lt;br /&gt;&lt;br /&gt;La secretària."&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Actualización del 27/11/2010&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Han pasado mas de 3 meses desde que inicié los trámites de esta reclamación. Desde buen comienzo tenía claro como iba a terminar todo este asunto. Confiaba poco en la justicia de este país, y lamentablemente, así continuará siendo. No voy a iniciar un procedimiento legal porque un juicio vale mucho dinero y la probabilidad de perderlo y ser condenado a pagar las costas judiciales es exagerada. Mi economía no puede permitírselo. Parece que hoy en día es improbable que David pueda vencer a Goliat...&lt;br /&gt;&lt;br /&gt;Millones de euros que pagamos rigurosamente todos los consumidores destinados a una empresa norte-americana privada, sospechosamente promocionada por demasiados gobiernos europeos. Debemos luchar activamente por nuestros derechos, y contra este soberbio monopolio. Si todos lo intentamos, es probable que algún día tengamos la posibilidad de comprar computadoras libres de software privativo, bastante mas económicas, al eliminar los costes de una licencia de software que exige muchas obligaciones legales al comprador, a cambio de unos "teóricos derechos" que ya hemos visto como fabricantes y distribuidores eliminan en la práctica a su antojo y con total impunidad legal.&lt;br /&gt;&lt;br /&gt;He perdido muchas horas de mi tiempo libre para mover todos los papeles exigidos para esta reclamación. Descartada la vía legal por los motivos expuestos, no descarto mover este asunto por portales en Internet de interés general para intentar concienciar a la gente que deben reclamar lo que es suyo. Animo también a los lectores a difundir esta información. Mi mas sincero agradecimiento para todos los que colaboréis con la causa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3911526715741058924?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3911526715741058924/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3911526715741058924' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3911526715741058924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3911526715741058924'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/08/exigiendo-la-devolucion-del-impuesto.html' title='Exigiendo la devolución del impuesto Windows'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/TGQJmycLEyI/AAAAAAAAAJo/0QDJxIX6ZR8/s72-c/precio_pc1.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5776337662891168456</id><published>2010-07-07T19:35:00.044+02:00</published><updated>2010-07-10T13:49:56.192+02:00</updated><title type='text'>¿Cuanto mas podremos apretarnos el cinturon?</title><content type='html'>Tomemos el sueldo medio de un empleado español, unos 21.500€ en bruto al año segun diversas fuentes en Internet.&lt;br /&gt;&lt;br /&gt;¿Alguien se ha planteado alguna vez, despues de pagar impuestos, hipotecas, seguridad social, multas, etc. cuanto queda de ese dinero en nuestros bolsillos? Hacemos un estudio con datos medios para sacar a flote ese dato:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;=== Retenciones de la seguridad social ===&lt;br /&gt;    (28%) ... sueldo medio 21500€   ------------------------------------&gt; 6020€&lt;br /&gt;&lt;br /&gt;=== Impuestos por iva ===&lt;br /&gt;    == de gastos imprescindibles ==&lt;br /&gt;    8%  Comida y productos limpieza y aseo personal ... 3600€/año ------&gt; 288€ iva&lt;br /&gt;    18% Calzado, ropa ... 500€/año -------------------------------------&gt; 90€ iva&lt;br /&gt;    18% Telefono fijo + internet ... 300€/año --------------------------&gt; 54€ iva&lt;br /&gt;    18% Telefono movil ... 180€/año ------------------------------------&gt; 32€ iva&lt;br /&gt;    18% Facturas luz ... 400€/año --------------------------------------&gt; 72€ iva&lt;br /&gt;    18% Gasolina ... 500€/año ------------------------------------------&gt; 90€ iva&lt;br /&gt;    18% Reparaciones en el hogar ... 300€/año --------------------------&gt; 54€ iva&lt;br /&gt;    18% Reparaciones y mantenimiento del coche ... 500€/año ------------&gt; 90€ iva&lt;br /&gt;&lt;br /&gt;    == de vicios (quien los tenga) ==&lt;br /&gt;    18% Tabaco ... 400€/año --------------------------------------------&gt; 72€ iva&lt;br /&gt;    18% Alcohol ... 400€/año  ------------------------------------------&gt; 72€ iva&lt;br /&gt;&lt;br /&gt;    === de gastos prescindibles ==&lt;br /&gt;    8%  Comidas y cenas fuera de casa ... 500€/año ---------------------&gt; 40€ iva&lt;br /&gt;    18% Regalos de cumpleaños, navidad, juguetes... 400€/año -----------&gt; 72€ iva&lt;br /&gt;&lt;br /&gt;=== Gastos forzados por la administración publica ===&lt;br /&gt;    Multas de trafico ... 200€/año -------------------------------------&gt; 200€&lt;br /&gt;    Seguro obligatorio coche ... 300€/año ------------------------------&gt; 300€&lt;br /&gt;    ITV coche ... 40€/año ----------------------------------------------&gt; 40€&lt;br /&gt;    Permiso circulacion coche ... 150€/año -----------------------------&gt; 150€&lt;br /&gt;&lt;br /&gt;=== Intereses derivados a la entidad bancaria ===&lt;br /&gt;    ...Hipoteca (150.000€ a 35 años) ... 7440€/año, intereses incl. ----&gt; 3430€ interes&lt;/pre&gt;&lt;br /&gt;Para que no queden dudas, los 3430 € de intereses anuales se han calculado tomando una hipoteca media de 150.000€ a 35 años, a un tipo de interes medio del 3.5% (aunque ahora esten mas bajos, no olvidemos que los intereses oscilan en el tiempo y hace no mucho estaban por encima del 5%).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    ((cuota_anual * 35 años) - credito_solicitado) / 35 años =&lt;br /&gt;    ((7440 * 35 años) - 150000) / 35 años = 3154€&lt;/pre&gt;&lt;br /&gt;En resumidas cuentas, nos retienen 6020€ euros al años en la seguridad social, nos cobran un total de 1026€/año en concepto de iva, pagamos unos 690€/año por gastos forzados por la administración publica, y 3154€ al año en concepto de intereses al banco. ¿Con que se queda un español medio para hacer sus compras?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    21500 - 6020 - 1026 - 690 - 3154 = 10610€ / año&lt;br /&gt;    10610 / 12 = 884€/mes&lt;/pre&gt;&lt;br /&gt;Nos quedan 884€/mes netos, exentos de impuestos, para gastar en lo que nos de la gana. Una pasta gansa, ¿no? Dá para irnos al Caribe en busca de "Curro"... eso y poco mas.&lt;br /&gt;&lt;br /&gt;Si todavia no te has dado cuenta del dato, te sugiero que reflexiones al respecto. Con esos escasos 900€ debes pagar TODOS los gastos del mes.&lt;br /&gt;&lt;br /&gt;Veamoslo desde otro punto de vista: sumemos los gastos anuales medios de comida, hipoteca, facturas, deducciones, multas, etc, segun la tabla anterior, y los restaremos del sueldo bruto anual para ver cuanto dinero nos queda al año en los bolsillos. Yo os hago el cálculo para ahorraros el trabajo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    21500 - 6020 - 3600 - 500 - 300 - 180 - 400 - 500&lt;br /&gt;    - 300 - 500 - 400 - 400 - 500 - 400 - 200&lt;br /&gt;    - 300 - 40 - 150 - 7440 = -630€&lt;/pre&gt;&lt;br /&gt;Atencion señores. El asalariado medio español se queda con un saldo neto anual total negativo de -630€/año. Dicho de otra manera: despues de trabajar durante un año enterito, el español medio todavía le debe 630€ al panadero, al butanero, al mecanico del coche, al banco, o a quien os de la gana. Lo que es seguro es que si no hay mas dinero, alguien se quedará sin cobrar esa deuda. Y si la situación se prolonga en el tiempo, con toda probabilidad, el banco embargue todos sus bienes presentes y futuros, con ello toda esperanza de una vida digna. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/TDS7hP5N77I/AAAAAAAAAJY/_SGDAHOYWq0/s1600/Apretar_Cinturon.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 190px; height: 200px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/TDS7hP5N77I/AAAAAAAAAJY/_SGDAHOYWq0/s200/Apretar_Cinturon.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5491220025548074930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quizas algunos os planteeis que no fumais, que no bebeis o que no gastais tanto en comida, por poner algunos ejemplos. Pero tener en cuenta que la tabla anterior es una tabla orientativa, muy resumida, que no considera muchos otros gastos en viajes, electrónica, electrodomesticos, cines, conciertos, transporte público, peajes, basura, agua, comunidad de vecinos, IBI, comisiones de los bancos, etc. etc.etc. Os animo a completarla con vuestros ingresos/gastos y que saqueis vuestras propias conclusiones.&lt;br /&gt;&lt;br /&gt;Señores politicos de este pais: reflexionen, y háganlo pronto porque el tiempo se está acabando. Esto no es un problema de confianza, es un problema real y muy serio. El español medio lo esta pasando mal, y lo va a pasar peor si las cosas siguen por este camino. No deberían quedar impunes aquellos que iniciaron esta crisis, no es de justicia que sus errores se solventen con dinero público, ni mantener los privilegios de las sicav que tributan a un 1%, mientras se sigue apretando el cinturón de la clase media subiendo impuestos, bajando salarios de los funcionarios, abaratando despidos, incrementando la edad de jubilación, reduciendo el dinero en I+D+i, y lo que quede por venir, que vendrá.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://es.wikipedia.org/wiki/Santiago_Ni%C3%B1o_Becerra"&gt;Santiago Niñó Becerra&lt;/a&gt;, catedrático de 'Estructura Económica' en la Universidad Ramón Llull de Barcelona, habla de lo que está por venir en su libro "&lt;a href="http://www.loslibrosdellince.com/libros.php?q=46"&gt;El crash del 2010&lt;/a&gt;", cuya lectura os recomiendo para que a nadie le pille por sorpresa las dimensiones de la mas que probable &lt;a href="http://www.cotizalia.com/en-exclusiva/santiago-nino-becerra-deuda-espana-crisis-20100120.html"&gt;crisis que se avecina&lt;/a&gt;. Si a alguien le interesa su lectura, que contacte conmigo.&lt;br /&gt;&lt;br /&gt;Cuando el sistema colapse, veremos como reacciona la gente para cubrir sus necesidades mas básicas de supervivencia. Veremos entonces quien le pone remedio a esto. Mientras tanto, sigamos confiando en que España gane el Mundial de Sudáfrica para que se solucionen todos los problemas de este país. Después, ya veremos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5776337662891168456?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5776337662891168456/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5776337662891168456' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5776337662891168456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5776337662891168456'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/07/cuanto-mas-podremos-apretarnos-el.html' title='¿Cuanto mas podremos apretarnos el cinturon?'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/TDS7hP5N77I/AAAAAAAAAJY/_SGDAHOYWq0/s72-c/Apretar_Cinturon.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5919648604993245939</id><published>2010-07-05T23:08:00.017+02:00</published><updated>2010-07-05T23:58:59.972+02:00</updated><title type='text'>Howto instalar XUbuntu en el Acer Aspire One</title><content type='html'>Mi novia compró recientemente un "Acer Aspire One" en Media Market por 250€. El equipo viene equipado con un hardware muy apetecible: un micro Intel Atom N450 a 1.66GHz con 1GB de memoria y 160GB de HDD, con pantalla LED LCD de 10.1', WiFi, Ethernet, 3 conectores USB, salida VGA y entrada/salida de audio. Una maquina muy accesible y con potencial y capacidad de almacenamiento mas que suficiente para las necesidades de una peluquera.&lt;br /&gt;&lt;br /&gt;Algunos amigos me recomendaron no comprar Acer por la mala fama que se ganaron hace algun tiempo, pero visto el titular de esta &lt;a href="http://diarioti.com/gate/n.php?id=26905"&gt;noticia&lt;/a&gt;, hoy en dia no sabes bien de que fabricante te puedes fiar mas, y Acer tenía la mejor relación calidad/precio, así que nos arriesgamos con el Aspire One.&lt;br /&gt;&lt;br /&gt;Convertido en sysadmin de facto de su portatil desde el mismo momento en el que pasó por caja, ya la adverti que si tenia problemas, Windows y yo no teníamos una relación precisamente buena, y tendríamos que operar de urgencias al enfermo en el quirófano.&lt;br /&gt;&lt;br /&gt;Los problemas llegaron el primer día que puso en marcha su bonito portatil... "Es que intento ver un video y me sale una pantalla que no se que es pero el video no se ve. Ademas, intento conectar a Internet y no va. Y abro el Word y me pide un número de licencia. Y me sale un antivirus que no para de recordarme que debo actualizalo. ¿Que hago? (...)".&lt;br /&gt;&lt;br /&gt;Y con esta frase empezó un fin de semana (de puente aqui en Terrassa), de lo mas friki, con la intención de instalar en el Acer una XUbuntu 10.04, y ya que me toca ser sysadmin al estilo "pringao's howto", al menos ser un sysadmin feliz.&lt;br /&gt;&lt;br /&gt;Y despues de contaros todo este rollo, llegamos a la parte práctica y mas interesante.&lt;br /&gt;&lt;br /&gt;El objetivo se resume en instalar una distribucion de Linux en un portatil que no tiene lector de CD-ROM. Tampoco usaremos ninguna unidad de CD-ROM externa, pues son caras y tenemos alternativas mucho mas económicas como veremos:&lt;br /&gt;&lt;br /&gt;Para ello necesitamos el portatil, una memoria USB de al menos 1GB, un sistema operativo Linux en ejecución y una ISO de Ubuntu. En mi caso, he instalado una XUbuntu 10.04 (xubuntu-10.04-desktop-i386.iso), ya que necesita pocos requisitos de RAM y el portatil no anda sobrado en este sentido. Aunque el post es generalizable a cualquier distribución que os de la gana, bastaría con ajustar mínimamente el fichero sysconfig.cfg (creado mas abajo).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/TDJMrRlkujI/AAAAAAAAAJI/63eUub0_gTo/s1600/IMAG0036.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/TDJMrRlkujI/AAAAAAAAAJI/63eUub0_gTo/s200/IMAG0036.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490535202057140786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Existen algunos USB en el mercado que a pesar de tener un MBR incorrecto, se pueden usar sin ningun problema para almacenar datos, pero esos USB no se pueden usar como unidades autoarrancables. El error se corrige de forma sencilla haciendo esto:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ sudo apt-get install mbr&lt;br /&gt;    $ sudo dd if=/dev/zero of=/dev/sdb&lt;br /&gt;    (... este comando puede tardar bastante dependiendo de la capacidad, paciencia ...)&lt;br /&gt;    $ sudo install-mbr --force /dev/sdb&lt;/pre&gt;&lt;br /&gt;siendo /dev/sdb el dispositivo con el que el kernel ha reconocido el USB pendrive. Dependiendo de cada equipo, este dato puede cambiar. WARNING: ¡Mucho cuidadin! Este comando es altamente destructivo si no se indica el fichero dispositivo correcto. ¡Tomaros vuestro tiempo en aseguraros que lo poneis bien!&lt;br /&gt;&lt;br /&gt;A continuación hay que crear una partición en la memoria USB tipo FAT16, la haremos de 750M para que quede claro que vamos a meter dentro una ISO de un CD, y para ello haremos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ sudo fdisk /dev/sdb&lt;br /&gt;&lt;br /&gt;    Orden (m para obtener ayuda): n&lt;br /&gt;    Acción de la orden&lt;br /&gt;    e   Partición extendida&lt;br /&gt;        p   Partición primaria (1-4)&lt;br /&gt;    p&lt;br /&gt;    Número de partición (1-4): 1&lt;br /&gt;    Primer cilindro (1-1021, valor predeterminado 1):&lt;br /&gt;    Se está utilizando el valor predeterminado 1&lt;br /&gt;    Last cilindro, +cilindros or +size{K,M,G} (1-1021, valor predeterminado 1021): +750M&lt;br /&gt;&lt;br /&gt;    Orden (m para obtener ayuda): a&lt;br /&gt;    Número de partición (1-4): 1&lt;br /&gt;&lt;br /&gt;    Orden (m para obtener ayuda): t&lt;br /&gt;    Se ha seleccionado la partición 1&lt;br /&gt;    Código hexadecimal (escriba L para ver los códigos): 6&lt;br /&gt;    Se ha cambiado el tipo de sistema de la partición 1 por 6 (FAT16)&lt;br /&gt;&lt;br /&gt;    Orden (m para obtener ayuda): p&lt;br /&gt;&lt;br /&gt;    Disco /dev/sdb: 8011 MB, 8011120640 bytes&lt;br /&gt;    247 cabezas, 62 sectores/pista, 1021 cilindros&lt;br /&gt;    Unidades = cilindros de 15314 * 512 = 7840768 bytes&lt;br /&gt;    Identificador de disco: 0x00000000&lt;br /&gt;&lt;br /&gt;    Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema&lt;br /&gt;    /dev/sdb1   *           1         101      773326    6  FAT16&lt;br /&gt;&lt;br /&gt;    Orden (m para obtener ayuda): w&lt;br /&gt;    ¡Se ha modificado la tabla de particiones!&lt;br /&gt;&lt;br /&gt;    Llamando a ioctl() para volver a leer la tabla de particiones.&lt;br /&gt;&lt;br /&gt;    Se están sincronizando los discos.&lt;/pre&gt;&lt;br /&gt;A continuación se formatea la partición con un sistema de ficheros FAT16, y le vamos a poner la etiqueta de volumen "liveusb". Es necesario usar FAT16 para que syslinux funcione bien.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ sudo mkfs.vfat -F 16 -n liveusb /dev/sdb1&lt;/pre&gt;&lt;br /&gt;El pendrive USB esta listo para almacenar la imagen del liveCD de XUbuntu. Montamos la ISO del liveCD y el USB pendrive:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ mkdir -p /media/iso&lt;br /&gt;    $ sudo mount -o loop xubuntu-10.04-desktop-i386.iso /media/iso&lt;br /&gt;    $ mkdir -p /media/usb&lt;br /&gt;    $ sudo mount /dev/sdb1 /media/usb&lt;/pre&gt;&lt;br /&gt;Copiamos de la ISO al USB los siguientes directorios como indican estos comandos:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ cd /media/iso&lt;br /&gt;    $ sudo cp -aR casper disctree dists install pool preseed .disk /media/usb/&lt;/pre&gt;&lt;br /&gt;Editamos el fichero de configuración de syslinux, syslinux.cfg, para que contenga esta información:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ cat /media/usb/syslinux.cfg&lt;br /&gt;    DEFAULT /casper/vmlinuz&lt;br /&gt;    APPEND  file=preseed/kubuntu.seed boot=casper initrd=/casper/initrd.lz ramdisk_size=1048576 root=/dev/ram0 rw quiet splash --&lt;/pre&gt;&lt;br /&gt;Por último, hacemos bootable el USB pendrive, para ello usaremos syslinux como gestor de arranque:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    $ sudo apt-get install syslinux mtools&lt;br /&gt;    $ cd&lt;br /&gt;    $ sudo umount /media/usb&lt;br /&gt;    $ syslinux -sf /dev/sdb1&lt;/pre&gt;&lt;br /&gt;Con esto ya disponemos de un pendrive que podemos usar para instalar Linux en cualquier portatil sin unidad de CD-ROM. En el caso particular que nos ocupa, hay que entrar en la BIOS del Acer Aspire One, (tecla F2) y modificar la secuencia de BootOrder para que el portatil arranque "USB HDD" antes que el "IDE0 : WDC WD1600BEVT - 22A23T0", lo que se consigue jugando con las feclas F6 (up) y F5 (down).&lt;br /&gt;&lt;br /&gt;A partir de aqui solo queda seguir los pasos de la instalación de la XUbuntu que se presumen "jarto complicados", solo al alcance de una profesional de la estética y la peluqueria con algun mes de experiencia usando el MS Word.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/TDJPIkngnUI/AAAAAAAAAJQ/slGmgqiRYyQ/s1600/IMAG0037.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/TDJPIkngnUI/AAAAAAAAAJQ/slGmgqiRYyQ/s200/IMAG0037.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5490537904404995394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Después del trabajo realizado me tome la libertad de quitarle al Acer la diabolica chapita con la que salen todos los PC's del mundo de las tiendas, "Designed for Windows XP" para quedarmela como trofeo y pegarsela a la labadora de mi casa para flipar de labadora tunning... Microsoft controlando los labados de mi ropa... ¡Aarrgghh! ¡Esto si que es para ponerse a temblar! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5919648604993245939?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5919648604993245939/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5919648604993245939' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5919648604993245939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5919648604993245939'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/07/howto-instalar-xubuntu-en-el-acer.html' title='Howto instalar XUbuntu en el Acer Aspire One'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/TDJMrRlkujI/AAAAAAAAAJI/63eUub0_gTo/s72-c/IMAG0036.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3439958601482209242</id><published>2010-01-30T10:25:00.040+01:00</published><updated>2010-01-31T10:26:22.714+01:00</updated><title type='text'>Richard Stallman: de ingeniero del MIT a estrella del rock</title><content type='html'>La portada de &lt;a href="http://eventos.barrapunto.com/eventos/10/01/28/1025256.shtml"&gt;barrapunto&lt;/a&gt; del dia 28/01/10 anunciaba una conferencia de Richard Stallman sobre el software libre en la ética y en la práctica. Era en el IES Lacetània de Manresa. Por la hora (las 19.15h) y el lugar (allí vive mi novia), era el dia perfecto para asistir por primera vez a una de sus conferencias y conocerle en persona.&lt;br /&gt;&lt;br /&gt;Llegue a la sala de actos 10 minutos antes de que comenzara su charla, con la intención de buscar un buen sitio donde sentarme. Pero al llegar, la sala estaba repleta de gente, y me tuve que sentar en uno de los asientos que quedaban libres en las últimas filas. El salon de actos contaba con 2x2 bloques de asientos de unos 12x15 sillas. Bastante gente se quedaron sin asiento, y pasaron el rato de pié, por lo que a groso modo habría unas 800 personas en el salón.&lt;br /&gt;&lt;br /&gt;Tuvo una entrada en escena al mas puro estilo "rock star". Tras esconder su cara con su larga melena mientras el director del centro introducía la apertura del evento, éste concluyo su intervención dando paso a la estrella del espectáculo:&lt;br /&gt;&lt;br /&gt;"con todos ustedes, ... ¡Richaard ... Staallman!"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/S2P_gam5PAI/AAAAAAAAAIw/EI7qxmBSc3w/s1600-h/29012010859.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/S2P_gam5PAI/AAAAAAAAAIw/EI7qxmBSc3w/s200/29012010859.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432466507902303234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ante los efusivos aplausos de un público entregado al personaje, éste se levantó de la silla echándo su melena hacia atras, y empezó a dar saltos a la pata coja dando un circulo completo de 360º. En aquel momento pensé que de los laterales iban a saltar los cohetes, iban a subir el volumen, a bajar las luces, ¡y a iniciar el concierto!&lt;br /&gt;&lt;br /&gt;Dejando de lado el tema glamouroso, y entrando de lleno en el terreno filosófico del asunto, inició su presentación haciendo incapié en los cuatro principios eticos fundamentales del movimiento del software libre:&lt;br /&gt;&lt;br /&gt;    - Libertad de usar el programa para cualquier meta legitima&lt;br /&gt;    - Libertad para estudiar/modificar el codigo fuente del programa&lt;br /&gt;    - Libertad de ayudar a tu projimo, copiando y distribuyendo el programa&lt;br /&gt;    - Libertad de publicar versiones modificadas, incluyendo su venta&lt;br /&gt;&lt;br /&gt;Criticó con fuerza al software privativo (el que priva de libertad), haciendo referencia directa a &lt;a href="http://bulma.net/body.phtml?nIdNoticia=2545"&gt;los 7 pecados&lt;/a&gt; de Micro$oft, al iPad de Apple, al que él denomina el &lt;a href="http://www.defectivebydesign.org/ipad"&gt;iBad&lt;/a&gt;, y también tuvo su momento para criticar el libro electrónico de Amazon, el Kindle, explicando que hace unos meses se descubrió una especie de puerta trasera que permitió a Amazon &lt;a href="http://www.fsf.org/news/amazon-apologizes"&gt;borrar de manera remota&lt;/a&gt; libros digitales almacenados en el sistema de forma lícita. Un atentado contra las libertades en toda regla. Realmente maléfico.&lt;br /&gt;&lt;br /&gt;Afortunadamente, la comunidad libre sigue haciendo su trabajo a la perfección, ofreciendo alternativas libres a la sociedad. Y pronto tendremos la alternativa al iPad de la mano de una empresa española, el &lt;a href="http://www.ifreetablet.com/"&gt;iFreeTablet&lt;/a&gt;. Sin duda, un gadget muy interesante a tener en cuenta en los próximos meses.&lt;br /&gt;&lt;br /&gt;Mas tarde, hizo incapie en que la gente reconozca la diferencia entre el kernel del sistema operativo (Linux) y el conjunto de herramientas necesarias para que el sistema funcione (herramientas GNU). Pidio que se le reconozcan los meritos que hoy en dia se le atribuyen casi en exclusiva al creador de Linux, Linus Torvalds, ya que mucha gente sigue confundiendo a Linux con todo el sistema, sin saber que en realidad, Linux es solo una parte del sistema que Richard Stallman empezó a gestar y desarrollar 10 años antes de que Linus terminara su primera versión funcional del kernel.&lt;br /&gt;&lt;br /&gt;Intuí cierto rencor hacia la persona de Linus Torvalds por llevarse este último todos los meritos mediáticos, segun el, porque la velocidad a la que se difundió una noticia erronea superó con creces la velocidad de la noticia que intentaba aclarar las cosas.&lt;br /&gt;&lt;br /&gt;Relacionado con la educación, Stallman hablo sobre el software en las escuelas, argumentando que un centro educativo de software, por definición de educación, nunca puede funcionar con software privativo: debe funcionar con software libre. Y la razón es de una logica aplastante: un alumno con dudas sobre el funcionamiento de su sistema privativo, nunca podra obtener respuestas. Sus profesores solo le podrán contestar a sus dudas con un triste: "no lo sé, es secreto". Y obviamente, este argumento va en contra de los intereses educativos del alumno. &lt;br /&gt;&lt;br /&gt;Critico con fuerza la propuesta de ley realizada por el Gobierno español sobre el intercambio de contenidos digitales, así como a los gobiernos de la Union Europea por fomentar el uso de software privativo en decremento del software libre, apoyando la iniciativa del portal &lt;a href="http://red-sostenible.net/index.php/Página_Principal"&gt;red-sostenible&lt;/a&gt;, animando al personal a continuar luchando actívamente por la causa.&lt;br /&gt;&lt;br /&gt;Relacionado con el mundo empresarial, habló sobre el modelo de negocio con el software libre: los clientes que desean una modificacion de un codigo libre, la piden a los desarrolladores, éstos la realizan, el cliente la paga, los desarrolladores la cobran. Pero esa modificación debe seguir siendo libre, lo cual, según mi modo de entender, choca frontalmente con el interés principal de toda empresa (ganar dinero) ya que si una empresa gasta sus recursos económicos para hacer una modificación en el codigo de un programa, y acto seguido el resto de las empresas del mundo pueden disponer de manera solidaria de esa modificación, la empresa que gasta sus recursos en la modificación no obtiene ninguna ventaja competitiva. Es un conflicto de intereses dificil de resolver.&lt;br /&gt;&lt;br /&gt;Hacia el final de la conferencia, Richard mostró "su otro yo", y tras enfundarse una túnica negra y colocarse sobre su cabeza un disco dorado a modo de aura, se presentó ante los presentes como San iGNUcio, ante las risas de los asistentes por lo cómico del asunto, y empezó a predicar con su religión a modo de profeta.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/S2QAoP2Gi_I/AAAAAAAAAI4/CR7kSBpbaKc/s1600-h/29012010860.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/S2QAoP2Gi_I/AAAAAAAAAI4/CR7kSBpbaKc/s200/29012010860.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432467741963881458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entre otras bromas, dijo que para convertirte a su religión, debes enunciar todos los comandos del editor emacs, uno por uno, en orden alfabético. Tambien tuvo sus palabras hacia el editor vi, sobre el que dijo que pronunciar 3 veces vi, VIVIVI, es pronunciar un numero diabolico (666), pero que usar una versión libre del editor puede servir para redimir todos tus pecados. Soy un ferviente defensor del vi, asi que segun san Ignucio, ¡estoy libre de todo pecado! :-)&lt;br /&gt;&lt;br /&gt;Richard Stallman se ganó al público asistente a la conferencia desde el primer momento que apareció en escena, y hasta el mismisimo final. Los aplausos se sucedieron de forma periódica durante las dos horas que duró su intervención. El tema es curioso y digno de que la mismísima SGAE haga una profunda reflexión al respecto: un ingeniero del MIT dando charlas sobre software libre consigue un exito de asistencia que muchos grupos musicales quisieran para si mismos tras su primer disco de exitos... Y sin cobrar ni un solo céntimo por derechos de autor!&lt;br /&gt;&lt;br /&gt;La sección de preguntas y respuestas fué mas breve de lo que hubiera deseado. Tras la primera pregunta, la gente empezaró a marchar de manera muy ruidosa, sin respetar el silencio en la sala que Richard reclamaba para poder escuchar las preguntas. Era el momento perfecto para que dejara de lado su guión y su puesta en escena perfectamente estudiada, y haber podido conocer un poco mas de cerca al personaje real. Pero el ruido continuó, y ante el descontrol de gente saliendo de la sala, Richard empezó a firmar libros, y yo me decidí finalmente a marchar.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/S2QEQNZz8DI/AAAAAAAAAJA/O6BXJz51NQs/s1600-h/29012010862.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/S2QEQNZz8DI/AAAAAAAAAJA/O6BXJz51NQs/s200/29012010862.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5432471727038001202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En cualquier caso, pasé un rato muy agradable en un ambiente que ciertamente me apasiona, y quedé contento de haber conocido en persona a uno de los mejores programadores de la historia, por el que siento una gran admiración y respeto, y desde luego un hombre que ha marcado mi carrera profesional desde que ayá por 1997 conocí de su sistema operativo y sus ideas éticas y filosóficas. Si nunca has asistido a una de sus conferencias, te gusta el mundillo, y tienes ocasión, no lo dudes, es mas que recomendable. Yo intentaré repetir algún día. ¡Hasta la próxima, rock star!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3439958601482209242?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3439958601482209242/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3439958601482209242' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3439958601482209242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3439958601482209242'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2010/01/richard-stallman-de-ingeniero-del-mit.html' title='Richard Stallman: de ingeniero del MIT a estrella del rock'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/S2P_gam5PAI/AAAAAAAAAIw/EI7qxmBSc3w/s72-c/29012010859.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5314991965129234413</id><published>2009-11-22T10:36:00.016+01:00</published><updated>2009-12-16T23:34:56.112+01:00</updated><title type='text'>Google lanza Chrome OS</title><content type='html'>Google acaba de presentar su nuevo sistema operativo Chrome OS.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SwkIWw847PI/AAAAAAAAAIk/kJFMIpLnr14/s1600/chromeos.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 174px; height: 200px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SwkIWw847PI/AAAAAAAAAIk/kJFMIpLnr14/s200/chromeos.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5406862014825426162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La empresa plantea su nuevo sistema operativo, no como un sustituto de los actuales, sino como un sistema operativo destinado a un sector especifico de los usuarios de Internet que demandan sistemas Netbook cada vez mas faciles de usar. La empresa rentabilizará este proyecto con creces, puesto que se trata del sector con mas numero de usuarios de la red, y aumentando a un ritmo exponencial según sus estudios.&lt;br /&gt;&lt;br /&gt;Esos usuarios no necesitan saber nada de procesos, de gestion de memoria, de planificadores, de interrupciones, comunicaciones, drivers, concurrencia, lenguajes de programación, administracion de sistemas, redes, etc. Son usuarios que quieren un equipo facil de usar, que arranque rapido y que dispongan de todas las aplicaciones que usan habitualmente: email, web browser, facebook, chat, juegos, youtube, etc.&lt;br /&gt;&lt;br /&gt;Google define estos tres requisitos (3S) como los requisitos basicos de su nuevo sistema operativo:&lt;br /&gt;&lt;br /&gt;1S. Security (seguridad):&lt;br /&gt;Quieren que el sistema sea seguro, libre de malware, y para ello nada mas facil que montar el rootfs del sistema en modo solo lectura y que todas las aplicaciones que use el usuario se encuentren en lo que se denomina "la nuve" (una metafora de Internet), y no como copias locales en su propio PC. Una consecuencia de esto es que los propios datos del usuario (fotos, documentos, videos...) no podran almacenarse en el sistema, sino que tambien se almacenan en "la nuve". Ellos argumentan que es mas seguro que almacenar los datos en nuestro propio PC, ya que la perdida o robo del Netbook, implica la perdida total de los datos, mientras que en la nuve siempre estarán disponibles desde cualquier PC desde cualquier parte del mundo.&lt;br /&gt;&lt;br /&gt;2S. Speed (velocidad):&lt;br /&gt;Quieren que el arranque del sistema sea rapido. Para ello, el hardware del Netbook solo dispondrá de una pequeña memoria flash para almacenar al Chrome OS. Como carece de disco duro (mecánico = lento), la velocidad de arranque aumenta considerablemente. Pero ademas, ellos siguen trabajando con el software del sistema operativo, intentando reducir todavía mas el tiempo de arranque de un sistema operativo convencional. Actualmente su sistema arranca en 7 segundos. Su objetivo es conseguir un dispositivo que arranque tan rapido como un televisor, pulsando el boton de Power e inmediatamente mostrando el login del sistema.&lt;br /&gt;&lt;br /&gt;3S. Simplicity (simplicidad):&lt;br /&gt;Quieren que el sistema operativo sea simple de usar, y para ello usan el navegador Chromium como escritorio del Netbook. A partir del navegador se pueden lanzar todas las aplicaciones que usa comunmente el usuario: web browser, reproductor multimedia para audio y video, juegos online, aplicaciones ofimaticas como el Google Docs, etc. Se olvida el concepto de administracion del equipo: ya no hay que mantener actualizados drivers, ni paquetes del sistema operativo, ni antivirus, todo este trabajo deja de ser necesario para el usuario.&lt;br /&gt;&lt;br /&gt;A nivel de arquitectura, estaría el sistema operativo Chrome OS controlando el hardware del Netbook, y por encima unicamente el Chromium browser como interfaz de usuario, sobre el cual correrían el resto de las aplicaciones.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;                        +------------------------+&lt;br /&gt;                        |         ...            |&lt;br /&gt;                        |       Twitter          |&lt;br /&gt;                        |       Facebook         |&lt;br /&gt;                        |        Gmail           |&lt;br /&gt;                        |       Blogspot         |&lt;br /&gt;                        |     Search engine      |&lt;br /&gt;                        |      Google maps       |&lt;br /&gt;                        |      Google docs       |&lt;br /&gt;                        |      Google knols      |&lt;br /&gt;                        +------------------------+&lt;br /&gt;                        |    Chromium browser    |&lt;br /&gt;                        +------------------------+&lt;br /&gt;                        |       Chrome OS        |&lt;br /&gt;                        +------------------------+&lt;br /&gt;                        |       Netbook HW       |&lt;br /&gt;                        +------------------------+&lt;/pre&gt;&lt;br /&gt;Resumiendo, Chrome OS es el sistema operativo para la gente que no sabe lo que es un sistema operativo (o como mi amigo &lt;a href="http://www.p-folio.net/"&gt;Jose&lt;/a&gt;, que lo sabe, pero prefiere olvidarse de ello :-) Los sistemas operativos tradicionales tal y como los conocemos hoy en día, seguirán siendo la herramienta para los profesionales del medio: desarrolladores de software y administradores de sistemas. El resto de los usuarios estaran usando el sistema operativo Chrome OS, muy posiblemente desconociendo su propia existencia. &lt;br /&gt;&lt;br /&gt;Creo que Google va a facilitar las vidas de usuarios e ingenieros, consiguiendo que los sistemas operativos tal y como los conocemos hoy en día, sean una herramienta exclusiva de los profesionales del medio. Los usuarios no tendrán que pelear con conceptos complejos que no les interesan en absoluto, y los ingenieros, por fin, dejaremos de ser &lt;a href="http://www.sromero.org/wiki/doku.php/linux:sistema:pringao_howto"&gt;los pringaos del howto&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5314991965129234413?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5314991965129234413/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5314991965129234413' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5314991965129234413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5314991965129234413'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/11/google-lanza-chrome-os.html' title='Google lanza Chrome OS'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p6JYGqjuqSI/SwkIWw847PI/AAAAAAAAAIk/kJFMIpLnr14/s72-c/chromeos.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-7648153489532949443</id><published>2009-11-07T17:28:00.021+01:00</published><updated>2009-11-07T19:40:57.529+01:00</updated><title type='text'>Metodo Cesar y analisis de frecuencias</title><content type='html'>Hace poco compré el libro "&lt;a href="http://www.ra-ma.es/libros/REDES-PRIVADAS-VIRTUALES/2830/978-84-7897-929-5"&gt;Redes Privadas Virtuales&lt;/a&gt;" de la editorial Ra-Ma, escrito y publicado por mi buen amigo &lt;a href="http://redes-privadas-virtuales.blogspot.com/"&gt;Javi&lt;/a&gt; (aprovecho para hacerte un poco de publicidad jejeje). Leyendo el principio del capitulo 3 sobre criptografía, recordé mis inicios en la criptografía cuando cursé en la &lt;a href="http://www.uji.es/"&gt;UJI&lt;/a&gt; allá por 2º de carrera la asignatura de "Seguridad y Protección de la información" bajo la supervisión del &lt;a href="http://www.uji.es/CA/departaments/lsi/estructura/personal/&amp;p_per_id=1908"&gt;Dr. Manuel Mollar&lt;/a&gt;, un crack en temas de seguridad donde los haya, del que aprendí todo lo que sé hoy en día sobre criptografía.&lt;br /&gt;&lt;br /&gt;Entre unos y otros he terminado por animarme a escribir este post sobre criptosistemas y criptoanalisis que resultará bastante entretenido para la gente curiosa que guste de estos temas.&lt;br /&gt;&lt;br /&gt;Primero unas formalidades para centrar el asunto sin enrollarnos demasiado: definiremos criptologia como la suma de dos ciencias que se complementan: criptografia y criptoanálisis.&lt;br /&gt;&lt;br /&gt;La criptografia diseña algoritmos que permiten comunicaciones secretas entre un emisor y un destinatario. En la criptografia clasica intervienen dos factores: un algoritmo de cifrado y una clave secreta, K.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;                     ----cifrado(K)----&gt;&lt;br /&gt;    Mensaje en claro                     Mensaje cifrado&lt;br /&gt;                     &lt;--descifrado(K)---&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El criptoanálisis se encarga de elaborar tecnicas que permiten descubrir tanto el algoritmo de cifrado utilizado como la clave secreta involucrada en el proceso de encriptado.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Mensaje cifrado --- ¿algoritmo + K? ---&gt; Mensaje en claro&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vamos a explicar como funciona un criptosistema muy sencillo, conocido como método de Cesar (usado hace unos cuantos años en las campañas militares romanas), y tambien vamos a ver lo facil que resulta atacarlo mediante una sencilla técnica de criptoanálisis conocida como el análisis de frecuencias.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SvWs5idVdsI/AAAAAAAAAIc/1Tm2LVhROwU/s1600-h/cesar.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 118px; height: 200px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SvWs5idVdsI/AAAAAAAAAIc/1Tm2LVhROwU/s200/cesar.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5401413432603145922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;El algoritmo de cifrado es muy sencillo. Cada caracter del mensaje en claro es sustituido por el situado K &gt; 0 posiciones mas adelante en el alfabeto. Por ejemplo, asumiendo K=3, el criptosistema reemplaza la A por la D, la B por la E, y así sucesivamente. El descifrado es igual de facil, ya que consiste en sustituir cada caracter del mensaje cifrado por el situado K posiciones atras en el alfabeto.&lt;br /&gt;&lt;br /&gt;Ejemplo de cifrado de Cesar con K = 4&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    Mensaje: E L P E R R O D E S A N R O Q U E T I E N E R A B O&lt;br /&gt;      Clave: 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4&lt;br /&gt;    Cifrado: I P T I V V S H I W E R V S U Y I X M I R I V E F S&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Aqui teneis un codigo escrito en C cesar.c que os permitira encriptar y desencriptar cualquier documento con la clave K que paseis como argumento de entrada:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* Algoritmo de Cesar con clave k */&lt;br /&gt;&lt;br /&gt;int main (int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;    /* argumentos de entrada */&lt;br /&gt;    if (argc != 3) {&lt;br /&gt;        printf("syntax: %s -[e|d] key\n", argv[0]);&lt;br /&gt;        printf("example: %s -e 3\n", argv[0]);&lt;br /&gt;        exit(0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (argv[1][1] != 'e' &amp;&amp; argv[1][1] != 'd') {&lt;br /&gt;        printf("syntax: %s -[e|d] key\n", argv[0]);&lt;br /&gt;        exit(0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* inicializaciones */&lt;br /&gt;    char ed = argv[1][1]; /* encode o decode */&lt;br /&gt;    int k = atoi(argv[2]); /* key */&lt;br /&gt;    if (k &gt; 255)&lt;br /&gt;        k = k % 256;&lt;br /&gt;&lt;br /&gt;    char c;&lt;br /&gt;&lt;br /&gt;    /* encoding ... */&lt;br /&gt;    if (ed == 'e') {&lt;br /&gt;        while (read(0, &amp;c, sizeof(unsigned char)) &gt; 0)&lt;br /&gt;            printf("%c", (c + k) % 256);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* decoding ... */&lt;br /&gt;    if (ed == 'd') {&lt;br /&gt;        while (read(0, &amp;c, sizeof(unsigned char)) &gt; 0)&lt;br /&gt;            printf("%c", (c - k) % 256);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El criptosistema de Cesar es facilmente atacable usando una tecnica de criptoanalisis conocida como analisis de frecuencias, ya que la frecuencia de aparicion de cada letra en el mensaje en claro se refleja exactamente en el texto cifrado. Conociendo la letra de mayor frecuencia en el alfabeto utilizada, queda automaticamente establecida la correspondencia.&lt;br /&gt;&lt;br /&gt;Vamos a atacar un mensaje cifrado con Cesar usando analisis de frecuencias. Sea por ejemplo el siguiente texto en castellano cifrado con una clave K, de momento desconocida. Nuestro objetivo es averiguar la clave K para descifrar el contenido del siguiente mensaje:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;hqxqoxjdughodpdqfkdghfx|rqrpeuhqrtxlhurdfrugduphylyldxqorfrpdfduudtxhwrfdedodjxlwduud&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Saber que el texto está en castellano es una pista muy clara de que debemos usar una tabla de frecuencias en castellano. En &lt;a href="http://www.sttmedia.com/characterfrequencies"&gt;esta&lt;/a&gt; direccion teneis la tabla completa de la frecuencia de aparición de cada carácter en el idioma que mas os interese. En la tabla de castellano podremos encontrar que el caracter mas usado en nuestro idioma es el caracter 'e'. &lt;br /&gt;&lt;br /&gt;Ahora necesitamos un programa que calcule la frecuencia de aparicion de cada caracter ASCII en el texto cifrado. Para ello hemos desarrollado este pequeño programa freq.c en C.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/* Frecuencia de cada caracter ASCII */&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;    /* inicializaciones */&lt;br /&gt;    unsigned long int total = 0;&lt;br /&gt;    float freq = 0;&lt;br /&gt;&lt;br /&gt;    int i;&lt;br /&gt;    int ascii[256]; /* numero de apariciones de cada ascii[i] */&lt;br /&gt;    for (i = 0; i &lt; 256; i++)&lt;br /&gt;        ascii[i] = 0;&lt;br /&gt;&lt;br /&gt;    unsigned char c;&lt;br /&gt;&lt;br /&gt;    /* actualizacion de la tabla ascii y de la variable total */&lt;br /&gt;    while (read(0, &amp;c, sizeof(unsigned char)) &gt; 0 ) {&lt;br /&gt;        ascii[c]++;&lt;br /&gt;        total++;&lt;br /&gt;    }&lt;br /&gt;    close(0);&lt;br /&gt;&lt;br /&gt;    /* visualizacion resultados tabla ASCII */&lt;br /&gt;    for (i = 0; i &lt; 256; i++) {&lt;br /&gt;        if (ascii[i]) {&lt;br /&gt;            freq = ((float) ascii[i]) / ((float) total);&lt;br /&gt;            printf("ASCII[%d] = %d\tfreq = %f\n", i, ascii[i], freq);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /* visualizacion total */&lt;br /&gt;    printf("\nTotal of characters: %lu", total);&lt;br /&gt;    printf("\n");&lt;br /&gt;&lt;br /&gt;    return(0);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;El resultado aplicado sobre el texto cifrado es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;td&gt;ASCII[100] = 15 freq = 0.176471&lt;br /&gt;ASCII[117] = 9  freq = 0.105882&lt;br /&gt;ASCII[114] = 8  freq = 0.094118&lt;br /&gt;ASCII[104] = 7  freq = 0.082353&lt;br /&gt;ASCII[120] = 7  freq = 0.082353&lt;br /&gt;ASCII[102] = 6  freq = 0.070588&lt;br /&gt;ASCII[113] = 6  freq = 0.070588&lt;br /&gt;ASCII[108] = 4  freq = 0.047059&lt;br /&gt;ASCII[111] = 4  freq = 0.047059&lt;br /&gt;ASCII[112] = 4  freq = 0.047059&lt;br /&gt;ASCII[103] = 3  freq = 0.035294&lt;br /&gt;ASCII[101] = 2  freq = 0.023529&lt;br /&gt;ASCII[106] = 2  freq = 0.023529&lt;br /&gt;ASCII[116] = 2  freq = 0.023529&lt;br /&gt;ASCII[119] = 2  freq = 0.023529&lt;br /&gt;ASCII[121] = 2  freq = 0.023529&lt;br /&gt;ASCII[107] = 1  freq = 0.011765&lt;br /&gt;ASCII[124] = 1  freq = 0.011765&lt;br /&gt;&lt;br /&gt;Total of characters: 85&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si el caracter mas frecuente en español es la letra 'e' (ascii 101), sabemos que alguno de los caracteres mas frecuentes del texto cifrado corresponde con la letra 'e'. Solo nos queda ir probando en secuencia las posibles claves hasta dar con una que decodifique el texto cifrado y nos deje ver con claridad el contenido del texto cifrado. Por tanto, debemos ir probando con esta secuencia de claves K:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    MAX   'e'&lt;br /&gt;------------------&lt;br /&gt;K = 100 - 101 = -1&lt;br /&gt;K = 117 - 101 = 16&lt;br /&gt;K = 114 - 101 = 13&lt;br /&gt;K = 104 - 101 = 3&lt;br /&gt;K = 120 - 101 = 19&lt;br /&gt;...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ningun texto cumple al pie de la letra con las frecuencias características del lenguaje (es un tema estadístico), aunque podeis estar seguros que la probabilidad de que el caracter 'e' sea uno de los caracteres mas frecuentes, es muy alta.&lt;br /&gt;&lt;br /&gt;¿Quien será el primero en dejarme un comentario con el resultado del texto en claro? &lt;br /&gt;&lt;br /&gt;Existen varios concursos planteados por distintos organismos oficiales como la CIA y conocidísimas empresas todopoderosas como Google con el proposito de cazar talentos dispersos por esos mundos... &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SvWr4365bgI/AAAAAAAAAIM/zFoVPyeoU6M/s1600-h/kryptos.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 158px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SvWr4365bgI/AAAAAAAAAIM/zFoVPyeoU6M/s200/kryptos.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5401412321672785410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En los exteriores de las oficinas de la CIA en Langley (Virgina) se encuentra una escultura enorme de bronce, de unos cuatro metros de altura, conocida como &lt;a href="http://en.wikipedia.org/wiki/Kryptos"&gt;kryptos&lt;/a&gt;, en la que se esconden &lt;a href="https://www.cia.gov/about-cia/virtual-tour/kryptos/index.html"&gt;cuatro mensajes cifrados&lt;/a&gt; escritos en ingles. La primera persona que anunció publicamente haber resuelto los tres primeros fue &lt;a href="http://en.wikipedia.org/wiki/James_Gillogly"&gt;James Gillogly&lt;/a&gt;, y por lo que se sabe, la cuarta parte continua sin resolver.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SvWsF_FJrWI/AAAAAAAAAIU/kjSEhSRpRiw/s1600-h/crypticgoogle.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 172px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SvWsF_FJrWI/AAAAAAAAAIU/kjSEhSRpRiw/s200/crypticgoogle.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5401412546933140834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En las paredes del MIT aparecieron carteles de Google con este críptico mensaje acompañado del texto "si puedes averiguar esto, puedes tener futuro en Google". El mensaje encriptado contiene un número de teléfono al que llamar en caso de acertarlo.&lt;br /&gt;&lt;br /&gt;Para resolver estos criptosistemas, necesitareis investigar por vuestra cuenta sobre otros criptosistemas por trasposicion como el Vigenere, una variante del metodo de Cesar que usa cadenas de texto como clave. Y tambien los criptosistemas por sustitucion, que unicamente reordenan la posicion de los mensajes en el texto. Y sobre variantes de unos y otros, incluso combinadas entre si. Asi que manos a la obra... ¿Os veis con ganas de intentar trabajar... en Google ... o en la CIA? Yes you can! Why not! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-7648153489532949443?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/7648153489532949443/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=7648153489532949443' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7648153489532949443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7648153489532949443'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/11/metodo-cesar-y-analisis-de-frecuencias.html' title='Metodo Cesar y analisis de frecuencias'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p6JYGqjuqSI/SvWs5idVdsI/AAAAAAAAAIc/1Tm2LVhROwU/s72-c/cesar.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-4286491309489529573</id><published>2009-10-07T19:29:00.046+02:00</published><updated>2009-10-07T23:02:27.295+02:00</updated><title type='text'>La ciencia española no necesita tijeras...</title><content type='html'>El Gobierno baraja una &lt;a href="http://www.elpais.com/articulo/sociedad/Alarma/comunidad/cientifica/recortes/investigacion/elpepusoc/20090910elpepisoc_2/Tes"&gt;reducción del 37%&lt;/a&gt; del dinero destinado a financiar los proyectos de I+D, las becas y los contratos de investigadores, para caer a los niveles de 2006.&lt;br /&gt;&lt;br /&gt;Muy bonito señores gobernantes de este país, es fabuloso. Los bancos piden ayudas millonarias al gobierno para afrontar una crisis que ellos mismos inician (por pura avaricia), nuestros señores gobernantes se las condecen para que puedan auto-regalarse pensiones vitalicias millonarias (son empresas privadas, cierto, pero reflotadas con dinero público... con el dinero de nuestros impuestos). &lt;br /&gt;&lt;br /&gt;La industria del automovil pide ayudas millonarias porque se reducen las ventas y no alcanzan sus previsiones de crecimiento, (pobrecitos, que no han ganado bastante con los millones de vehiculos que colapsan las carreteras españolas a cualquier hora punta del día), ayudas que les llegan. &lt;br /&gt;&lt;br /&gt;Que los paletas de este pais se quedan sin trabajo despues de estallar la burbuja inmoviliaria en la que ganaban mensualmente el sueldo de dos ingenieros, y les daba para construirse su propia casas a precio de coste en un par de años... Pues ayudas para que los paletas arreglen aceras... Mientras otros españoles (todos ellos con los mismos derechos según la Constitución española) se ven obligados a hipotecar su vida con algún banco, durante 30, 40 y hasta 50 años... &lt;br /&gt;&lt;br /&gt;¿Y quien va a pagar las consecuencias de los excesos cometidos? Desde luego, todos los españoles, con el anunciado incremento del iva, que cuando interesa... "todos somos iguales" y que "hacienda somos todos", etc. "Todos debemos ser solidarios", eso nos dicen ahora. Supongo que esos que manejan millones diariamente deberían ser igual de solidarios que todos, igualdad en terminos relativos... a su salario neto, señores gobernantes, eso es lo que queremos los ciudadanos, y que no nos tomen mas el pelo. &lt;br /&gt;&lt;br /&gt;"Todos los ciudadanos españoles tienen derecho a una vivienda digna". Pero por lo visto la vivienda no es un bien de primera necesidad, pues está grabada con un iva del 7%. Y que a un mileurista le digan que tiene que ser solidario y pagar 1000 euros mas de iva al comprar una vivienda de 40m2 para vivir con su familia... (que en realidad no son 1000 sino 2000 euros, porque de esos 1000 euros de iva tambien hay que pagar los intereses al banco durante los 30 años de la hipoteca), eso, eso es fomentar la solidaridad, eso es.&lt;br /&gt;&lt;br /&gt;A esos millonarios (de euros, no de pesetas), "no les podemos subir mas los impuestos, no sea cosa que se lleven su dinero a otro pais". Y me pregunto yo, qué problema habrá con que ese dinero se vaya a otro país, ¡si el dinero seguirá siendo suyo vayan donde vayan! ¿Quizás sus "regalos" son mas atractivos que los mios?. &lt;br /&gt;&lt;br /&gt;Pero especialmente afectados se verán los científicos e investigadores, que parece ser que para lo inteligentes que son, aprovechan muy poco sus cualidades intelectuales para sacar beneficio propio (gracias a dios, y por el bien de la ciencia, mejor que mantengan ocupados sus cerebros en cosas mas trascendentales), porque por lo visto no sacan tajada nunca, ni cuando las cosas van bien, ni menos aún cuando van mal.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SszQ4clI3-I/AAAAAAAAAIE/iysZ2hqLuP4/s1600-h/3973473121_e76fde787c_o.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SszQ4clI3-I/AAAAAAAAAIE/iysZ2hqLuP4/s200/3973473121_e76fde787c_o.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5389912522218856418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Quiero recalcar lo duro que resulta cursar estudios universitarios de ciencias, esfuerzo que por meritos propios debería garantizar al individuo que los afronta con éxito un futuro próspero y mas estable. Los científicos deben costearse unos estudios universitarios e hipotecar su vida personal por un periodo mínimo de 5 años de carrera universitaria (y muchos saben, sobre todo los implicados, que resulta muy pero que muy complicado completarlos en ese tiempo). Otros, como los médicos, incluso hasta 10 años pagandose los estudios y sin cobrar ni un misero céntimo. ¿Y todo ese esfuerzo economico y personal para llegar a donde?&lt;br /&gt;&lt;br /&gt;La compensación que les ofrece el gobierno parece humillante... Lo que les tocará es reducir sus salarios o matar proyectos de investigación en los que llevaban años trabajando, para poder pagar impuestos necesarios para rescatar a bancos o a industrias del automovil, y solidarizarse con esa gente parada con escasa cualificación que estan perdiendo sus puestos de trabajo diariamente (miles). Y que mientras esos parados (muchos de ellos felices de su condición) viven en sus casitas a cuerpo de rey, cobrando el subsidio de desempleo y dándose unas buenas vacaciones, incluso rechazando ofertas de trabajo que "no les gustan", (hablo con conocimiento de causa) mientras los cientificos y sus proyectos pagan los excesos cometidos por unos y otros.&lt;br /&gt;&lt;br /&gt;Señores politicos, con este apoyo a los cientificos, y viendo los beneficios obtenidos despues de tanto sacrificio, lo que van a conseguir es que en pocos años, este pais se convierta en un pais de analfabetos incultos esperando nuevas ayudas para cobrar la prestación por desempleo. Cualquiera diría que esta situación les interesa incluso más que tener un pais de gente competente, no sea que les pongan las cosas dificiles en su labor de gobernar.&lt;br /&gt;&lt;br /&gt;Si investigan un poco podrán ver la tendencia decreciente en matriculaciones en carreras de ciencias en los últimos años, lo que demuestra que estamos en el buen camino. Que alguien me explique como piensan sostener este pais haciendo lo que estan haciendo. Sin investigación no hay productos nuevos. Sin productos nuevos no hay produccion. Sin produccion la gran masa social se queda desempleada. Sin trabajadores, el estado reduce sus ingresos... Poco a poco la piramide se desmorona, y a este paso caeremos todos, desde el primero hasta el último.&lt;br /&gt;&lt;br /&gt;No se olviden de una cosa, sus hijos son los que pagarán las consecuencias mas graves. Aunque posiblemente eso también les debe importar muy poco... porque el largo plazo que mas les preocupa seguramente no llegue mucho mas allá de la fecha marcada por las próximas elecciones. &lt;br /&gt;&lt;br /&gt;Esta es la realidad del pais en el que vivimos muchos científicos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-4286491309489529573?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/4286491309489529573/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=4286491309489529573' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/4286491309489529573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/4286491309489529573'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/10/la-ciencia-espanola-no-necesita-tijeras.html' title='La ciencia española no necesita tijeras...'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/SszQ4clI3-I/AAAAAAAAAIE/iysZ2hqLuP4/s72-c/3973473121_e76fde787c_o.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-7372634616450717081</id><published>2009-10-03T08:30:00.019+02:00</published><updated>2009-10-03T12:22:56.928+02:00</updated><title type='text'>Kernel boot process para novatos</title><content type='html'>El usuario de un PC pulsa el boton de alimentación del sistema (power) y espera su arranque hasta que se muestre en pantalla el interfaz de usuario gráfico donde el sistema solicita usuario/password para iniciar la sesion. Este post profundiza en ese proceso de arranque, con la intención de que cualquier lector con los conocimientos suficientes, entienda mejor todos los pasos involucrados, sin entrar en detalles que dificulten su comprensión.&lt;br /&gt;&lt;br /&gt;En resumen, desde el power-on hasta el login del usuario, se pasa por 4 etapas:&lt;br /&gt;1.- Programa en ROM carga el boot-loader&lt;br /&gt;2.- El boot-loader carga el kernel&lt;br /&gt;3.- El kernel inicializa el sistema y pasa el control al user-space&lt;br /&gt;4.- El user-space finaliza la inicializacion.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Etapa 1. La BIOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tras el power-on, un pequeño programa cargado en ROM toma el control del sistema (la BIOS en x86). &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SscihwubrBI/AAAAAAAAAHs/zRFH92WVWOc/s1600-h/phoenix_bios.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 152px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SscihwubrBI/AAAAAAAAAHs/zRFH92WVWOc/s200/phoenix_bios.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5388313442582768658" /&gt;&lt;/a&gt;&lt;br /&gt;Este pequeño programa localiza el "boot device" con el que arrancar el sistema, y para ello elige el primer dispositivo bootable disponible en la secuencia "boot order" (por ejemplo, primero con CD/DVD, despues con USB y despues con HD). Una vez conocido el dispositivo bootable, lee su MBR (sector 0). Este MBR almacena 3 cosas: la rutina bootstrap loader (en .asm), la tabla de particiones y la firma de dispositivo bootable (0x55AAh) como dos ultimos bytes de la partición. Por último, el pequeño programa cargado en ROM pasa el control de ejecución a la rutina bootstrap loader, hecha única y exclusivamente para pasar el control al boot-loader.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Etapa 2. El boot-loader&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Los ejemplos mas comunes de boot-loader son grub y lilo (x86, amd) y u-boot (arm). Lo típico es que el boot-loader presente al usuario un menu con las distintas opciones de arranque (diferentes sistemas operativos, distintos kernels del mismo sistema operativo, o programas que no necesiten de sistema operativo como memtest86+). Normalmente tienen una opcion seleccionada por defecto mas un timeout. El usuario elige una de las opciones o el timeout elige la opcion por defecto.&lt;br /&gt;&lt;br /&gt;El boot-loader carga el kernel seleccionado en RAM, y opcionalmente tambien la imagen initramfs. La pregunta es, ¿y como accede el boot-loader a la imagen del kernel guardada en el filesystem de una de las particiones...? ¡Sin soporte del kernel!. Cada boot-loader resuelve este problema de forma diferente. El lilo por ejemplo necesita conocer la localizacion exacta del sector del disco en el que esta la imagen del kernel. Grub, en cambio, entiende muchos sistemas de fichero (ffs, fat16, fat32, minic, ext2, reiserfs, jfs, xfs y vst), y puede leer ficheros en dichas particiones sin ayuda de nadie.&lt;br /&gt;&lt;br /&gt;Finalmente, el boot-loader pasa el control de ejecución al kernel cargado en RAM, pasandole tambien su lista de argumentos argv (como se hace con cualquier otro programa escrito en C).&lt;br /&gt;&lt;br /&gt;Arranque directo vs arranque encadenado&lt;br /&gt;&lt;br /&gt;El grub boot-loader permite dos tipos de arranque: directo y encadenado. El arranque directo permite arrancar directamente un sistema operativo (Linux). En arranque encadenado (chain-loading), permite arrancar otro boot-loader distinto (el que usa Windows).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SscixNBfxCI/AAAAAAAAAH0/oFyB7ABYHwM/s1600-h/grub.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 127px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SscixNBfxCI/AAAAAAAAAH0/oFyB7ABYHwM/s200/grub.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5388313707876959266" /&gt;&lt;/a&gt;&lt;br /&gt;Para arrancar un sistema operativo, el grub necesita conocer el dispositivo de almacenamiento y la partición de ese dispositivo en el que se encuentra almacenado su kernel. Además, en modo directo tambien necesita el path al binario del kernel al que transfiere el control. Mientras que en modo encadenado, transfiere el control al PBR (Partition Boot Record) de la partición indicada; se trata de un bloque similar al del MBR pero almacenado en la partición. Esta dualidad posibilita a grub el arranque del cualquier sistema operativo, sea libre o propietario.&lt;br /&gt;&lt;br /&gt;El fichero de configuración del grub&lt;br /&gt;&lt;br /&gt;El fichero de configuracion del grub se llama menu.lst y generalmente se encuentra en el directorio /boot/grub/. Cuando grub arranca, lee su contenido y presenta al usuario un menu con las opciones de arranque disponibles en su interior.&lt;br /&gt;&lt;br /&gt;Algunas etiquetas para definir parametros generales de su configuración:&lt;br /&gt;- default - Establece la entrada (title) seleccionada por defecto&lt;br /&gt;- timeout - Tiempo en segundos para arrancar la configuracion default&lt;br /&gt;- splashimage - Imagen de fondo (14 colores, 640x480, .xpm.gz)&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;PRE&gt;default 1&lt;br /&gt;timeout 3&lt;br /&gt;splashimage=(hd0,0)/boot/grub/splash.xpm.gz&lt;/PRE&gt;&lt;br /&gt;Por cada sistema operativo que grub puede arrancar, se define en menu.lst un grupo de etiquetas que especifican toda la información que grub necesita para poder arrancarlo. Cada grupo de etiquetas se inicia con la palabra clave "title", que especifica el texto mostrado para el sistema operativo arrancado, y a continuación una serie de etiquetas que dependen del modo de arranque (directo o encadenado). Veamos dos ejemplos para entenderlo mejor:&lt;br /&gt;&lt;br /&gt;Ejemplo tipico Linux (carga directa)&lt;br /&gt;&lt;PRE&gt;title       Ubuntu, kernel 2.6.22.5-custom&lt;br /&gt;root        (hd0,0)&lt;br /&gt;kernel      /boot/vmlinuz-2.6.22.5-custom root=/dev/hda1 ro quiet splash&lt;br /&gt;initrd      /boot/initrd.img-2.6.22.5-custom&lt;br /&gt;boot&lt;/PRE&gt;&lt;br /&gt;Ejemplo tipico Windows (carga encadenada)&lt;br /&gt;&lt;PRE&gt;title       Windows Vista&lt;br /&gt;root        (hd0,1)&lt;br /&gt;chainloader +1&lt;/PRE&gt;&lt;br /&gt;Las etiquetas tipicas de estas entradas son:&lt;br /&gt;- title - Texto mostrado para el sistema operativo arrancado&lt;br /&gt;- root - Dispositivo de almacenamiento y particion donde esta disponible el kernel.&lt;br /&gt;- kernel - (Carga directa) Path en root a la imagen del kernel arrancado&lt;br /&gt;- initrd - (Carga directa) Path en root al fichero initramfs&lt;br /&gt;- boot - (Carga directa) Arranca el sistema operativo seleccionado&lt;br /&gt;- chainloader - (Carga encadenada) Pasa control al sector del PBR indicado&lt;br /&gt;&lt;br /&gt;La etiqueta "root" confunde a mucha gente (y no es para menos). La sintaxis es propia de grub, no la confundais con la sintaxis de los ficheros dispositivo situados en /dev para los dispositivos de almacenamiento, que diferencia los dispositivos de almacenamiento IDE (hda) de los SCSI (sda). En cambio, grub usa siempre el prefijo hd. Por tanto, (hd0,0) significa primer bootable-device (0) de la primera partición (0), mientras que (hd1,3) significa segundo bootable-device (1) de la cuarta partición (3). Tampoco olvideis que el bootable-device depende del boot-order asignado en la BIOS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Etapa 3. El kernel de Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El kernel toma el control del sistema: se descomprime a si mismo, inicializa el hardware (CPU, cache y configuración específica de cada board), los distintos subsistemas del kernel (el scheduler, el gestor de memoria, y los sistemas de ficheros virtuales /proc y /sys, sin llegar a montarlos). A continuación lee su lista de argumentos argv. Algunos parámetros tipicos de argv son estos:&lt;br /&gt;&lt;br /&gt;- root=/dev/sda1 - Fichero dispositivo de la particion raiz ("/")&lt;br /&gt;- rootfstype=ext2 - Sistema de ficheros de la particion raiz&lt;br /&gt;- init=/sbin/init - Primer programa del user-space ejecutado&lt;br /&gt;- Muchos mas en Documentation/kernel-parameters.txt&lt;br /&gt;&lt;br /&gt;A continuación inicializa la consola (/dev/console) para poder mostrar los logs del arranque por pantalla. Y por fin monta su partición raiz (root). Este es el paso mas importante para los usuarios, y se explica despues con mayor detalle.&lt;br /&gt;&lt;br /&gt;El kernel intenta ejecutar el primer programa del user-space (init). Para ello, crea un kernel-thread que se reemplaza a si mismo (syscall execve) con la imagen del binario del userspace apuntado por init (normalmente apuntando a /sbin/init). Si el programa indicado por init no se encuentra en la particion raiz, el kernel muestra un panic error indicando el error. Si lo encuentra, pasa el control a dicho programa.&lt;br /&gt;&lt;br /&gt;Recordemos que este binario reside en la particion raiz (root). Se trata del primer programa del user-space ejecutado, y el primer programa compilado con la libreria de C estandar (libc).&lt;br /&gt;&lt;br /&gt;Montaje de la partición raiz&lt;br /&gt;&lt;br /&gt;Para montar la partición raiz (root), el kernel necesita el device driver del dispositivo que aloja la partición raiz y el driver del sistema de ficheros de esa partición (ext2, ext3, etc.).&lt;br /&gt;&lt;br /&gt;Si esos 2 drivers fueron compilados built-in (no como modulos), el kernel dispone de todo lo necesario para montar la partición raiz. Por tanto la monta y completa su trabajo.&lt;br /&gt;&lt;br /&gt;Si los drivers fueron compilados como modulos (no built-in), el kernel necesita extraer esos modulos de algun sitio. Para ello se usa la imagen initramfs de la que ya hemos hecho algun comentario en este post (profundizaremos sobre ella despues). El kernel lee la imagen initramfs cargada en RAM por el bootloader, la descomprime y monta el sistema de ficheros almacenado en su interior. Continua ejecutando el script /init almacenado en el initramfs. Desde ese script podemos lanzar el código que mas nos interese:&lt;br /&gt;&lt;br /&gt;- Una opcion es que /init monte la partición raiz indicada en (root). Para ello lee de initramfs los modulos necesarios para montar el dispositivo indicado en root, carga dichos modulos y reemplaza el montaje del initramfs por el de la partición raiz.&lt;br /&gt;- Otra opcion, mas empleada en sistemas embedded con sistemas de ficheros muy pequeños, es que el initramfs se convierta en la partición raiz del kernel y el su interior se aloje la aplicación del user-space que va a correr el sistema embedded.&lt;br /&gt;&lt;br /&gt;La imagen initramfs&lt;br /&gt;&lt;br /&gt;Introducido en el kernel 2.6 para conseguir un proceso de inicialización del kernel mucho mas limpio, ya que parte del código de inicialización del kernel se mueve al user-space. Solo esta soportado en kernels &gt;= 2.6.17 configurados adecuadamente.&lt;br /&gt;&lt;br /&gt;Como ya hemos visto, puede usarse en sistemas embedded como sistema de ficheros root del kernel, y en sistemas mas grandes, como sistema de ficheros intermedio para montar la partición raiz.&lt;br /&gt;&lt;br /&gt;Para construir una imagen initramfs para el boot-loader brug, se hace esto:&lt;br /&gt;&lt;PRE&gt;$ mkinitramfs -o /boot/initrd.img-2.6.22.5-custom 2.6.22.5-custom&lt;/PRE&gt;&lt;br /&gt;Para crear una imagen initramfs custom (casi nadie hace esto):&lt;br /&gt;&lt;PRE&gt;$ find &lt;rootfs&gt; -print -depth | cpio -ov | gzip  -c  &gt; initramfs.img&lt;/PRE&gt;&lt;br /&gt;Para extraer el contenido de una imagen initramfs una vez generada:&lt;br /&gt;&lt;PRE&gt;$ gzip -dc initramfs.img | cpio -id&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Etapa 4. El user-space&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No vamos a entrar en muchos detalles, ya que el arranque del user-space es dependiente de cada distribución de Linux. Para no extendernos demasiado, explicaremos aqui el modelo genérico de linux, asumiendo que init=/sbin/init. Por tanto, el primer programa del user-space que tomará el control será /sbin/init, quien leerá el script /etc/inittab y lo ejecuta en secuencia.&lt;br /&gt;&lt;br /&gt;Cada linea del fichero /etc/inittab tiene este formato:&lt;br /&gt;&lt;PRE&gt;id:runlevels:action:process&lt;/PRE&gt;&lt;br /&gt;- id - Secuencia de 4 caracteres. Nosotros lo vamos a ignorar&lt;br /&gt;- runlevels - Niveles de ejecucion. Nosotros lo vamos a ignorar&lt;br /&gt;- action - Accion llevada a cabo cuando se ejecute la entrada&lt;br /&gt;        --&gt; sysinit: proceso ejecutado durante el boot del sistema&lt;br /&gt;        --&gt; restart: proceso se reinicia cuando termina&lt;br /&gt;        --&gt; shutdown: proceso ejecutado con el shutdown del sistema&lt;br /&gt;- process - Especifica linea de comandos del proceso ejecutado&lt;br /&gt;&lt;br /&gt;Un ejemplo de fichero /etc/inittab típico de cualquier sistema Linux:&lt;br /&gt;&lt;PRE&gt;# Script de inicializacion del arranque del sistema&lt;br /&gt;::sysinit:/etc/init.d/rcS&lt;br /&gt;# El proceso /sbin/init se reinicia cada vez que termina&lt;br /&gt;::restart:/sbin/init&lt;br /&gt;# Proceso ejecutado cuando hacemos un shutdown&lt;br /&gt;::shutdown:/bin/umount -a -r&lt;/PRE&gt;&lt;br /&gt;Como vemos, la inicialización del user-space la completa el script apuntado por sysinit en inittab (/etc/init.d/rcS). Desde este script se configuran los dispositivos de red (ifconfig), se montan los virtual filesystems (/proc, /sys), se montan las particiones de datos (recordemos que la partición root ya esta montada), se inicializan los distintos servicios del sistema (http, smtp, ...). &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SscjDgBtjzI/AAAAAAAAAH8/DBTsavRQIhA/s1600-h/login.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SscjDgBtjzI/AAAAAAAAAH8/DBTsavRQIhA/s200/login.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5388314022215782194" /&gt;&lt;/a&gt;&lt;br /&gt;Finalmente se muestra en pantalla el interfaz de usuario gráfico donde el sistema solicita usuario/password para iniciar la sesion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-7372634616450717081?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/7372634616450717081/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=7372634616450717081' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7372634616450717081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7372634616450717081'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/10/secuencia-de-arranque-del-kernel-de.html' title='Kernel boot process para novatos'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/SscihwubrBI/AAAAAAAAAHs/zRFH92WVWOc/s72-c/phoenix_bios.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-2644714704060734314</id><published>2009-09-02T16:56:00.020+02:00</published><updated>2009-09-02T18:59:56.287+02:00</updated><title type='text'>Crónica de un urban runner</title><content type='html'>Hace años que practico mi afición de salir a correr por las calles de la ciudad en la que resido. Recorriendo la ciudad de esta forma uno aprende el callejero, se mantiene en forma y se relaja del stress de vivir en una gran ciudad. Como veis, el urban runner tiene muchos alicientes para practicar su deporte favorito. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/Sp6SysMf9aI/AAAAAAAAAHk/KqYzfGVmtyE/s1600-h/runners.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 86px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/Sp6SysMf9aI/AAAAAAAAAHk/KqYzfGVmtyE/s200/runners.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5376896404681651618" /&gt;&lt;/a&gt;&lt;br /&gt;Pero que nadie se olvide: ninguna practica deportiva esta exenta de riesgos. El urban runner esta continuamente expuesto al peligro de los atropellos. Obviamente, al de los coches y las motos cuando cruza la calle. Si. Pero tambien a los atropellos producidos por otros peatones cuando el urban runner transita por parques, aceras, paseos, calles... todos los sitios teóricamente "habilitados" para su práctica deportiva. Estos peatones "suicidas" presentan características muy peculiares que quiero compartir con vosotros:&lt;br /&gt;&lt;br /&gt;- Jovencitas locas que ven a lo lejos su tienda favorita y dan un aceleron, enfilando en linea recta la entrada por su puerta principal, sin importarles lo mas minimo quien se cruce en su camino.&lt;br /&gt;- Madres que se aproximan de cara con el carrito de su bebe haciendo "eses" hacia el mismo lado en el que tu intentas esquivarlas, hasta que finalmente te toca hacer una gran curva para evitarlas.&lt;br /&gt;- Niños de 4 o 5 años que van cogidos de la mano de sus papis y que cuando estas a punto de adelantarles, sueltan de la mano al niño que empieza a purular por el unico espacio libre por donde podías pasar.&lt;br /&gt;- Señoras mayores que van con su gayatito haciendo zig zag en la misma direccion en la que tu intentas esquivarlas, mientras te preguntas por qué no siguen una linea recta.&lt;br /&gt;- Jovencitas locas que salen corriendo de su tienda de ropa favorita con dos bolsas en cada mano mientras por su cabeza solo ronda la idea de entrar en su otra tienda de ropa favorita, y se lanzan a cruzar la calle sin reparar quien se aproxima por su lado.&lt;br /&gt;- Señoras mayores que ven una moneda de 2 centimos brillando en el suelo y que a pesar de que te han visto venir, deciden recogerla justo cuando estas a punto de pasar por ese mismo punto, agachandose al suelo cortandote la trayectoria.&lt;br /&gt;- El típico chulito "killo", que se encara hacia ti mientras te aproximas a el y a pesar de ir cambiando poco a poco tu trayectoria para evitar colisionar, insiste en invadir tu trayectoria recta hasta que consigue desviarte completamente.&lt;br /&gt;- Chiquillas adolescentes de 15 años con acné en la cara que se quedan mirandote mientras te acercas a ellas con cara de que les duele una muela, directas hacia la colisión te apartes hacia el lado que te apartes.&lt;br /&gt;- Grupito de señoras mayores, muy animadas, que justo terminan la conversacion cuando estas proximo a pasar por su lado y se dispersan en todas direcciones sin preocuparse mas que por seguir despidiendose de sus amigas una y otra vez a voces.&lt;br /&gt;- Divorciada maquillada y muy perfumada que tras tomarse su cafecito en el bar y pagar en la barra, sale a la calle despreocupada guardando el monedero en su bolso mientras cruza la calle sin percatarse que has estado a punto de atropellarla.&lt;br /&gt;- Personas paseando su perro con 6 metros de correa extensible cortando el paso de extremo a extremo de la calle.&lt;br /&gt;- Parejita romántica de las que andan cogiditos de la mano, a la que te acercas por su espalda e intentas adelantar por el trozo de acera que dejan libre y cuando estas a punto de hacerlo empiezan a separarse sin soltarse las manos cortardote inconscientemente el paso.&lt;br /&gt;- Señoras mayores subiditas de peso que una vez hacen la intencion de bajar un bordillo no pueden detener esa intención ni aunque se queden mirandote mientras te acercas a ellas, con lo que finalmente se cruzan involuntariamente por donde tu querías pasar.&lt;br /&gt;- Conductores que aparcan el coche a su izquierda y salen del coche, abriendo brúscamente la puerta, sin antes comprobar si alguien se acercaba por la acera.&lt;br /&gt;- Jovencitas locas que salen corriendo de su otra tienda de ropa favorita con 4 bolsas en cada mano y mientras por su cabeza ronda el remordimiento de que su tarjeta de crédito está echando chispas, se lanzan a cruzar la calle sin reparar que vienes corriendo.&lt;br /&gt;&lt;br /&gt;Esta es la lista de los atropellos mas curisosos que me han ocurrido en los últimos meses. Que nadie se preocupe: por el momento he salido ileso en todos ellos. Seguiré actualizando este post mientras la gravedad de los atropellos así me lo permita :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-2644714704060734314?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/2644714704060734314/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=2644714704060734314' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2644714704060734314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/2644714704060734314'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/09/cronica-de-un-urban-runner.html' title='Crónica de un urban runner'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/Sp6SysMf9aI/AAAAAAAAAHk/KqYzfGVmtyE/s72-c/runners.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3320237180620351772</id><published>2009-08-22T16:01:00.013+02:00</published><updated>2009-08-22T17:02:45.258+02:00</updated><title type='text'>Qt4, QComboBox y el foco del teclado</title><content type='html'>Esta vez vamos a escribir un post que será útil para desarrolladores de la libreria Qt (version 4) que tengan interes en profundizar en la gestión del foco de teclado del widget QComboBox. Vamos a modificar el comportamiento standard de este widget, y supongo que por ese motivo la documentación de la libreria es poco clara en este sentido. Por ello creo que este post os puede servir para entender mejor este asunto.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/So_94deMIQI/AAAAAAAAAHU/4rWyC0x1DsI/s1600-h/200px-Qt_logo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/So_94deMIQI/AAAAAAAAAHU/4rWyC0x1DsI/s200/200px-Qt_logo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5372792026902044930" /&gt;&lt;/a&gt;&lt;br /&gt;La idea es implementar un widget custom haciendo uso de dos de los widgets predefinidos por la libreria: QLabel y QComboBox. Nuestra widget custom (ComboLabel) compondrá el QLabel y el QComboBox en un solo widget, de forma que cuando reciba el foco del teclado, desplegará automáticamente la lista del QComboBox, y cuando pierda el foco, la esconderá automaticamente. Vamos a usar la tecla "Enter" (Qt::Key_Enter) para hacer la transición del foco.&lt;br /&gt;&lt;br /&gt;Este problema no plantea complicaciones en entornos donde existe un raton o una pantalla tactil, ya que en estos casos, el puntero aisla de los problemas de foco. Sin embargo, en los sistemas donde el único dispositivo de entrada es un teclado, la gestion del foco se convierte en uno de los problemas clave a gestionar y resolver por el desarrollador. Bueno, en uno mas :-)&lt;br /&gt;&lt;br /&gt;Os planteo una primera propuesta para resolver el problema que en principio debe parecer obvia (aunque veremos que no funciona). Primero crear una subclase de QWidget (ComboLabel) que componga una instancia de la clase QLabel y de QComboBox en un mismo layout. Despues reimplementar los filtros de entrada (focusInEvent) y salida (focusOutEvent) del foco, para mostrar y ocultar automáticamente la lista. Por ultimo reimplementar el filtro de eventos de teclado (keyPressEvent) para hacer la transicion del foco cuando el usuario pulse la tecla Qt::Key_Enter.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ComboLabel::ComboLabel(QString title, QWidget *parent) : QWidget(parent)&lt;br /&gt;{&lt;br /&gt;    setFocusPolicy(Qt::StrongFocus);&lt;br /&gt;&lt;br /&gt;    m_label = new QLabel(title);&lt;br /&gt;    m_combo = new QComboBox;&lt;br /&gt;&lt;br /&gt;    QHBoxLayout * mainLayout = new QHBoxLayout;&lt;br /&gt;    mainLayout-&gt;addWidget(m_label);&lt;br /&gt;    mainLayout-&gt;addWidget(m_combo);&lt;br /&gt;    setLayout(mainLayout);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboLabel::focusInEvent(QFocusEvent * event)&lt;br /&gt;{&lt;br /&gt;    m_combo-&gt;showPopup();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboLabel::focusOutEvent(QFocusEvent * event)&lt;br /&gt;{&lt;br /&gt;    m_combo-&gt;hidePopup();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboLabel::keyPressEvent(QKeyEvent * event)&lt;br /&gt;{&lt;br /&gt;    switch(event-&gt;key()) {&lt;br /&gt;        case Qt::Key_Enter:&lt;br /&gt;            focusNextChild();&lt;br /&gt;            break;&lt;br /&gt;        default:&lt;br /&gt;            QWidget::keyPressEvent(event);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Esta propuesta parece obvia pero no funciona como queremos. El problema viene dado por la implementación del QComboBox, ya que este widget esta compuesto internamente por dos widgets, un QLineEdit y un QAbstractItemView, y cuando el QAbstractItemView del QComboBox toma el foco del teclado, nunca mas lo devuelve al padre. ¿Como resolvemos entonces este asunto?&lt;br /&gt;&lt;br /&gt;La solución del problema (bastante tricky como vereis) consiste en crear una clase ComboBox (derivada de QComboBox), e instalar un filtro de eventos (installEventFilter()) en la vista desplegada (view()). Con este filtro se detectan los eventos de pulsacion de tecla sobre el QAbstractItemView, y se hace la transicion del foco cuando el usuario pulsa sobre dicha vista la tecla Qt::Key_Enter. Para terminar, cuando el widget recibe el foco debe desplegar la vista (showPopup()) y cuando abandona el foco, debe esconderla (hidePopup()). Ambos métodos deben ser reimplementados tal y como veremos, ya que la implementación de la clase padre (QComboBox) no es suficiente para nuestro objetivo. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SpAHv0xveYI/AAAAAAAAAHc/MutdtJBrLDY/s1600-h/combolabel.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 160px; height: 200px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SpAHv0xveYI/AAAAAAAAAHc/MutdtJBrLDY/s200/combolabel.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5372802873655523714" /&gt;&lt;/a&gt;&lt;br /&gt;Veamos los detalles:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;ComboLabel::ComboLabel(QString title, QWidget *parent) : QWidget(parent)&lt;br /&gt;{&lt;br /&gt;    m_label = new QLabel(title);&lt;br /&gt;    m_combo = new ComboBox;&lt;br /&gt;&lt;br /&gt;    QHBoxLayout * mainLayout = new QHBoxLayout;&lt;br /&gt;    mainLayout-&gt;addWidget(m_label);&lt;br /&gt;    mainLayout-&gt;addWidget(m_combo);&lt;br /&gt;    setLayout(mainLayout);&lt;br /&gt;&lt;br /&gt;    setFocusProxy(m_combo);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ComboBox::ComboBox(QWidget * parent) : QComboBox(parent)&lt;br /&gt;{&lt;br /&gt;    view()-&gt;installEventFilter(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bool ComboBox::eventFilter(QObject * obj, QEvent * event)&lt;br /&gt;{&lt;br /&gt;    if (obj == view() &amp;&amp; event-&gt;type() == QEvent::KeyPress) {&lt;br /&gt;        QKeyEvent *keyEvent = static_cast&lt;QKeyEvent *&gt;(event);&lt;br /&gt;        switch (keyEvent-&gt;key()) {&lt;br /&gt;            case Qt::Key_Enter:&lt;br /&gt;                hidePopup();&lt;br /&gt;                focusNextChild();&lt;br /&gt;                return QComboBox::eventFilter(obj, event);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return QObject::eventFilter(obj, event);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboBox::showPopup()&lt;br /&gt;{&lt;br /&gt;    if (!(view()-&gt;isVisible())) {&lt;br /&gt;        setRootModelIndex(QModelIndex());&lt;br /&gt;        QComboBox::showPopup();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboBox::hidePopup()&lt;br /&gt;{&lt;br /&gt;    if (view()-&gt;isVisible()) {&lt;br /&gt;        setRootModelIndex(view()-&gt;currentIndex().parent());&lt;br /&gt;        setCurrentIndex(view()-&gt;currentIndex().row());&lt;br /&gt;        QComboBox::hidePopup();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ComboBox::focusInEvent(QFocusEvent * event)&lt;br /&gt;{&lt;br /&gt;    if (count() &gt; 0) showPopup(); else focusNextChild();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Para que podais probar el ejemplo en vuestro ordenador y analizarlo con mas calma, os dejo este &lt;a href="http://socios.aditel.org/%7Eicastell/develex/qt4/combolabel.tgz"&gt;tarball&lt;/a&gt; aqui. Insistid porque parece que el servidor web también esta de vacaciones :-). En él encontrareis todos los fuentes listos para ser compilados.&lt;br /&gt;&lt;br /&gt;Espero que este pequeño ejemplo os sirva en el futuro para resolver mejor vuestros problemas de foco con QComboBox'es y toda clase de widgets custom que implementeis de ahora en adelante. La librería Qt4 es una librería muy extensa, asi que si alguien tiene interés en tratar algun tema en particular, podeis mandarme un correo sin ningun compromiso e intentaré hacer lo que pueda para ayudaros.&lt;br /&gt;&lt;br /&gt;Por cierto... ¿que tal lo habeis pasado estas vacaciones? Las mías cortitas, este verano se han terminado pronto. Y terminadas las vacaciones, como veis, volvemos con energias renovadas y mas ganas de transmitir nuevos conocimientos a los lectores de este blog. Estamos en epoca de crisis, pero ilusion que no falte, que mientras nadie diga lo contrario... ¡sigue siendo gratis! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3320237180620351772?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3320237180620351772/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3320237180620351772' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3320237180620351772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3320237180620351772'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/08/qt4-qcomboboxes-y-el-foco-del-teclado.html' title='Qt4, QComboBox y el foco del teclado'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p6JYGqjuqSI/So_94deMIQI/AAAAAAAAAHU/4rWyC0x1DsI/s72-c/200px-Qt_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5538084864492808042</id><published>2009-08-01T09:50:00.020+02:00</published><updated>2009-08-01T12:47:25.019+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='-'/><title type='text'>Organizar un proyecto en C con librerias</title><content type='html'>Los programadores newbies en Linux podeis aprovechar este post para aprender a compilar y a usar vuestras librerías en C. Encontrareis muchos manuales en Internet mucho mas extensos y elaborados que este, pero yo lo que quiero transmitiros son conocimientos de forma rapida, para que lo pilleis a la primera sin necesidad de que perdais mucho tiempo. Así que, sin anestesia, nos ponemos manos a la obra:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SnQRljssYtI/AAAAAAAAAHM/Kok3kKm5h3I/s1600-h/librerias.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SnQRljssYtI/AAAAAAAAAHM/Kok3kKm5h3I/s200/librerias.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5364932393040634578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Información de background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Segun programamos, encontramos funciones que se usan en muchas partes de nuestro codigo. Nos interesa tenerlas en un directorio separado, compiladas y listas para poder usarlas siempre que queramos. Las ventajas de esto son enormes:&lt;br /&gt;- Evitamos los continuos copy/paste (código mas compacto)&lt;br /&gt;- Reducimos tiempo de compilacion (solo se compilan una vez)&lt;br /&gt;- Aumentamos fiabilidad con el tiempo de uso (mas probadas, menos bugs)&lt;br /&gt;&lt;br /&gt;La librería estara compuesta por uno o mas ficheros .c fuentes y uno o mas ficheros .h de cabeceras. Veamos un ejemplo:&lt;br /&gt;&lt;PRE&gt;$ cat milib.h&lt;br /&gt;#ifndef _MI_LIB_H&lt;br /&gt;#define _MI_LIB_H&lt;br /&gt;int suma(int a, int b);&lt;br /&gt;int resta(int a, int b);&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;$ cat milib.c&lt;br /&gt;int suma(int a, int b) { return a+b; }&lt;br /&gt;int resta(int a, int b) { return a-b; }&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Librerías estáticas vs librerías dinámicas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En linux podemos hacer dos tipos de librerías:&lt;br /&gt;- Librerias estáticas&lt;br /&gt;- Librerias dinámicas&lt;br /&gt;&lt;br /&gt;Las librerías estaticas se añaden a la imagen de nuestro ejecutable. Una vez hecha esta operación, la librería puede borrarse y el código sigue funcionando, ya que nuestro binario resultante contiene todo lo que necesita de la librería. &lt;br /&gt;&lt;br /&gt;Las librerías dinámicas no se añaden a la imagen de nuestro ejecutable. El ejecutable debe buscar la librería siempre que la necesite, y por tanto, la librería dinámica no puede borrarse, o nuestro programa dejaría de funcionar.&lt;br /&gt;&lt;br /&gt;La elección del tipo de librería que debeis usar depende de la naturaleza del proyecto desarrollado. Es una eleccion en la que debeis valorar ventajas e inconvenientes, y llegar a un compromiso entre ambas:&lt;br /&gt;- Ejecutable estatico ocupa mas espacio&lt;br /&gt;- Ejecutable estatico es mas facil de instalar en otro PC&lt;br /&gt;- Ejecutable estatico es mas rapido&lt;br /&gt;- Ejecutable dinamico aprovecha mejoras de la librería compatible con el código del programa&lt;br /&gt;- Ejecutable dinamico requiere refactorización con cambios incompatibles&lt;br /&gt;&lt;br /&gt;En Linux (en general Unix) las librerías estáticas se nombran con la extension .a (libmia.a) y las librerías dinámicas se nombran con la extension .so (libmia.so).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Receta para construir y usar una librería estática&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Partimos de nuestro programa miprograma.c y de los fuentes de nuestra libreria milib.c. &lt;br /&gt;&lt;PRE&gt;$ cat miprograma.c&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;int main(void) {&lt;br /&gt;    printf("%d\n", suma(10,10));&lt;br /&gt;    printf("%d\n", resta(10,10));&lt;br /&gt;}&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;Veamos los pasos necesarios para construir y hacer uso de una librería estática:&lt;br /&gt;- Obtener los ficheros objeto .o de todos los fuentes .c de nuestra libreria&lt;br /&gt;&lt;PRE&gt;$ gcc -c milib.c -o milib.o&lt;/PRE&gt;&lt;br /&gt;- Crear la libreria .a&lt;br /&gt;&lt;PRE&gt;$ ar -rv libmia.a milib.o&lt;/PRE&gt;&lt;br /&gt;- Compilar nuestro programa, linkando con la libreria estatica&lt;br /&gt;&lt;PRE&gt;$ gcc -o miprograma miprograma.c -I. -L. -Bstatic -lmia&lt;/PRE&gt;&lt;br /&gt;Observar que -Bstatic -lmia indica que se debe coger la libreria libmia.a. El prefijo lib y la extension .a ya las pone automaticamente el compilador gcc. La opción -Bstatic afecta a todas las librerías que van detrán en la línea de compilación. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Receta para compilar y usar una librería dinámica&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Partimos de nuestro programa miprograma.c y de los fuentes de nuestra libreria milib.c. Veamos los pasos necesarios para construir y hacer uso de una librería dinámica:&lt;br /&gt;- Obtener los ficheros objeto .o de todos los fuentes .c de nuestra libreria&lt;br /&gt;&lt;PRE&gt;$ gcc -c milib.c -o milib.o&lt;/PRE&gt;&lt;br /&gt;- Crear la libreria .so&lt;br /&gt;&lt;PRE&gt;$ ld -o libmia.so milib.o -shared&lt;/PRE&gt;&lt;br /&gt;- Compilar nuestro programa, linkando con la libreria dinámica&lt;br /&gt;&lt;PRE&gt;$ gcc -o miprograma miprograma.c -I. -L. -Bdynamic -lmia&lt;/PRE&gt;&lt;br /&gt;Observar que -Bdynamic -lmia indica que se debe coger la libreria libmia.so El prefijo lib y la extension .so ya las pone automaticamente el compilador gcc. La opción -Bdynamic afecta a todas las librerías que van detrán en la línea de compilación. &lt;br /&gt;&lt;br /&gt;El comando ldd sirve para ver las librerias dinamicas con las que se ha linkado un programa. Por ejemplo:&lt;br /&gt;&lt;PRE&gt;$ ldd miprograma&lt;br /&gt;linux-gate.so.1 =&gt;  (0xbfffe000)&lt;br /&gt;libmia.so =&gt; not found&lt;br /&gt;libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0xb7e6f000)&lt;br /&gt;/lib/ld-linux.so.2 (0xb7faa000)&lt;/PRE&gt;&lt;br /&gt;Como vemos en el ejemplo, el programa no encuentra la libreria libmia.so. Hay que decirle al programa donde estan las librerías dinámicas. Para ello definimos la variable de entorno LD_LIBRARY_PATH de esta manera:&lt;br /&gt;&lt;PRE&gt;$ export LD_LIBRARY_PATH=/path/a/miprograma&lt;br /&gt;$ ldd miprograma&lt;br /&gt;linux-gate.so.1 =&gt;  (0xbfffe000)&lt;br /&gt;libmia.so =&gt; /path/a/miprograma/libmia.so (0xb7f2f000)&lt;br /&gt;libc.so.6 =&gt; /lib/tls/i686/cmov/libc.so.6 (0xb7df7000)&lt;br /&gt;/lib/ld-linux.so.2 (0xb7f34000)&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cierre del post&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es hora de que practiqueis vosotros, os tomeis un tiempo para probar este ejemplo y asimilar los conceptos, y empeceis a aplicar estos conocimientos en vuestros futuros proyectos. &lt;br /&gt;&lt;br /&gt;Yo me despido del blog hasta despues del verano. Hoy cumplo 33 años y quiero aprovechar la ocasión para dedicarle este post a todos mis lectores, y en especial a aquellos que se acuerden de felicitarme. Os agradezco a todos las felicitaciones, pero yo lo que quiero son regalos little bit frikies! ;-) Que paseis un buen verano y nos leemos en Septiembre! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5538084864492808042?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5538084864492808042/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5538084864492808042' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5538084864492808042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5538084864492808042'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/08/organizar-un-proyecto-en-c-con.html' title='Organizar un proyecto en C con librerias'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/SnQRljssYtI/AAAAAAAAAHM/Kok3kKm5h3I/s72-c/librerias.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-4880239084127735636</id><published>2009-07-10T19:27:00.014+02:00</published><updated>2009-07-11T11:34:22.754+02:00</updated><title type='text'>Estiramientos para calentar y enfriar</title><content type='html'>Me gustaría dedicar este post a todos los deportistas newbies, que por el motivo que sea deciden cambiar sus habitos de vida sedentarios por otros mas saludables. Esa energia que os animó en su momento a dar el primer paso puede aportaros mucha satisfacción a lo largo de vuestras vidas, pero debeis encauzarla adecuadamente para que no se os acabe pronto la mecha. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SleYzC83HhI/AAAAAAAAAHE/25UyEoZskPc/s1600-h/estiramientos-abuela.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 138px; height: 200px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SleYzC83HhI/AAAAAAAAAHE/25UyEoZskPc/s200/estiramientos-abuela.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5356918284513386002" /&gt;&lt;/a&gt;&lt;br /&gt;Y es que mucha gente abandona en pocas semanas la practica de deporte por falta de motivación, o peor aún, por alguna lesión producida por alguna sobrecarga durante sus primeras semanas de entrenamiento. &lt;br /&gt;&lt;br /&gt;No podemos luchar contra la falta de motivación. Es un tema muy personal que depende de los gustos y la capacidad de sacrificio de cada individuo. Pero si podemos dar algunos consejos para reducir la aparición de las temidas lesiones, y evitar así culparlas de un temprano abandono de la actividad fisica.&lt;br /&gt;&lt;br /&gt;Antes de iniciar cualquier actividad deportiva, sea del tipo que sea, es necesario realizar un buen calentamiento. Y lo voy a recalcar para que quede bien claro: hay que hacerlo siempre. Se trata de poner en funcionamiento el aparato locomotor, lo que yo llamo "arranque de motores". Lo mismo debe repetirse despues de terminar la actividad física, pero a la inversa, es decir, realizar un buen enfriamiento, o "parada de motores". Es como si cogemos un coche y lo ponemos de 0 a 200Km/h sin hacerle el rodaje. Lo mismo si apagamos el contacto del motor cuando el coche va a 200Km/h. (Bueno, lo dejaré en 120Km/h que no quiero incitaros a sobrepasar los limites de velocidad legales). Como podeis imaginar, el motor sufrirá mucho y correreis el riesgo de griparlo. Nuestro cuerpo funciona como el motor de ese coche. Por tanto debemos tratarlo con el mismo cuidado.&lt;br /&gt;&lt;br /&gt;Para la fase de calentamiento os recomiendo realizar un trote suave "borriquero" de 5 minutos y tal como lo termineis, realizar la siguiente tabla de estiramientos (desde la cabeza hasta los pies). Debe llevaros unos 10/12 minutos en total.&lt;br /&gt;&lt;br /&gt;- 10rep mirar nuestro hombro izquierdo y despues mirar nuestro hombro derecho.&lt;br /&gt;- 10rep apoyar la oreja sobre el hombro izquierdo y despues sobre el derecho&lt;br /&gt;- 10rep mirar al techo y al suelo&lt;br /&gt;- 10rep elevación hombros con los brazos pegados al cuerpo (hacia arriba)&lt;br /&gt;- 10rep rotación hombros con los brazos pegados al cuerpo (rotación delantera)&lt;br /&gt;- 10rep rotación hombros con los brazos pegados al cuerpo (rotación trasera)&lt;br /&gt;- 10sec con mano izquierda, coger codo derecho y llevarlo al hombro izquierdo &lt;br /&gt;- 10sec con mano derecha, coger codo izquierdo y llevarlo al hombro derecho&lt;br /&gt;- 10sec codo derecho en la nuca estirando hacia la izq. con mano izquierda&lt;br /&gt;- 10sec codo izquierdo en la nuca estirando hacia la der. con mano derecha&lt;br /&gt;- 10sec mano der. por el cuello y izq. por debajo espalda, coger manos y hacer un 8&lt;br /&gt;- 10sec mano izq. por el cuello y der. por debajo espalda, coger manos y hacer un 8&lt;br /&gt;- 10sec mano der. a la cintura y mano izq. por encima de la cabeza, doblar cintura&lt;br /&gt;- 10sec mano izq. a la cintura y mano der. por encima de la cabeza, doblar cintura&lt;br /&gt;- 10sec separar piernas, dejar caer cintura, palmas tocan suelo&lt;br /&gt;- 10sec separar piernas, dejar caer cintura a la izq. manos tocando tobillo izq.&lt;br /&gt;- 10sec separar piernas, dejar caer cintura a la der. manos tocando tobillo der.&lt;br /&gt;- 10sec separar piernas, dejar caer culo sobre tobillo der. y estirada pierna izquierda&lt;br /&gt;- 10sec separar piernas, dejar caer culo sobre tobillo izq. y estirada pierna derecha&lt;br /&gt;- 10sec mirando al frente, estirar pierna izq. hacia delante sin mover la pierna der.&lt;br /&gt;- 10sec mirando al frente, estirar pierna der. hacia delante sin mover la pierna izq.&lt;br /&gt;- 10sec fuerza para tumbar una pared, manteniendo recta pierna izq. sin doblar rodilla&lt;br /&gt;- 10sec fuerza para tumbar una pared, manteniendo recta pierna der. sin doblar rodilla&lt;br /&gt;- 10sec de pie, cruzar pie izq. sobre pie der. y tocar tobillos con las manos&lt;br /&gt;- 10sec de pie, cruzar pie der. sobre pie izq. y tocar tobillos con las manos&lt;br /&gt;- 10sec de pie, subir talon izq. sobre un bordillo y mantener flexionado&lt;br /&gt;- 10sec de pie, subir talon der. sobre un bordillo y mantener flexionado&lt;br /&gt;- 10rep de pie, rotacion tobillo izq. apagando colilla sentido horario&lt;br /&gt;- 10rep de pie, rotacion tobillo izq. apagando colilla sentido antihorario&lt;br /&gt;- 10rep de pie, rotacion tobillo der. apagando colilla sentido horario&lt;br /&gt;- 10rep de pie, rotacion tobillo der. apagando colilla sentido antihorario&lt;br /&gt;- 10rep de pie, flexionar rodillas, rotacion de ambas en sentido horario&lt;br /&gt;- 10rep de pie, flexionar rodillas, rotacion de ambas en sentido antihorario&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para la fase de enfriamiento, nunca pareis de golpe y os senteis en un sofá, debeis andar durante 5 minutos mientras os bajan las pulsaciones. Despues os recomiendo realizar la siguiente tabla de estiramientos en la que todos los ejercicios se hacen en el suelo. En total son 6/8 minutos mas.&lt;br /&gt;&lt;br /&gt;- 10sec juntar las plantas de los pies y tirar las rodillas al suelo&lt;br /&gt;- 10sec pierna izq. estirada al frente y tocar punta del pie.&lt;br /&gt;- 10sec pierna der. estirada al frente y tocar punta del pie.&lt;br /&gt;- 10sec abrir piernas y estirar brazos intentando tocar el suelo con el pecho &lt;br /&gt;- 10sec abrir piernas y estirar brazos y coger pie izq. con las dos manos&lt;br /&gt;- 10sec abrir piernas y estirar brazos y coger pie der. con las dos manos&lt;br /&gt;- 10sec acostado boca arriba, llevar rodilla izq. sobre el pecho&lt;br /&gt;- 10sec acostado boca arriba, llevar rodilla der. sobre el pecho&lt;br /&gt;- 10sec acostado boca arriba, llevar rodilla izq. y rodilla der. sobre el pecho&lt;br /&gt;- 10sec acostado boca abajo, presionar talon del pie izq. sobre el culo&lt;br /&gt;- 10sec acostado boca abajo, presionar talon del pie der. sobre el culo&lt;br /&gt;- 10sec acostado boca abajo, presionar talones del pie izq. y der. sobre el culo&lt;br /&gt;&lt;br /&gt;Estos ejercicios mejorarán la elasticidad de vuestros musculos. Con ello evitareis lesiones musculares, sobrecargas, contracturas, distensiones. Tambien son buenos como remedio contra las agujetas. &lt;br /&gt;&lt;br /&gt;Si haceis bien estos ejercicios podreis practicar deporte por muchísimo tiempo sin tener prácticamente lesiones tontas, y os será mas dificil abandonar el deporte con la excusa de que a vosotros os ha tratado mal, que el deporte es malo para salud, o frases por el estilo que seguro habeis escuchado en mas de una ocasión. Vosotros disponeis de la información necesaria para hacer mejor las cosas y no abandonar a la primera. Es hora de ponerse manos a la obra, chicos. ¡A estirar se ha dicho!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-4880239084127735636?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/4880239084127735636/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=4880239084127735636' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/4880239084127735636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/4880239084127735636'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/07/calentamiento-para-evitar-lesiones.html' title='Estiramientos para calentar y enfriar'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/SleYzC83HhI/AAAAAAAAAHE/25UyEoZskPc/s72-c/estiramientos-abuela.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3584305623061856401</id><published>2009-04-25T11:37:00.021+02:00</published><updated>2009-04-25T17:32:01.665+02:00</updated><title type='text'>Operación bikini: howto</title><content type='html'>Llega el veranito y con su cercanía mucha gente empieza a plantearse lo de apuntarse a un gimnasio y ponerse a dieta para perder unos kilitos y lucir un bonito cuerpo en la playa. &lt;br /&gt;&lt;br /&gt;No soy experto en la materia. INEF se convirtió en mi vocación frustrada cuando tome la decision de hacerme informático (que por otra parte se trata de mi vocación realizada ;-) De todas formas, creo que conozco lo suficiente del tema como para daros algunos trucos y consejos que seguro os serviran para mejorar vuestro aspecto fisico en general. Y es que son ya 21 años practicando distintos deportes, 7 de los cuales con entrenadores nacionales de baloncesto, y los 14 restantes aplicando por mi cuenta los conocimientos que de ellos aprendí cuando todavía era un adolescente.&lt;br /&gt;&lt;br /&gt;Asi que sin mas vacilación, nos ponemos manos a la obra y entramos en materia. ¡Que tiemblen los kilos de mas!&lt;br /&gt;&lt;br /&gt;Tres puntos basicos para alcanzar nuestro objetivo:&lt;br /&gt;- Alimentación&lt;br /&gt;- Hidratación&lt;br /&gt;- Deporte&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Punto básico 1: Alimentación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La alimentación es básica para mejorar nuestro aspecto físico (y nuestra salud). Se trata de aprender a comer bien, y tener la fuerza de voluntad suficiente para no pecar comiendo cosas que estan muy ricas pero que no le hacen ninguna falta a nuestro organismo. Ya os digo que no vais a pasar hambre, asi que tranquilos que nadie va a tener que preocuparse por eso.&lt;br /&gt;&lt;br /&gt;De la alimentacion necesitamos entender tres cosas importantes:&lt;br /&gt;- Reducir la ingestión de grasas&lt;br /&gt;- Aumentar la ingestión de fibras&lt;br /&gt;- Dosificar la ingestion de hidratos y proteinas.&lt;br /&gt;&lt;br /&gt;Las grasas sirven de muy poco para nuestro organismo. Se acumulan rapidamente como reservas energeticas y pronto aparecen los malditos michelines. Por ello debemos prescindir por completo del consumo de bolleria (donuts, bollycaos, croissants, etc) y alimentos fritos (patatas fritas, carne frita, huevos fritos, etc.). Tambien hay que eliminar de la dieta los productos lácteos sin descremar y las yemas de huevo, ya que contienen una alta concentración de grasas saturadas y colesterol. Por tanto, cuando compremos yogures, queso o leche, debemos elegir productos desnatados.&lt;br /&gt;&lt;br /&gt;No obstante, nuestro organismo necesita el aporte de una cantidad minima de grasas al dia que vamos a ingerir de las carnes blancas (pechugas de pollo y pavo) y del pescado. Tambien os recomiendo tomar una cucharada de aceite de oliva virgen crudo al dia, lo que ayuda a eliminar el colesterol malo de nuestro organismo. Por ultimo, está demostrado que la grasa vegetal de las nueces es muy eficaz para destruir el colesterol malo, asi que también vamos a incluirlas en nuestra dieta diaria.&lt;br /&gt;&lt;br /&gt;La fibra nos permitira ir al baño con regularidad. Si queremos perder peso, ¿no es esto lo mas facil? :-) Para ello el truco son los copos de avena, eso si que os va a dar regularidad y no los danones Activia. Hace cosa de 2 años que descubri ésto y desde entonces soy un reloj de cucko :-) Y por supuesto, la verdura (ensaladas) y fruta.&lt;br /&gt;&lt;br /&gt;Los hidratos de carbono (arroz, pasta y patata) son la gasolina de nuestro organismo: cuanta mas actividad física, mayores necesidades de hidratos tendreis. Las proteínas (carne de pollo y pavo, pescado y claras de huevo) son las que reconstruyen las fibras de vuestros musculos provocadas por el desgaste del día a día. Por dosificar la ingestión de hidratos y proteínas me refiero a que en funcion de la actividad física que tengais cada día, tendreis que aumentar/disminuir la cantidad que tomareis, aumentándola los dias que realiceis ejercicio fisico y disminuyendola el resto de los días. Lo importante es que consumais la energia suficiente para desenvolveros en vuestro día a día con normalidad, pero nunca mas de la necesaria.&lt;br /&gt;&lt;br /&gt;Una vez tenemos claros los alimentos que nos convienen, vamos a ver como organizar las comidas del día. Existe la leyenda urbana que dice que haciendo solo 3 comidas al día podremos adelgazar mas que si comemos 4 o 5 veces... Yo no soy partidario de esa teoría y no os lo recomiendo en absoluto. Al hacer menos comidas al día, se tiende a llenar mas el estomago en cada comida para no pasar hambre hasta la siguiente comida, y eso hace que las paredes de vuestro estomago se agranden. Al tener mayor volumen en el estomago, podeis llenarlo con mas cantidad de alimentos, con lo cual va a provocar que cada vez que comais lo lleneis mas y mas, lo cual os llevará a tener un estomago todavia mas grande (...).&lt;br /&gt;&lt;br /&gt;Yo os recomiendo hacer 5 comidas al dia, mas o menos una cada 3 horas, en cantidades que no os quedeis con hambre, pero tampoco os hincheis demasiado. Se trata de que entre las comidas no noteis sensación de estar hambrientos. El cuerpo siempre debe tener alimento suficiente para que podais desenvolveros con vuestras tareas cotidianas con normalidad.&lt;br /&gt;&lt;br /&gt;Tambien es importante la hora del día a la que tomais cada alimento. Los hidratos de carbono (arroz, pasta, patata...) no los tomeis mas tarde de la comida de mediodia, ya que los quemareis durante la actividad fisica que hagais por la tarde. En cambio, si los tomais en la cena, antes de iros a dormir, vuestro organismo no los consumirá, y los acumulará como reservas energeticas que os haran engordar por la noche.&lt;br /&gt;&lt;br /&gt;En concreto, yo os aconsejo estas 5 comidas (prohibido picar entre comidas).&lt;br /&gt;- Desayuno (7/8h)&lt;br /&gt;- Almuerzo (10/11h)&lt;br /&gt;- Comida (13/15h)&lt;br /&gt;- Merienda (17/18h)&lt;br /&gt;- Cena (20/22h)&lt;br /&gt;&lt;br /&gt;Para el desayuno, el bol de copos de avena con leche desnatada. Esto es lo basico para que vayais al baño con regularidad. Es increible, pero en 3 semanas estareis notando los resultados.&lt;br /&gt;&lt;br /&gt;Para el almuerzo, un bocadillo de atun natural (que podeis acompañar con tomate natural o con unas aceitunas), de pechuga de pavo, o de tortilla francesa sin freir (como si hicierais una creppe).&lt;br /&gt;&lt;br /&gt;Para la comida, de primer plato arroz, pasta o hervido. Y de segundo una pechuga de pollo o de pavo a la plancha, o bien una sepia a la plancha o un poco de pescado (sardina, emperador, lenguado). Y de postre una o dos piezas de fruta (kiwis, naranjas, manzanas, peras o piña).&lt;br /&gt;&lt;br /&gt;Para la merienda, un platano, un yogourt 0% grasa, unas almendras o avellanas, unos cereales o unas galletas Maria, y podeis incluir un quesito burgo de arias 0% grasa con mermelada o membrillo.&lt;br /&gt;&lt;br /&gt;Y para la cena, una crema de verduritas (yo compro cremas Knorr) con una cucharadita de aceite y unas cuantas nueces. O bien una ensalada con tomate, lechuga, pepino, cebolla, maiz, media manzana, dos esparragos, unas nueces y un huevo duro (prescindiendo de la yema). Y que podeis combinar con atun natural o con dos patitas de cangrejo congelado. Y de postre otra pieza de fruta.&lt;br /&gt;&lt;br /&gt;Os pongo las fotos de una comida tipica de mi dieta de un dia cualquiera del año:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfLcFODX3UI/AAAAAAAAAGU/QLZ-KgN0NwU/s1600-h/desayuno.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfLcFODX3UI/AAAAAAAAAGU/QLZ-KgN0NwU/s200/desayuno.jpg" alt="" id="BLOGGER_PHOTO_ID_5328563291362417986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfLcUR7aHvI/AAAAAAAAAGc/y-j2qsKdvI4/s1600-h/almuerzo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfLcUR7aHvI/AAAAAAAAAGc/y-j2qsKdvI4/s200/almuerzo.jpg" alt="" id="BLOGGER_PHOTO_ID_5328563550100791026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SfLchpK35zI/AAAAAAAAAGk/gbJMqeJDnZU/s1600-h/comida.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SfLchpK35zI/AAAAAAAAAGk/gbJMqeJDnZU/s200/comida.jpg" alt="" id="BLOGGER_PHOTO_ID_5328563779677972274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SfLcucFxWdI/AAAAAAAAAGs/mDHkv7LWl94/s1600-h/merienda.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SfLcucFxWdI/AAAAAAAAAGs/mDHkv7LWl94/s200/merienda.jpg" alt="" id="BLOGGER_PHOTO_ID_5328563999505209810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SfLc8YPb9bI/AAAAAAAAAG0/vW1hYPm-inY/s1600-h/cena.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SfLc8YPb9bI/AAAAAAAAAG0/vW1hYPm-inY/s200/cena.jpg" alt="" id="BLOGGER_PHOTO_ID_5328564238990177714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como veis, hay variedad. Es una dieta sana, equilibrada y que os permitira perder grasa de vuestro cuerpo con facilidad. Al no ingerir mucha grasa, vuestro organismo ira quemando (poco a poco) las reservas de grasa que teneis acumuladas en las paredes de vuestros músculos, por tanto estareis consiguiendo vuestro objetivo de reducir volumen y perder peso de una forma sana.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Punto básico 2: Hidratación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es otro de los aspectos básicos para que mejoreis vuestro aspecto fisico (y vuestra salud). El cuerpo humano esta formado en un 65/70% por agua, por tanto debemos depurar esa cantidad de liquido constantemente. Para ello se recomienda beber como mínimo 2l de agua al dia. Para controlar la cantidad consumida, os recomiendo comprar una botella de agua de 2l de plastico, y rellenarla cada dia, teniendo en cuenta que antes de iros a dormir debe estar vacia todos los días. El agua filtrará nuestro organismo, eliminando impurezas, toxinas y tejidos adiposos, asi que ya sabeis que cada vez que orineis estareis mejorando vuestro estado de salud, por tanto cuanto mas agua bebais, mejor.&lt;br /&gt;&lt;br /&gt;Otro aspecto importante es cuando debeis beber ese agua. Yo os recomiendo que lo hagais entre comidas y eviteis beber agua durante las comidas. La razón es muy simple: si llenais el estomago de agua cuando estais comiendo, pronto sentireis que estais llenos y que no teneis mas hambre. Una hora mas tarde estareis con la tripa vacia (el agua no alimenta mucho) y desesperados por picar algo antes de la siguiente comida. &lt;br /&gt;&lt;br /&gt;Los dias que practiqueis algun deporte, al terminar la actividad física debeis beberos un zumo de frutas o una bebida isotónica como el Isostar o el Aquarius para reponer las vitaminas y las sales minerales que hayais perdido de la sudoración durante el ejercicio.&lt;br /&gt;&lt;br /&gt;Por ultimo, olvidaros de las bebidas con gases, como la CocaCola, la Fanta, gaseosa o derivados. Os hincharan mucho y no es eso lo que buscamos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Punto básico 3: Deporte&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mucha gente piensa que con hacer un poco de deporte se puede adelgazar, y eso no es del todo cierto. El 70% del cuerpo de un deportista de élite esta basado en su dieta. Sin una correcta alimentación, el deportista nunca llegaría a tener ese cuerpo. Pero tambien es cierto que no solo se consigue comiendo bien. Por tanto, dieta y deporte se complementan uno al otro.&lt;br /&gt;&lt;br /&gt;Ya hemos aprendido a comer y a beber bien. Nos queda por explicar que ejercicios debemos hacer para aprovechar la dieta sana que estamos haciendo y acelerar el metabolismo de nuestro cuerpo para que consuma mas energia de la que ingerimos comiendo.&lt;br /&gt;&lt;br /&gt;Esta demostrado que practicar deporte 1 o 2 días a la semana sirve de poco. Imagina que durmieras solo dos días a la semana: el Viernes y el Sabado: el resto de la semana estarías muerto de sueño. Si dormimos todos los días y comemos todos los días, ¿no deberíamos hacer deporte todos los dias? &lt;br /&gt;&lt;br /&gt;Los buenos resultados se consiguen practicando ejercicio al menos 3 días a la semana, aunque yo os recomiendo 5 días. Esta claro que necesitais acostumbrar el cuerpo a la carga de trabajo, asi que empezar haciendo 3 días a la semana e ir incrementando el ritmo muy poco a poco, sin ninguna prisa.&lt;br /&gt;&lt;br /&gt;Yo planifico mis entrenamientos en 5 días a la semana, repartiendo todos los grupos musculares que entreno entre esos 5 días: &lt;br /&gt;&lt;br /&gt;- Piernas (3 días por semana)&lt;br /&gt;- Pecho (1 dia por semana)&lt;br /&gt;- Triceps (1 dia por semana)&lt;br /&gt;- Hombros (1 dia por semana)&lt;br /&gt;- Biceps (1 dia por semana)&lt;br /&gt;- Dorsales (1 dia por semana)&lt;br /&gt;- Abdominales (4 días por semana)&lt;br /&gt;&lt;br /&gt;En concreto, organizo mis entrenamientos de esta forma:&lt;br /&gt;&lt;br /&gt;Primer día:&lt;br /&gt;5 minutos estiramientos de activación&lt;br /&gt;15 minutos carrera farlek (sprint ritmo 3.30 min/km + recuperacion ritmo 6 min/km)&lt;br /&gt;3 ejercicios de pecho (serie de 3x12)&lt;br /&gt;3 ejercicios de triceps (serie de 3x12)&lt;br /&gt;200 abdominales en series de 20/30&lt;br /&gt;5 minutos estiramientos de parada&lt;br /&gt;&lt;br /&gt;Segundo día:&lt;br /&gt;5 minutos estiramientos activación&lt;br /&gt;15 minutos carrera continua (ritmo 5 min/km)&lt;br /&gt;Ejercicios con pesas de los distintos grupos musculares de las piernas.&lt;br /&gt;200 abdominales en series de 20/30&lt;br /&gt;5 minutos estiramientos de parada&lt;br /&gt;&lt;br /&gt;Tercer día:&lt;br /&gt;5 minutos estiramientos activación&lt;br /&gt;3 ejercicios de hombro (serie de 3x12)&lt;br /&gt;3 ejercicios de biceps (serie de 3x12)&lt;br /&gt;200 abdominales en series de 20/30&lt;br /&gt;5 minutos estiramientos de parada&lt;br /&gt;&lt;br /&gt;Cuarto día:&lt;br /&gt;10 minutos carrera continua (ritmo 5.30 min/km)&lt;br /&gt;5 minutos estiramientos activación&lt;br /&gt;30 minutos de sprints pista atletismo&lt;br /&gt;5 minutos estiramientos de parada&lt;br /&gt;&lt;br /&gt;Quinto día:&lt;br /&gt;5 minutos estiramientos activación&lt;br /&gt;5 ejercicios de dorsales (serie de 3x12)&lt;br /&gt;200 abdominales en series de 20/30&lt;br /&gt;5 minutos estiramientos de parada&lt;br /&gt;&lt;br /&gt;Si hay alguien muy interesado en conocer mas detalles de este entrenamiento, que se ponga en contacto conmigo y se los daré con mucho gusto. Y como no se puede predicar sin dar ejemplo, los que me conoceis ya sabreis que no me gusta presumir de mi cuerpo, pero si no os enseño una foto no vais a creer en los resultados, asi que ahi va esta instantánea para motivar al personal:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfMia973dLI/AAAAAAAAAG8/CzHGDAr_qoY/s1600-h/29072008632.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SfMia973dLI/AAAAAAAAAG8/CzHGDAr_qoY/s200/29072008632.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5328640630807033010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Con esfuerzo estais todos capacitados para conseguirlo. Si lo intentais, pronto obtendreis los primeros resultados. Y con los primeros resultados, la motivación necesaria para seguir adelante aumentará. Espero que me comenteis los resultados si poneis este plan de dieta/entrenamiento en práctica. Tambien agradecería que gente con mas conocimientos en esta materia me corrija si hay algo que pudiera mejorarse. ¡Animo gente! ¡Como vamos a presumir este verano de cuerpo bonito!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3584305623061856401?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3584305623061856401/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3584305623061856401' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3584305623061856401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3584305623061856401'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/04/operacion-bikini-howto.html' title='Operación bikini: howto'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/SfLcFODX3UI/AAAAAAAAAGU/QLZ-KgN0NwU/s72-c/desayuno.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5770023468715697974</id><published>2009-03-21T17:50:00.014+01:00</published><updated>2009-04-01T19:12:51.627+02:00</updated><title type='text'>El targetfs de un sistema embedded</title><content type='html'>Un sistema embedded es un sistema informático de bajo coste, y de propósito general, que corre sobre una plataforma hardware con recursos generalmente escasos. El hecho de que los recursos hardware escaseen en el sistema embedded, plantea problemas nuevos al ingeniero de software generalmente acostumbrado a trabajar con un ordenador de sobremesa. Imagina por un momento que tuvieras que instalar una distribución de Linux de las tipicas (Ubuntu, Fedora, Suse, etc.) en un disco duro de solo 4MB. Una distribucion Debian tipica minima (excluyendo el kernel) ocupa unos 40MB, demasiado para nuestro sistema embedded. Necesitas una alternativa bastante mas ligera.&lt;br /&gt;&lt;br /&gt;El objetivo de este post es generar un targetfs para el sistema embedded que tenga disponibles todas las aplicaciones del user-space necesarias para manejar tu dispositivo embedded (target). Para ello usaremos la herramienta &lt;a href="http://busybox.net/"&gt;busybox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/ScUiCl5jLjI/AAAAAAAAAGM/h9Zv-qOnlPg/s1600-h/busybox.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 164px; height: 116px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/ScUiCl5jLjI/AAAAAAAAAGM/h9Zv-qOnlPg/s200/busybox.png" alt="" id="BLOGGER_PHOTO_ID_5315692363109314098" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Su manual (man) lo define como "The Swiss Army Knife of Embedded Linux", algo asi como "la navaja suiza de los Linux embedded". Busybox es un único binario que combina pequeñas versiones de los distintos comandos basicos de un sistema Linux. En terminologia busybox, cada comando basico es un "applet". La lista de los 107 applets incluidos no tiene desperdicio:&lt;br /&gt;&lt;br /&gt;       addgroup, adduser, adjtimex, ar, arping, ash, awk, basename, bunzip2,&lt;br /&gt;       busybox, bzcat, cal, cat, chgrp, chmod, chown, chroot, chvt, clear, cmp,&lt;br /&gt;       cp, cpio, crond, crontab, cut, date, dc, dd, deallocvt, delgroup, deluser,&lt;br /&gt;       devfsd, df, dirname, dmesg, dos2unix, dpkg, dpkg-deb, du, dumpkmap,&lt;br /&gt;       dumpleases, echo, egrep, env, expr, false, fbset, fdflush, fdformat, fdisk,&lt;br /&gt;       fgrep, find, fold, free, freeramdisk, fsck.minix, ftpget, ftpput, getopt,&lt;br /&gt;       getty, grep, gunzip, gzip, halt, hdparm, head, hexdump, hostid, hostname,&lt;br /&gt;       httpd, hush, hwclock, id, ifconfig, ifdown, ifup, inetd, init, insmod,&lt;br /&gt;       install, ip, ipaddr, ipcalc, iplink, iproute, iptunnel, kill, killall,&lt;br /&gt;       klogd, lash, last, length, linuxrc, ln, loadfont, loadkmap, logger, login,&lt;br /&gt;       logname, logread, losetup, ls, lsmod, makedevs, md5sum, mesg, mkdir,&lt;br /&gt;       mkfifo, mkfs.minix, mknod, mkswap, mktemp, modprobe, more, mount, msh, mt,&lt;br /&gt;       mv, nameif, nc, netstat, nslookup, od, openvt, passwd, patch, pidof, ping,&lt;br /&gt;       ping6, pipe_progress, pivot_root, poweroff, printf, ps, pwd, rdate,&lt;br /&gt;       readlink, realpath, reboot, renice, reset, rm, rmdir, rmmod, route, rpm,&lt;br /&gt;       rpm2cpio, run-parts, rx, sed, seq, setkeycodes, sha1sum, sleep, sort,&lt;br /&gt;       start-stop-daemon, strings, stty, su, sulogin, swapoff, swapon, sync,&lt;br /&gt;       sysctl, syslogd, tail, tar, tee, telnet, telnetd, test, tftp, time, top,&lt;br /&gt;       touch, tr, traceroute, true, tty, udhcpc, udhcpd, umount, uname,&lt;br /&gt;       uncompress, uniq, unix2dos, unzip, uptime, usleep, uudecode, uuencode,&lt;br /&gt;       vconfig, vi, vlock, watch, watchdog, wc, wget, which, who, whoami, xargs,&lt;br /&gt;       yes, zcat&lt;br /&gt;&lt;br /&gt;Busybox funciona usando argv[0] para determinar el applet que debe invocar. Al renombrar el binario de busybox con el nombre de un applet determinado, se ejecuta dicho applet. Sin embargo esto no es practico. El truco que usa busybox es tener un único binario llamado "busybox" y tener un enlace (link) simbólico distinto por cada applet apuntando al binario de busybox. Asi por ejemplo:&lt;br /&gt;&lt;pre&gt;$ ls -l /bin&lt;br /&gt;-rwxr-xr-x     1 0 0  272800 busybox&lt;br /&gt;lrwxrwxrwx     1 0 0      12 sh -&gt; busybox&lt;br /&gt;lrwxrwxrwx     1 0 0      12 cp -&gt; busybox&lt;br /&gt;lrwxrwxrwx     1 0 0      12 ls -&gt; busybox&lt;/pre&gt;&lt;br /&gt;Para crear los enlaces simbólicos, se usa el comando ln:&lt;br /&gt;&lt;pre&gt;$ ln -fs busybox sh&lt;br /&gt;$ ln -fs busybox cp&lt;br /&gt;$ ln -fs busybox ls&lt;/pre&gt;&lt;br /&gt;Así por ejemplo, para ejecutar un listado largo usando el applet ls, hacemos:&lt;br /&gt;&lt;pre&gt;$ /bin/ls -l&lt;/pre&gt;&lt;br /&gt;donde /bin/ls es en realidad un link apuntando al binario busybox.&lt;br /&gt;&lt;br /&gt;Para compilar busybox, hay que descargar los fuentes, preferiblemente del sitio oficial http://www.busybox.net/downloads/. Para obtener los fuentes de la versión 1.9.0 y extraer su contenido, hacemos esto:&lt;br /&gt;&lt;pre&gt;$ cd /usr/src&lt;br /&gt;$ wget http://www.busybox.net/downloads/busybox-1.9.0.tar.gz&lt;br /&gt;$ tar xvfz busybox-1.9.0.tar.gz&lt;/pre&gt;&lt;br /&gt;Durante el proceso de configuración de la compilación de busybox, el usuario decide los applets que integra el binario resultante una vez compilado. Para ello, busybox emplea un método similar al de la compilación del kernel de Linux (.config), pudiendo usar varias opciones:&lt;br /&gt;&lt;pre&gt;$ make allnoconfig&lt;br /&gt;$ make oldconfig&lt;br /&gt;$ make menuconfig&lt;/pre&gt;&lt;br /&gt;Para realizar la compilación, basta con ejecutar el comando make, igual que se hace con el kernel de Linux, y el binario resultante aparece en la raiz de los fuentes:&lt;br /&gt;&lt;pre&gt;$ make&lt;/pre&gt;&lt;br /&gt;Despues de un buen rato esperando, tendras compilado tu busybox.&lt;br /&gt;&lt;br /&gt;Retomando el objetivo inicial de este post, nos interesa generar un targetfs para el dispositivo embedded. Para ello crea una partición de 4MB en un fichero de tu disco duro (por ejemplo targetfs4M.img) y crear un sistema de ficheros en su interior (por ejemplo, formatealo con EXT2).&lt;br /&gt;&lt;pre&gt;$ dd if=/dev/zero of=targetfs4M.img bs=1M count=8&lt;br /&gt;$ mkfs.ext2 -F targetfs4M.img&lt;/pre&gt;&lt;br /&gt;Despues monta la partición de 4MB recien creada (targetfs4M.img) en el sistema de ficheros de tu ordenador de sobremesa, por ejemplo en el directorio /media/removable.&lt;br /&gt;&lt;pre&gt;$ mount -o loop targetfs4M.img /media/removable&lt;/pre&gt;&lt;br /&gt;Por ultimo instala el binario de busybox en el targetfs de tu sistema embedded:&lt;br /&gt;&lt;pre&gt;$ make install CONFIG_PREFIX=/media/removable&lt;/pre&gt;&lt;br /&gt;La instalación copia el binario del busybox en /media/removable (en la partición de 4MB montada en ese directorio) y crea en su interior todos los enlaces simbólicos a los applets configurados y compilados dentro del directorio de compilación.&lt;br /&gt;&lt;br /&gt;Con esto ya tienes un targetfs básico para tu sistema embedded. No estará completo porque deberás añadir la aplicación que deba correr tu sistema embedded, pero ya dispones de un buen punto de partida para empezar a jugar con tu sistema. Ah! Y no olvides hacer un sync y desmontar /media/removable antes de hacer nada mas con esa partición!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5770023468715697974?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5770023468715697974/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5770023468715697974' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5770023468715697974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5770023468715697974'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/03/el-targetfs-de-un-sistema-embedded.html' title='El targetfs de un sistema embedded'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/ScUiCl5jLjI/AAAAAAAAAGM/h9Zv-qOnlPg/s72-c/busybox.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5300964032792423563</id><published>2009-02-27T19:08:00.016+01:00</published><updated>2009-02-27T21:16:41.751+01:00</updated><title type='text'>Ya no me gustas GNOME: bienvenido XFCE</title><content type='html'>He sido usuario de GNOME durante los últimos 5 años. No tenía nada en contra de KDE (de hecho desarrollo habitualmente con la libreria Qt), pero una vez me acostumbré a sus atajos de teclado, llegó el momento que sin ellos mi vida ya no tenia sentido. ¡Que sería de mi si no pudiera abrir un nuevo tag del terminal con Mays+Ctrl+t [...]!&lt;br /&gt;&lt;br /&gt;GNOME y KDE son dos de los escritorios de Linux mas extendidos en la actualidad. Los dos cumplen su función de manera extraordinaria, facilitando las tareas a los usuarios, sobre todo a aquellos usuarios que yo llamo "de la generación ventana", poco o nada acostumbrados al uso del terminal. (A todos vosotros, no sabeis lo que os perdeis. Bueno, este será tema de otro debate).&lt;br /&gt;&lt;br /&gt;Sin embargo, ambos escritorios comparten un serio problema que me disgusta bastante, acentuado sobre todo en sus últimas versiones: un consumo de recursos exagerado, que causa una caida notable del rendimiento del PC. Esta perdida de rendimiento se nota mucho mas en los PCs con menos cantidad de memoria RAM. ¿No era ese uno de los motivos por los que yo no gustaba de usar Windows [...]?&lt;br /&gt;&lt;br /&gt;En el caso de GNOME corriendo en mi PC con 1GB de memoria RAM, mas de 500MB los consumía GNOME, el solito. Y claro, cuando los recursos de tu PC escasean y la economía no está para muchos extras tecnológicos (esperaremos tiempos mejores), uno tiene que mirar alternativas que satisfagan sus necesidades de la mejor manera posible. &lt;br /&gt;&lt;br /&gt;Y buscando por google encontré una alternativa que me gustó, y me gustó mucho. Tanto que desde entonces ha pasado a ser el nuevo escritorio de mi PC. Se trata del escritorio XFCE (version 4) que viene de serie en la distribución XUbuntu. &lt;br /&gt;&lt;br /&gt;Como podeis ver en este pantallazo, a primera vista se trata de un escritorio similar a cualquier otro que ya esteis acostumbrados a usar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/Sag1GYceM6I/AAAAAAAAAFo/tdJb4qRo2qY/s1600-h/desktop.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 125px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/Sag1GYceM6I/AAAAAAAAAFo/tdJb4qRo2qY/s200/desktop.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307550544613487522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si seguis mirando capturas de pantalla vereis que pese a su sencillez, es bastante completo: un panel con multitud de opciones para su configuración, escritorios virtuales, transparencias en las ventanas, en los marcos, applets para la barra de tareas. Y por lo que he podido probar hasta ahora, muy estable.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/Sag5xJNK5bI/AAAAAAAAAFw/SOlf7IN7pRo/s1600-h/config.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 125px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/Sag5xJNK5bI/AAAAAAAAAFw/SOlf7IN7pRo/s200/config.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307555677303662002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/Sag59JEa7WI/AAAAAAAAAF4/EbczYiJq1qg/s1600-h/window1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 125px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/Sag59JEa7WI/AAAAAAAAAF4/EbczYiJq1qg/s200/window1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307555883425394018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/Sag6IRQTVbI/AAAAAAAAAGA/zYc1Sg2-5PI/s1600-h/window2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 125px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/Sag6IRQTVbI/AAAAAAAAAGA/zYc1Sg2-5PI/s200/window2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5307556074601272754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Estamos de acuerdo en que no es un GNOME+compiz con escritorios virtuales rotando en 3D con efectos de aguas al mover la ventanas, iconos animados y tal. Pero, ¿y que me aporta a mi toda esa parafernalia? Pues en realidad muy poco. Esas características las usamos mas para presumir de escritorio bonito que para aumentar nuestra productividad.&lt;br /&gt;&lt;br /&gt;En cambio, ¿que gano yo usando XFCE? Un escritorio que consume 14MBytes en memoria RAM, y deja libre casi 1GByte de memoria RAM para que se ejecuten las aplicaciones de mi PC. Desde que lo he instalado, mis aplicaciones estan radiantes de felicidad, dando saltos de alegría por los bits de mi memoria RAM. Todas han abandonado el cuarto oscuro llamado "la partición de swap" por completo. Y me lo agradecen todos los días dandome unos tiempos de respuesta inauditos desde hacía mucho tiempo. Y ese placer espiritual que produce poder abrir un nuevo tag del xfce4-terminal con Mays+Ctrl+t [...] &lt;br /&gt;&lt;br /&gt;¿Que mas se le puede pedir a un escritorio? Sin duda alguna... ¡Me gustas XFCE, bienvenido a mi PC!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5300964032792423563?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5300964032792423563/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5300964032792423563' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5300964032792423563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5300964032792423563'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/02/ya-no-me-gusta-gnome-bienvenido-xfce.html' title='Ya no me gustas GNOME: bienvenido XFCE'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/Sag1GYceM6I/AAAAAAAAAFo/tdJb4qRo2qY/s72-c/desktop.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3790866548967287082</id><published>2009-01-31T22:52:00.004+01:00</published><updated>2009-02-02T22:39:09.346+01:00</updated><title type='text'>Usando valgrind + memcheck como debugger</title><content type='html'>Linus Torvalds declaró en &lt;a href="http://lwn.net/2000/0914/a/lt-debugger.php3"&gt;este&lt;/a&gt; post su postura contraria al uso de debuggers en el kernel, argumentando que son herramientas usadas por los malos desarrolladores que, lejos de aprender de sus errores, se concentran en resolver el problema sin profundizar en la causa real del error. Y por tanto, prefiere mantenerlos lejos del desarrollo del kernel. Desde luego que tiene mucha razón (palabra de Linus).&lt;br /&gt;&lt;br /&gt;Mi postura, no tan radical, aunque totalmente de acuerdo con sus argumentos. Es deseable desarrollar con sumo cuidado e intentar evitar todos los fallos durante la codificación, pues detectarlos a posteriori en ocasiones puede ser complicado. Sin embargo, puede que tengamos que analizar algun core de código que no hemos escrito nosotros. Y en una línea que nunca en la vida debería fallar. ¿Que esta ocurriendo?. ¿Que hacemos ahora? Es en estos casos cuando necesitamos ayuda de lo que yo llamo "las fuerzas especiales".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SYTaK329ZuI/AAAAAAAAAFQ/0zV6ZRjW-lo/s1600-h/valgrind.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 58px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SYTaK329ZuI/AAAAAAAAAFQ/0zV6ZRjW-lo/s200/valgrind.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5297598942022559458" /&gt;&lt;/a&gt;&lt;br /&gt;En este post os voy a explicar como usar el debugger valgrind con la herramienta memcheck para detectar 5 errores comunes en la programación de C/C++. Lo vemos en estos 5 test:&lt;br /&gt;&lt;br /&gt;Test 1: Detección de una perdida de memoria:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;03 int main()&lt;br /&gt;04 {&lt;br /&gt;05     char *x = malloc(100); /* memory leak */&lt;br /&gt;06     return 0;&lt;br /&gt;07 }&lt;br /&gt;$ gcc -g test1.c -o test1&lt;br /&gt;$ valgrind --tool=memcheck --leak-check=yes ./test1&lt;br /&gt;==8458== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1&lt;br /&gt;==8458==    at 0x4C265AE: malloc (vg_replace_malloc.c:207)&lt;br /&gt;==8458==    by 0x40051D: main (test1.c:5)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 2: Detectar escrituras fuera de los limites de la memoria reservada:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;03 int main()&lt;br /&gt;04 {&lt;br /&gt;05     char *x = malloc(10);&lt;br /&gt;06     x[10] = 'a'; /* write out of bounds */&lt;br /&gt;07     return 0;&lt;br /&gt;08 }&lt;br /&gt;$ gcc -g test2.c -o test2&lt;br /&gt;$ valgrind --tool=memcheck --leak-check=yes ./test2&lt;br /&gt;==17039== Invalid write of size 1&lt;br /&gt;==17039==    at 0x40052A: main (test2.c:6)&lt;br /&gt;==17039==  Address 0x519d03a is 0 bytes after a block of size 10 alloc'd&lt;br /&gt;==17039==    at 0x4C265AE: malloc (vg_replace_malloc.c:207)&lt;br /&gt;==17039==    by 0x40051D: main (test2.c:5)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 3: Detectar el uso de variables sin inicializar:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;03 int main()&lt;br /&gt;04 {&lt;br /&gt;05     int x;&lt;br /&gt;06     if (x == 0) /* uninitialised variable */&lt;br /&gt;07         printf("x is zero");&lt;br /&gt;08     return 0;&lt;br /&gt;09 }&lt;br /&gt;$ gcc -g test3.c -o test3&lt;br /&gt;$ valgrind --tool=memcheck --leak-check=yes ./test3&lt;br /&gt;==17070== Conditional jump or move depends on uninitialised value(s)&lt;br /&gt;==17070==    at 0x400518: main (test3.c:6)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 4: Intentar liberar una zona de memoria que no ha sido reservada:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;03 int main(void)&lt;br /&gt;04 {&lt;br /&gt;05     char * str;&lt;br /&gt;06     free(str); /* free not allocated */&lt;br /&gt;07     return 0;&lt;br /&gt;08 }&lt;br /&gt;$ gcc -g test4.c -o test4&lt;br /&gt;$ valgrind --tool=memcheck --leak-check=yes ./test4&lt;br /&gt;==17092== Conditional jump or move depends on uninitialised value(s)&lt;br /&gt;==17092==    at 0x4C25265: free (vg_replace_malloc.c:323)&lt;br /&gt;==17092==    by 0x40051C: main (test4.c:6)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Test 5: delete en C++ mal hecho:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;01 int main(void)&lt;br /&gt;02 {&lt;br /&gt;03     char * str = new char[10];&lt;br /&gt;04     delete str; // instead of: delete [] v;&lt;br /&gt;05     return 0;&lt;br /&gt;06 }&lt;br /&gt;$ g++ -g test5.c -o test5&lt;br /&gt;$ valgrind --tool=memcheck --leak-check=yes ./test5&lt;br /&gt;==17116== Mismatched free() / delete / delete []&lt;br /&gt;==17116==    at 0x4C24DAD: operator delete(void*) (vg_replace_malloc.c:342)&lt;br /&gt;==17116==    by 0x40067A: main (test5.cpp:4)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hemos visto que valgrind es una herramienta de mucha ayuda para un desarrollador de C/C++ que sin duda nos ayudará a resolver muchos bugs. No obstante, tambien tiene sus limitaciones, por ejemplo que memcheck no comprueba los limites en los arrays estaticos, y por tanto no detecta este error:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;01 int main()&lt;br /&gt;02 {&lt;br /&gt;03     char x[10];&lt;br /&gt;04     x[11] = 'a'; /* not detected! */&lt;br /&gt;05     return 0;&lt;br /&gt;06 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;No obstante, debemos recordar las palabras de Linus. Los debugger son para los malos programadores. Y nosotros queremos ser buenos programadores. Asi que debemos aprender de nuestros errores e intentar que no vuelvan a repetirse en el futuro. Si seguis estos consejos, los debuggers tienen los días contados :-) En todo caso, para mi, el mejor debugger que ha existido y que siempre existirá es el printf (en C) o el cout (en C++).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3790866548967287082?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3790866548967287082/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3790866548967287082' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3790866548967287082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3790866548967287082'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/01/6-usos-de-valgrind-memcheck.html' title='Usando valgrind + memcheck como debugger'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p6JYGqjuqSI/SYTaK329ZuI/AAAAAAAAAFQ/0zV6ZRjW-lo/s72-c/valgrind.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-3814419812166282807</id><published>2009-01-23T19:10:00.000+01:00</published><updated>2009-01-24T11:00:04.136+01:00</updated><title type='text'>Controla tu tarifa plana de Orange</title><content type='html'>Todos debemos (deberíamos) llevar un control exhaustivo del gasto mensual que hacemos en la factura de nuestro teléfono movil, y mas en plena época de crisis en la que siempre viene tan bien ahorrarse unas pelillas. Lo primero sin duda es elegir una tarifa que se adapte a vuestras necesidades.&lt;br /&gt;&lt;br /&gt;En mi caso, tengo la tarifa plana de Orange: pago 22 euros al mes y hablo 1000 minutos gratis. Eso siempre que las llamadas sean dentro de la franja horaria de 18-08h. Los SMS y las llamadas fuera de la franja horaria se pagan aparte. El problema de la tarifa plana es que Orange no proporciona ningún servicio para controlar los minutos consumidos (ya me informé en su momento, muy mal hecho señores de Orange) y cuando (como en mi caso) apuras el consumo mensual hasta el último suspiro, a veces puedes llevarte sorpresas desagradables si no controlas el tiempo.&lt;br /&gt;&lt;br /&gt;Este post explica como controlar los minutos que todavía os quedan disponibles para seguir llamando, y así poder apurar al máximo los minutos gratuitos. Para ello necesitas dos cosas: el listado de llamadas del periodo de facturación actual (en formato .txt) y un bash shell script en Linux que desarrollé hace algun tiempo y que extrae la información de esa factura.&lt;br /&gt;&lt;br /&gt;El bash shell script lo teneis disponible aqui.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://socios.aditel.org/%7Eicastell/develex/bash/orangeTarifaPlanaActual.sh"&gt;http://socios.aditel.org/~icastell/develex/bash/orangeTarifaPlanaActual.sh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Esta licenciado bajo GPL, asi que podeis usarlo y modificarlo a vuestro antojo, siempre que respeteis la licencia.&lt;br /&gt;&lt;br /&gt;Para conseguir el listado de llamadas del periodo de facturación actual, hay que darse de alta en la página de Orange, enviando un SMS (gratuito) desde vuestro movil Orange al 222, con el texto CLAVE seguido de un espacio y la clave entre 6 y 8 dígitos, por ejemplo: CLAVE 12345678. Después os autentificais en el área de clientes de su página web &lt;a href="http://www.orange.es/"&gt;http://www.orange.es&lt;/a&gt;, introduciendo vuestro número de teléfono y el password que hayais elegido en el SMS:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SXoWnhVOG0I/AAAAAAAAAD0/PZZFd7JMvx4/s1600-h/login_orange.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 100px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SXoWnhVOG0I/AAAAAAAAAD0/PZZFd7JMvx4/s200/login_orange.png" alt="" id="BLOGGER_PHOTO_ID_5294569180145523522" border="0" /&gt;&lt;/a&gt;En el menú que aparece a la izquierda, hay que seleccionar dentro del apartado "mi factura y consumo", la opción "listado de llamadas" e insertar en el calendario el periodo de facturación en el que estais interesados:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SXoXwvEJpyI/AAAAAAAAAD8/azQtlrVqmCs/s1600-h/listado_llamadas.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 138px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SXoXwvEJpyI/AAAAAAAAAD8/azQtlrVqmCs/s200/listado_llamadas.png" alt="" id="BLOGGER_PHOTO_ID_5294570437962475298" border="0" /&gt;&lt;/a&gt;En pantalla aparece un listado de todas las llamadas realizadas en el periodo de facturación indicado en el paso anterior. Lo siguiente es pulsar el boton que aparece al pie de la pagina "Imprimir todas las paginas", tal y como muestra la siguiente imagen:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SXpEznjcLEI/AAAAAAAAAEU/J9vLEFbIOoY/s1600-h/imprimir_todas.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 146px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SXpEznjcLEI/AAAAAAAAAEU/J9vLEFbIOoY/s200/imprimir_todas.png" alt="" id="BLOGGER_PHOTO_ID_5294619965509086274" border="0" /&gt;&lt;/a&gt;Al pulsar ese boton aparece una ventana emergente para iniciar la impresión. Esa ventana no será necesaria, debes cerrarla. En pantalla tendrás el listado de todas las llamadas realizadas. Debes seleccionarlo al completo desde la primera llamada hasta la última, y usar la función de copiar/pegar para guardarlo en un fichero de texto llamado factura.txt (en realidad el nombre es irrelevante).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SXodbJ79_5I/AAAAAAAAAEM/q_-0a0nDaRI/s1600-h/seleccion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SXodbJ79_5I/AAAAAAAAAEM/q_-0a0nDaRI/s200/seleccion.png" alt="" id="BLOGGER_PHOTO_ID_5294576664288558994" border="0" /&gt;&lt;/a&gt;Ya tienes el listado de llamadas. Ese listado lo vas a usar como input del script que ya debes haber descargado. Para probarlo, basta con que ejecutes esto en linea de comandos del bash:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; font-family: courier new;"&gt;&lt;span style="font-size:78%;"&gt;$ orangeTarifaPlanaActual.sh factura.txt&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Los resultados del script son concluyentes:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left; font-family: courier new;"&gt;&lt;span style="font-size:78%;"&gt;Gasto en llamadas sin descuentos =  234.1776 (euros)&lt;br /&gt;Gasto en llamadas con descuentos =  6.5448 (euros)&lt;br /&gt;Minutos gratis consumidos =  994.26666666666666666666&lt;br /&gt;Minutos gratis restantes =  5.73333333333333333334&lt;br /&gt;Total factura a pagar este mes =  33.111968 (euros)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Este mes nos han sobrado poco mas de 5 minutos. Podríamos haber hecho una llamadita mas. Pero mas de 200 euros de ahorro en llamadas, ¡no estan nada mal!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-3814419812166282807?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/3814419812166282807/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=3814419812166282807' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3814419812166282807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/3814419812166282807'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/01/controla-tu-tarifa-plana-de-orange.html' title='Controla tu tarifa plana de Orange'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_p6JYGqjuqSI/SXoWnhVOG0I/AAAAAAAAAD0/PZZFd7JMvx4/s72-c/login_orange.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5622148843023628484</id><published>2009-01-04T11:58:00.000+01:00</published><updated>2009-01-04T14:42:50.892+01:00</updated><title type='text'>El cubo de Rubik</title><content type='html'>Papa Noel me trajo estas Navidades un juguete nuevo muy chulo: un cubo de Rubik de 3x3. De pequeño ya tuve uno, pero me causó una gran frustración no poder resolverlo nunca y finalmente opté por despegar todas las pegatinas y pegarlas en su posición correcta. ¿Lo resolví o no? jeje. Pues si, pero a partir de entonces el cubo quedo algo dañádo, por decirlo de alguna manera, y algunas pegatinas se caian de cuando en cuando... Aquella azaña no me dejó un buen sabor de boca. Asi que estas vacaciones me puse manos a la obra, leyendo algunos manuales de Internet, para sacarme la espinita.&lt;br /&gt;&lt;br /&gt;El cubo viene resuelto de fábrica, asi que lo primero que hay que hacer es enredarlo todo lo que podais. De eso se encargó mi hermano antes de regalarmelo... ¡ya te apañaras! me dijo. ¡Que cabron! jeje Pense yo. Pero no os preocupeis porque puede resolverse desde cualquier posición. Nuestra posicion de partida del cubo es la siguiente:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCJJjPtBdI/AAAAAAAAADs/vwoBwB0UcPM/s1600-h/paso0_0.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCJJjPtBdI/AAAAAAAAADs/vwoBwB0UcPM/s200/paso0_0.jpg" alt="" id="BLOGGER_PHOTO_ID_5287376759705896402" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Para empezar hay que tomar una cara de referencia como cara superior del cubo. Sirve cualquiera, asi que vamos a tomar la blanca que me gusta mas. Debes hacer  una cruz en la cara blanca. Ademas, todas sus caras laterales deben tener el color de su celda central del mismo color que la celda que hay por encima: &lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SWCCk1QeWxI/AAAAAAAAACE/QyCZnLV9eNQ/s1600-h/paso1_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SWCCk1QeWxI/AAAAAAAAACE/QyCZnLV9eNQ/s200/paso1_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287369531816041234" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCC43BdCPI/AAAAAAAAACM/14ELA4w4j3U/s1600-h/paso1_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCC43BdCPI/AAAAAAAAACM/14ELA4w4j3U/s200/paso1_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287369875887294706" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Una vez has conseguido esto, debes completar toda la primera fila de cada lateral de su color, lo que a su vez completará la cara superior de color blanco: &lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCEdeNyPtI/AAAAAAAAACU/ucUDk9umaqM/s1600-h/paso2_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCEdeNyPtI/AAAAAAAAACU/ucUDk9umaqM/s200/paso2_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287371604394917586" border="0" /&gt;&lt;/a&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCEso2qAII/AAAAAAAAACc/ulWgwIlxfZ8/s1600-h/paso2_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCEso2qAII/AAAAAAAAACc/ulWgwIlxfZ8/s200/paso2_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287371864948736130" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Ahora debes completar la segunda fila de cada lado:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SWCFCOweswI/AAAAAAAAACk/rjoTBHZH_vE/s1600-h/paso3_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SWCFCOweswI/AAAAAAAAACk/rjoTBHZH_vE/s200/paso3_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287372235900629762" border="0" /&gt;&lt;/a&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCFNJLfk4I/AAAAAAAAACs/zT64OUosvoA/s1600-h/paso3_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCFNJLfk4I/AAAAAAAAACs/zT64OUosvoA/s200/paso3_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287372423381881730" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;En este punto, debes girar el cubo, tomando como base la cara blanca y como cara superior la cara amarilla (todavia sin completar):&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCFxNGDjeI/AAAAAAAAAC0/Bd40sIb-8QY/s1600-h/paso4_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCFxNGDjeI/AAAAAAAAAC0/Bd40sIb-8QY/s200/paso4_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287373042908106210" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Igual que hiciste con la cara blanca, debes hacer una cruz en la cara amarilla, por supuesto sin estropear la cara blanca ni las dos filas inferiores que ya tenemos en su posición correcta:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCGaV8zMJI/AAAAAAAAAC8/k3dfiDPB-tU/s1600-h/paso4_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCGaV8zMJI/AAAAAAAAAC8/k3dfiDPB-tU/s200/paso4_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287373749659840658" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Ahora todas las caras laterales deben tener el color de su celda central del mismo color que la celda que hay por encima, por supuesto respetando la cruz de color amarillo:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCG_-yg3VI/AAAAAAAAADE/2_P1TPdHOnI/s1600-h/paso5_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCG_-yg3VI/AAAAAAAAADE/2_P1TPdHOnI/s200/paso5_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287374396277710162" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;En el siguiente paso debes situar las fichas de las 4 esquinas que todavía faltan por completar en su posicion, aunque sus colores no esten bien encarados:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCIW8g1cUI/AAAAAAAAADU/8JsUIZoc5WY/s1600-h/paso6_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCIW8g1cUI/AAAAAAAAADU/8JsUIZoc5WY/s200/paso6_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287375890315309378" border="0" /&gt;&lt;/a&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_p6JYGqjuqSI/SWCHzvrYsdI/AAAAAAAAADM/iVmZ_DTyznM/s1600-h/paso6_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://1.bp.blogspot.com/_p6JYGqjuqSI/SWCHzvrYsdI/AAAAAAAAADM/iVmZ_DTyznM/s200/paso6_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287375285574480338" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Por útimo solo queda encarar con sus colores las fichas que todavia no lo esten. Y por fin, el cubo queda resuelto:&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCI0sHCXuI/AAAAAAAAADc/amjfeghzP3s/s1600-h/paso7_1.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SWCI0sHCXuI/AAAAAAAAADc/amjfeghzP3s/s200/paso7_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5287376401308212962" border="0" /&gt;&lt;/a&gt;&lt;td&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SWCI_YgocPI/AAAAAAAAADk/XiXtb1EymfU/s1600-h/paso7_2.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SWCI_YgocPI/AAAAAAAAADk/XiXtb1EymfU/s200/paso7_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5287376585025417458" border="0" /&gt;&lt;/a&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;¡Objetivo cumplido!&lt;br /&gt;&lt;br /&gt;Los algoritmos necesarios para conseguir la secuencia descrita no los he incluido aqui porque es bastante mas complicado de explicar que de entender. Hay multitud de manuales en Internet y por supuesto, podeis preguntarme aqui si teneis cualquier duda.&lt;br /&gt;&lt;br /&gt;Ha sido muy divertido aprender a resolverlo y me lo he pasado muy bien. Pero en realidad no es trivial, y desde luego no es un juguete pensado para un niño de 8 años que no reciba ninguna ayuda para resolverlo. El cubo 3x3 tiene 43 trillones de posiciones y sin una guia que te explique los pasos es prácticamente impensable que alguien pueda resolverlo por su cuenta.&lt;br /&gt;&lt;br /&gt;No obstante, en este mundo hay gente para todo, y el estadounidense Shotaro Makisumi ostenta el record mundial de velocidad en 12,11 segundos, y a ciegas en 3 minutos y 37 segundos. Desde luego que no voy a ser yo quien se lo quite...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5622148843023628484?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5622148843023628484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5622148843023628484' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5622148843023628484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5622148843023628484'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2009/01/el-cubo-de-rubik.html' title='El cubo de Rubik'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/SWCJJjPtBdI/AAAAAAAAADs/vwoBwB0UcPM/s72-c/paso0_0.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-7868204858454889032</id><published>2008-12-14T11:50:00.000+01:00</published><updated>2008-12-14T14:00:48.068+01:00</updated><title type='text'>Barcelona - Valencia</title><content type='html'>La semana pasada tuve una agradable visita en Barcelona. Aprovechando el puente de la Inmaculada, vinieron a visitarme desde Castellón mi hermano David y mi mejor amigo Xavi. Para aprovechar el viaje al máximo, decidimos comprar entradas para ver el partido de la jornada "Barcelona - Valencia".&lt;br /&gt;&lt;br /&gt;Para Xavi era el primer partido en un campo de primera división al que asistía en directo, ni mas ni menos que su querido Barcelona en el Camp Nou y contra todo un Valencia con Villa maravilla y compañía... Sin duda, ¡un partidazo! Mi hermano David y yo, merengues confesos, nunca habíamos estado en el Camp Nou, asi que era el dia perfecto para conocer al campo de nuestro eterno ribal.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_p6JYGqjuqSI/SUTuwu_D5hI/AAAAAAAAABc/PONBOocDHRk/s1600-h/06122008676.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_p6JYGqjuqSI/SUTuwu_D5hI/AAAAAAAAABc/PONBOocDHRk/s200/06122008676.jpg" alt="" id="BLOGGER_PHOTO_ID_5279607184198723090" border="0" /&gt;&lt;/a&gt;Dos horas antes del partido decidimos infiltramos en la plaza en frente del bar "La Jarra" con los seguidores cules para disfrutar del ambiente y vivir mas de cerca el partido. Entre canticos a favor del Barcelona, y algunos gritos poniendo en duda la sexualidad de Gutti (poco importaba que el ribal fuera el Valencia), tuvimos que pasar desapercibidos mientras Xavi se dejaba sus cuerdas vocales gritando en favor de los suyos.&lt;br /&gt;&lt;br /&gt;Sabedores de lo arriesgado de la situación, no era ni el momento ni el lugar apropiado para posicionarnos en favor del Real Madrid, asi que decidimos unimos a la fiesta cantando el himno del Barça como dos seguidores mas ¡Tooot el camp...! Si, soy un vendido, pero amigos seguidores del Real Madrid, era cuestion de supervivencia, ¡que Dios me perdone! :-)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUT0PhGqz7I/AAAAAAAAABs/0buw2tKTiyY/s1600-h/06122008679.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUT0PhGqz7I/AAAAAAAAABs/0buw2tKTiyY/s200/06122008679.jpg" alt="" id="BLOGGER_PHOTO_ID_5279613210606620594" border="0" /&gt;&lt;/a&gt;Media hora antes del partido entramos en el estadio. Aunque sea el eterno ribal, reconozco que el estadio me impresionó y durante unos minutos me quedé hipnotizado admirando todos sus detalles. Un cesped verde en perfectas condiciones, el video marcador gigante, los paneles publicitarios perfectamente sincronizados, la prensa haciendo su trabajo, el palco, los aficionados que poco a poco iban tomando sus asientos y como no, los jugadores de ambos equipos que ya habían iniciado el calentamiento en el terreno de juego.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUUCO5Xs18I/AAAAAAAAAB0/3Aii-BNcvpo/s1600-h/06122008683.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUUCO5Xs18I/AAAAAAAAAB0/3Aii-BNcvpo/s200/06122008683.jpg" alt="" id="BLOGGER_PHOTO_ID_5279628593103427522" border="0" /&gt;&lt;/a&gt;El arbitro dió comienzo al partido y una enorme cantidad de flashes de fotos iluminaron las gradas por unos instantes formando un campo lleno de estrellas de luz donde en el terreno de juego empezaban a brillar con luz propia las verdaderas estrellas del partido (Xavi, Messi, Henri y compañia...)&lt;br /&gt;&lt;br /&gt;El partido fué azulgrana de principio a fin. La gente se lo pasó en grande, celebrando cada gol con toda su energía. Los culé obtuvieron la recompensa que se merecían por la entrega de sus aficionados que no pararon de animarles en todo el partido. Al final, Barcelona 4 - 0 Valencia.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUTyoSDLLjI/AAAAAAAAABk/YK6A_ATKPGo/s1600-h/06122008681.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SUTyoSDLLjI/AAAAAAAAABk/YK6A_ATKPGo/s200/06122008681.jpg" alt="" id="BLOGGER_PHOTO_ID_5279611437038906930" border="0" /&gt;&lt;/a&gt;Una gran victoria del equipo catalán que mi amigo Xavi disfrutó mas que nunca, y que mi hermano David y yo, sin llegar a su eufória pero con aplausos de dos madrilistas en el Camp Nou reconociendo al Barça como justo vencedor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-7868204858454889032?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/7868204858454889032/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=7868204858454889032' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7868204858454889032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7868204858454889032'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2008/12/barcelona-valencia.html' title='Barcelona - Valencia'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_p6JYGqjuqSI/SUTuwu_D5hI/AAAAAAAAABc/PONBOocDHRk/s72-c/06122008676.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-5576251381361554480</id><published>2008-12-13T23:02:00.000+01:00</published><updated>2009-01-24T14:24:32.871+01:00</updated><title type='text'>The IT Crowd. Tercera parte</title><content type='html'>Los que ya conocíais la serie, estais de enhorabuena, pues ya estan disponibles los capitulos de la tercera temporada de la serie de televisión "The IT Crowd".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_p6JYGqjuqSI/SXsWTXb0QlI/AAAAAAAAAEs/JjR_Zoetxvs/s1600-h/it-crowd.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 110px;" src="http://3.bp.blogspot.com/_p6JYGqjuqSI/SXsWTXb0QlI/AAAAAAAAAEs/JjR_Zoetxvs/s200/it-crowd.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294850308868162130" /&gt;&lt;/a&gt;Los que no la conocíais, os la recomiendo personalmente. Es una serie muy divertida que narra las aventuras y desventuras de dos informáticos de un servicio técnico y su convivencia con el resto de los compañeros de su trabajo.&lt;br /&gt;&lt;br /&gt;A mi me hicieron reir mucho en las dos primeras temporadas y despues de tanto tiempo sin saber nada de ellos ya les echaba de menos. Y es que terminas por cogerles cariño. Esperemos que la tercera temporada esté a la altura.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-5576251381361554480?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/5576251381361554480/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=5576251381361554480' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5576251381361554480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/5576251381361554480'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2008/12/it-crowd-tercera-parte.html' title='The IT Crowd. Tercera parte'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_p6JYGqjuqSI/SXsWTXb0QlI/AAAAAAAAAEs/JjR_Zoetxvs/s72-c/it-crowd.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9034270376130887246.post-7852441507184503790</id><published>2008-12-03T18:05:00.000+01:00</published><updated>2009-01-24T14:27:46.355+01:00</updated><title type='text'>Makefile y target .PHONY</title><content type='html'>Hace tiempo que veo dentro de los Makefile unos target .PHONY que mas que a informática me recuerdan a los caballitos en los que siempre quería montar de pequeño. Hoy no pude resistir la curiosidad y aprendí a usar los dichosos "pony".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_p6JYGqjuqSI/SXsXMix2msI/AAAAAAAAAE0/Xiie3SdiVyw/s1600-h/gnu-head.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 189px;" src="http://2.bp.blogspot.com/_p6JYGqjuqSI/SXsXMix2msI/AAAAAAAAAE0/Xiie3SdiVyw/s200/gnu-head.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5294851291165924034" /&gt;&lt;/a&gt;&lt;br /&gt;La razón principal de usarlos es evitar conflictos con ficheros que tengan el mismo nombre que los target. Para entenderlo mejor, vamos a ver un ejemplo. Si escribes en el Makefile una regla con target clean para limpiar archivos temporales:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:78%;"&gt;clean:&lt;br /&gt;    rm *.temp&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;la regla se ejecutará cada vez que ejecutes 'make clean' en la shell.&lt;br /&gt;&lt;br /&gt;Sin embargo, la regla anterior no se tendrá en cuenta cuando en el directorio actual haya un fichero llamado "clean", ya que en ese caso se considera que clean es un target que se encuentra "up-to-date", y por  tanto ya no es necesario ejecutar el comando rm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;$ make clean&lt;br /&gt;make: `clean' está actualizado.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para resolver el problema, se declara un target .PHONY como este:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;.PHONY : clean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este target "especial" fuerza a que el comando rm sea ejecutado siempre, incluso cuando haya un fichero llamado "clean" en el directorio actual.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;$ make clean&lt;br /&gt;rm *.tmp&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9034270376130887246-7852441507184503790?l=aicastell.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aicastell.blogspot.com/feeds/7852441507184503790/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9034270376130887246&amp;postID=7852441507184503790' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7852441507184503790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9034270376130887246/posts/default/7852441507184503790'/><link rel='alternate' type='text/html' href='http://aicastell.blogspot.com/2008/12/makefile-y-target-phony.html' title='Makefile y target .PHONY'/><author><name>aicastell</name><uri>http://www.blogger.com/profile/04503324372247938811</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_p6JYGqjuqSI/STbim_xEWsI/AAAAAAAAAAM/4ccpFpIhR04/S220/ivan.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_p6JYGqjuqSI/SXsXMix2msI/AAAAAAAAAE0/Xiie3SdiVyw/s72-c/gnu-head.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
