<?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-32630182</id><updated>2012-01-28T14:50:00.284-08:00</updated><category term='Python'/><category term='gnome-voice-control'/><category term='CSS'/><category term='Ingeniería del Software'/><category term='Programming C'/><category term='Linux'/><category term='Arquitecturas Software'/><category term='perl'/><category term='HTML'/><category term='Tools'/><category term='Cscope'/><category term='accesibilidad'/><category term='practicum'/><category term='Emacs'/><category term='Awk'/><category term='Bash'/><category term='Programming'/><category term='svn'/><category term='Web'/><category term='gnome'/><category term='gmyspace'/><title type='text'>Últimas tecnoloxías</title><subtitle type='html'>Whatever I need to write about free software, software engineering... and any related issue</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32630182.post-4392736966005916290</id><published>2008-11-26T06:44:00.000-08:00</published><updated>2008-11-26T07:06:07.040-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>SVN commit from perl script</title><content type='html'>Although SVN is getting dead due GIT expansion, there are a lot of projects that still use it, like the one I'm involved.&lt;br /&gt;&lt;br /&gt;In order to make commits easier I've developed this perl script. You can get it from sourceforge:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/utils/"&gt;http://sourceforge.net/projects/utils/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-4392736966005916290?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/4392736966005916290/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=4392736966005916290' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4392736966005916290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4392736966005916290'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/11/svn-commit-from-perl-script.html' title='SVN commit from perl script'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-3197434946769924977</id><published>2008-11-07T16:48:00.000-08:00</published><updated>2008-11-26T07:09:48.627-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Programming tip</title><content type='html'>&lt;div style="text-align: justify;"&gt;Commonly, we have to compare constants with variables. Traditionally, it is achieved like that:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;if (variable == CONSTANT)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;But this is a common source of errors. If we write '=' instead '==', compilation will be achieved correctly, but execution maybe crash.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;In order to avoid this problem, the first member of the comparison must be the constant:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;if (CONSTANT == variable)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;This way, if we forget one 'equal' a compilation error will arise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-3197434946769924977?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/3197434946769924977/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=3197434946769924977' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3197434946769924977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3197434946769924977'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/11/programming-tip.html' title='Programming tip'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-7527862764253348281</id><published>2008-11-02T06:28:00.000-08:00</published><updated>2008-11-02T06:55:01.327-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmyspace'/><title type='text'>Coming back!</title><content type='html'>How a long from my last post!!&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;This time I've been working on HED (Home Entertainment Device), now renamed as &lt;a href="http://www.xataka.com/2008/10/08-blusens-blubrain-centro-multimedia-completo"&gt;Blu:Brain&lt;/a&gt; and finishing the &lt;a href="http://www.mastersoftwarelibre.com/"&gt;Free Software Master&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then I have to tell a lot of interesting things related these issues. Taking into account this is a personal blog, next posts will be related to the second one.&lt;br /&gt;&lt;br /&gt;To start with this review, I show you the new appearance of &lt;a href="http://ultimastecnoloxias.blogspot.com/search/label/gmyspace"&gt;GMyspace&lt;/a&gt;:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BkneNOzin8k/SQ28NsYczuI/AAAAAAAAACc/gzAa0TO0hqA/s1600-h/gmyspace-capture.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 214px;" src="http://2.bp.blogspot.com/_BkneNOzin8k/SQ28NsYczuI/AAAAAAAAACc/gzAa0TO0hqA/s400/gmyspace-capture.png" alt="" id="BLOGGER_PHOTO_ID_5264070482904010466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;As you can see, it is too closed to an useful application :)&lt;br /&gt;&lt;br /&gt;See you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-7527862764253348281?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/7527862764253348281/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=7527862764253348281' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7527862764253348281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7527862764253348281'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/11/coming-back.html' title='Coming back!'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BkneNOzin8k/SQ28NsYczuI/AAAAAAAAACc/gzAa0TO0hqA/s72-c/gmyspace-capture.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-7493011028545775669</id><published>2008-08-17T14:44:00.000-07:00</published><updated>2008-08-17T14:51:00.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmyspace'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GMySpace source code committed</title><content type='html'>&lt;a href="http://sourceforge.net/projects/gmyspace/"&gt;GMySpace&lt;/a&gt; has been accepted as project in SourceForge.net. Next step has been to upload source code to SVN repository.&lt;br /&gt;&lt;br /&gt;Currently, project is in an ALPHA development stage, but next milestone is too near. Then, BETA version will be released.&lt;br /&gt;&lt;br /&gt;You can browse source code:&lt;br /&gt;&lt;a href="http://gmyspace.svn.sourceforge.net/viewvc/gmyspace/trunk/"&gt;http://gmyspace.svn.sourceforge.net/viewvc/gmyspace/trunk/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://sourceforge.net/projects/gmyspace/"&gt;http://sourceforge.net/projects/gmyspace/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-7493011028545775669?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/7493011028545775669/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=7493011028545775669' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7493011028545775669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7493011028545775669'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/08/gmyspace-source-code-committed.html' title='GMySpace source code committed'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-6382146836525425230</id><published>2008-08-09T11:45:00.000-07:00</published><updated>2008-08-09T11:51:22.068-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmyspace'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GMySpace en Sourceforge</title><content type='html'>Como todo proyecto que se precie (de software libre &lt;span style="font-style: italic;"&gt;of course&lt;/span&gt;) GMySpace estará disponible en breve en SourceForge. Lo he dado de alta y ahora está en estado &lt;span style="font-style: italic;"&gt;"Pending"&lt;/span&gt; a la espera de ser aceptado por los administradores.&lt;br /&gt;&lt;br /&gt;Por lo pronto, la página ya existe, aúnque vacía de contenidos. Es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/gmyspace/"&gt;http://sourceforge.net/projects/gmyspace/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-6382146836525425230?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/6382146836525425230/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=6382146836525425230' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/6382146836525425230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/6382146836525425230'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/08/gmyspace-en-sourceforge.html' title='GMySpace en Sourceforge'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-8257616227164426351</id><published>2008-07-17T14:44:00.000-07:00</published><updated>2008-07-17T15:22:25.754-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><title type='text'>Testear software y JUnit</title><content type='html'>&lt;div style="text-align: justify;"&gt;Bueno... rompiendo un poco con la monotemática GNOME que llevaba últimamente, voy a hacer un pequeño inciso. Ayer, mientras paseaba por Santiago de Compostela (eso sí, después de varias horas peleádome con GLib) me fui a dar un paseíllo con mi compañero de piso. Teníamos varios puntos de paso obligados y uno de ellos era Follas Novas que, para quien no la conozca se trata de una librería enooooooooooorme de la cual, alguien del mundo de la cultura cuyo nombre no recuerdo dijo que se trataba de la otra obra de arte de Santiago (o algo así), al mismo nivel que  la catedral.&lt;br /&gt;&lt;br /&gt;El caso es que, como de costumbre en las librerías, me fui a la sección de informática y lo vi. Allí estaba esperándome. Entre una pared llena de libros de todo tipo encontré uno que hablaba de cómo probar software usando &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt;[6] como caso práctico. Me llamó la atención desde el principio ya que, como algunos sabéis, la &lt;a href="http://ultimastecnoloxias.blogspot.com/search/label/Ingenier%C3%ADa%20del%20Software"&gt;ingeniería del software&lt;/a&gt;[5] es uno de los temas que más me gustan. Después de haber estudiado y probado diversos aspectos de esta rama, como las metodologías (&lt;a href="http://www.extremeprogramming.org/"&gt;eXtreme Programming&lt;/a&gt;[4] o &lt;a href="http://es.wikipedia.org/wiki/Scrum"&gt;Scrum&lt;/a&gt;[2, 3], con la que me peleo todos los días en el trabajo), patrones de diseño,  paradigmas, etc., las metodologías de prueba era una de esas cosas que tenía pendientes.&lt;br /&gt;&lt;br /&gt;El libro en cuestión es: "&lt;a href="http://www.pearsoneducacion.com/resultado.asp?ean=9788483223543"&gt;Pruebas de software y JUnit&lt;/a&gt;"[1] de Pearson-Education.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;[1]&lt;a href="http://www.pearsoneducacion.com/resultado.asp?ean=9788483223543"&gt;http://www.pearsoneducacion.com/resultado.asp?ean=9788483223543&lt;/a&gt;&lt;br /&gt;[2][PDF]&lt;a href="http://www.navegapolis.net/files/Flexibilidad_con_Scrum.pdf"&gt;http://www.navegapolis.net/files/Flexibilidad_con_Scrum.pdf&lt;/a&gt;&lt;br /&gt;[3]&lt;a href="http://es.wikipedia.org/wiki/Scrum"&gt;http://es.wikipedia.org/wiki/Scrum&lt;/a&gt;&lt;br /&gt;[4]&lt;a href="http://www.extremeprogramming.org/"&gt;http://www.extremeprogramming.org/&lt;/a&gt;&lt;br /&gt;[5]&lt;a href="http://ultimastecnoloxias.blogspot.com/search/label/Ingenier%C3%ADa%20del%20Software"&gt;http://ultimastecnoloxias.blogspot.com/search/label/Ingenier%C3%ADa%20del%20Software&lt;/a&gt;&lt;br /&gt;[6]&lt;a href="http://www.junit.org/"&gt;http://www.junit.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-8257616227164426351?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/8257616227164426351/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=8257616227164426351' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8257616227164426351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8257616227164426351'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/07/testear-software-y-junit.html' title='Testear software y JUnit'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-2354242343942803432</id><published>2008-07-13T03:53:00.000-07:00</published><updated>2008-07-13T04:00:43.523-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmyspace'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GMySpace. Arquitectura</title><content type='html'>El siguiente esquema muestra la arquitectura de la aplicación GMySpace&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_BkneNOzin8k/SHne5Q3z5KI/AAAAAAAAACM/HxU6ujQQfm4/s1600-h/arquitectura.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_BkneNOzin8k/SHne5Q3z5KI/AAAAAAAAACM/HxU6ujQQfm4/s400/arquitectura.png" alt="" id="BLOGGER_PHOTO_ID_5222450318275765410" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Como vemos existen dos zonas claramente diferencias: backend y frontend. El frontend se encarga de la presentación de los datos al usuario; dejando para el backend las tareas de obtención y almacenamiento de la información. Esta separación en capas tiene una serie de consecuencias:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Permite la realización de distintas aplicaciones de frontend de manera sencilla, ya que no existe acoplamiento con el backend: se accede al mismo a través de una API.&lt;/li&gt;&lt;li&gt;Se puede cambiar el mecanismo de descarga y/o parseo sin que ello suponga cambio alguno para las aplicaciones de frontend.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Por otra parte, cabe destacar la inclusión de una capa de abstracción sobre la base de datos. Esto se debe a un motivo principalmente: independizar la aplicación del motor de base de datos empleado.&lt;br /&gt;&lt;br /&gt;En breve se liberará el código del backend, que está casi terminado y algún boceto inicial del frontend :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-2354242343942803432?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/2354242343942803432/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=2354242343942803432' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2354242343942803432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2354242343942803432'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/07/gmyspace-arquitectura.html' title='GMySpace. Arquitectura'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_BkneNOzin8k/SHne5Q3z5KI/AAAAAAAAACM/HxU6ujQQfm4/s72-c/arquitectura.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-3099268126427435861</id><published>2008-07-13T02:40:00.000-07:00</published><updated>2008-07-13T03:25:24.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome-voice-control'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GnomeVoiceControl. Primer contacto (y II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;En el &lt;a href="http://ultimastecnoloxias.blogspot.com/2008/06/gnomevoicecontrol-primer-contacto.html"&gt;último post[1]&lt;/a&gt; sobre &lt;span style="font-style: italic;"&gt;GnomeVoiceControl&lt;/span&gt; comentaba que tuviera dos problemillas con la instalación:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;GnomeVoiceControl&lt;/span&gt; es un applet, con lo cual está controlado por Bonobo y éste debe saber donde encontrarlo.&lt;/li&gt;&lt;li&gt;Como el objetivo de la aplicación es controlar el escritorio, se hacen continuamente llamadas de acceso al mismo. Para que esto funcione deben estar activadas las opciones de accesibilidad que, en mi caso, no lo estaban.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Básicamente se deben a mi ignorancia.&lt;br /&gt;&lt;br /&gt;El problema número uno se puede solucionar de dos maneras básicamente:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Instalar la aplicación (applet) en un directorio conocido. Esto es, en un directorio en el cual Bonobo busque por defecto, por ejemplo: &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt; /usr/libexec/&lt;/span&gt;. &lt;/span&gt;Esto se consigue con el parámetro 'target' en el configure:&lt;span style="font-weight: bold;"&gt; ./configure --target=/usr/libexec&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Establecer la variable de entorno que usa Bonobo para buscar los applets. De esta manera dejamos que el instalador lo instale donde quiera (esto es, la configuración por defecto del &lt;span style="font-weight: bold; font-style: italic;"&gt;configure&lt;/span&gt;&lt;span style="font-style: italic;"&gt;)&lt;/span&gt; y con dicha variable actualizada correctamente Bonobo tiene acceso a la aplicación.&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Para el segundo problema también existen dos soluciones:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Desde el escritorio, activar las opciones de accesibilidad:&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;System-&gt; Preferences -&gt; Assistive Technologies Preferences&lt;/span&gt; y una vez ahí activar el checkbox "Enable assistive technologies"&lt;/li&gt;&lt;li&gt;Ejecutar &lt;span style="font-weight: bold; font-style: italic;"&gt;/usr/lib/at-spi-registryd&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;En realidad fui capaz de instalarlo gracias al &lt;a href="http://carlosgc.linups.org/"&gt;Carlos GC&lt;/a&gt;[2] que, vía chat, me iba explicando estas cosillas.&lt;br /&gt;&lt;br /&gt;[1]&lt;a href="http://ultimastecnoloxias.blogspot.com/2008/06/gnomevoicecontrol-primer-contacto.html"&gt;http://ultimastecnoloxias.blogspot.com/2008/06/gnomevoicecontrol-primer-contacto.html&lt;/a&gt;&lt;br /&gt;[2]&lt;a href="http://carlosgc.linups.org/"&gt;http://carlosgc.linups.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-3099268126427435861?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/3099268126427435861/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=3099268126427435861' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3099268126427435861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3099268126427435861'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/07/gnomevoicecontrol-primer-contacto-y-ii.html' title='GnomeVoiceControl. Primer contacto (y II)'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-4046964812957146717</id><published>2008-06-29T15:58:00.000-07:00</published><updated>2008-06-29T16:15:41.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gmyspace'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GMySpace</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durante todas las asignaturas del máster, y especialmente en las de la asignatura de "Desarrollo con Software Libre" he tratado de estudiar y trastear un poquillo, según correspondiese, con los contenidos adquiridos. Algunas de esas pruebecillas las he publicado en el blog, pero otras, la mayoría no.&lt;br /&gt;&lt;br /&gt;En su día, cuando dimos programación en Bash y tecnologías relacionadas como sed o awk hice un pequeño script muy útil (al menos para mi). Se trataba de un párser de las páginas de myspace.com. Lo que hacía era quedarse con la información relativa a los conciertos de cada uno de los grupos que yo le indicaba. La verdad es que no fue fácil, en parte por mi inexperiencia pero también por el código html tan feo con el que está hecho este portal.&lt;br /&gt;&lt;br /&gt;La intención inicial era realizar una aplicación que tuviera como base dicho párser para que mostrase la información de conciertos de tus grupos favoritos de manera amigable. Pero... el máster siguió avanzando y dimos otros contenidos que también tuve que ir probando (ya lo explicaré en entradas posteriores) para no quedar atrasado (sin olvidarnos del resto de obligaciones, como el trabajo :s).&lt;br /&gt;&lt;br /&gt;Ahora bien, una vez que hemos profundizado más en el estudio de GNOME como plataforma de desarrollo y siendo esta la que he elegido para el desarrollo del prácticum, he retomado el tema del párser de MySpace. Los motivos han sido fundamentalmente:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;La utilidad de la aplicación&lt;/li&gt;&lt;li&gt;Profundizar en el conocimiento de GNOME&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;A falta de un diagrama que muestre el funcionamiento de la aplicación, explicado de palabra sería algo así: "&lt;span style="font-family: courier new;"&gt;GMySpace es una aplicación que se descarga la información de conciertos de tus grupos favoritos y te la muestra en una aplicación de escritorio con interfaz gráfica. Dicha información se descarga periódicamente o a petición del usuario y se almacena en una base de datos. La GUI se construye a partir de la información almacena en dicha BBDD y de las preferencias del usuario (ver conciertos de un grupo o de todos, ver conciertos entre dos fechas dadas, ver en formato calendario o en forma tabular, etc)&lt;/span&gt;". Para ello, las tecnologías usadas son:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;sed, awk, para parsear la página descargada&lt;/li&gt;&lt;li&gt;sqlite, como BBDD&lt;/li&gt;&lt;li&gt;GTK+, para la GUI&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Como mi lista de TODOs va bajando (lentamente, pero bajando), en breve podré centrar todos mis esfuerzos en el prácticum con lo que mis conocimientos de GNOME se verán ampliados y podré realizar más aportaciones a GnomeVoiceControl. Entretanto, y como complemento, trataré de dar forma a lo expuesto en esta entrada.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-4046964812957146717?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/4046964812957146717/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=4046964812957146717' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4046964812957146717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4046964812957146717'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/06/gmyspace.html' title='GMySpace'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-5908995468867602406</id><published>2008-06-26T10:37:00.000-07:00</published><updated>2008-06-26T11:06:49.101-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome-voice-control'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GnomeVoiceControl. Primer contacto</title><content type='html'>&lt;div style="text-align: justify;"&gt;Un mes sin postear pero no un mes sin trabajar. Más bien todo lo contrario. Han sido (y son) varios los frentes abiertos que es difícil afrontarlos todos de manera sólida y más difícil aún tener tiempo para relatarlos en el blog. Para no perder el hilo, a continuación expondré como va lo concerniente a GNOME y en concreto a GnomeVoiceControl.&lt;br /&gt;&lt;br /&gt;Primer contacto&lt;br /&gt;Lógicamente, lo primero a realizar fue descargarse el código para su posterior compilación y ejecución. Para ello accedí al SVN para, así, obtener la última versión en desarrollo:&lt;br /&gt;&lt;pre&gt;svn checkout http://svn.berlios.de/svnroot/repos/festlang/trunk/gnome-voice-control &lt;/pre&gt;Además, es necesario descargase también las siguientes librerías:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;pocketsphinx: &lt;a href="http://cmusphinx.org/download/nightly/pocketsphinx.nightly.tar.gz"&gt;http://cmusphinx.org/download/nightly/pocketsphinx.nightly.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GStreamer development packages: gstreamer-devel gstreamer-plugins-base-devel &lt;a href="http://gstreamer.freedesktop.org/"&gt;http://gstreamer.freedesktop.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GNOME development packages: libwnck-dev, libatspi-dev, gnome-panel-dev startup-notification-devel&lt;span style="font-family: monospace;"&gt;:&lt;/span&gt; &lt;a href="http://gnome.org/"&gt;http://gnome.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;GNOME build system: libtool gnome-common intltool &lt;a href="http://gnome.org/"&gt;http://gnome.org&lt;/a&gt; &lt;/li&gt;&lt;li&gt;libnotify:&lt;a href="http://www.galago-project.org/news/index.php"&gt; http://www.galago-project.org/news/index.php&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Una vez que tenemos todo instalado solo queda probarlo. Pero esto no fue trivial por varios motivos:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;GnomeVoiceControl es un applet, con lo cual está controlado por Bonobo y éste debe saber donde encontrarlo.&lt;/li&gt;&lt;li&gt;Como el objetivo de la aplicación es controlar el escritorio, se hacen continuamente llamadas de acceso al mismo. Para que esto funcione deben estar activadas las opciones de accesibilidad que, en mi caso, no lo estaban.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-weight: bold;"&gt;[to be continued...]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-5908995468867602406?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/5908995468867602406/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=5908995468867602406' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5908995468867602406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5908995468867602406'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/06/gnomevoicecontrol-primer-contacto.html' title='GnomeVoiceControl. Primer contacto'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-2222245189755086327</id><published>2008-05-26T16:07:00.000-07:00</published><updated>2008-06-01T08:18:15.788-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>GNOME</title><content type='html'>&lt;div style="text-align: justify;"&gt;Antes de entrar en la descripción de gnome-voice-control creo necesario echar un vistazo a la plataforma GNOME, sobre la cual se desarrolla la aplicación.&lt;br /&gt;&lt;br /&gt;Lo primero que hay que decir es que el lenguaje de programación es C (a diferencia de otras plataformas donde se eligen lenguajes de alto nivel , como C++ en &lt;a href="http://www.kde.org"&gt;KDE&lt;/a&gt;[1] o C# en &lt;a href="http://www.mono-project.com"&gt;MONO&lt;/a&gt;[2]). Hablar de C siempre asusta un poco. Se asocia a trabajar a bajo nivel sin mucha más ayuda que la agudeza de cada cual. Ahora bien, la eficiencia en tiempo y espacio lograda en dicho lenguaje no es equiparable a ningún otro, la cual ha sido siempre la principal baza de C ante el resto de alternativas. ¿Compensa dicha eficiencia la complejidad del lenguaje? No es este el momento ni el lugar para ese debate, sino para mostrar como en GNOME se ha solucionado el problema de la complejidad... [entonces... sin complejidad ni pérdida de eficiencia... estamos ante el lenguaje perfecto? :|].&lt;br /&gt;&lt;br /&gt;Una de las principales carencias de C es proporciona unas estructuras de datos muy pobres, así como las herramientas para procesarlos. Esto se soluciona en GNOME con la librería GLIB que, concretamente ofrece:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Tipos abstractos de datos (listas, colas, hash table...)&lt;/li&gt;&lt;li&gt;Manipulación de cadenas&lt;/li&gt;&lt;li&gt;Memory allocation&lt;/li&gt;&lt;li&gt;Dynamics loadable modules&lt;/li&gt;&lt;li&gt;Abstracción del bucle principal&lt;/li&gt;&lt;li&gt;Expresiones regulares&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Por otra parte, otra carencia fundamental de C es su NO orientación a objetos. Pero esto también tiene solución, GObject. Por último, tenemos GIO, que proporciona una abstracción sobre el sistema de ficheros de manera que las aplicaciones pueden manipularlos independientemente de su localización física&lt;br /&gt;&lt;br /&gt;Estas tres, (Glib, GObject y GIO) en la práctica, se consideran un solo bloque que, por extensión, se denomina Glib, tal como vemos en la figura.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BkneNOzin8k/SEJv82QBaFI/AAAAAAAAACE/P8c3uFjZMsw/s1600-h/gnome_platform.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_BkneNOzin8k/SEJv82QBaFI/AAAAAAAAACE/P8c3uFjZMsw/s400/gnome_platform.png" alt="" id="BLOGGER_PHOTO_ID_5206847210339264594" border="0" /&gt;&lt;/a&gt;A continuación se explican brevemente cada uno de los componentes de la arquitectura GNOME. Sobre la figura, únicamente destacar que aquellos componentes con fondo azul están marcados como  DEPRECATED, con lo cual no se aconseja su uso ya que serán suprimidos en futuras versiones del framework.  Esto no es ningún obstáculo ya que su funcionalidad ha sido implementada o absorbida por otros componentes.&lt;br /&gt;&lt;br /&gt;Siguiendo con la figura observamos que, al mismo nivel de Glib tenemos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Cairo, encargada de pintar en el dispositivo de salida&lt;/li&gt;&lt;li&gt;D-Bus, un bus de comunicación entre aplicaciones. Se trata de un sistema IPC de alto nivel, similar a &lt;a href="http://www.omg.org/"&gt;CORBA[3]&lt;/a&gt;, pero más sencillo.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Sobre esta capa inferior se asientan todo un conjunto de librerías:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;GDK, relacionada con el sistema gráfico. Se trata de una capa intermedia que emplea GTK+ (creación de widgets) para acceder a Cairo abstrayendo los detalles característicos de cada tipo de ventana.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ATK. API de accesibilidad.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Pango. Librería para el manejo de fuentes y texto.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GVFS&lt;/li&gt;&lt;li&gt;GNOME-VFS&lt;/li&gt;&lt;li&gt;Libbonobo. Se trata de un framework para la creación de componentes independientes. Está planeada su desaparición, si bien, en la práctica, se sigue usando.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;La siguiente capa tiene cuatro módulos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;GTK+. Para construír interfaces gráficas&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LibGnome&lt;/li&gt;&lt;li&gt;Gconf, donde se guardan las opciones de configuración de cada usuairo del sistema.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;AT-SPI. Proporciona interfaces usadas por las tecnologías de accesibildad&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Seguimos:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;LibGlade. Para construír interfaces gráficas a partir de descripciones XML&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Gail. Es una implementación de las interfaces ATK&lt;br /&gt;&lt;/li&gt;&lt;li&gt;LibBonoboUI. Controles de UI para crear componentes BONOBO&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Y arriba de todo,&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;LibGnomeUI. Widgets para aplicaciones. La gran mayoría ya han sido portados a GTK+.&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Este post no es más que corta+pega+adapta un poquillo de:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://library.gnome.org/devel/references"&gt;la documentación de gnome[4]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/mod/resource/view.php?id=497&amp;amp;subdir=/2008-03-07-gnome"&gt;apuntes&lt;/a&gt;[5] de GNOME de la asignatura de &lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=41"&gt;Desarrollo de Software Libre,&lt;/a&gt;[6] de &lt;a href="http://carlosgc.linups.org/"&gt;Carlos García Campos[7]&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Referencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[1] KDE, &lt;a href="www.kde.org"&gt;www.kde.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[2] MONO &lt;a href="www.mono-project.com"&gt;www.mono-project.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[3] CORBA &lt;a href="www.corba.org"&gt;www.corba.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[4] Referencia de GNOME &lt;a href="http://library.gnome.org/devel/references"&gt;http://library.gnome.org/devel/references&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[5] Apuntes de GNOME: &lt;a href="http://gsyc.escet.urjc.es/moodle/mod/resource/view.php?id=497&amp;amp;subdir=/2008-03-07-gnome"&gt;http://gsyc.escet.urjc.es/moodle/mod/resource/view.php?id=497&amp;amp;subdir=/2008-03-07-gnome&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[6] Asignatura Desarrollo de Software Libre, &lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=41"&gt;http://gsyc.escet.urjc.es/moodle/course/view.php?id=41&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[7] Blog de Carlos García Campos: &lt;a href="http://carlosgc.linups.org/"&gt;http://carlosgc.linups.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-2222245189755086327?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/2222245189755086327/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=2222245189755086327' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2222245189755086327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2222245189755086327'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/05/gnome.html' title='GNOME'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_BkneNOzin8k/SEJv82QBaFI/AAAAAAAAACE/P8c3uFjZMsw/s72-c/gnome_platform.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-6556508744236891900</id><published>2008-05-26T14:48:00.000-07:00</published><updated>2008-06-01T08:19:47.273-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='practicum'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome-voice-control'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad'/><title type='text'>Prácticum. Elección de proyecto</title><content type='html'>&lt;div style="text-align: justify;"&gt;Tras la elección de la temática del prácticum y del conocimiento de las necesidades en el ámbito de la accesibilidad toca el momento de elegir un proyecto en el que trabajar o incluso proponer uno nuevo. Son varias las cuestiones a tener en cuenta:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Sistema Operativo&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Linux&lt;/li&gt;&lt;li&gt;Windows&lt;/li&gt;&lt;li&gt;Independiente&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Plataforma&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gnome.org/"&gt;GNOME[1]&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kde.org/"&gt;KDE[2]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/"&gt;JAVA[3]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mono-project.com/"&gt;MONO[4]&lt;/a&gt;&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Al margen de los requisitos técnicos del proyecto, es necesario delimitar bien el ámbito funcional del mismo. Esto es, cada disfunción tiene unas necesidades particulares, lo cual implica que la solución adoptada para paliarla deberá ser específica.&lt;br /&gt;&lt;br /&gt;El máster ha estado organizado en distintas &lt;a href="http://gsyc.escet.urjc.es/moodle/course/category.php?id=17"&gt;asignaturas&lt;/a&gt; o bloques. A estas alturas ya hemos pasado por:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/Introducci%C3%83%C2%B3n%20al%20software%20libre"&gt;Introducción al software libre&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=40"&gt;Dinámicas en el software libre&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=43"&gt;Integración de sistemas con software libre&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gsyc.escet.urjc.es/moodle/course/view.php?id=41"&gt;Desarrollo de software libre&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;En esta última aprendimos las distintas tecnologías y plataformas de desarrollo empleadas de forma mayoritaria. Entre todas ellas, la que más caló en mi fue GNOME. Así, será esta sobre la cual desarrolle mi aplicación.&lt;br /&gt;&lt;br /&gt;Por último queda definir cuál será la aplicación concreta sobre la que trabajar. Como en todo proyecto, y especialmente los de software libre, la primera tarea es realizar un estado del arte con el fin de saber cómo están las cosas en el momento actual. Por suerte, en GNOME, viendo que la accesibilidad es un tema muy en boga en los últimos tiempos, han lanzado el programa &lt;a href="http://www.gnome.org/projects/outreach/a11y/"&gt;GNOME Outrech&lt;/a&gt;[6], cuya finalidad es:&lt;br /&gt;&lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;Incrementar la percepción de las cuestiones relacionadas con la accesibilidad y cómo estas se atañen a las aplicaciones informáticas.&lt;/li&gt;&lt;li&gt;Animar a trabajar en dichas cuestiones&lt;/li&gt;&lt;li&gt;Ayudar a la comunidad del software libre a mejorar su soporte para accesibilidad&lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;Así,dentro del programa, se ha elaborado una lista de tareas a realizar, que podemos consultar en&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://http//live.gnome.org/action/edit/Accessibility/GetInvolved"&gt;http://live.gnome.org/action/edit/Accessibility/GetInvolved&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Como vemos, se trata de una lista que recorre todos los campos relacionados con la accesibilidad, siendo de especial interés para mi el punto tres: Assistive Technology and Other Work, y más concretamente los puntos seis y siete dentro de éste:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://live.gnome.org/action/edit/Accessibility/GetInvolved#head-965c6af81ad050c6525477eac899683fbe5d07bc"&gt;6) Speech Synthesis (TTS)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://live.gnome.org/action/edit/Accessibility/GetInvolved#head-1453e39625a82ce7cff390df8aa7ce52bd28ed3a"&gt;7) Speech Recognition (ASR)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://live.gnome.org/action/edit/Accessibility/GetInvolved#head-67c756010d32b1b60ad87e9986d3605d72e91bde"&gt;&lt;/a&gt;Es decir, aquellas herramientas relacionadas con el habla, tanto a nivel de síntesis como de reconocimiento. Si recordamos el &lt;a href="http://ultimastecnoloxias.blogspot.com/2008/05/prcticum.html"&gt;post anterior,&lt;/a&gt; una de las carencias manifestadas por las instituciones que trabajan en este ámbito era precisamente el "acceso al ordenador por voz", de ahí el interés en estos dos puntos.&lt;br /&gt;&lt;br /&gt;Ahora bien, durante este proceso de elección de proyecto, los profesores del máster comentaron la existencia de una aplicación cuya finalidad era el control del escritorio GNOME por voz: &lt;a href="http://live.gnome.org/GnomeVoiceControl"&gt;GnomeVoiceControl[7]&lt;/a&gt;. Se trata de una aplicación aún en pañales, nacida en el &lt;a href="http://code.google.com/soc/2007/"&gt;GSoC 2007&lt;/a&gt;[8], y con mucho margen de maniobra.  Después de echarle un ojo encontré en ella justo lo que buscaba. Resultó fácil la elección.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Referencias:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[1] Gnome: &lt;a href="http://www.gnome.org"&gt;http://www.gnome.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[2] KDE: &lt;a href="http://www.kde.org"&gt;http://www.kde.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[3] Java: &lt;a href="http://java.sun.com"&gt;http://java.sun.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[4] Mono: &lt;a href="http://www.mono-project.com"&gt;http://www.mono-project.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[5] Asignaturas del máster: &lt;a href="http://gsyc.escet.urjc.es/moodle/course/category.php?id=17"&gt;http://gsyc.escet.urjc.es/moodle/course/category.php?id=17&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[6] Gnome Outrech: &lt;a href="http://www.gnome.org/projects/outreach/a11y/"&gt;http://www.gnome.org/projects/outreach/a11y/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[7] GnomeVoiceControl: &lt;a href="http://live.gnome.org/GnomeVoiceControl"&gt;http://live.gnome.org/GnomeVoiceControl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[8] GSoC 2007 &lt;a href="http://code.google.com/soc/2007/"&gt;http://code.google.com/soc/2007/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-6556508744236891900?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/6556508744236891900/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=6556508744236891900' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/6556508744236891900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/6556508744236891900'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/05/prcticum-eleccin-de-proyecto.html' title='Prácticum. Elección de proyecto'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-4280603186534950471</id><published>2008-05-22T11:04:00.000-07:00</published><updated>2008-06-01T08:20:43.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='practicum'/><category scheme='http://www.blogger.com/atom/ns#' term='accesibilidad'/><title type='text'>Prácticum</title><content type='html'>&lt;div style="text-align: justify;"&gt;Como culminación del Free Software Master[1], los alumnos debemos realizar unas prácticas (o Practicum) con el objetivo de consolidar los conocimientos adquiridos, así como coger experiencia en proyectos de software libre reales.&lt;br /&gt;&lt;br /&gt;Para ello tenemos dos opciones:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Realizarlas en una empresa de las que han colaborado en el master: Igalia[2], Trabe Soluciones[3], Grupo Libresoft de la Universidad Rey Juan Carlos[4] o Telefónica ID por medio del proyecto MORFEO [5]&lt;/li&gt;&lt;li&gt;Trabajar en un proyecto de software libre por nuestra cuenta&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;La primera opción implicaría dedicarse en exclusiva a ello; permitiendo la segunda compaginarla con otra actividad. Este último es mi caso, que tendré que compaginarlo con mi trabajo en Blusens[6].&lt;br /&gt;&lt;br /&gt;¿Qué hacer?&lt;br /&gt;Una de las características que define a los proyectos de software libre es que los hackers que participan en ellos hacen lo que les gusta: programar en las aplicaciones que les gusta mejorando y arreglando aquellas funcionalidades que más les gusten. Siendo esto así, el abanico de posibles proyectos en los que colaborar es inmenso. De esta manera la primera tarea para mi prácticum fue elegir sobre qué trabajar.&lt;br /&gt;&lt;br /&gt;Esto que podría parecer complicado a primera vista no lo fue en mi caso, ya que desde hace tiempo he considerado que una de los principales objetivos de la tecnología en general (y de las TIC en particular) debería ser ayudar a la integración de personas con algún tipo de discapacidad.&lt;br /&gt;&lt;br /&gt;Siguiendo por esta vía me puse en contacto con distintas instituciones (Discapnet [7], Ceapat[8], Fundación Once [9])  de este ámbito con la intención de obtener información sobre las carencias en la materia.&lt;br /&gt;&lt;br /&gt;Entre las distintas opciones propuestas dos me parecieron de especial interés:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Acceso por voz al ordenador &lt;/li&gt;&lt;li&gt;Control de entorno a través de la  voz.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;La primera consistiría en poder disfrutar de las distintas funcionalidades proporcionadas por un ordenador usando solamente la voz en lugar de los habituales dispositivos de entradas, como el teclado o el ratón. Una aplicación de estas características ayudaría a las personas con discapacidades motrices.&lt;br /&gt;&lt;br /&gt;En cuanto a la segunda, control de entorno a través de voz, es un pasito más allá de la primera. Se trata de poder controlar los distintos dispositivos con los que tratamos habitualmente en la vida cotidiana por medio de la voz.  Esto implicaría tecnologías no estrictamente software con lo cual quizá excediesen el alcance del Máster (además que el tiempo del que dispongo es muy limitado).&lt;br /&gt;&lt;br /&gt;Así que, una vez decidida la temática comenzó la búsqueda de un proyecto concreto... pero eso es cosa de otro post :)&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;[1] Free Software Master &lt;a href="http://www.igalia.com/eventos/master/"&gt;http://www.igalia.com/eventos/master/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[2] Igalia &lt;a href="http://www.igalia.com/"&gt;http://www.igalia.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[3] Trabe Soluciones &lt;a href="http://www.trabesoluciones.com/"&gt;http://www.trabesoluciones.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[4] Libresoft &lt;a href="http://libresoft.es/"&gt;http://libresoft.es/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[5] Proyecto Morfeo &lt;a href="http://www.morfeo-project.com/"&gt;http://www.morfeo-project.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[6] Blusens &lt;a href="http://www.blusens.com/"&gt;http://www.blusens.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[7] Discapnet - Portal de las personas con discapacidad &lt;a href="http://www.discapnet.es/"&gt;http://www.discapnet.es/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[8] Centro estatal de autonomía personal y ayudas técnicas &lt;a href="http://www.ceapat.org/"&gt;http://www.ceapat.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;[9] Fundación ONCE &lt;a href="http://www.fundaciononce.es/"&gt;http://www.fundaciononce.es&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-4280603186534950471?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/4280603186534950471/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=4280603186534950471' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4280603186534950471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4280603186534950471'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/05/prcticum.html' title='Prácticum'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-2319686846574737022</id><published>2008-04-06T14:58:00.000-07:00</published><updated>2008-04-06T15:19:03.873-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Splitting terminal</title><content type='html'>I'm an Emacs user and... I like split window into two or three panels in order to read some views at a time. I wonder if I could do the same with xterm... and... yes! I do! Terminator!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BkneNOzin8k/R_lLzm6S-SI/AAAAAAAAAB8/Fs2S7-r2-lc/s1600-h/2007-07-29-terminator-02.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_BkneNOzin8k/R_lLzm6S-SI/AAAAAAAAAB8/Fs2S7-r2-lc/s400/2007-07-29-terminator-02.png" alt="" id="BLOGGER_PHOTO_ID_5186259795884308770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's very useful when you are debugging a client-server application because you can see both programs at a time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;From:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.go2linux.org/multiple-terminal-in-one-window-terminator-console&lt;/li&gt;&lt;/ul&gt;Official site:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;https://launchpad.net/terminator/&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-2319686846574737022?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/2319686846574737022/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=2319686846574737022' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2319686846574737022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2319686846574737022'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/04/splitting-terminal.html' title='Splitting terminal'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_BkneNOzin8k/R_lLzm6S-SI/AAAAAAAAAB8/Fs2S7-r2-lc/s72-c/2007-07-29-terminator-02.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-5581819637016117194</id><published>2008-04-06T14:45:00.000-07:00</published><updated>2008-04-06T15:19:34.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming C'/><title type='text'>Retrieving information from source code</title><content type='html'>In the development stage of a program, usually we write debugging lines (yeah... debugging tools such as &lt;a href="http://sourceware.org/gdb/"&gt;gdb&lt;/a&gt;[1] or &lt;a href="http://valgrind.org/"&gt;valgrind&lt;/a&gt;[2] would be a more valuable option). But, when we work with very large programs, would be very useful knowing the file and line os source code where such debugging line is placed. This task can be achieve with  the &lt;a href="http://www.cplusplus.com/doc/tutorial/preprocessor.html"&gt;preprocessor directives&lt;/a&gt;[3]:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;__FILE__&lt;/li&gt;&lt;li&gt;__LINE__&lt;/li&gt;&lt;/ul&gt;Example of use:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-family:MS Sans Serif;"&gt;fprintf( stderr, "%s &lt;%d&gt;: %s\n", __FILE__, __LINE__, "some text");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;[1] http://sourceware.org/gdb/&lt;br /&gt;[2] http://valgrind.org/&lt;br /&gt;[3] http://www.cplusplus.com/doc/tutorial/preprocessor.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-5581819637016117194?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/5581819637016117194/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=5581819637016117194' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5581819637016117194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5581819637016117194'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/04/retrieving-information-from-source-code.html' title='Retrieving information from source code'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-5651837485587449934</id><published>2008-03-22T11:52:00.000-07:00</published><updated>2008-03-22T12:56:21.255-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>PyRenamer. Automatically renaming tool</title><content type='html'>&lt;div style="text-align: justify;"&gt;As you know, after taking photos for a whole day, we have to face to the hard task of classifying them. The most commonly task is renaming them accordingly people involved or whatever criteria.&lt;br /&gt;&lt;br /&gt;Then, we start in a situation like this:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BkneNOzin8k/R-VZQ8MX5wI/AAAAAAAAABU/KsRYczw9CUg/s1600-h/original.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_BkneNOzin8k/R-VZQ8MX5wI/AAAAAAAAABU/KsRYczw9CUg/s400/original.png" alt="" id="BLOGGER_PHOTO_ID_5180645093930428162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;If we want to rename them, probably we'll have to write the same name a lot of times. Ex.:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;A_Place_1.jpg&lt;/li&gt;&lt;li&gt;A_Place_2.jpg&lt;/li&gt;&lt;li&gt;A_Place_3.jpg&lt;/li&gt;&lt;li&gt;Second_place_1.jpg&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;li&gt;Second_place_34.jpg&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;This is a hard task. It would be very simple with an automatically renamer tool. This way, I've developed this tool.&lt;br /&gt;&lt;br /&gt;It is a simple Python application that renames all files between two ones in alphabetical order.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;P1010085.JPG  &lt;/li&gt;&lt;li&gt;P1010089.JPG &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;P1010093.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;P1010097.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;P1010101.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;P1010105.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;P1010109.JPG  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;P1010113.JPG &lt;/span&gt; &lt;/li&gt;&lt;li&gt;P1010117.JPG  &lt;/li&gt;&lt;li&gt;P1010121.JPG&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;The emphatic ones will be rename:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-weight: bold; text-align: justify;"&gt;renamer -s P1010093.JPG -e P1010113.JPG -n MyPlace&lt;/div&gt;&lt;ul style="font-weight: bold; text-align: justify;"&gt;&lt;li style="font-weight: normal;"&gt;-s [start]*&lt;/li&gt;&lt;li style="font-weight: normal;"&gt;-e [end]*&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;-n [new name]*&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: normal;"&gt;-c [initial counter value]&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Fields with [*] are mandatory. Anyway, if you omit any of them, application will question you:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BkneNOzin8k/R-VfqsMX5xI/AAAAAAAAABc/vKYwb1C0wZE/s1600-h/comando.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_BkneNOzin8k/R-VfqsMX5xI/AAAAAAAAABc/vKYwb1C0wZE/s400/comando.png" alt="" id="BLOGGER_PHOTO_ID_5180652133381826322" border="0" /&gt;&lt;/a&gt;Above example will result:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;P1010085.JPG  &lt;/li&gt;&lt;li&gt;P1010089.JPG &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;MyPlace_0.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;MyPlace_1.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;MyPlace_2.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;MyPlace_3.JPG  &lt;/li&gt;&lt;li style="font-weight: bold;"&gt;MyPlace_4.JPG  &lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;MyPlace_5&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;.JPG &lt;/span&gt; &lt;/li&gt;&lt;li&gt;P1010117.JPG  &lt;/li&gt;&lt;li&gt;P1010121.JPG&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BkneNOzin8k/R-VgfcMX5yI/AAAAAAAAABk/sZGq_DxSc94/s1600-h/nueva.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_BkneNOzin8k/R-VgfcMX5yI/AAAAAAAAABk/sZGq_DxSc94/s400/nueva.png" alt="" id="BLOGGER_PHOTO_ID_5180653039619925794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Source code: &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/renamer/renamer.py?rev=216&amp;amp;root=freeswmaster"&gt;[Download]&lt;/a&gt; &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/renamer/renamer.py?content-type=text%2Fplain&amp;amp;rev=216&amp;amp;root=freeswmaster"&gt;[View]&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-5651837485587449934?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/5651837485587449934/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=5651837485587449934' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5651837485587449934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5651837485587449934'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/03/pyrenamer-automatically-renaming-tool.html' title='PyRenamer. Automatically renaming tool'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BkneNOzin8k/R-VZQ8MX5wI/AAAAAAAAABU/KsRYczw9CUg/s72-c/original.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-3381114394111748139</id><published>2008-03-19T07:37:00.000-07:00</published><updated>2008-03-19T07:55:41.217-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Cscope'/><title type='text'>KScope: beyond CScope</title><content type='html'>Previos post I presented &lt;a href="http://cscope.sourceforge.net"&gt;CScope[1],&lt;/a&gt; a code browser tool. Now, I write about &lt;a href="http://kscope.sourceforge.net"&gt;KScope[2]&lt;/a&gt;, a graphical user interface for CScope..&lt;br /&gt;&lt;br /&gt;This tool give us a graphical representation from CScope data. In addition, it has edition capabilities. Next pictures[&lt;a href="http://kscope.sourceforge.net/sshots.shtml"&gt;&lt;span style="text-decoration: underline;"&gt;3&lt;/span&gt;&lt;/a&gt;] give a clear idea of its power.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BkneNOzin8k/R-EnJSR98YI/AAAAAAAAABM/-pVgoF4FzkI/s1600-h/main_window_thumb.gif"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BkneNOzin8k/R-EnJSR98YI/AAAAAAAAABM/-pVgoF4FzkI/s1600-h/main_window_thumb.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 297px; height: 227px;" src="http://2.bp.blogspot.com/_BkneNOzin8k/R-EnJSR98YI/AAAAAAAAABM/-pVgoF4FzkI/s400/main_window_thumb.gif" alt="" id="BLOGGER_PHOTO_ID_5179464086932287874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BkneNOzin8k/R-EnECR98XI/AAAAAAAAABE/aWxSk0s2qf8/s1600-h/calltree_thumb.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 298px; height: 256px;" src="http://1.bp.blogspot.com/_BkneNOzin8k/R-EnECR98XI/AAAAAAAAABE/aWxSk0s2qf8/s400/calltree_thumb.gif" alt="" id="BLOGGER_PHOTO_ID_5179463996737974642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_BkneNOzin8k/R-Em_SR98WI/AAAAAAAAAA8/2KikC65Xaqk/s1600-h/callgraph_thumb.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 299px; height: 257px;" src="http://2.bp.blogspot.com/_BkneNOzin8k/R-Em_SR98WI/AAAAAAAAAA8/2KikC65Xaqk/s400/callgraph_thumb.gif" alt="" id="BLOGGER_PHOTO_ID_5179463915133596002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;[1] CScope, http://cscope.sourceforge.net&lt;br /&gt;[2] KScope, http://kscope.sourceforge.net/&lt;br /&gt;[3] KScope screenshots, http://kscope.sourceforge.net/sshots.shtml&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-3381114394111748139?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/3381114394111748139/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=3381114394111748139' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3381114394111748139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3381114394111748139'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/03/kscope-beyond-cscope.html' title='KScope: beyond CScope'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_BkneNOzin8k/R-EnJSR98YI/AAAAAAAAABM/-pVgoF4FzkI/s72-c/main_window_thumb.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-8067811520237573017</id><published>2008-03-09T10:59:00.000-07:00</published><updated>2008-03-09T12:25:22.339-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Cscope'/><category scheme='http://www.blogger.com/atom/ns#' term='Emacs'/><title type='text'>Cscope: source code browser</title><content type='html'>Sometimes we have to fight with third party code, maybe without any documentation. In addition, this code can be very scattered and intermingled. This way, reading it is a too difficult task. In this context, using code browsing tools is a good idea in order to explore the code easily. Among these ones, I know &lt;a href="http://cscope.sourceforge.net/"&gt;Cscope&lt;/a&gt; [1], a pattern and symbol browser for C language.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Installation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;apt-get install cscope&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Running from command line&lt;/span&gt;&lt;br /&gt;The basic mode is execution from command line. After running cscope in the source code directory, it presents us the next query list:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BkneNOzin8k/R9QnYSR98TI/AAAAAAAAAAk/9AqKlMwSXrQ/s1600-h/cscope_init.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_BkneNOzin8k/R9QnYSR98TI/AAAAAAAAAAk/9AqKlMwSXrQ/s400/cscope_init.png" alt="" id="BLOGGER_PHOTO_ID_5175805169933087026" border="0" /&gt;&lt;/a&gt;As we can see these queries can answer a lot of questions. Answering them directly from source code would be a very difficult and boring task.&lt;br /&gt;&lt;br /&gt;After querying, in the above corner, we can see the result. Moreover, if we press enter in a result line, we will enter in our default editor in order to edit the source code.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BkneNOzin8k/R9QqHyR98UI/AAAAAAAAAAs/AXzdsKC7n7w/s1600-h/cscope_query.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_BkneNOzin8k/R9QqHyR98UI/AAAAAAAAAAs/AXzdsKC7n7w/s400/cscope_query.png" alt="" id="BLOGGER_PHOTO_ID_5175808185000128834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Integration with Emacs[2]&lt;/span&gt;&lt;br /&gt;Command line isn't a friendly interface. If you want, you can use it, but there is a more powerfull way to use cscope: integrating with Emacs. Next, I describe the steps to do it:&lt;br /&gt;&lt;br /&gt;1) Copy xcscope.el from contrib/xcscope in cscope tarball to any directory in emacs path (for instance /usr/share/emacs/site-lisp). If you have installed cscope with apt-get you can jump this step.&lt;br /&gt;&lt;br /&gt;2) Add (require 'xcscope) to ~/.emacs o ~/.emacs.d/init.el&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BkneNOzin8k/R9QseCR98VI/AAAAAAAAAA0/0SHl2Q_Ecb4/s1600-h/cscope_emacs.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_BkneNOzin8k/R9QseCR98VI/AAAAAAAAAA0/0SHl2Q_Ecb4/s400/cscope_emacs.png" alt="" id="BLOGGER_PHOTO_ID_5175810766275473746" border="0" /&gt;&lt;/a&gt;If you like, you can integrate it with Vi [2]&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;[1] Cscope homepage: &lt;a href="http://cscope.sourceforge.net/"&gt;http://cscope.sourceforge.net/&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://www.linux.com/articles/114237?theme=print"&gt;http://www.linux.com/articles/114237?theme=print&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-8067811520237573017?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/8067811520237573017/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=8067811520237573017' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8067811520237573017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8067811520237573017'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/03/cscope-source-code-browser.html' title='Cscope: source code browser'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_BkneNOzin8k/R9QnYSR98TI/AAAAAAAAAAk/9AqKlMwSXrQ/s72-c/cscope_init.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-3500356061313010742</id><published>2008-03-02T13:40:00.000-08:00</published><updated>2008-03-02T13:51:17.989-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Awk'/><category scheme='http://www.blogger.com/atom/ns#' term='Bash'/><title type='text'>Region filter. Version 1.2 released</title><content type='html'>New way to invoke it. Following classical approach of the vast majority of commands,  "pipe invoking" is available now!&lt;br /&gt;&lt;br /&gt;Use:&lt;br /&gt;./your_program | region.sh [params]&lt;br /&gt;&lt;br /&gt;This way "file parameter" is omitted.&lt;br /&gt;&lt;br /&gt;Source code: &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/region_filter/region.sh?rev=208&amp;amp;root=freeswmaster"&gt;[Download]&lt;/a&gt; &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/region_filter/region.sh?content-type=text%2Fplain&amp;amp;rev=208&amp;amp;root=freeswmaster"&gt;[View]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.S.: behavior of previous version... a feature or a bug? :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-3500356061313010742?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/3500356061313010742/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=3500356061313010742' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3500356061313010742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3500356061313010742'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/03/region-filter-version-12-released.html' title='Region filter. Version 1.2 released'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-4277134835030682865</id><published>2008-03-02T08:56:00.000-08:00</published><updated>2008-03-02T13:51:41.857-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Awk'/><category scheme='http://www.blogger.com/atom/ns#' term='Bash'/><title type='text'>Region filter. Bash version</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sometimes, we have to fight with very large programs with a lot of debugging lines too. Reading this verbose output usually is a very tedious task. Moreover, each moment we are interested in a little set of the output. This way, it would be very useful filter the big amount of information and then, get the interesting one.&lt;br /&gt;&lt;br /&gt;For this task, I've written a short bash script. It cuts regions from a file. These region are delimited with start and end tags. Ex.:&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;[&lt;span style="font-size:85%;"&gt;bla bla bla]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;BEGIN&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;[interesting things]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;END&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;[bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;Moreover, more than one region can be defined:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[interesting things]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;END&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[more bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;BEGIN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;[very interesting things]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;END&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In addition, we can name the region&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;  BEGIN reg1&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[interesting things]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt;  END reg1&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[more bla bla bla]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt; BEGIN reg2&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;[very interesting things]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;font-size:85%;"  &gt; END reg2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This way, the bash script can filter the first region or the another one.&lt;br /&gt;&lt;br /&gt;Command line&lt;br /&gt;./region -f file [-b begin_tag] [-e end_tag] [-i id_tag]&lt;br /&gt;&lt;br /&gt;Default values are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;    begin_tag: BEGIN&lt;/li&gt;&lt;li&gt;    end_tag: END&lt;/li&gt;&lt;li&gt;    id_tag: [None] &lt;/li&gt;&lt;/ul&gt;Use:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;your_program &gt; output.txt&lt;/li&gt;&lt;li&gt;region -f output.txt&lt;/li&gt;&lt;/ul&gt;Source code: &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/region_filter/region.sh?rev=206&amp;amp;root=freeswmaster"&gt;[Download]&lt;/a&gt; &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/andriu/region_filter/region.sh?content-type=text%2Fplain&amp;amp;rev=206&amp;amp;root=freeswmaster"&gt;[View]&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-4277134835030682865?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/4277134835030682865/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=4277134835030682865' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4277134835030682865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4277134835030682865'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/03/region-filter-bash-version.html' title='Region filter. Bash version'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-7970616968886993805</id><published>2008-02-28T04:43:00.000-08:00</published><updated>2008-02-28T04:47:08.708-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Montar dispositivos en Ubuntu</title><content type='html'>&lt;div style="text-align: left;"&gt;¿Quién no se peleó alguna vez con ese pendrive que no se monta automáticamente? En el siguiente enlace se explican una serie de pasos a seguir. Muy interesante.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.asturlinux.org/comunidad/MemoriaUSB"&gt;http://www.asturlinux.org/comunidad/MemoriaUSB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como se intuye del título está enfocado a las memorias USB pero se puede extrapolar a otros dispositivos&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-7970616968886993805?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/7970616968886993805/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=7970616968886993805' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7970616968886993805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7970616968886993805'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/02/montar-dispositivos-en-ubuntu.html' title='Montar dispositivos en Ubuntu'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-1031193646455273659</id><published>2008-02-26T02:35:00.001-08:00</published><updated>2008-02-26T03:44:26.281-08:00</updated><title type='text'>Fosdem 2008</title><content type='html'>&lt;div style="text-align: justify;"&gt;El pasado fin de semana tuvo lugar en Bruselas el &lt;a href="http://fosdem.org/"&gt;Fosdem&lt;/a&gt; (Free and Open Source Software developers' European Meeting). Se trata de uno de los eventos de Software Libre más reconocidos a nivel mundial y en él se dan cita los distintos roles involucrados en la materia, desde desarrolladores independientes hasta grandes empresas, pasando por grupos de investigación universitarios. Cada uno de estos expone los proyectos en los que participa, futuros desarrollos o nuevas tendencias en el mundo del Free Software.&lt;br /&gt;&lt;br /&gt;Hoy en día la actividad en el Software Libre es frenética, de manera que para exponer los distintos proyectos en curso harían falta semanas. Como esto es inviable en un encuentro de varios días, la solución por la que optan los organizadores es la de realizar conferencias en paralelo, de manera que cada cual elija la que más le interesa. La 'concurrencia' se lleva a cabo por temática, esto es, las charlas en paralelo son aquellas que se engloban dentro de un mismo tema. De esta manera, los 'temas' en los que se dividen son:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/bsdpostgresql"&gt;BSD + PostgreSQL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/centosfedora"&gt;CentOS + Fedora&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/crossdesktop"&gt;CrossDesktop&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/debian"&gt;Debian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/drupal"&gt;Drupal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/embedded"&gt;Embedded&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/freejava"&gt;Free Java&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/gnome"&gt;GNOME&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/jboss"&gt;JBoss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/kde"&gt;KDE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/mozilla"&gt;Mozilla&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/openofficeorg"&gt;OpenOffice.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/opensuse"&gt;openSUSE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/researchroom"&gt;Research Room&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/rubyonrails"&gt;Ruby on Rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fosdem.org/2008/schedule/devroom/xorg"&gt;X.org&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Además de las conferencias y workshops en las que se engloban dichas actividades, también existe la posibilidad de realizar los exámenes de las certificaciones &lt;a href="http://www.lpi.org/"&gt;LPI&lt;/a&gt; (Linux Professional Institute) y &lt;a href="http://www.bsdcertification.org/"&gt;BSD&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Por último, destacar que había un gran número de stands de organizaciones vinculadas, de una manera u otra al software libre, en los cuales explicaban su trabajo. Además, repartían pósters, trípticos explicativos, pins, cds...&lt;br /&gt;&lt;br /&gt;Los alumnos del &lt;a href="http://www.igalia.com/eventos/master/"&gt;Free Software Master&lt;/a&gt; tuvimos la oportunidad de asistir en calidad de ponentes!! Allí expusimos (quien puso voz y cara fue Pablo), en la Research Room, nuestra particular visión sobre calidad en el software libre: &lt;a href="https://forge.morfeo-project.org/plugins/scmsvn/viewcvs.php/*checkout*/trunk/2nd-Work/Paper/final-paper.pdf?rev=192&amp;amp;root=freeswmaster"&gt;Quality and libre software: a theoretical and practical approach.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;font-family:lucida grande;" &gt;I can't believe it&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-1031193646455273659?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/1031193646455273659/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=1031193646455273659' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/1031193646455273659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/1031193646455273659'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/02/fosdem-2008.html' title='Fosdem 2008'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-160823561848872826</id><published>2008-02-03T01:44:00.000-08:00</published><updated>2008-02-03T06:22:06.314-08:00</updated><title type='text'>Occam's razor, porque lo más sencillo es lo más probable</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace más o menos un año surgió en la &lt;a href="http://www.uvigo.es/"&gt;Universidad de Vigo&lt;/a&gt; la iniciativa de publicar una revista técnica libre. Tras tres números publicados no cabe otra cosa más que dar la enhorabuena a los promotores de dicha iniciativa así como a todos los que han trabajado en la misma.&lt;br /&gt;&lt;br /&gt;No voy aquí a hacer ningún breve resumen de los contenidos porque, sinceramente, no sabría qué artículos nombrar. Tendría que enumerar todos, ya que todos me parecen interesantísimos. Sin más, dejo el enlace a la página de descargas para que cada cual valore por sí mismo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://webs.uvigo.es/occams-razor/"&gt;http://webs.uvigo.es/occams-razor/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;P.D.: ah! como todo documento libre, permite bajarse los fuentes (en látex) así como colaborar enviando nuevos artículos.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-160823561848872826?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/160823561848872826/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=160823561848872826' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/160823561848872826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/160823561848872826'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/02/occams-razor-porque-lo-ms-sencillo-es.html' title='Occam&apos;s razor, porque lo más sencillo es lo más probable'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-4895180272988576254</id><published>2008-01-07T16:25:00.000-08:00</published><updated>2008-01-07T16:49:23.394-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>Wikia</title><content type='html'>&lt;div style="text-align: justify;"&gt;É coñecida por todos a meirande cantidade de información que circula pola rede. Tamén é de sobre coñecida que quen deu coa mellor solución para buscar esta información levouse o gato á auga (pobre gatiño, co medo que lle teñen a auga), é dicir, google. Comezou sendo un simple buscador e converteuse no sistema preferido de moitos para publicar blogs (&lt;a href="http://www.blogger.com"&gt;blogger&lt;/a&gt;), visualizar mapas(&lt;a href="http://maps.google.com"&gt;google.maps&lt;/a&gt; e &lt;a href="http://earth.google.com"&gt;google earth&lt;/a&gt;), ler feeds (&lt;a href="http://reader.google.com"&gt;google reader&lt;/a&gt;) e un &lt;a href="http://www.google.com/intl/es/options/"&gt;longo etcétera&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Parece mentira pero a realidade é que eu agora mesmo non concibiría a internet sen google. A realidade é así de... crúa? Pois, no que se refire o servicio básico, é dicir, ao buscador, dende onte temos unha alternativa aínda en fase alpha. Trátase de &lt;a href="http://alpha.search.wikia.com/"&gt;wikia,&lt;/a&gt; o buscador web dos creadores da &lt;a href="http://www.wikipedia.org"&gt;wikipedia.&lt;/a&gt; Baséase nas ideas da &lt;a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html"&gt;Web 2.0&lt;/a&gt; para intentar ofrecer ao usuario os resultados que realmente busca empregando para iso a información proporcionada por outros usuarios.&lt;br /&gt;&lt;br /&gt;Eu probeino. Pensaba que con iso de que era o primeiro día e ao estar baseado en redes sociais pois aínda non tería suficientes datos como para dar un bó resultado. Nada máis lonxe da realidade. Fixen unhas poucas buscas e, se ben é certo que para cada unha delas obtiven poucos resultados, estes foros verdadeiramente significativos. Posiblemente sexa esta unha das vantaxes que nos ofrece: un refinamento nas buscas, a diferencia do que pasa en google onde se proporciona ao usuario unha cantidade inxente de resultado onde só os primeiros (a primeira páxina de resultados, por exemplo) son relevantes.&lt;br /&gt;&lt;br /&gt;Agora só nos quedan dúas cousas: participar e esperar a ver que pasa.&lt;br /&gt;&lt;br /&gt;De chegarse a un resultado satisfactorio e ser este proxecto unha alternativa real a google... solucionaríase a progresiva monopolización da web que estamos a experimentar?&lt;br /&gt;&lt;br /&gt;Ofrecerá &lt;a href="http://alpha.search.wikia.com/"&gt;wikia,&lt;/a&gt; de ter éxito, outros servicios seguindo o modelo de google?&lt;br /&gt;&lt;br /&gt;Tempo ao tempo.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-4895180272988576254?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/4895180272988576254/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=4895180272988576254' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4895180272988576254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/4895180272988576254'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2008/01/wikia.html' title='Wikia'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-5040944605739121457</id><published>2007-12-16T11:14:00.000-08:00</published><updated>2007-12-16T11:17:56.097-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitecturas Software'/><title type='text'>Escritorios e webs. Un camiño entre dous mundos.</title><content type='html'>&lt;div style="text-align: justify;"&gt;  Corría o ano 2005. Estaba en cuarto de carreira (&lt;a title="Escola Técnica Superior de Enxeñeiros de Telecomunicación" href="http://teleco.uvigo.es/" id="uaty"&gt;Teleco Vigo)&lt;/a&gt; e coido que foi aí cando comezou o meu verdadeiro interese pola tecnoloxía alén do estrictamente académico. Descubrín por esa época unha chea de tecnoloxías relacionadas co desenvolvemento web como JSP, os servicios web, &lt;a title="Mozilla projects" href="http://www.mozilla.org/projects/" id="jp06"&gt;os proxectos de Mozilla&lt;/a&gt;... Entre estes últimos estaba  &lt;a title="XML User Interface Language" href="http://www.xulplanet.com/" id="rtsy"&gt;XUL&lt;/a&gt;, unha linguaxe &lt;a title="Extensible Markup Language" href="http://www.w3schools.com/xml/default.asp" id="hczh"&gt;XML&lt;/a&gt; para crear interfaces gráficas de usuario (GUIs). Lembro que me chamara bastante a atención. Nese momento estaba entusiasmado ca maquetación web con CSS e co cumplimento estricto dos distintos estándares e o seguimento de directrices para garantir a interoperabilidade entre plataformas cando de súpeto... zas!! unha linguaxe que me permite facer aplicacións web como se foxen aplicacións de escritorio. De feito, moito máis doado todavía xa que a sintaxe era XML... impresionante!&lt;br /&gt;&lt;br /&gt;Tanto me impresionara que a miña primeira entrada nun blog (que eu mesmo implementara :), con un par) trataba sobre este tema. Creo recordar que comentaba algo así como que a tendencia era desenvolver cada vez máis aplicacións web deixando a un lado as de escritorio e tecnoloxías como XUL, facilitaban esa transición xa que permitían facer GUIs de maneira moi sinxela cunha apariencia similar ás de escritorio.&lt;br /&gt;&lt;br /&gt;Pois ben, hai case tres anos de eso pero nesta última semana ata en dúas ocasións e outra máis uns días máis atrás topei con estes mesmos temas. Primeiramente topei cos&lt;b&gt; sistemas operativos web &lt;/b&gt;como &lt;a title="EyeOS" href="http://eyeos.info/" id="gbm4"&gt;EyeOS&lt;/a&gt; ou &lt;a title="YouOS" href="https://www.youos.com/" id="r356"&gt;YouOS.&lt;/a&gt; Son, &lt;span style="font-style: italic;"&gt;grosso modo&lt;/span&gt;, sistemas que che amosan, vía web, unha interface coma as dos sistemas operativos de escritorio, cun conxunto de aplicacións para realizar as tarefas habituais. Non me vou extender máis neste tema, xa que non é motivación deste &lt;span style="font-style: italic;"&gt;post,&lt;/span&gt; déixote que te inmiscúas neles e os descubras en profundidade por ti mesmo. A miña impresión é que non son a solución á migración dos sistemas de escritorio aos sistemas web porque non son máis que unha simple &lt;span style="font-weight: bold;"&gt;simulación &lt;/span&gt;dos SO de escritorio sobre unha infraestructura web. Penso que este é un erro común en moitos sistemas: inténtase imitar un modelo que funciona cunha tecnoloxía distinta. Esa tecnoloxía (neste caso a infraestructura web) pode ofrecer unha serie de oportunidades que a primeira non ten e, polo feito de imitar esta primeira, quedarán sen explorar. De feito, a grande maioría dos avances tecnolóxicos xurden de ideas novidosas, pode que inspiradas noutros sistemas, pero non da copia exacta. Por este motivo, son os investigadores ou técnicos máis novos os que teñen moito que dicir neste eido xa que ao non levar traballando moito tempo nunha tecnoloxía concreta carecen de moitos prexuízos nese campo ao que lles permite romper coas tendencias actuais e propoñer ideas que rompan radicalmente con todo o anterior.&lt;br /&gt;&lt;br /&gt;Neste campo dos sistemas web penso que é moito mellor a proposta de &lt;span style="font-weight: bold;"&gt;google, &lt;/span&gt;que ofrece un paquete de aplicacións ás que se accede vía web, pero de maneira independiente cada unha delas como: Google Reader, como lector de &lt;span style="font-style: italic;"&gt;feeds, &lt;/span&gt;Google Docs, como paquete de ofimática; Blogger, para os blogs; Picassa, para fotografías; Gmail, para correo... bueno e &lt;a title="Aplicacións de google" href="http://www.google.es/intl/es/options/" id="aec-"&gt;tantas outras&lt;/a&gt;&lt;span style="font-style: italic;"&gt;. &lt;/span&gt;Desta maneira permite realizar vía web, moitas tarefas que habitualmente se facían en aplicacións de escritorio. A diferencia cos sistemas operativos web comentados no paragrafo anterior é que non estás nun entorno pechado, é dicir, non existe un &lt;a title="contenedor" href="http://martinfowler.com/articles/injection.html" id="e0eg"&gt;contenedor&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;sobre o cal se dispoñen as distintas aplicacións ofrecidas. O único elemento de unión que hai entre todas elas é o concepto de &lt;span style="font-weight: bold;"&gt;sesión, &lt;/span&gt;o cal é transparente para o usuario, xa que esta se mantén entre os servidores de google e a máquina cliente mediante os protocolos subxacentes.&lt;br /&gt;&lt;br /&gt;Agora ben, as aplicacións de escritorio seguen a estar aí e coido que, durante un tempo bastante longo, isto seguirá a ser así. Desta maneira, plantéxase unha cuestión inquedante... ¿non sería necesario algún mecanismo de sincronización entre as aplicacións web e as de escritorio? Esta cuestión xurdíu nunha tertulia con &lt;a title="No sólo Software  No sólo software. Hablando de desarrollo de software libre... pero no sólo." href="http://nosolosoftware.blogspot.com/" id="s7cv"&gt;Andrés Maneiro&lt;/a&gt; na xélida noite de A Coruña, o venres pasado. Chegamos á conclusión de que sería necesario un mecanismo de sincronización entre ámbalas dúas partes de maneira que se poidera empregar ferramentas de ámbolos dous lados indistintamente en tempo e lugar e se mantivesen os mesmos datos de maneira consistente. Desta maneira teriamos os documentos accesibles no noso ordenador persoal en local e tamén de maneira remota dende calqueira equipo. E foi aquí cando nos demos de conta dunha cousa: o correo electrónico xa permite isto dente hai moitos anos. Podemos descargarnos as nosas mensaxes, respondelas &lt;span style="font-style: italic;"&gt;offline, &lt;/span&gt;e no momento no que recupere a conexión enviaranse de verdade ditas respostas, sincronizando así a información que dispós no teu ordenador local coa que está na rede. Este mecanismo do correo electrónico baséase en protocolos como &lt;a title="Post Office Protocol version 3 (POP3)," href="http://en.wikipedia.org/wiki/Pop3" id="pd1d"&gt;POP3&lt;/a&gt; ou &lt;a title="Internet Message Access Protocol" href="http://www.imap.org/" id="j1ov"&gt;IMAP.&lt;/a&gt; Pois ben, da mesma maneira podería (debería de) existir protocolos similares para outro tipo de información como: documentos de texto ou follas de cálculo. É máis, idealmente debería de haber un protocolo xenérico (independente do tipo de documento) que mantese a sincronización entre &lt;span style="font-weight: bold;"&gt;os dous mundos&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;online&lt;/span&gt; e &lt;span style="font-style: italic;"&gt;offline&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-5040944605739121457?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/5040944605739121457/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=5040944605739121457' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5040944605739121457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5040944605739121457'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/12/escritorios-e-webs-un-camio-entre-dous.html' title='Escritorios e webs. Un camiño entre dous mundos.'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-5708363920685033624</id><published>2007-11-27T14:25:00.000-08:00</published><updated>2007-11-27T14:52:22.416-08:00</updated><title type='text'>Utilidades: ferramentas e tecnoloxías (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;No meu estudio diario de sistemas de execución de eLearning atópome as veces que estes empregan ferramentas xa existentes para o seu desenvolvemento. Considero que esta é unha moi boa técnica. Desta maneira afórrase tempo ao non programar o xa existente (non reinventar a roda) e, por outra banda, tense a seguridade (se se é coidadoso ao elixir) de que o sistema vai funcionar. Isto non é nada novo, xa o dixo &lt;a href="http://www.catb.org/%7Eesr/" id="p3t1" title="Eric S.Raymond"&gt;Eric S.Raymond&lt;/a&gt; en &lt;a href="http://biblioweb.sindominio.net/telematica/catedral.html" id="y1m:" title="The Cathedral and the bazaar"&gt;The Cathedral and the bazaar(español)&lt;/a&gt;: os bos programadores saben que escribir, os mellores que reescribir (ou reutilizar).&lt;br /&gt;&lt;br /&gt;A  continuación enumero unha serie de ferramentas e tecnoloxías coas que me teño topado pero que aínda non tiven tempoa estudiar e probar en profundidade (así que xa sabedes o que vos toca...).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://openacs.org/" id="kyk2" title="openACS"&gt;openACS&lt;/a&gt;&lt;br /&gt;OpenACS (Open Architecture Community System) is a toolkit for building scalable, community-oriented web applications.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ws.apache.org/axis/"&gt;Axis&lt;/a&gt;&lt;br /&gt;Axis is essentially a SOAP engine -- a framework for constructing SOAP processors such as clients, servers, gateways, etc. The current version of Axis is written in Java, but a C++ implementation of the client side of Axis is being developed.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opensymphony.com/quartz/" id="b48o" title="Quartz"&gt;Quartz&lt;/a&gt;&lt;br /&gt;Quartz is a full-featured, open source job scheduling system that can be integrated with, or used along side virtually any J2EE or J2SE application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components or EJBs. The Quartz Scheduler includes many enterprise-class features, such as JTA transactions and clustering.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://logging.apache.org/log4j/1.2/index.html" id="q5d:" title="Log4J"&gt;Log4J&lt;/a&gt;&lt;br /&gt;Inserting log statements into your code is a low-tech method for debugging it.It may also be the only way because debuggers are not always available or applicable. This is often the case for distributed applications.&lt;br /&gt;On the other hand, some people argue that log statements pollute source codeand decrease legibility. (We believe that the contrary is true). In the Java language where a preprocessor is not available, log statements increase the size of the code and reduce its speed, even when logging is turned off. Given that a reasonably sized application may contain thousands of log statements, speed is of particular importance.&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;  With log4j it is possible to enable logging at runtime without modifying the application binary. The log4j package is designed so that these statements can remain in shipped code without incurring a heavy performance cost. Logging behavior can be controlled by editing a configuration file, without touching&lt;br /&gt;the application binary.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.openldap.org/" id="eq-v" title="openLDAP"&gt;openLDAP&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.openldap.org/software/"&gt;OpenLDAP Software&lt;/a&gt; is an &lt;a href="http://www.opensource.org/"&gt;open source&lt;/a&gt; implementation of the &lt;b&gt;L&lt;/b&gt;ightweight &lt;b&gt;D&lt;/b&gt;irectory &lt;b&gt;A&lt;/b&gt;ccess&lt;b&gt; P&lt;/b&gt;rotocol.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipse.org/aspectj/" id="n0t1" title="AspectJ"&gt;AspectJ&lt;/a&gt;&lt;br /&gt;Some aspects of system implementation, such as logging, error handling, standards enforcement and feature variations are notoriously difficult to implement in a modular way. The result is that code is tangled across a system and leads to quality, productivity and maintenance problems. AspectJ is a seamless aspect-oriented extension to the Java programming language that enables clean modularization of these 'crosscutting concerns'. For the best AspectJ development experience, the AspectJ Development Tools (AJDT) project provides Eclipse platform based tool support for AOSD with AspectJ.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jpam.sourceforge.net/" id="o51t" title="JPam"&gt;JPam&lt;/a&gt;&lt;br /&gt;JPam is a Java-PAM bridge. PAM, or Pluggable Authentication Modules, is a standard security architecture used on Linux, Mac OS X, Solaris, HP-UX and other Unix systems. JPam is the missing link between the two.&lt;br /&gt;&lt;br /&gt;JPAM permits the use of PAM authentication facilities by Java application running on those platforms.&lt;br /&gt;These facilities include:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;account&lt;br /&gt;&lt;/li&gt;  &lt;li&gt;auth&lt;br /&gt;&lt;/li&gt;&lt;li&gt;    password&lt;br /&gt;&lt;/li&gt;  &lt;li&gt;session&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;It features JAAS and direct APIs, support for most Unix OSs and architectures and much &lt;a href="http://jpam.sourceforge.net/features.html"&gt;more&lt;/a&gt;...&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: justify;"&gt;  JPam is available under an Apache open source&lt;a href="http://jpam.sourceforge.net/license.html"&gt; license&lt;/a&gt; and is actively developed, maintained and supported.&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/technologies/security/" id="xsyu" title="JAAS"&gt;JAAS&lt;/a&gt;&lt;br /&gt;Java&lt;sup&gt;&lt;span&gt;TM&lt;/span&gt;&lt;/sup&gt; Authentication and Authorization Service&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/webservices/jaxm/index.jsp" id="r8-0" title="JAXM"&gt;JAXM&lt;/a&gt;&lt;br /&gt;The &lt;b&gt;Java API for XML Messaging (JAXM)&lt;/b&gt; enables applications to send and receive document-oriented XML messages. JAXM implements Simple Object Access Protocol (SOAP) 1.1 with Attachments messaging so you can focus on building, sending, receiving, and decomposing messages for your applications instead of programming low-level XML communications routines.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jade.tilab.com/" id="sm9m" title="JADE"&gt;JADE&lt;/a&gt;&lt;br /&gt;JADE (Java Agent DEvelopment Framework) is a software Framework fully implemented in Java language. It simplifies the implementation of multi-agent systems through a middle-ware that complies with the&lt;a href="http://www.fipa.org/" target="_blank"&gt; FIPA specifications&lt;/a&gt; and through a set of&lt;a href="http://jade.tilab.com/images/JADEscreenshot.jpg" target="_blank"&gt; graphical tools&lt;/a&gt; that supports the debugging and deployment phases. The agent platform can be distributed across machines (which not even need to share the same OS) and the configuration can be controlled via a&lt;br /&gt;&lt;a href="http://jade.tilab.com/images/rma.gif" target="_blank"&gt;remote GUI&lt;/a&gt;. The configuration can be even changed at run-time by moving agents from one machine to another one, as and when required. JADE is completely implemented in Java language and the minimal system requirement is the version 1.4 of JAVA (the run time environment or the JDK).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-5708363920685033624?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/5708363920685033624/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=5708363920685033624' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5708363920685033624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/5708363920685033624'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/11/utilidades-ferramentas-e-tecnoloxas-i.html' title='Utilidades: ferramentas e tecnoloxías (I)'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-7297349167507793560</id><published>2007-11-06T13:10:00.001-08:00</published><updated>2007-11-06T15:22:49.267-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><title type='text'>State pattern</title><content type='html'>Moitas veces ao programar xurden escenarios nos que a resposta que debe de dar a aplicación non sempre é a mesma, senón que depende da situación na que se atope o programa nese momentos. Esta pode estar caracterizada, por exemplo, polo valor que toman algunhas variables. Estas distintas situacións nas que se atopa a aplicación son os &lt;b&gt;estados&lt;/b&gt;, e o mecanismo coñecido e posto en práctica na maioría das ocasións para xestionar as distintas accións características de cada estado é a implementación dunha &lt;b&gt;máquina de estados&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;Tralas máquinas de estado hai toda unha teoría matemática que, para aos programadores carece de importancia algunha. Simplemente nos adicamos a pensar nun programa cun estados en tres termos: estado-estímulo-resposta. Noutras verbas, para cada estado a resposta do sistema ás distintas ordes ou interaccións vai ser distinta.&lt;br /&gt;&lt;br /&gt;Agora ben, a nivel de programación, interactuar cun módulo software consiste en invocar unha serie de métodos, públicos se os chamamos dende fora a través da súa interface ou privados se o facemos dende dentro. En ámbolos dous o comportamento vai depender do estado. Tradicionalmente a implementación deste mecanismo consistíu nunha sucesión de sentencias &lt;b&gt;if&lt;/b&gt; ou &lt;b&gt;case&lt;/b&gt; dun &lt;b&gt;switch&lt;/b&gt;. Unha sentencia por cada estado. Esta metodoloxía ten unha serie de inconvenientes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Ineficiencia. Nun determinado momento só hai un estado activo, pero non sabemos cal, polo que hai que pasar por toda a secuencia de &lt;b&gt;if&lt;/b&gt; ou &lt;b&gt;case&lt;/b&gt; ata chegar ao de interés. Isto supón unha carga innecesaria. O ideal sería executar a parte do código correspondente ao estado actual sen executar os &lt;b&gt;if&lt;/b&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;  &lt;li&gt; Metodoloxía propensa a erros. Calquera cambio nun estado pode implicar cambiar todos os métodos. Máis concretamente cambiar unha pequena parte de cada un dos métodos, a correspondente ao estado en cuestión. Dende o punto de vista do programador isto é moi engorroso e perigoso. Ao estar a parte do código dun estado misturado cos demáis, cambiando un, se non se fai con tino, pódense estragar os demáis. Por outra banda, sería doado esquecerse de modificar algún método. Isto último é moi probable no caso de que esteamos a engadir un novo estado. Se modificamos todos os métodos menos un podemos levar o sistema a situacións anómalas.&lt;br /&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;A solución a todos os males anteriores pasa polo emprego do &lt;b&gt;Patrón Estado&lt;/b&gt;. Este patrón propón encapsular o código de cada estado nunha clase. Así, teremos unha clase por estado. A entidade á que pertenzan eses estados, isto é, a aplicación ou clase que poida estar en varios estados terá unha obxecto estado activo de cada vez. Desta maneira soluciónanse os dous problemas anteriores:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;As chamadas aos distintos métodos non perderán tempo en secuencias de &lt;b&gt;if&lt;/b&gt; ou &lt;b&gt;case&lt;/b&gt; xa que no seu interior só está o código corresponde ao estado da clase na que se atopan. &lt;br /&gt;  &lt;/li&gt; &lt;br /&gt;  &lt;li&gt;Ao non ter misturado código de distintos estados minimizamos a posibilidade de cometer erros ao facer modificacións. As modificacións sobre un estado afectarán só á clase correspondente a ese estado. Engadir un novo estado supón crear unha nova clase, non existindo o perigo de engadir o &lt;b&gt;if&lt;/b&gt; correspondente en cada dos métodos. Pódese pensar que desta maneira podemos esquecer engadir un método ao crear unha nova clase, pero non é así. As clases correspondentes a cada estado deberán de implementar unha determinada interfaz ou herdarán dunha clase xenérica que lle obrigará a sobrecargar os distintos métodos ou, terá unha implementación por defecto para aqueles métodos que non sexan característicos de ningún estado e, por tanto, de implementación opcional. &lt;br /&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;   Este mecanismo queda máis claro á vista do seguinte diagrama de clases:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BkneNOzin8k/RzD2dD50NwI/AAAAAAAAAAU/f289oOecybk/s1600-h/statepattern.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_BkneNOzin8k/RzD2dD50NwI/AAAAAAAAAAU/f289oOecybk/s400/statepattern.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5129870954699437826" /&gt;&lt;/a&gt;&lt;br /&gt;   &lt;b&gt;Contexto&lt;/b&gt; é a entidade que manexa estados (a que pola implementación tradicional tería as ristras de &lt;b&gt;if&lt;/b&gt; para cada método). Como vemos, esta posúe un obxecto da clase &lt;b&gt;Estado&lt;/b&gt;. Esta clase é a que encapsula o comportamento de cada estado. As implementacións concretas de cada un fanse nas súas clases fillas, as &lt;b&gt;EstadoConcretoX&lt;/b&gt;. &lt;b&gt;Contexto&lt;/b&gt; disporá en cada instante dun só obxecto &lt;b&gt;Estado&lt;/b&gt; e este, á súa vez, disporá dun só elemento &lt;b&gt;EstadoConcretoX&lt;/b&gt; activo.&lt;br /&gt;&lt;br /&gt;Os patróns de deseño software propoñen sulucións xenéricas deixando, ás veces, cuestións sen especificar que dependerán do criterio do programador. Así, xurden as seguintes preguntas:&lt;br /&gt;&lt;br /&gt;¿Como se fai un cambio de estado?&lt;/b&gt; Os cambios de estado detéctanse por mecanismos á marxe desta arquitectura. Serán os tradicionais, como premer un botón ou finalizar unha acción. Agora ben, como cada estado está encapsulado nun obxecto e aplicación traballará en cada momento cun só destes deles (o correspondente o estado actual), temos que lidiar coa tarefa de cambialo. Para dar resposta a isto temos que antes considerar como almacenamos os estados, isto é:&lt;br /&gt; &lt;ul&gt; &lt;br /&gt; &lt;li&gt; ¿temos todos os estados cargados e almacenados nunha estructura como un array?  &lt;/li&gt;&lt;br /&gt; &lt;li&gt; ¿temos en cada instante cargado só o obxecto correspondente ao estado actual?&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;A primeira solución apuntada implica a creación de todos os obxectos &lt;b&gt;EstadoConcretoX&lt;/b&gt; posibles ao inicio da aplicación e, en cada instante, ter apuntado un deles, o correspondente ao estado actual, que será o soporte as operacións características de dito estado. Seguindo esta proposta, cambiar de estado significa simplemente cambiar o obxecto apuntado. Esta solución caracterízase por:&lt;br /&gt; &lt;ul&gt;&lt;br /&gt; &lt;li&gt;Ocupación de memoria. Como temos cargados todos os obxectos a ocupación de memoria pode ser importante se éstes ocupan moito e/ou se temos demasiados&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Cambios de estado moi rápidos. É unha característica a ter en conta en aplicacións onde os cambios de estado sexan moi frecuentes.&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt;O segunto método implica a destrucción e creación dun novo obxecto &lt;b&gt;EstadoConcretoX&lt;/b&gt; cando se cambia de estado. As características deste mecanismo son as opostas ao anterior:&lt;br /&gt; &lt;ul&gt; &lt;br /&gt; &lt;li&gt;Moi baixa ocupación de memoria. De feito é a mínima posible, xa que só temos cargado un obxecto.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Cambios de estado lentos. As accións de destrucción e creación de obxectos son lentas.&lt;/li&gt;&lt;br /&gt; &lt;/ul&gt;&lt;br /&gt;De entre os dous mecanismos, como outras tantas veces, teremos que decidir se darlle prioridade á ocupación de memoria ou a velocidade de execución. Para aplicacións con cambios de estado habituais parece máis apropiado mantelos todos en memoria. Un exemplo disto poden ser os protocolos de comunicacións, nos que se están a invocar primitivas de maneira moi frecuente e, por tanto, os cambios de estado deben de ser moi rápido, para non ter que encolar as peticións.&lt;br /&gt;&lt;br /&gt;¿Quen xestiona os cambios de estado? Caben dúas posibilidades: os estados en si, isto é, os obxectos &lt;b&gt;EstadoConcretoX&lt;/b&gt; o cal implicaría un mecanismo distribuído; ou a clase &lt;b&gt;Estado&lt;/b&gt; ou &lt;b&gt;Contexto&lt;/b&gt;, dando lugar a unha técnica más centralizada. O primeiro método da lugar a un alto acoplamento entre clases, xa que unhas terían que coñecer as outras. Ademáis teriamos o código dunha determinada función (cambiar de estado) desperdigado en varias clases (scattered code), o cal non é modular (é unha cagada). Un cambio na xestión dos estados implicaría tocar máis dunha clase (insostible). Estes problemas non se dan se deixamos a xestión para &lt;b&gt;Estado&lt;/b&gt; ou &lt;b&gt;Contexto&lt;/b&gt;. Desta maneira só queda decidir cal é a que garda os estados actuais se unha ou a outra, pero isto xa é cuestión do programador.&lt;br /&gt;&lt;br /&gt;  Exemplos de aplicación deste patrón poden ser:&lt;br /&gt;  &lt;ul&gt;&lt;br /&gt;    &lt;li&gt;Máquinas de estados de comunicacións&lt;/li&gt; &lt;br /&gt;    &lt;li&gt;Ferramentas gráficas. En moitas ferramentas gráficas disponse dun panel no que se pode debuxar. Para facer isto é habitual dispor dun panel de botóns no que se elixe a ferramenta de debuxado desexada (un pincel, un lapis, etc.). O resultado sobre o panel de debuxado non será o mesmo, variará en función da ferramente empregada. Así, pódese pensar que a ferramente elixida constitúe o estado da aplicación.&lt;/li&gt;&lt;br /&gt;  &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-7297349167507793560?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/7297349167507793560/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=7297349167507793560' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7297349167507793560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/7297349167507793560'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/11/state-pattern.html' title='State pattern'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_BkneNOzin8k/RzD2dD50NwI/AAAAAAAAAAU/f289oOecybk/s72-c/statepattern.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-9035221669554771781</id><published>2007-10-23T07:38:00.000-07:00</published><updated>2007-10-23T07:59:11.837-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Java to HTML</title><content type='html'>Ás veces precisamos escribir código java durante algunha explicación, como por exemplo, nunha documentación ou nun blog, como pode ser este. &lt;br /&gt;Case todos os IDE de hoxe en día colorean o código de maneira que se poida apreciar a simple vista cada unha das partes que o compoñen. Se queremos ter esa mesma apariencia en HTML teremos que coller o código e aplicarlle un montón de etiquetas para obter dito resultado. Isto é moi engorroso. Pero como case sempre, temos unha aplicación que fai o traballo sucio por nós, trátase de &lt;a href="http://www.java2html.de/"&gt;Java2Html&lt;/a&gt;. Vaga a penar botarlle unha ollada. É verdadeiramente sinxelo e o resultado é moi bo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación amósase un exemplo de funcionamento. Primeiramente se pode observar un pedazo de código pegado directamente e, de seguido, o mesmo código, tras pasar por &lt;a href="http://www.java2html.de/"&gt;Java2Html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * This is about &lt;code&gt;ClassName&lt;/code&gt;.&lt;br /&gt; * {@link com.yourCompany.aPackage.SuperClass}&lt;br /&gt; * @author author&lt;br /&gt; */&lt;br /&gt;public class ClassName extends SuperClass {&lt;br /&gt;  /* This comment may span multiple lines. */&lt;br /&gt;  private int integer = 0;&lt;br /&gt;  public final static char character = 'A';&lt;br /&gt;  // This comment may span only this line&lt;br /&gt;  private String string = "zero";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; &lt;br /&gt;&lt;font color="#3f5fbf"&gt;/**&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;This&amp;nbsp;is&amp;nbsp;about&amp;nbsp;&lt;/font&gt;&lt;font color="#7f7f9f"&gt;&amp;lt;code&amp;gt;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;ClassName&lt;/font&gt;&lt;font color="#7f7f9f"&gt;&amp;lt;/code&amp;gt;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;.&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#3f3fbf"&gt;{@link&amp;nbsp;com.yourCompany.aPackage.SuperClass}&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*&amp;nbsp;&lt;/font&gt;&lt;font color="#7f9fbf"&gt;@author&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;author&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f5fbf"&gt;*/&lt;/font&gt;&lt;br /&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;ClassName&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;extends&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;SuperClass&amp;nbsp;&lt;/font&gt;&lt;font color="#000000"&gt;{&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;/*&amp;nbsp;This&amp;nbsp;comment&amp;nbsp;may&amp;nbsp;span&amp;nbsp;multiple&amp;nbsp;lines.&amp;nbsp;*/&lt;/font&gt; &lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;int&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;integer&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;0&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;public&amp;nbsp;final&amp;nbsp;static&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;char&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;character&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#990000"&gt;'A'&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#3f7f5f"&gt;//&amp;nbsp;This&amp;nbsp;comment&amp;nbsp;may&amp;nbsp;span&amp;nbsp;only&amp;nbsp;this&amp;nbsp;line&lt;/font&gt; &lt;br /&gt;&lt;font color="#ffffff"&gt;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color="#7f0055"&gt;&lt;b&gt;private&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color="#000000"&gt;String&amp;nbsp;string&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color="#2a00ff"&gt;&amp;#34;zero&amp;#34;&lt;/font&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;br /&gt;&lt;font color="#000000"&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-9035221669554771781?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/9035221669554771781/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=9035221669554771781' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/9035221669554771781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/9035221669554771781'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/10/java-to-html.html' title='Java to HTML'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-8087427450625544727</id><published>2007-10-18T11:44:00.000-07:00</published><updated>2007-10-18T11:49:11.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Arquitecturas Software'/><title type='text'>Filosofando sobre compoñentes software..</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;            &lt;/div&gt;&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;&lt;div style="text-align: justify;"&gt;O software é unha disciplina relativamente recente. Coido que aínda non acadou a súa fase de madurez. Día a día os que estamos máis ou menos metidos neste mundiño observamos como xurden novas técnicas, como morren outras, como aquela maneira de traballar de hai un ano hoxe nos parece unha toleira. En definitiva, está todo moi caótico. No outro lado da moneda temos o hardware. Xa o dicía un profesor meu da universidade: “los que en la Edad Media hacían molinos, hoy hacen hardware”. Dende un punto de vista histórico non sei se é certo ou non mais, no ámbito deste artigo, carece de importancia esa cuestión. Pero alén disto esa frase agocha moito máis significado. Trátase da larga traxectoria que levou o hardware ata os nosos días, gracias a cal atópase nun estado de madurez e estabilidade que debe de servir como exemplo ao software. &lt;/div&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; text-align: justify;"&gt; Nos últimos tempos apareceron novos estándares e revisións doutros existentes como BlueTooth ou Wifi sobre os que se constrúen aplicacións cada vez máis complexas. Mais, as placas electrónicas (con permiso dos electrónicos) son todas “parecidas” entre si, isto é, uns poucos chips insertados nunha plaquiña e interconectados mediante pistas. Quizais algunha resistencia para facer algunha adaptación ou condensadores para pequenos filtrados pero pouco ou nada máis. E isto é así para sistemas tan sinxelos como un mando a distancia ata a placa base do meu ordenador (e supoño que do teu tamén). A funcionalidade do sistema ben dada pola interconexión entre os distintos chips, así como “das tripas” destes. Cada un destes chips  unha ofrece ao enxeñeiro de hardware unha serie de patiñas ou pins que actúan como entrada ou saída de información. Nas mans do electrónico está o poder de conectalo debidamente con outros chips ou circuitos integrados para crear grandes sistemas. Cada un destes circuitos integrados está deseñado por distintas empresas e... sen embargo... todo funciona!&lt;/p&gt;  &lt;p style="margin-bottom: 0cm; text-align: justify;"&gt; No software a realidade pinta de maneira ben distinta. Se as cousas funcionasen como no hardware bastaría con coller unha serie de compoñentes deseñados por distintos desenvolvedores e unilos entre si cunha infraestructura moi básica: nada máis lonxe da realidade. Coa aparición da POO (&lt;i&gt;OOP – object oriented programming&lt;/i&gt;) deuse un pulo á reutilización, permitindo deseñar clases que se poden reutlizar posteriormente. Na práctica isto non funciona así xa que as clases non encapsulan funcionalidades de maneira correcta, atopándose estas distribuídas entre varias Así, nunha aplicación existen unha chea de dependencias entre clases, de maneira que é difícil coller unha de elas e reutilizala outra vez.  &lt;/p&gt;  &lt;p style="margin-bottom: 0cm; text-align: justify;"&gt; Nos últimos tempos toman cada vez máis protagonismo as tecnoloxías web e, neste eido, xurden unha chea de &lt;i&gt;frameworks &lt;/i&gt;&lt;span style="font-style: normal;"&gt;como SPRING, JSF ou .NET. Estes proporcionan unha infraestructura ou un esquelete do sistema moi complexo que é totalmente transparente ao programador, permitindo a este a construcción de sistemas complexos de maneira sinxela. Aínda así, coido que non son a solución definitiva. As miñas razóns son as seguintes:&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Infraestructuras  moi complexas. Para crear pequenas aplicacións empréganse  máis recursos no soporte das mesmas que nelas en si mesmas.  ¿Para as grandes é válido? Verdadeiramente  funciona, pero penso que non é a solución ideal porque  esta vai depender do framework empregado, complicando así  calquera migración futura e obrigando a ter expertos no  manexo dos mesmos.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Seguindo co  exemplo do hardware, alí os grandes sistemas compóñense  dos mesmos elementos cos pequenos, ¿non sería viable  que no software isto fose da mesma maneira? Así se  solucionarían os dous problemas plantexados no punto  anterior: a migración, a cal xa non tería sentido  porque o sistema non estaría asentado sobre outro e, por este  mesmo motivo, non habería que ter expertos nese outro sistema  base.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt; O que propoño é:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Deseñar  compoñentes software &lt;b&gt;autónomos&lt;/b&gt;, cunhas  interfaces ben definidas, que se poidan empotrar en calquera  sistema. Ben, esta idea non é ningunha novidade. É  máis pódese dicir que o obxectivo de moitos  arquitecturas que teñen xurdido nos últimos anos.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Da mesma  maneira que no hardware temos as tarxetas como “frameworks” para  os distintos compoñentes, ter no SW unha &lt;b&gt;infraestructura  moi sinxela &lt;/b&gt;tamén.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Conectarase as  entradas dun compoñente ás saídas doutro  &lt;i&gt;(&lt;/i&gt;&lt;i&gt;&lt;b&gt;mapping&lt;/b&gt;&lt;/i&gt;&lt;i&gt;)&lt;/i&gt; . Esta conexión pode  ser directa ou mediante algún elemento intermediador que  adapte o protocolo de comunicación, como un &lt;i&gt;bridge &lt;/i&gt;&lt;span style="font-style: normal;"&gt;en  redes ou unha resistencia de &lt;/span&gt;&lt;i&gt;pull-up&lt;/i&gt;&lt;span style="font-style: normal;"&gt;  en electrónica.&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;Estas  conexións definirán o &lt;b&gt;fluxo de datos e de control  &lt;/b&gt;pero... ¿cando se establece este? ¿quen o fai?  Deberemos de ter unha ferramenta de modelado, gráfica ou  textual, na que se definan as conexións entre os disintos  compoñentes. Nesta definirase o comportamento inicial do  sistema, mais este poderá variar mediante o cambio no fluxo  de datos ou control e os compoñentes.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;&lt;span style="font-style: normal;"&gt;Os  compoñentes poderanse extraer e poñer en quente &lt;/span&gt;&lt;i&gt;(&lt;/i&gt;&lt;i&gt;&lt;b&gt;hot  swap&lt;/b&gt;&lt;/i&gt;&lt;i&gt;). &lt;/i&gt;&lt;span style="font-style: normal;"&gt;Para que isto  sexa posible os outros compoñentes deben de ser o  suficientemente robustos como para soportar estas situacións.  Este comportamento é parecido ao dos nodos das redes de  comunicacións, se un se cae, a rede ten que seguir  funcionando. Para elo os outros nodos cambiarán as súas  táboas de encamiñamento dacordo a nova situación.  Aquí non ten sentido falar de táboas de encamiñamento,  a non ser que teñamos compoñentes redundantes  (distintos compoñentes que dan a mesma funcionalidade). Neste  caso o novo compoñente que reciba a orde de executarse deberá  tamén recibir algún tipo de información para  acadar o mesmo &lt;/span&gt;&lt;i&gt;estado &lt;/i&gt;&lt;span style="font-style: normal;"&gt;no  que estaba o outro. Con respecto a esto xurde unha cuestión,  ¿poderase recuperar o estado directamente (como un patrón  &lt;/span&gt;&lt;i&gt;memento&lt;/i&gt;&lt;span style="font-style: normal;"&gt;) ou teranse  que dar unha serie de pasos ata acadalo?&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;div style="text-align: justify;"&gt;No hardware é  doado imaxinarse o &lt;i&gt;hot swap&lt;/i&gt;&lt;span style="font-style: normal;"&gt;  porque os compoñentes son tanxibles. No software é  máis complexo. Non vamos a coller un compoñente SW coa  man, extraelo e por outro no seu lugar, senón que haberá  un axente ou &lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;entidade  coordinadora &lt;/b&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;que os  active e desactive. Isto pode ser a petición dun usuario, co  cal se comunica. &lt;/span&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;  &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;A  interconexión dos compoñentes deberá de ser  independente da linguaxe na que estes estean programados, así  como da plataforma sobre a que se interconecten (linux, windows...)&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;&lt;span style="font-style: normal;"&gt;A  &lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;conexión &lt;/b&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;dos  mesmos poderase facer de maneira local ou ben &lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;remota&lt;/b&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;.  Este punto pode entroncar coas Arquitecturas Orientadas a Servicios.  Xurde aquí, entón, unha cuestión, ¿podemos  considerar os compoñentes como servicios e/ou viceversa?&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;&lt;span style="font-style: normal;"&gt;Os  compoñentes poderán ampliar a súa  funcionalidade mediante &lt;/span&gt;&lt;i&gt;&lt;b&gt;plugins. &lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Cada  vez que se engade un &lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=""&gt;plugin&lt;/span&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  a un compoñente este deberá de actualizar a súa  interface coa nova funcionalidade ofrecida ou ampliada.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt; Dúbidas&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Un dos requisitos impostos por SOA  é que os servicios sexan sen estado. Aquí, os  compoñentes, ¿pode ter sentido que teñan  estado? ¿Con estado é posible que poidan ofrecer  funcionalidades maiores?&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;¿Pode ter isto relación  coas POJO (clases de java de toda a vida) bautizadas por Martin  Flower e as ferramentas que hai para traballar con elas?   &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;ul&gt;&lt;li value="1"&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; text-align: justify;"&gt;¿As  tarefas de comunicación as leva o compoñente en si  mesmo ou necesita dunha capa ou doutro de compoñente de  apoio?&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; Tecnoloxías, arquitecturas e ferramentas a estudiar relacionadas:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;COTS&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;CBSE&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;SOA&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;ADL (Architecture Description  Languages)&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Notación UML-RT (en teoría  isto é anterior a UML 2.0)&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Rational Rose&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Event-driven Modelling??&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-8087427450625544727?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/8087427450625544727/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=8087427450625544727' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8087427450625544727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8087427450625544727'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/10/filosofando-sobre-compoentes-software.html' title='Filosofando sobre compoñentes software..'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-3028574767367430142</id><published>2007-10-17T15:19:00.000-07:00</published><updated>2007-10-17T15:30:06.202-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>rsync</title><content type='html'>Cando traballamos en varias máquinas de maneira habitual, ou temos unha como copia de seguridade, gustarianos ter sincronizada a información en todas elas.&lt;br /&gt;&lt;br /&gt;Isto é moi doado co comando &lt;span style="font-family: courier new; font-weight: bold;"&gt;rsync.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;Nunca máquina debemos de ter correndo un servidor de rsync. Nos clientes executaremos o comando cada vez que queiramos sincronizar o contido dalgún directorio local con outro directorio da máquina na que corre o servidor.&lt;br /&gt;&lt;br /&gt;É interesante destacar que a sincronización pode ser en ámbolos dous sentidos. Ademáis, entre outras opcións, a ferramente ofrece a opción de ter en conta a versión máis recente dun ficheiro para actualizalo ou non según se lle indique.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-3028574767367430142?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/3028574767367430142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=3028574767367430142' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3028574767367430142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/3028574767367430142'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/10/rsync.html' title='rsync'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-8256849307048340398</id><published>2007-10-16T15:36:00.000-07:00</published><updated>2007-10-16T15:45:04.469-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitecturas Software'/><title type='text'>SOA, Web Services, Orchestration e Choreography</title><content type='html'>SOA (&lt;span style="font-style: italic;"&gt;Services Oriented Architecture&lt;/span&gt;) é unha arquitectura software cuio obxectivo é distribuír a funcionalidade entre unha serie de axentes. Estes axentes funcionan de maneira autónoma sendo  totalmente independentes entre si.&lt;br /&gt;&lt;br /&gt;Cada un destes axentes ou servicios ofrece un servicio (un cálculo, a encriptación dun texto, unha conversión de formato) á aplicación que o invoque. Desta maneira estase a repartir a funcionalidade dunha aplicación en distintas entidades. Agora ben, a aplicación principal debe de poder acceder a este servicio para o cal é preciso que este se tivera rexistrado previamente nun directorio (como unhas páxinas amarelas).&lt;br /&gt;&lt;br /&gt;Cada servicio debe de cumplir unha serie de restriccións para que poida ser descuberto e empregado por outras entidades. Estas son:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Independencia da linguaxe&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Independencia da plataforma&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Idempotencia. Para non dar lugar a situacións erróneas polo envío de mensaxes repetidas.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Sen estado.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Interfaces ben definidas&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;A esta arquitectura responden os servicios web cunha serie de características:&lt;br /&gt;As interfaces deben de estar baseadas en protocolos de Internet (HTTP, ...)&lt;br /&gt;As mensaxes deben de ser XML (excepto os attachments que poden ir en binario)&lt;br /&gt;&lt;br /&gt;Unha vez feita esta brevísima descrición inicial xurde a seguinte cuestión, ¿non sería posible que estes servicios cooperasen entre si dando lugar a sistemas máis potentes? Pois si. Está cooperación vén descrita por dous termos: choreography e orchestration.  Choreography é unha descrición das interaccións peer to peer externamente observables que existen entre os servicios que forman parte do sistema.  Esta descrición dase dende un punto de vista neutral, non dende o punto de vista dos servicios, mediante o estándar WS-CDL. Pola contra orchestration fai referencia á composición de servicios, controlando a maneira en que interactúan entre eles e, verificando que isto se faga de maneira segura, seguindo unha secuencia lóxica e fiable. A composición de servicios para dar lugar a outros novos segue o estándar WS-BPEL.&lt;br /&gt;&lt;br /&gt;Agora que xa temos un conxunto de servicios perfectamente definidos que cooperan entre si proporcionando unha certa funcionalidade xurde outra pregunta, ¿estamos ante un sistema de workflow? A resposta é si. Stephen Ross-Talbot [1] o describe da seguinte maneira tengo en conta se hai interacción humana ou non: “in a SOA services can be software agents as well as human agent. It is when we include a human agent as a service that we start to see that orchestration and choreography are different ways of defining workflows. In the case of orchestration we use a service to broker the interactions between the services including the human agents and in the case of choreography we define the expected observable interactions between the services as peers as opposed to mandating any form of brokering”.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;[1]Orchestration and Choreography: Standards, Tools and Technologies for Distributed Workflows.&lt;br /&gt;Stephen Ross-Talbot&lt;br /&gt;Pi4 Technology, London, UK and W3C, Geneva, Switzerland&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[2]http://www.lightreading.com/&lt;/li&gt;&lt;br /&gt;&lt;li&gt;[3]Web Services Architecture&lt;br /&gt;W3C Working Group Note 11 February 2004&lt;br /&gt;http://www.w3.org/TR/2004/NOTE-ws-arch-20040211/&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Andrés Estévez Costas, 16/10/2007&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-8256849307048340398?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/8256849307048340398/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=8256849307048340398' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8256849307048340398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/8256849307048340398'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/10/soa-web-services-orchestration-y.html' title='SOA, Web Services, Orchestration e Choreography'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-1567149392777845217</id><published>2007-10-12T13:47:00.000-07:00</published><updated>2007-10-12T13:54:01.650-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><title type='text'>Adaptive Object Modeling (AOM)</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   H1 { margin-bottom: 0.21cm }   H1.western { font-family: "Helvetica"; font-size: 16pt }   H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }   H1.ctl { font-family: "DejaVu Sans"; font-size: 16pt }  --&gt;  &lt;/style&gt;  &lt;h1 class="western"&gt;Adaptive Object Modeling (AOM)&lt;/h1&gt;[NOTA: o que está en inglés é por vagabundería pura e dura]&lt;br /&gt;&lt;br /&gt;&lt;p&gt; Trátase dunha arquitectura que responde á seguinte cuestión: “¿Como construír sistemas que poidan, dinamicamente, adaptarse aos novos requirimentos do negocio?”. É dicir, trátase de construír sistemas que se adapten facilmente aos cambios no dominio. Facilmente, no extremo, pode significar “sen programar”. Esta é a arquitectura empregada por moitos sistemas de workflow.  &lt;/p&gt; &lt;p&gt; Esta arquitectura baséase en dúas cuestións fundamentais:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p&gt;Metadatos. Como o seu nome indica son datos sobre datos. AOM  propón o emprego de metadatos para modelar aquelas cuestións  “predicibles”. Desta maneira non se ata a unha funcionalidade  dada, permitíndoa modificar en tempo de execución. Ao  meu entender non é a solución idónea, xa que  hai que saber no momento da implementación do sistema por  onde poden ir os tiros, o cal non é máis flexible  posible.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;Patróns de Diseño que afondan no tema da  reutilización e dos cambios ao voo durante a execución  dun sistema. Entre estes están:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;Patróns dinámicos:&lt;/p&gt;   &lt;ul&gt;&lt;li&gt;&lt;p&gt;TypeObject, desacopla as instancias das súas clases,    de forma que esas clases poidan ser implementadas como instancias    doutras clases. Permite CREAR CLASES DINÁMICAMENTE (ollo!!    clases, non obxectos), permitindo ao sistema proporcionar as súas    propias regras de chequeo de tipos. Pode conducir a sistemas más    sinxelos e pequenos.&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;Property, proporciona mecanismos para acceder, alterar,    engadir e eliminar atributos en tempo de execución .&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;TypeSquare. A combinación do TypeObject co Property&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;RuleObject. "This pattern language balances the forces in    the problem doaain of modeling, design, implementation and    placement of business rules, workflow, routing in distributed,    object-oriented and component-based applications. As the need    arises for more scalability, flexibility and performance,    additional patterns are introduced that balance the new forces    that come into the picture as a result of additional functional or    non-functional requirements"     &lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;/li&gt;&lt;li&gt;&lt;p&gt;Patróns “clásicos”&lt;/p&gt;   &lt;ul&gt;&lt;li&gt;&lt;p&gt;Strategy. Define unha familia de algoritmos encapsulando    cada un deles nun obxecto. Estes obxectos son intercambiables.    Esta solución permite que o algoritmo varíe en    función do cliente que o empregue.&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;Composite&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;Interpreter&lt;/p&gt;    &lt;/li&gt;&lt;li&gt;&lt;p&gt;Builder&lt;/p&gt;   &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-1567149392777845217?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/1567149392777845217/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=1567149392777845217' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/1567149392777845217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/1567149392777845217'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/10/adaptive-object-modeling-aom.html' title='Adaptive Object Modeling (AOM)'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-36222993659873837</id><published>2007-08-08T16:05:00.000-07:00</published><updated>2007-08-08T16:08:26.224-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><title type='text'>Patróns de Software</title><content type='html'>&lt;p style="margin-bottom: 0cm;"&gt;A &lt;b&gt;Enxeñería do Sofware&lt;/b&gt; é unha ciencia relativamente recente no mundo da técnica, non comparable á mecánica, a electricidade ou a electrónica. Nestas últimas, por exemplo, existe unha grande experiencia acumulada ao longo de moitos anos. Por este motivo tódalas cuestións que atinxen a estas materias atópanse perfectamente definidas e delimitadas, coñecéndose perfectamente a problemática que involucran, así como a súa solución. Ademais, ditas solucións fóronse depurando pouco a pouco limando todos os pequenos detalles que non se tiveran en conta nun primeiro momento.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;A tecnoloxía do software está moito máis verde. Se ben é certo que nos últimos anos experimentou un gran desenvolvemento coa aparición de novos paradigmas como a &lt;b&gt;Programación Orientada a Obxectos (OOP –&lt;/b&gt;&lt;i&gt;&lt;b&gt; object oriented programation) &lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;ou, moito máis recente, a &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;Programación Orientada a Aspectos (AOP –&lt;/b&gt;&lt;/span&gt;&lt;i&gt;&lt;b&gt; aspect oriented programation),&lt;/b&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt; que non se tratarán aquí por escaparse do ámbito deste apéndice. Ademais da aparición destes paradigmas aparecen novas técnicas como o emprego de &lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;b&gt;Patróns de Deseño Software. &lt;/b&gt;&lt;/span&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;Un patrón “&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=""&gt;describe un problema que ocorrre unha e outra vez no noso entorno, así como a solución a dito problema, de tal modo que se poida aplicar esta solución un millón de veces, sen facer o mesmo dúas veces&lt;/span&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;”. O contexto orixinal desta descrición era a arquitectura urbana, pero pódese aplicar noutros ámbitos. Neste caso ao Software. Neste ámbito, segundo o seu propósito os patróns divídense nos seguintes grupos:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-style: normal;"&gt;De  creación, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;que  tratan sobre o proceso de creación de obxectos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-style: normal;"&gt;Estructurais,  &lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;que  tratan coa composición de clases ou obxectos.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-style: normal;"&gt;De  comportamento, &lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;que  caracterizan o modo no que as clases e os obxectos interactúan  e se reparten a responsabilidade.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-36222993659873837?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/36222993659873837/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=36222993659873837' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/36222993659873837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/36222993659873837'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/08/patrns-de-software.html' title='Patróns de Software'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-2018232061033901608</id><published>2007-08-07T16:18:00.000-07:00</published><updated>2007-08-08T08:31:50.539-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ingeniería del Software'/><title type='text'>Refactorización de código</title><content type='html'>&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;A refactorización é un concepto que toma cada vez máis peso no desenvolvemento de software.  Consiste en &lt;b&gt;realizar modificacións no código co obxectivo de mellorar a súa estructura interna, sen alterar o seu comportamento externo&lt;/b&gt;. O obxectivo final é manter un código limpo e estructurado ou, dito doutro xeito, sinxelo e de calidade.&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Unha vez definida esta técnica toca o momento de profundizar nas súas peculiaridades. Cada  proxecto de desenvolvemento de software parte dunhas especificacións iniciais a partir das cales realízase o deseño e, posteriormente, a implementación. A partir desas especificacións, as dúas fases seguintes, débense de desenvolver de maneira que se cumprar todas as directrices propostas na Enxeñería do Software para garantir uns altos niveis de calidade. A práctica afástase un tanto desta descrición. As especificacións cambian de cotío, incluso cando xa se superou esta fase, e se está en pleno deseño ou incluso na implementación. Isto implica que se teñan que realizar modificacións non consideradas no plantexamento inicial. Estes cambios provocan que a arquitectura proposta inicialmente para o sistema a desenvolver deixe de ser a máis adecuada. A consecuencia disto é unha perda gradual da calidade do software que se manifesta de diversas maneiras:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;existencia  de código duplicado;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;o  código non permite entender o deseño;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;método  e clases moi longos;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;cada  cambio implica cada vez un maior esforzo de programación;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;A maneira de solucionar isto é aplicar técnicas de &lt;b&gt;refactorización,&lt;/b&gt;&lt;span style=""&gt; consistentes en &lt;/span&gt;&lt;b&gt;pequenos&lt;/b&gt;&lt;span style=""&gt; cambios no código que transformen a estructura para dar lugar a outra que se adapte mellor as especificacións actuais. Agora ben, hai que ter en conta que todo cambio no código conleva un risco importante. Focalizando a atención nunha determinada cuestión pódense deixar de lado outras que tamén se ven afectadas por estes cambios. Para evitar esta problématica é imprescindible contar cun conxunto de probas automáticas que garantan que calquera cambio realizado non estrague ningunha funcionalidade.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;Existen dous escenarios principais de uso da refactorización. O primeiro deles da lugar á chamada &lt;/span&gt;&lt;b&gt;refactorización a posteriori&lt;/b&gt;&lt;span style=""&gt; e, por outra banda, tense a &lt;/span&gt;&lt;b&gt;refactorización continua. &lt;/b&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;A &lt;/span&gt;&lt;b&gt;refactorización a posteriori &lt;/b&gt;&lt;span style=""&gt;consiste no conxunto de cambios a realizar tras coller unha aplicación desenvolvida previamente. Os motivos polos que aplicar refactorización aquí son principalmente dous:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;O  código non é de calidade. Neste caso aplicaranse os  cambios oportunos para invertir esta situación.&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;A  estructura non é valida para soportar as novas  funcionalidades e engadir.&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;O problema principal neste escenario é que os cambios poden moi grandes. A maneira de paliar este problema é tratar de dividilos no maior número posible deles. Así cada un dos resultantes será o máis pequeno posible e, polo tanto, máis doado de realizar. Estes cambios tan grandes poden dar lugar a outro problema: a &lt;/span&gt;&lt;b&gt;espiral refactorizadora, &lt;/b&gt;&lt;span style=""&gt;consistente na identificación de novos problemas mentres se está a refactorizar. Estes novos tamén se empezan a refactorizar. Este proceso pode ser recursivo, non tendo ningunha estimación da súa durabilidade, o cal debe de evitarse por todos os medios. A maneira de evitar este problema é definir claramente os obxectivos da cara refactorización. Se durante o desenvolvemento da mesma se atopan outros novos, apuntaranse, pero non se solucionarán neste momento para evitar entrar na espiral.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;O outro escenario de refactorización é a &lt;/span&gt;&lt;b&gt;refactorización continua. &lt;/b&gt;&lt;span style=""&gt;A diferencia principal co anterior está no punto de partida. Este tipo refactorización dase cando un equipo de desenvolvemento comeza un proxecto dende cero. Por tanto, as necesidades de refactorización virán dadas unicamente polas novas funcionalidades que se engadan. Trala implementación de cada unha delas procederase á refactorización. Desta maneira consíguese que a estructura da aplicación sexa sempre a ideal.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;A continuación descríbense unha serie de cuestións a ter en conta en calquera tipo de refactorización:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Coñecementos  teóricos básicos.&lt;/span&gt;&lt;/b&gt;&lt;span style=""&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;  A identificación de situacións que “pidan” unha  refactorización&lt;/span&gt;&lt;/span&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;i&gt;&lt;span style=""&gt;  (bad smells)&lt;/span&gt;&lt;/i&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;  non debe de ser unha tarefa que xurda da inspiración de cada  un dos membros do equipo. Existen unha serie de situacións  comúns que, o seu coñecemento previo, aforrará  moito tempo. Tamén é moi importante o coñecemento  dos distintos patróns de deseño existentes, os cales,  axudarán a identificar ditas situacións.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-style: normal;"&gt;Compromiso  entre funcionalidade e estructura. &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Acadar  unha estructura perfecta da aplicación pode supoñer  realizar refactorizacións que empreguen moito tempo de  desenvolvemento. Ocupar este tempo nestas tarefas sacrifica o avance  da aplicación no tocante ás funcionalidades. Non se  debe de caer en ningún dos dous extremos, chegando a un  compromiso entre ambos. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;  &lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt; &lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;Por último sinalar que a refactorización é unha peza básica en diversas técnicas de programacións actuais, como son:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style=""&gt;A  Programación Extrema&lt;/span&gt;&lt;/span&gt;&lt;i&gt;&lt;span style=""&gt;  (Extreme Programming)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm; font-style: normal;"&gt;&lt;span style="background: transparent none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"&gt;&lt;span style=""&gt;O  Desenvolvemento Dirixido por Probas&lt;/span&gt;&lt;i&gt;&lt;span style=""&gt;  (TDD – Test Driven Development)&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-2018232061033901608?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/2018232061033901608/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=2018232061033901608' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2018232061033901608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/2018232061033901608'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2007/08/refactorizacin-de-cdigo.html' title='Refactorización de código'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115637378694176783</id><published>2006-08-23T15:28:00.000-07:00</published><updated>2007-08-08T08:36:59.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Creación de servicios de Internet en Ubuntu</title><content type='html'>En alguna ocasión hemos ejecutado algo parecido a esto&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;telnet &lt;i&gt;url_destino&lt;/i&gt; &lt;i&gt;puerto&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo que estamos haciendo es ejecutar de manera remota un programita en la máquina indicada que está escuchando peticiones en ese puerto.&lt;br /&gt;&lt;br /&gt;Esa interfaz no es nada clara, así que lo que se hace es asociar un nombre a esa aplicación en ese puerto. Y eso es lo que pasa cuando hacemos, por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;ftp &lt;i&gt;url_destino&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a explicar como podemos crear nosotros nuestro propio servicio. Para ello tendremos que introducir unas líneas en dos ficheros de configuración y crear los ficheros de la aplicación en sí.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;/etc/xinetd.conf&lt;/strong&gt;&lt;br /&gt;En este fichero se definen las características del servicio. Puede tener un aspecto parecido a este:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;service nada&lt;br /&gt; {&lt;br /&gt;        disable                 = no&lt;br /&gt;        socket_type             = stream&lt;br /&gt;        wait                    = no&lt;br /&gt;        user                    = root&lt;br /&gt;        server                  = /usr/sbin/nada&lt;br /&gt;        nice                    = 10&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Todas las opciones, así como sus posibles valores se pueden consultar con &lt;span class="codigo"&gt; man xinetd.conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Comentar solamente que la línea &lt;span class="codigo"&gt;server&lt;/span&gt; indica la ruta del script que se ejecutará cuando se acceda al servicio.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;/etc/services&lt;/strong&gt;&lt;br /&gt;Es una lista en la que se enumeran todos los servicios, así como el protocolo de transporte subyacente (tcp/udp) y el puerto. Tiene el siguiente aspecto:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;...&lt;br /&gt;dircproxy       57000/tcp                       # Detachable IRC Proxy&lt;br /&gt;tfido           60177/tcp                       # fidonet EMSI over telnet&lt;br /&gt;fido            60179/tcp                       # fidonet EMSI over TCP&lt;br /&gt;&lt;br /&gt;# Local services&lt;br /&gt;nada            12345/tcp              # Comentario de nuestro servicio&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La primera columna es el nombre del servicio que coincide con el especificado en /etc/xinestd.conf. OJO!! Aquí el nombre del servicio y del script son iguales, pero esto NO tiene porqué ser así.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora, para probasto, basta hacer:&lt;br /&gt;&lt;span class="codigo"&gt;telnet localhost 12345&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Próximamente explicaremos cómo acceder al servicio por su nombre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115637378694176783?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115637378694176783/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115637378694176783' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115637378694176783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115637378694176783'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/creacin-de-servicios-de-internet-en.html' title='Creación de servicios de Internet en Ubuntu'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115610893071852170</id><published>2006-08-20T14:16:00.000-07:00</published><updated>2007-08-08T08:36:59.877-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Crear usuario root en Ubuntu</title><content type='html'>Los que nos pasamos de otra distribución de Linux a esta nos encontramos con que, por defecto, no existe el usuario root. Para solucionarlo basta teclear lo siguiente en una consola:&lt;br /&gt;&lt;br /&gt;&lt;div class="codigo"&gt;&lt;br /&gt;   sudo passwd root&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A continuación nos pedirá la nueva contraseña para el usuario "root"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115610893071852170?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115610893071852170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115610893071852170' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115610893071852170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115610893071852170'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/crear-usuario-root-en-ubuntu.html' title='Crear usuario root en Ubuntu'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115567361834307227</id><published>2006-08-15T12:39:00.000-07:00</published><updated>2007-08-08T08:37:29.616-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>AJAX. Implementación</title><content type='html'>Continuando con el artículo introductorio a AJAX vamos a presentar ahora una implementación sacada del &lt;a href="http://rajshekhar.net/blog/archives/85-Rasmus-30-second-AJAX-Tutorial.html"&gt;Rasmus' 30 seconds tutorial&lt;/a&gt;, sobre la cual haremos algún comentario y propondremos alguna modificación.&lt;br /&gt;&lt;br /&gt;En primer lugar tenemos la función &lt;span class="codigo"&gt;createRequestObject()&lt;/span&gt; que se encarga de inicializar el objeto encargado de la comunicación, esto es, aquel que nos proporcionará los métodos necesarios para enviar la petición al servidor y recibir la respuesta.&lt;br /&gt;&lt;br /&gt;En el código podemos observar como se tiene en cuenta el navegador que se está utilizando&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;function createRequestObject() {&lt;br /&gt;    var ro;&lt;br /&gt;    var browser = navigator.appName;&lt;br /&gt;    if(browser == "Microsoft Internet Explorer"){&lt;br /&gt;        ro = new ActiveXObject("Microsoft.XMLHTTP");&lt;br /&gt;    }else{&lt;br /&gt;        ro = new XMLHttpRequest();&lt;br /&gt;    }&lt;br /&gt;    return ro;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación tenemos que llamar a la función anterior para obtener una instancia de dicho objeto: &lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;var http = createRequestObject();&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;sndReq(action)&lt;/span&gt; se encarga de enviar la solicitud al servidor. Como vemos invoca el método &lt;span class="codigo"&gt;http.open&lt;/span&gt; con dos parámetros: método de la petición ("get" o "post") y la url. En este caso se le está pasando a la función la lista de variables a enviar ("action"), no ocurriendo con la página destino ("rpc.php"), que está puesta de manera constante en el código. Queda a gusto del programador hacerlo como lo estime más oportuno o como le dé más rabia.&lt;br /&gt;&lt;br /&gt;En la siguiente línea (&lt;span class="codigo"&gt; http.onreadystatechange = handleResponse;&lt;/span&gt;) le  estamos indicando qué función tiene que ejecutarse cuando "cambie el estado de la petición", esto es, cuando después de haber enviado la petición, reciba la respuesta sin error.&lt;br /&gt;&lt;br /&gt;Y por el último tenemos &lt;span class="codigo"&gt; http.send(null);&lt;/span&gt;, parte muy importante, ya que indica el fin de la petición. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;function sndReq(action) {&lt;br /&gt;    http.open('get', 'rpc.php?action='+action);&lt;br /&gt;    http.onreadystatechange = handleResponse;&lt;br /&gt;    http.send(null);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Por último tenemos la función &lt;span class="codigo"&gt;handleResponse&lt;/span&gt; que se encarga de recibir la respuesta a la petición anterior e insertar el código html recibido en el elemento correspondiente. Esta implementación lo que hace es que el servidor envíe una cadena al cliente con el siguiente formato:&lt;br /&gt;&lt;br /&gt;         identificadorElementoHtml|contenido&lt;br /&gt;&lt;br /&gt;donde identificadorElementoHtml es el atributo "id" del elemento de la página en el que queremos insertar el código recibido (el "contenido"). Por tanto lo primero que hay que hacer es separar ambos campos, usar el primero de ellos para buscar el elemento "padre"(&lt;span class="codigo"&gt;document.getElementById(identificadorElementoHtml)&lt;/span&gt;) y cambiar su contenido por el nuevo, para lo cual accedemos al atributo &lt;span class="codigo"&gt;innerHTML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;function handleResponse() {&lt;br /&gt;    if(http.readyState == 4){&lt;br /&gt;        var response = http.responseText;&lt;br /&gt;        var update = new Array();&lt;br /&gt;&lt;br /&gt;        if(response.indexOf('|' != -1)) {&lt;br /&gt;            update = response.split('|');&lt;br /&gt;            document.getElementById(update[0]).innerHTML = update[1];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tal como está hecho este ejemplo, el servidor ("rpc.php") envía una cosa u otra en función de la variable "action". Otra posibilidad es tener un script en el servidor distinto por cada acción. De esta manera en el cliente la página destino ya no debe ser una constante y podemos obviar la variable "action".&lt;br /&gt;&lt;br /&gt;Se puede dar el caso de que el resultado de una misma petición la querramos mostrar en distintos elementos, unas veces en unos y otras en otros. Para ello la solución puede ser enviar al servidor en una variable el atributo "id" deseado y este lo devolverá en su respuesta como primer campo. Otra solución (no me comprometo a que funcione) sería dejar una variable en javascript indicando en donde hay que colocar la siguiente información recibida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Referencias:&lt;br /&gt; &lt;a href="http://www.w3schools.com/ajax"&gt;http://www.w3schools.com/ajax/&lt;/a&gt;&lt;br /&gt; &lt;a href="http://rajshekhar.net/blog/archives/85-Rasmus-30-second-AJAX-Tutorial.html"&gt;Rasmus' 30 seconds tutorial&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115567361834307227?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115567361834307227/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115567361834307227' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115567361834307227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115567361834307227'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/ajax-implementacin.html' title='AJAX. Implementación'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115550462196457429</id><published>2006-08-13T14:20:00.000-07:00</published><updated>2007-08-08T08:37:22.468-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Esquivar los spambots</title><content type='html'>Es de todos conocido el afán de muchas compañías por hacerse con direcciones de correo electrónico activas para enviar correos publicitarios a las mismas.&lt;br /&gt;&lt;br /&gt;Una de las técnicas empleadas son los cadenas de correos que todos hemos recibido alguna vez en las que, antes del contenido del mensaje en sí, aparecen infinidad de direcciones. Además de esta existe otra mucho más sofisticada, que es el uso de &lt;span style="font-style: italic;"&gt;spambots, &lt;/span&gt;esto es, robots que rastrean páginas en busca de  direcciones .  De forma más técnica podemos decir que lo que hacen es buscar en el código de una página web patrones que coincidan con la sintaxis correcta de una dirección de correo, por lo tanto, es condición necesaria que en dicho código se encuentre explicitamente el e-mail, así que para esquivar estos spambots lo que tenemos que hacer es, simplemente, no escribir la dirección en la página web. ¿Y cómo la mostramos? Existen dos maneras: la primera, poco elegante, hace uso de javascript. Consiste en que en la posición en la que queremos mostrar la dirección de correo insertamos un código javascript que la genere, por ejemplo, mediante la concatenación de dos variables. De esta manera no existirá ninguna cadena en el código que cumpla el patrón de un e-mail. La segunda forma es hacer uso de CSS, más concretamente del pseudo-elemento &lt;span style="font-style: italic;"&gt;after&lt;/span&gt; de la siguiente manera:&lt;br /&gt;&lt;br /&gt;[en la hoja de estilos...]&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;address:after{&lt;br /&gt;/* \40 es un código para escribir el caracter '@' */&lt;br /&gt;content: " &amp;lt;ultimastecnoloxias\40 gmail.com&amp;gt;";&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;[ en el lugar de la página donde queremos que aparezca...]&lt;br /&gt;&lt;span class="codigo"&gt;&lt;br /&gt;&amp;lt;address&amp;gt;&amp;copy; 2006 &amp;Uacute;ltimas tecnolox&amp;iacute;as&amp;lt;/address&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;En el ejemplo aparece la etiqueta &lt;span style="font-style: italic;"&gt;address &lt;/span&gt;pero podía ser cualquier otra.&lt;br /&gt;De esta manera hemos conseguido evitar que un spambot encuentre nuestra dirección de correo, ya que en ningún momento aparecerá en el código html de la página. Además, usando esta última técnica, lo hacemos de manera sencilla y elegante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[OJO!!!] &lt;/span&gt;Microsoft Internet Explorer no soporta pseudo-elementos, así que esto no funcionará. ¿La solución? Concienciar al personal para dejar de usar productos Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115550462196457429?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115550462196457429/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115550462196457429' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115550462196457429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115550462196457429'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/esquivar-los-spambots.html' title='Esquivar los spambots'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115541824511447455</id><published>2006-08-12T14:18:00.000-07:00</published><updated>2007-08-08T08:37:29.616-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>AJAX. ¿De qué va?</title><content type='html'>Tradicionalmente la visualización de páginas web ha consistido en la solicitud y descarga de la misma a partir de un archivo .html generado previamente o bien generándose bajo demanda por algún lenguaje del lado de servidor, como PHP.&lt;br /&gt;   En ambos casos se descarga la página completamente, siendo este el punto débil de esta arquitectura. Durante la navegación por un sitio web, al acceder a cada una de sus secciones es habitual que no cambie la página completamente, sino una pequeña parte. Por esto motivo es innesario descargar las partes constantes, y es esto lo que soluciona AJAX.&lt;br /&gt;&lt;br /&gt;La idea es pedir al servidor el cachito de código html que va a cambiar respecto a la vista actual. De esta manera ahorramos ancho de banda y hacemos que la navegación sea más rápida.&lt;br /&gt;&lt;br /&gt;Para que todo esto sea posible es necesario programar un par de funcioncillas en javascript que se encargan de:&lt;br /&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;Petición de contenidos&lt;/li&gt;&lt;li&gt;Espera hasta finalizar la descarga&lt;/li&gt;&lt;li&gt;Actualización de la página. Se trata de cambiar el código html que se está visualizando por el nuevo. Para que esto sea sencillo es imprescindible que tengamos la página bien maquetada, para lo cual debemos olvidarnos de los FRAMES y las TABLAS (para dar formato) en favor de bloques DIV o SPAN. Si es así, basta cambiar el atributo "contenido" de cada uno de ellos por el nuevo&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115541824511447455?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115541824511447455/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115541824511447455' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115541824511447455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115541824511447455'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/ajax-de-qu-va.html' title='AJAX. ¿De qué va?'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32630182.post-115541470116322138</id><published>2006-08-12T13:06:00.000-07:00</published><updated>2007-08-08T08:37:29.616-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><title type='text'>PHP 6</title><content type='html'>Ya está en desarrollo la nueva versión de este popular lenguaje, rival de ASP, su sucedáneo en el Imperio Gates. Algunas de las modificaciones que presentará son las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HTTP_*_VARS eliminado&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Register Globals es retirado&lt;/li&gt;&lt;li&gt;Return By Reference dará un error&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;Esta breve nota fue sacada de &lt;a href="http://www.maestrosdelweb.com/editorial/php6"&gt;Maestros del Web&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32630182-115541470116322138?l=ultimastecnoloxias.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ultimastecnoloxias.blogspot.com/feeds/115541470116322138/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32630182&amp;postID=115541470116322138' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115541470116322138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32630182/posts/default/115541470116322138'/><link rel='alternate' type='text/html' href='http://ultimastecnoloxias.blogspot.com/2006/08/php-6.html' title='PHP 6'/><author><name>Andrés Estévez</name><uri>http://www.blogger.com/profile/13226391747388177244</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
