<?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-35092134</id><updated>2012-01-29T20:30:59.464+01:00</updated><category term='Personal'/><category term='Trips'/><category term='Libros'/><category term='Pattern Design'/><category term='Granada'/><category term='Industrialización'/><category term='Berlín'/><category term='EMF'/><category term='Madrid'/><category term='Cocina'/><category term='Dynamic Languages'/><category term='Objectives'/><category term='Functional programming'/><category term='hadoop'/><category term='Vigo'/><category term='Virtual Reallity'/><category term='Asturias'/><category term='Hip Hop'/><category term='Languages'/><category term='Sin tiempo'/><category term='Real World'/><category term='Graphics'/><category term='DSL'/><category term='Software Measures'/><category term='Viajes'/><category term='Humor'/><category term='Error'/><category term='Holidays'/><category term='Software Programming'/><category term='New York'/><category term='Subversion'/><category term='Londres'/><category term='Sexy  Sadie'/><category term='Parser Combinators'/><category term='Scratch'/><category term='Social Networks'/><category term='cloud'/><category term='NetBeans'/><category term='Gourmet'/><category term='Metaprogramming'/><category term='Groovy'/><category term='Navidad'/><category term='AspectJ'/><category term='Alemania'/><category term='RCP'/><category term='Pointcuts'/><category term='First Steps'/><category term='Agile'/><category term='STL'/><category term='Osgi'/><category term='Año Nuevo'/><category term='Eclipse'/><category term='Amigos'/><category term='Restaurantes'/><category term='Blog'/><category term='Fito'/><category term='Skin'/><category term='NeoMetrics'/><category term='AOP'/><category term='Humans'/><category term='Sofware Architecture'/><category term='Twitter'/><category term='Amsterdam'/><category term='slides'/><category term='Eclipse Plugins'/><category term='Photos'/><category term='Desilusion'/><category term='Software Systems'/><category term='Surf'/><category term='JDT'/><category term='springio'/><category term='Cambios'/><category term='Spring DM'/><category term='Vacaciones'/><category term='IDE'/><category term='MOP'/><category term='Categories'/><category term='C++'/><category term='Videos'/><category term='Scala'/><category term='General'/><category term='Comedia'/><category term='Equinox'/><category term='DDD'/><category term='Spring'/><category term='DLTK'/><category term='Scalability'/><category term='R-Eclipse'/><category term='Software Disasters'/><category term='tricks'/><category term='Informática'/><category term='Propósitos'/><category term='JVM'/><category term='Crosscutting'/><category term='Ebooks'/><category term='Internet'/><category term='Stuttgart'/><category term='Music'/><category term='Software Development'/><category term='Monólogos'/><category term='MMOG'/><category term='Java'/><category term='Software Architecture'/><category term='Algorithms'/><category term='API'/><category term='Refactor'/><category term='Open Source'/><category term='Paternidad'/><category term='Ingeniería del Software'/><category term='Maven'/><category term='Linux'/><category term='Software Transactional Memory'/><category term='Musica'/><category term='GMF'/><category term='Ida de pelota'/><category term='Technologies'/><category term='CIDI'/><category term='Roma'/><category term='Deportes'/><category term='Europe'/><category term='CMMI'/><category term='R'/><category term='Books'/><category term='Erlang'/><category term='Framekorks'/><title type='text'>Just my thoughts</title><subtitle type='html'>A little bit on new technologies, software architecture, programming languages and whatever else.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default?start-index=101&amp;max-results=100'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>204</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35092134.post-1684275870655969498</id><published>2012-01-02T17:55:00.000+01:00</published><updated>2012-01-02T17:55:25.597+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Algunos libros para comenzar el año</title><content type='html'>&lt;div style="text-align: justify;"&gt;Unos cuantos libros para comenzar el año de la mejor manera posible: aprendiendo cosas nuevas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/51gA7MWpBYL._SL500_AA300_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51gA7MWpBYL._SL500_AA300_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The Garbage Collection Handbook. Este libro ofrece una visión actualizada del estado del arte de los sistemas de recolección de basura y la gestión automática de memoria. He leido varias críticas de Gil Tene (CTO de Azul Systems) y en todas ellas pone al libro por las nubes.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No he tenido ocasión de leerlo, todavía, pero está en las primeras posiciones de la lista de libros que me gustaría leer este comienzo de año.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/51gLGwJ-0xL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51gLGwJ-0xL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para aquellos que estéis interesados en los sistemas distribuidos y/o trabajeis con ellos aquí podréis encontrar una magnífica y extensa referencia sobre este tipo de sistemas: fundamentos, algoritmos , etc.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No estoy seguro si ya he hablado de este libro con anterioridad pero la verdad es que se trata de una magnífica y reconfortante lectura en la que se pueden aprender infinidad de cosas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/51lGZVrE1JL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_AA278_PIkin4,BottomRight,-31,22_AA300_SH20_OU01_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51lGZVrE1JL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_AA278_PIkin4,BottomRight,-31,22_AA300_SH20_OU01_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Excelente lectura si os gusta conocer los "internals" del sistema operativo Linux y cómo funcionan la mayoría de sus principales subsistemas: gestión de procesos, gestión de memoria, etc. Posiblemente nunca escribamos ni una línea de código relacionada con el núcleo de este sistema operativo pero estoy convencido de que esta lectura puede ayudarnos como desarrolladores a escribir mejores programas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-1684275870655969498?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1684275870655969498/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1684275870655969498' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1684275870655969498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1684275870655969498'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2012/01/algunos-libros-para-comenzar-el-ano.html' title='Algunos libros para comenzar el año'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2567239389263622394</id><published>2012-01-02T12:12:00.000+01:00</published><updated>2012-01-02T12:12:30.804+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Año Nuevo'/><category scheme='http://www.blogger.com/atom/ns#' term='Propósitos'/><title type='text'>Propósitos para 2012</title><content type='html'>&lt;div style="text-align: justify;"&gt;Un año nuevo que comienza cargado de ilusiones, apasionantes retos personales y profesionales y grandísimas noticias. Al igual que el año anterior me gustaría escribir esta pequeña entrada en la que plasmar todas las buenas intenciones para este nuevo año que acaba de comenzar. Sobra decir que, tal y como ha ocurrido con las intenciones de hace doce meses, algunas se cumplirán y algunas no; esperemos que con tesón, perseverancia y muchas muchas ganas muchas de ellas sean algo más que meras intenciones.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Algunas de las cosas que tengo en mente:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Pasar el máximo tiempo posible con mi hijo y mi novia&lt;/b&gt;. Como tod@s ya sabéis el pasado mes de noviembre hemos sido padres por primera vez y quiero disfrutar al máximo del niño y de todo lo que lo rodea.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Casarme&lt;/b&gt;. La única duda que tengo respecto a este tema es el tipo de celebración que vayamos a realizar aunque todo indica que no llevaremos a cabo una "boda tradicional" cientos de invitados sino que será algo extremadamente simple.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;b&gt;Retomar el tema del doctorado&lt;/b&gt;. Acontecimientos de diversa índole como la parálisis facial, la operación de corazón de mi suegra, el nacimiento de Sergio y algunas cosas más hicieron que durante el segundo semestre del año pasado me costara mucho más poner orden y determinación. Esperemos que en este año que comienza sea capaz de organizarme de manera mucho más eficaz y pueda retomar las diferentes cosas del doctorado que ahora mismo tengo en un estado de abandono absoluto.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;strike&gt;Ponerme en forma&amp;nbsp;&lt;/strike&gt;&lt;b&gt;Practicar algo de deporte&lt;/b&gt;. Creo que practicar algo de deporte es algo muchto más realista. Soy consciente de que recuperar el estado de forma que tenía cuando jugaba al fútbol y practicaba surf es una utopía con lo que me conformaré con salir a correr de vez en cuando y perder unos cuantos kilillos que he cogido durante el último viaje a EEUU y estas navidades (que todavía no han tocado a su fin y tengo unas cuantas citas pendientes) .&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;No podía terminar este post sin hacer mención a las cosas ligadas al mundo de la tecnología que me gustaría hacer durante este año:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Asistir a alguna conferencia más que el año anterior&lt;/b&gt;. El año pasado estuve hablando en Spring I/O sobre Hadoop y este año tenía medio preparada una presentación sobre los internals de Cloud Foundry aunque finalmente no tuve tiempo de enviarla por lo que este año, en caso de que pueda asistir, será unicamente como oyente.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;De momento ya tengo la entrada para los &lt;a href="http://days2012.scala-lang.org/"&gt;Scala Days 2012&lt;/a&gt;&amp;nbsp;(todavía tengo que gestionar el hotel y el&amp;nbsp;viaje)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Aprender nuevas cosas y mejorar muchas de las que yo conozco&lt;/b&gt;. Mejorar mis habilidades con &amp;nbsp;Scala, participar más activamente en algunos proyectos en los que he hecho algunas cosillas, dar "pasos mucho más serios" en otros lenguajes como &lt;a href="http://golang.org/"&gt;Go&lt;/a&gt; y &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;, profundizar mis conocimientos de sistemas distribuidos, . . . .&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Impulsar el grupo de escalabilidad en español:&amp;nbsp;&lt;a href="https://groups.google.com/forum/#!forum/spain-scalability-users"&gt;https://groups.google.com/forum/#!forum/spain-scalability-users&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Tenía algunas cosas más en mente pero tengo que cortar aquí porque está el niño llorando y tengo que ocuparme de el.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Feliz año 2012 a tod@s y esperemos que no sea tan malo como lo pintan!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&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/35092134-2567239389263622394?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2567239389263622394/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2567239389263622394' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2567239389263622394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2567239389263622394'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2012/01/propositos-para-2012.html' title='Propósitos para 2012'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7673203986332746268</id><published>2011-11-28T22:56:00.001+01:00</published><updated>2011-11-28T23:46:08.680+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><title type='text'>Algunos libros sobre Java y JVM</title><content type='html'>Durante estas últimas semanas he tenido la ocasión de terminar varios de los libros que tenía pendientes así como de realizar alguna nueva adquisición que, de momento, está encolada en mi lista de lectura.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Me gustaría aprovechar esta entrada para compartir con vosotros algunos de los libros anteriores que, bajo mi punto de vista, podrían resultar interesantes para tod@s aquell@s que os dediquéis, de algún modo, a trabajar con la plataforma Java (lenguaje y/o máquina virtual).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/51PMR3OVSXL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_AA278_PIkin4,BottomRight,-32,22_AA300_SH20_OU01_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://ecx.images-amazon.com/images/I/51PMR3OVSXL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_AA278_PIkin4,BottomRight,-32,22_AA300_SH20_OU01_.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;El primero de ellos es &lt;a href="http://www.amazon.com/dp/B005OR9NA2/ref=rdr_kindle_ext_tmb"&gt;Java Performance from The Java Series&lt;/a&gt;. Escrito por Charlie Hunt, JVM performance lead engineer en Oracle, y &amp;nbsp;Binu John, senior performance engineer en Ning. Ha sido mi última adquisición y únicamente he podido leer los dos primeros capítulos pero creo que estamos ante uno de las lecturas obligatorias para tod@s aquell@s que se dedican y/o les gusta el mundo del rendimiento de aplicaciones sobre la JVM.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;JVM Tuning, profiling, mediciones, herramientas, escritura de benchmarks, internals de la JVM, algoritmos de recolección de basura y tuneo de los mismos, gestión de la memoria, &amp;nbsp;. . . &amp;nbsp;son sólo algunas de las temáticas tratadas en este magnífico manuscrito.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.manning.com/evans/evans_cover150.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://www.manning.com/evans/evans_cover150.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Otro magnífica referencia &amp;nbsp;relativa al mundo Java: &lt;a href="http://www.manning.com/evans/"&gt;The well-grounded Java developer&lt;/a&gt;. Se trata de un early access por lo que sólo he podido leer los capítulos disponibles hasta el momento. Pensado para desarrolladores con unos sólidos conocimientos de Java el libro abarca un amplio espectro de temáticas como pueden ser:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Algunas de las novedades de Java 7&lt;/li&gt;&lt;li&gt;Nuevo mecanismo de IO y concurrencia&lt;/li&gt;&lt;li&gt;Classfiles y bytecode&lt;/li&gt;&lt;li&gt;Inyección de dependencias&lt;/li&gt;&lt;li&gt;Lenguajes alternativos en la JVM: Clojure, Groovy y Scala&lt;/li&gt;&lt;li&gt;Integración continua&lt;/li&gt;&lt;li&gt;. . .&lt;/li&gt;&lt;/ul&gt;En lineas generales creo que se trata de una lectura recomendada (a la espera de que se publique la segunda mitad del libro). Los capítulos pueden ser leidos de manera independiente, saltándose aquellos en los que ya se conoce de manera profunda la temática tratada en el mismo.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://jcip.net/images/jcip-cover.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://jcip.net/images/jcip-cover.jpg" width="243" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Un libro que había leido hace tiempo y que he vuelto a leer hace &amp;nbsp;unas semanas ha sido &lt;a href="http://jcip.net/"&gt;Java Concurrency in Practice&lt;/a&gt;. Poco puedo decir de este libro que no se haya dicho ya. Otra de las lecturas obligatorias para todos aquellos desarrolladores que trabajen con el lenguaje Java.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Ofrece una visión práctica de cómo se deben escribir programas escalables y seguros aprovechando la capacidad de las nuevas arquitecturas hardware.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://akamaicovers.oreilly.com/images/0636920021667/cat.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://akamaicovers.oreilly.com/images/0636920021667/cat.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;a href="http://shop.oreilly.com/product/0636920021667.do"&gt;Functional Programming for Java Developers&lt;/a&gt;. Escrito por Dean Wampler. Es un libro en el que se introducen los conceptos básicos de la programación funcional (que está "renaciendo" gracias a lenguajes como Scala o Clojure, además de sus beneficios a la hora de escribir programas concurrentes entre otras muchas cosas).&lt;br /&gt;&lt;br /&gt;Es un libro muy cortito aunque personalmente no me ha entusiasmado demasiado. Si no tenéis ninguna experiencia en programación funcional puede ser un buen punto de partida. No se cubren mónadas, laziness ni combinators.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7673203986332746268?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7673203986332746268/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7673203986332746268' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7673203986332746268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7673203986332746268'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/11/algunos-libros-sobre-java-y-jvm.html' title='Algunos libros sobre Java y JVM'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6852805106145706878</id><published>2011-10-06T23:47:00.000+02:00</published><updated>2011-10-07T07:55:55.286+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Systems'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Transactional Memory'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Escalabilidad, disponibilidad y estabilidad</title><content type='html'>&lt;div style="text-align: justify;"&gt;En algunas ocasiones hemos hablado de temas de escalabilidad y disponibilidad de sistemas aunque siempre desde un punto de vista muy práctico, haciendo referencia a los problemas que ocupan nuestro día a día.&amp;nbsp;Me gustaría recopilar, a lo largo de una serie de posts, algunos de los patrones y/o tecnologías más populares relacionados con la escalabilidad, la concurrencia o la alta disponibilidad.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Me gustaría dejar claro desde un principio que lo aquí expuesto son simplemente mis ideas, adquiridas a lo largo del tiempo gracias a la experiencia acumulada en la construcción de diversos sistemas software, mis estudios de doctorado, leer y practicar mucho, aprender de los maestros y pasarme muchas, pero muchas muchas, &amp;nbsp;horas aporreando el teclado. Por tanto, las cosas que aquí aparecen podrían ser erróneas y/o incompletas.&lt;br /&gt;&lt;br /&gt;Me gustaría comenzar con una tecnología relacionada con la concurrencia: la memoria transaccional (STM en adelante).&lt;br /&gt;&lt;br /&gt;Escribir programas concurrentes es una tarea sumamente complicada y, habitualmente, no determinista; ¿cuantas veces habremos probado un programa multihilo en nuestros sistemas de integración continua y , tras poner el sistema en producción, nos hemos encontrado con nuevos errores? Tan real como la vida misma.&lt;br /&gt;&lt;br /&gt;Habitualmente las inmutabilidad (hablaremos de ella en el futuro) es un gran aliado a la hora de escribir programas concurrentes dado que resulta mucho más sencillo razonar sobre información cuyo estado permanece estable. Sin embargo, como en la mayoría de las situaciones, la inmutabilidad no es una bala de plata que soluciona todos los problemas por lo que tendremos que lidiar con información cuyo estado puede variar y con toda la problemática asociada a la misma. Llegados a esta situación, y siguiendo con el enfoque con el que estamos más familiarizados, estaríamos peleándonos con bloqueos, granularidad de los mismos, etc.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;&lt;span style="font-family: 'Trebuchet MS', sans-serif;"&gt;Un vistazo a la STM&lt;/span&gt;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La STM puede ayudarnos a resolver el problema anterior de manera mucho más sencilla visualizando la memoria (heap + pila) como si de un dataset transaccional se tratara. Algunas de las características más relevantes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Concepto muy similar al de una base de datos tradicional. Se llevan a cabo operaciones como begin, commit o abort/rollback&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;En caso de que se produzca una colisión la transacción será relanzada de manera automática&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Se realiza un proceso de rollback sobre la memoria cuando se produce una operación de abort.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Las transacciones se pueden componer y anidar&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Un aspecto sumamente importante que debemos tener en cuenta a la hora de utilizar la memoria transaccional es que todas las operaciones englobadas en el ámbito de una transacción deberán ser idempotentes (anteriormente hablábamos del relanzamiento automático en caso de que se produjera una colisión).&lt;br /&gt;&lt;br /&gt;Existen numerosas implementaciones disponibles para la máquina virtual de Java (JVM) entre las que destacan:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Multiverse:&amp;nbsp;&lt;a href="http://multiverse.codehaus.org/overview.html"&gt;http://multiverse.codehaus.org/overview.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Akka: &lt;a href="http://akka.io/docs/akka-1.0/stm-java.html"&gt;http://akka.io/docs/akka-1.0/stm-java.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Clojure STM:&amp;nbsp;&lt;a href="http://clojure.org/refs"&gt;http://clojure.org/refs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;CCSTM:&amp;nbsp;&lt;a href="http://ppl.stanford.edu/ccstm/site/index.html"&gt;http://ppl.stanford.edu/ccstm/site/index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Deuce STM:&amp;nbsp;&lt;a href="https://sites.google.com/site/deucestm/"&gt;https://sites.google.com/site/deucestm/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;En la siguiente entrada realizaremos varios ejemplos prácticos de uso de la memoria transaccional y analizaremos cuales son los escenarios más propicios para la utilización de esta solución.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Migue&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/35092134-6852805106145706878?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6852805106145706878/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6852805106145706878' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6852805106145706878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6852805106145706878'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/10/escalabilidad-disponibilidad-y.html' title='Escalabilidad, disponibilidad y estabilidad'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1569874145403528263</id><published>2011-10-05T00:48:00.002+02:00</published><updated>2011-10-05T00:49:30.508+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Paternidad'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>[Off-Topic] Poniéndome al día y buenas noticias</title><content type='html'>Hola a tod@s,&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hace más de un mes y medio de la última entrada en el blog pero es que me está costando mucho más de lo&amp;nbsp;esperado retomar todas las cosas pendientes y/o atrasadas por lo que últimamente me estoy agobiando un poquito.&amp;nbsp;De todos modos el objetivo de la entrada no era aburriros con mis "problemas" sino comentaros una buena noticia, al menos para mi :), aunque seguro que muchos de los que os pasáis por aquí ya lo sabréis: ¡&lt;b&gt;vamos a ser papás&lt;/b&gt;!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Así es; si todo sigue como hasta ahora, dentro de cuatro semanas&amp;nbsp;aproximadamente&amp;nbsp;tendremos &amp;nbsp;a nuestro hijo Sergio entre nuestros brazos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-1S-aBTXObZs/TouF5epuhDI/AAAAAAAACGM/Qrq2UOPnOpQ/s1600/IRATXE_DINIZ_SERNA__SERGIO__20110820132904_1344061.bmp" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-1S-aBTXObZs/TouF5epuhDI/AAAAAAAACGM/Qrq2UOPnOpQ/s320/IRATXE_DINIZ_SERNA__SERGIO__20110820132904_1344061.bmp" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Estos últimos meses han sido, sin lugar a dudas, los mejores meses de mi vida. Meses de cambio, de preparar la casa, de descubrir cosas que ni siquiera sabía que existían o de convertirme en un "manitas".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-pmYqfWctS-g/TouIrfiYMDI/AAAAAAAACGQ/YFhuz72lKtc/s1600/P1040372.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://1.bp.blogspot.com/-pmYqfWctS-g/TouIrfiYMDI/AAAAAAAACGQ/YFhuz72lKtc/s320/P1040372.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Con toda seguridad los cambios serán mucho más notables cuando el pequeño nazca pero de momento prefiero no adelantar acontecimientos y centrarnos en disfrutar del "poquito" tiempo de embarazo que nos queda.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-HGXqpB57LQk/TouKQ1aYRDI/AAAAAAAACGU/vAZkv7UyXco/s1600/P1040297.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://4.bp.blogspot.com/-HGXqpB57LQk/TouKQ1aYRDI/AAAAAAAACGU/vAZkv7UyXco/s320/P1040297.JPG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Dentro de poco tendré que repartir mimos y cuidados entre mis dos amores aunque mi gordita dice que nada de dividir, que como mínimo duplicar así que . . . difícil tarea me espera.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Migue&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-1569874145403528263?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1569874145403528263/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1569874145403528263' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1569874145403528263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1569874145403528263'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/10/off-topic-poniendome-al-dia-y-buenas.html' title='[Off-Topic] Poniéndome al día y buenas noticias'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-1S-aBTXObZs/TouF5epuhDI/AAAAAAAACGM/Qrq2UOPnOpQ/s72-c/IRATXE_DINIZ_SERNA__SERGIO__20110820132904_1344061.bmp' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2277763979460964687</id><published>2011-08-26T23:16:00.000+02:00</published><updated>2011-09-14T23:18:13.400+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Asturias'/><title type='text'>De regreso</title><content type='html'>Ya estoy de vuelta.&lt;br /&gt;&lt;br /&gt;Por suerte ya me he recuperado por completo de mi parálisis facial (finalmente "solo" me duró once días aproximadamente) con lo que de nuevo estoy online.&lt;br /&gt;&lt;br /&gt;La entrada no será muy larga :) , simplemente quería que supierais que me encuentro perfectamente. &lt;br /&gt;&lt;br /&gt;Espero retomar el blog durante los próximos días aunque con lo que tenemos en camino tengo una agenda en la que el tiempo libre brill a por su ausencia.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;Migue&lt;br /&gt;&lt;br /&gt;PD: he escrito la entrada desde el iPad y la verdad que se escribe mucho más rápido de lo que uno podría esperar en un principio.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2277763979460964687?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2277763979460964687/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2277763979460964687' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2277763979460964687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2277763979460964687'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/08/de-regreso.html' title='De regreso'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-9133171125220513001</id><published>2011-08-02T13:01:00.000+02:00</published><updated>2011-08-02T13:01:00.368+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Asturias'/><title type='text'>Offline</title><content type='html'>Durante los próximos días estaré "offline" por completo. Nada de ordenador, IPad, Internet y similares :). Voy a ver si consigo desconectar por completo durante estos días y termino de recuperarme de mi parálisis facial.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;Migue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-9133171125220513001?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/9133171125220513001/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=9133171125220513001' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/9133171125220513001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/9133171125220513001'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/08/offline.html' title='Offline'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7274768772907535027</id><published>2011-07-30T22:22:00.000+02:00</published><updated>2011-07-30T22:22:55.496+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Parálisis facial</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hacía muchísimo tiempo que no me ponía enfermo pero esta vez me ha tocado. Será que me estoy haciendo mayor . . . :(. &amp;nbsp;La doctora me ha diagnosticado parálisis facial.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Gracias a Dios suena mucho más aparatoso de lo que es: tengo la mitad de la cara dormida (es una sensación similar a la que se presenta cuando regresas&amp;nbsp;del dentista) y se me cierra un poco el ojo con lo que &amp;nbsp;a veces se me cansa la vista y no puedo enfocar demasiado bien.&amp;nbsp;Las buenas noticias es que no es doloroso aunque si bastante incómodo. Las malas es que me puede durar desde tres días hasta tres meses y que "del mismo modo que viene se va" (palabras textuales de la doctora).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Espero recuperarme cuanto antes y seguir dando un poco de guerra!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Migue&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7274768772907535027?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7274768772907535027/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7274768772907535027' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7274768772907535027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7274768772907535027'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/07/paralisis-facial.html' title='Parálisis facial'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2255515980824366756</id><published>2011-07-19T22:43:00.000+02:00</published><updated>2011-07-19T22:43:22.265+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scalability'/><title type='text'>Grupo de escalabilidad: mapa clusterizado</title><content type='html'>Tras los resultados de la encuesta que realizamos durante la semana pasada hemos creado un pequeño mapa geográfico en el que se muestran a modo de clúster los distintos miembros que componemos el grupo de escalabilidad en español y dónde estamos ubicados cada uno de nosotros:&lt;br /&gt;&lt;br /&gt;&lt;div id="ss-frame"&gt;&lt;/div&gt;&lt;script src="http://sharedspaces.googlelabs.com/embed_api.js"&gt;&lt;/script&gt;&lt;script&gt;new google.sharedspaces.Embed({div:document.getElementById("ss-frame"), id: "m2vgpQwYHv", width: 525, height: 600, title: true, sidepanel: false, border: true})&lt;/script&gt;&lt;small&gt;Embedded from Google Shared Spaces. &lt;a href="http://sharedspaces.googlelabs.com/"&gt;Create your own space.&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;El registro el libre y cada una de las personas que aparece en el mapa anterior se ha registrado de manera propia.&lt;br /&gt;&lt;br /&gt;Si estáis interesados en alguna temática relacionada con la escalabalidad de sistemas de información os animo a que os registréis en el &lt;a href="https://groups.google.com/forum/#!forum/spain-scalability-users"&gt;grupo&lt;/a&gt; y también os apuntéis en el mapa!&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;Migue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2255515980824366756?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2255515980824366756/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2255515980824366756' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2255515980824366756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2255515980824366756'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/07/grupo-de-escalabilidad-mapa.html' title='Grupo de escalabilidad: mapa clusterizado'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6214030175151822383</id><published>2011-07-13T20:42:00.000+02:00</published><updated>2011-07-13T20:42:40.077+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Evento sobre escalabilidad de sistemas</title><content type='html'>&lt;div style="text-align: justify;"&gt;Desde el &lt;a href="https://groups.google.com/forum/#!forum/spain-scalability-users"&gt;grupo de escalabilidad en español &lt;/a&gt;hacía tiempo que estábamos barajando la posibilidad de organizar un evento relativo a la escalabilidad de sistemas y finalmente hemos dado un paso adelante.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es una primera aproximación en la que estamos intentando recabar el mayor conjunto de información posible con el objetivo de llegar al mayor número de gente posible.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No voy a repetir todo el rollo que hemos escrito en otros sitios :) así que simplemente os dejo los enlaces donde podréis encontrar toda la información de la que disponemos hasta este momento:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://groups.google.com/forum/#!topic/spain-scalability-users/Z-FqVch1NCY"&gt;Topic en el grupo google&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mpermar.polldaddy.com/s/evento-de-escalabilidad"&gt;Encuesta&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://brigomp.blogspot.com/2011/07/consulta-sobre-evento-sobre.html"&gt;Entrada en el blog de Martín Pérez&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Estaremos encantados de recibir vuestras críticas, sugerencias y/o propuestas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Migue&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6214030175151822383?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6214030175151822383/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6214030175151822383' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6214030175151822383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6214030175151822383'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/07/evento-sobre-escalabilidad-de-sistemas.html' title='Evento sobre escalabilidad de sistemas'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3957623553885371839</id><published>2011-06-29T18:31:00.000+02:00</published><updated>2011-06-29T18:31:02.508+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AspectJ y Scala (y III)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Última entrada (en esta ocasión mucho menos ladrillo) de esta mini-comparativa que estamos llevando a cabo entre AspectJ y Scala (podéis consultar las anteriores entradas en los siguientes enlaces: &lt;a href="http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-i.html"&gt;AspectJ y Scala (I)&lt;/a&gt;, &lt;a href="http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-ii.html"&gt;AspectJ y Scala (II)&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hemos estado revisando cómo llevar a cabo la aplicación de varias funcionalidades como el uso de cachés o la gestión de transacciones mediante el uso de AspectJ y Scala, haciendo hincapié en las ventajas y desventajas de las dos aproximaciones. Nótese que hemos estado hablando de funcionalidad transversal como las transacciones y la caché pero no hemos hablado de otro tipo de funcionalidades las cuales abarcan un espectro mucho más amplio como por ejemplo FFDC (First Faiulure Data Capture), Profiling, gestión de la concurrencia, etc. En este tipo de situaciones el uso de Scala y HFOs resultaría mucho más tedioso que los ejemplos vistos en las entradas anteriores; derivando en los síntomas clásicos de funcionalidad "difuminada" por toda nuestra apliación.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Conclusión? El uso de cualquiera de las dos aproximaciones que hemos estado analizando dependerá, como en el 90 por ciento de todas las situaciones, del problema que estemos resolviendo, por lo que tendremos que escoger la "herramienta" más adecuada para el problema que se nos plantea.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Y por qué no un mixin de las anteriores? Esta es una de las alternativas que más me convence:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Compilamos nuestros programas Scala de la manera habitual.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Definimos nuestros aspectos para llevar a cabo la funcionalidad transversal deseada.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Realizamos un proceso de binary weaving (ya sea build time o load time)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Mediante el mecanismo anterior estaremos aplicando nuestros aspectos a nuestro código Scala compilado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En mi cuenta de &lt;a href="https://github.com/migue/blog-examples"&gt;GitHub&lt;/a&gt; podréis encontrar dos proyectos Eclipse (&lt;b&gt;scala-simple-service &lt;/b&gt;y&lt;b&gt; aspectj-advice-scala&lt;/b&gt;) que deben ser utilizados de manera conjunta. Mediante estos dos pequeños proyectos de ejemplo se ilustra cómo podemos utilizar conjuntamente aspectos escritos en AspectJ que hagan advice sobre código Scala compilado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&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/35092134-3957623553885371839?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3957623553885371839/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3957623553885371839' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3957623553885371839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3957623553885371839'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-y-iii.html' title='AspectJ y Scala (y III)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5786380563802065443</id><published>2011-06-28T00:11:00.001+02:00</published><updated>2011-06-28T00:14:57.183+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AspectJ y Scala (II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;En &lt;a href="http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-i.html"&gt;la entrada anterior&lt;/a&gt; analizamos algunas de las similitudes y diferencias existentes entre Scala y AspectJ, llevando a cabo una implementación de una caché extremadamente simple en ambos lenguajes, describiendo las ventajas y desventajas presentes en cada una de las aproximaciones.&amp;nbsp;Durante esta entrada analizaremos un ejemplo de aplicación de una funcionalidad transversal como la gestión de transacciones.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El ejemplo que aquí nos ocupa no persigue realizar una implementación detallada de control de transacciones sino simplemente ilustrar como podríamos aplicar una funcionalidad transversal mediante el uso de AspectJ o Scala.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Del mismo modo que en el post anterior, comenzamos por la aproximación basada en AspectJ. Para ello en primer lugar definimos una simple anotación que nos sirva como elemento de marcado de aquellas clases y/o métodos que se deben ejecutar bajo un contexto transaccional.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una vez definida la anotación anterior definiremos un aspecto que sea capaz de detectar aquellos joint point en los que deseamos establecer un contexto transaccional.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;i&gt;&lt;span class="s1"&gt;pointcut&lt;/span&gt; transactionalOperation() : &lt;span class="s1"&gt;execution&lt;/span&gt;(&lt;span class="s2"&gt;@Transactional&lt;/span&gt; * * (..) );&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="p1"&gt;Con el pointcut anterior estaremos capturando las llamadas realizadas sobre cualquier método anotado con nuestra anotación @Transactional. Ahora necesitaremos definir un advice en el que llevamos a cabo la gestión de la transacción (nótese que este gestor de transacciones es completamente absurdo y simplemente imprime por pantalla la funcionalidad real que debería ser llevada a cabo por un gestor de transacciones operativo)&lt;/div&gt;&lt;div class="p1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;script src="http://pastie.org/2103676.js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;div class="p1"&gt;En muchas ocasiones todos los métodos de una clase necesitarán ser transaccionales, y no querremos anotar todos los métodos de dicha clase. En este supuesto podríamos utilizar &lt;b&gt;anotaciones a nivel de clase&lt;/b&gt; que nos permitan seleccionar aquellos métodos que deseemos (por ejemplo, todos los métodos públicos).&lt;br /&gt;&lt;br /&gt;Adicionalmente, podríamos hacer uso de los ITD y establecer la transaccionalidad a todas aquellas clases &amp;nbsp;que nosotros deseemos. Por ejemplo, supongamos que todos los nombres de nuestros servicios, los cuales deseamos que sean transaccionales, terminan con el sufijo Service. Podríamos, mediante el uso de un aspecto, añadir la anotación @Transactional a todos nuestros servicios.&lt;br /&gt;&lt;br /&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="s1"&gt;declare&lt;/span&gt; &lt;span class="s1"&gt;@type&lt;/span&gt; : *Service : &lt;span class="s2"&gt;@Transactional&lt;/span&gt; ;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Dicho aspecto, en conjunción con el anterior, provocaría que todos nuestros servicios fueran transaccionales&lt;br /&gt;&lt;br /&gt;En Scala, de nuevo, haremos uso de funciones de alto nivel (high order functions) de manera muy similar a la solución de la caché descrita en la entrada anterior:&lt;/div&gt;&lt;div&gt;&lt;script src="http://pastie.org/2131238.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;Si deseamos que un método de uno de nuestros servicios sea transaccional no tendremos más que extender de la clase abstracta y utilizar la HOF anterior:&lt;br /&gt;&lt;div&gt;&lt;script src="http://pastie.org/2131252.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;Si comparamos las soluciones aportadas por cada una de las dos alternativas tendremos que&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En el caso de AspectJ no necesitamos anotar cada método de manera independiente puesto que podríamos hacer uso de anotaciones a nivel de clase. El nivel de granularidad que podemos alcanzar está definido a nivel de método (aunque tampoco es un problema excesivamente grande puesto que podríamos utilizar el patrón Extract Method para extraer la funcionalidad transaccional a un método sobre el cual podríamos aplicar nuestro aspecto).&lt;/li&gt;&lt;li&gt;En el caso de Scala necesitaremos recubrir nuestra lógica con la HOF definida en nuestro ejemplo anterior. En esta situación, el nivel de granularidad es notablemente superior puesto que podemos recubrir una simple parte de nuestro método&lt;/li&gt;&lt;/ul&gt;Durante esta segunda entrada hemos vuelto a confrontar Scala y AspectJ a la hora de aplicar una funcionalidad transversal, intentando plasmar las ventajas y desventajas de cada uno de ellos.&lt;br /&gt;&lt;br /&gt;En la siguiente y última entrada de esta serie analizaremos cómo aunar lo mejor de ambos mundos en un ejemplo práctico que nos sirva como base para futuros ejemplos.&lt;br /&gt;&lt;br /&gt;Como siempre podéis encontrar el código fuente de todos los ejemplos del blog (o casi todos :) ) en mi cuenta de &lt;a href="https://github.com/migue/blog-examples"&gt;GitHub&lt;/a&gt;, bajo el proyecto blog-examples.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;PD: perdón por el ladrillo de entrada :(.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5786380563802065443?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5786380563802065443/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5786380563802065443' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5786380563802065443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5786380563802065443'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-ii.html' title='AspectJ y Scala (II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7488054958529463701</id><published>2011-06-21T00:09:00.000+02:00</published><updated>2011-06-21T00:09:04.804+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AspectJ y Scala (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;¿Podemos establecer alguna conexión entre estos dos mundos? Si nos detenemos por un instante veremos que comparten muchas más cosas de las que a simple vista podría parecer:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Son lenguajes de tipado estático.&lt;/li&gt;&lt;li&gt;Ambos producen código compatible con la máquina virtual de Java (JVM)&lt;/li&gt;&lt;li&gt;Las funciones de alto nivel de Scala comparten algunas características con los advices de AspectJ&lt;/li&gt;&lt;li&gt;Los traits de Scala comparten algunas características con el static crosscuting de AspectJ.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Durante el resto de la entrada que nos ocupa (y la siguiente) realizaremos una pequeña comparativa en la que pondremos de manifiesto el modo en que cada uno de estos lenguajes resuelve determinado tipo de problemas. Pongámonos manos a la obra.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;Cachés&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A través de este ejemplo se pretende presentar el modo en que ambos lenguajes solucionan el problema de aplicar una funcionalidad transversal en un punto determinado del código. Implementaremos un mecanismos de caché extremadamente sencillo de manera que podamos centrar nuestra atención en los aspectos relevantes de las alternativas que estamos planteando&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el caso de AspectJ se está tendiendo a utilizar las anotaciones como un elemento de marcado (y parece que está siendo recibido con una aceptación más que notable). Nuestro primer paso será definir la anotación con la que realizaremos el "marcado" de aquellos métodos que deseamos establecer como cacheados:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="s1"&gt;@Retention&lt;/span&gt;(RetentionPolicy.&lt;span class="s2"&gt;RUNTIME&lt;/span&gt;)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p2"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;public&lt;span class="s3"&gt; &lt;/span&gt;@interface&lt;span class="s3"&gt; &lt;/span&gt;&lt;span class="s1"&gt;Cachable&lt;/span&gt;&lt;span class="s3"&gt; {&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;&lt;span class="Apple-tab-span"&gt;&lt;/span&gt;&amp;nbsp; &amp;nbsp;String scriptKey () &lt;span class="s4"&gt;default&lt;/span&gt; &lt;span class="s5"&gt;""&lt;/span&gt;;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="p1"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El atributo keyScript de la anotación anterior actuaría (en una caché real), como un pequeño lenguaje de scripting de manera que pudiera ser evaluado por la caché para generar la clave bajo la que se almacenará una determinada llamada (obviaremos esta parte para intentar no distraernos de nuestro principal objetivo).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una vez definido el elemento de marcado, definiremos nuestro aspecto, el cual será capaz de capturar las llamadas de aquellos métodos anotados con @Cacheable y realizar la lógica necesaria de nuestra sencilla caché&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;" width="10%"&gt;&lt;script src="http://pastie.org/2074516.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;En el caso de Scala llevaremos a cabo nuestra funcionalidad transversal mediante el uso de funciones de primer nivel (high order functions)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;script src="http://pastie.org/2098190.js"&gt;&lt;/script&gt;&lt;/div&gt;&lt;br /&gt;Gracias a la funcionalidad anterior, podemos pasar al método cache una función que será ejecutada en caso de ser necesario, devolviendo los valores de la caché en el supuesto de que haya sido calculado en un paso anterior.&lt;br /&gt;&lt;br /&gt;Si comparamos las dos alternativas que hemos planteado hasta este momento:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En el caso de AspectJ, cada uno de los elementos que deseamos cachear tendremos que anotarlos con, valga la redundancia, la anotación que hemos definido anteriormente. Mientras tanto, en el caso de Scala, tendremos que recubrir cada uno de los métodos que deseamos cachear con la función de alto nivel (high order function).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;En el caso de AspectJ estamos utilizando un "lenguaje" externo que actua como elementos de las claves de nuestra caché mientras que en el caso de Scala estamos utilizando el propio lenguaje de manera nativa, con el consiguiente beneficio que ello conlleva.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Esta ha sido nuestra primera aproximación a Scala y AspectJ. Durante las siguientes entradas analizaremos algunos ejemplos adicionales y veremos como podemos integrar lo mejor de ambos mundos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Podéis encontrar el código fuente de los ejemplos anteriores en el siguiente repositorio de &lt;a href="https://github.com/migue/blog-examples/"&gt;GitHub&lt;/a&gt;, concretamente en los proyectos AspectJCacheExample y ScalaCacheExample.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;/div&gt;&lt;blockquote&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7488054958529463701?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7488054958529463701/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7488054958529463701' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7488054958529463701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7488054958529463701'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/06/aspectj-y-scala-i.html' title='AspectJ y Scala (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7956674576496354795</id><published>2011-06-03T21:47:00.000+02:00</published><updated>2011-06-03T21:47:50.411+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Mecanismo de Load Time Weaving (LTW)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durante la &lt;a href="http://miguelinlas3.blogspot.com/2011/05/weaving-en-aspectj-i.html"&gt;última entrada&lt;/a&gt; analizábamos de manera introductoria los diferentes mecanismos de tejido ofrecidos por AspectJ así como las principales características de los mismos. Durante esta entrada nos acercaremos un poquito más al mecanismo de tejido en tiempo de carga, por normal general más desconocido, desde mi punto de vista, que el mecanismo de tejido en tiempo de construcción (durante todos los ejemplos que hemos visto en anteriores entradas siempre hemos utilizado el tejido en tiempo de construcción).&lt;br /&gt;&lt;br /&gt;Los pasos que tenemos que seguir cuando utilizamos el tejido en tiempo de carga son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Iniciar nuestra aplicación con el archivo aspectjweaver.jar el actuando como un agente (hablaremos de agentes en otra entrada). Para ello podríamos utilizar una línea como la siguiente&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;div style="text-align: center;"&gt;java -javaagent:&lt;path&gt;/aspectjweaver.jar &lt;more options=""&gt; &lt;mainclass&gt;&lt;/mainclass&gt;&lt;/more&gt;&lt;/path&gt;&lt;/div&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Durante el proceso de inicialización del agente (llevado a cabo por la máquina virtual) el propio agente recupera aquellos archivos existentes en el classpath que coincidan con META-INF/aop.xml (en el caso de encontrar múltiples llevará a cabo la combinación de los mismos).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Carga de los aspectos indicados.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;El agente se registra como un listener del evento de carga de clases de la máquina virtual. Mediante este mecanismo se tiene acceso a la definición de la clase, permitiendo incluso la modificación de la misma.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Continua el proceso normal de carga de nuestro aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Cada vez que una nueva clase es cargada la máquina virtual notifica al agente dicha situación. En ese momento es posible examinar la clase en cuestión y determinar si algunos de los aspectos cargados con anterioridad necesita ser tejido. En caso afirmativo, la clase será tejida con el aspecto en cuestión, retornando el bytecode resultante a la máquina virtual.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;La máquina virtual utiliza el bytecode resultante como elemento de definición de la clase.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mediante el conjunto de pasos anteriores, aquellas clases que hayan hecho matching con las definiciones de nuestros aspectos tendrán incorporada la funcionalidad definida en éstos últimos.&lt;br /&gt;&lt;br /&gt;El agente anterior utiliza un interfaz de la máquina virtual conocido como &lt;a href="http://download.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html"&gt;JVMTI&lt;/a&gt; (Java Virtual Machine Tools Interface) que ha sido introducido a partir de Java 5. En el caso de que utilicéis una versión anterior podréis hacer uso de este mecanismo mediante una versión basada en classloaders específicos.&lt;/div&gt;&lt;div style="text-align: justify;"&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/35092134-7956674576496354795?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7956674576496354795/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7956674576496354795' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7956674576496354795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7956674576496354795'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/06/mecanismo-de-load-time-weaving-ltw.html' title='Mecanismo de Load Time Weaving (LTW)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1419001404551563028</id><published>2011-05-27T21:29:00.000+02:00</published><updated>2011-05-27T21:29:56.869+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Weaving en AspectJ (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace un tiempo escribí una serie de entradas relacionadas con la orientación a aspectos en general y AspectJ en particular (podéis encontrar dichas entradas &lt;a href="http://miguelinlas3.blogspot.com/search/label/AOP"&gt;aquí&lt;/a&gt;) que posteriormente agrupé en un &lt;a href="http://www.slideshare.net/miguelinlas3/aop-4570210"&gt;documento&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hasta este momento nos hemos centrado en la teoría de la orientación a aspectos, cómo escribir los mismos y algunas de sus posibles aplicaciones. Sin embargo, no hemos prestado especial atención al modo en el que los aspectos se combinan con las clases para componer nuestro sistema final. Durante esta entrada y las siguientes profundizaremos en diferentes aspectos del proceso de tejido (weaving).&lt;br /&gt;&lt;br /&gt;El mecanismo de tejido es aquel que nos permite combinar la definición de nuestras clases y de nuestros aspectos en un ente ejecutable que conforma nuestro sistema final.&lt;br /&gt;&lt;br /&gt;Podemos clasificar los diferentes modelos en base al momento en el que llevan a cabo el tejido. En este caso tendríamos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Build time&lt;/b&gt;. Las clases y los aspectos son combinados durante el proceso de construcción de nuestra aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Load time (LTW)&lt;/b&gt;. En este caso el tejido se realiza en el momento en el que una clase se carga en la máquina virtual, por lo que en este caso no será necesario llevar a cabo ningún proceso adicional en nuestro proceso de construcción.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Otra posible clasificación podría establecerse en función del los tipos de entrada del proceso de weaving&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Source code weaving&lt;/b&gt;. La entrada al proceso son archivos de código fuente (clases y aspectos)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Weaving binario (bytecode)&lt;/b&gt;. La entrada al proceso es el &lt;i&gt;bytecode&lt;/i&gt; obtenido como resultado del proceso de compilación de nuestras clases&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;De manera esquemática, a continuación se reflejan las diferente combinaciones ofrecidas por el &lt;i&gt;weaver&lt;/i&gt; de AspectJ:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tiempo de construcción: las entradas admitidas son tanto código fuente como clases compiladas (bytecode)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Tiempo de carga: las entradas pueden ser bytecode o un archivo xml (lo veremos más adelante)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Con esta pequeña entrada nos hemos aproximado de manera sencilla a los procesos de tejido presentes en &lt;i&gt;AspectJ&lt;/i&gt; de una manera teórica. En futuras entradas analizaremos con un poco más de detalle los contenidos aquí presentados, haciendo especial hincapié en los mecanismos de tejido en tiempo de carga.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&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/35092134-1419001404551563028?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1419001404551563028/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1419001404551563028' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1419001404551563028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1419001404551563028'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/05/weaving-en-aspectj-i.html' title='Weaving en AspectJ (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6954438530753637475</id><published>2011-05-21T09:25:00.000+02:00</published><updated>2011-05-21T09:25:14.299+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><title type='text'>Libros: últimas y futuras lecturas (II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Esta es la primera entrada que escribo desde mi reciente adquisición: un IMac 27''. Lo siento, tenía que decirlo :). A ver si me acostumbro a este, para mi, nuevo sistema operativo y le comienzo a sacar partido.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En la &lt;a href="http://miguelinlas3.blogspot.com/2011/05/libros-ultimas-y-futuras-lecturas-i.html"&gt;entrada anterior&lt;/a&gt;&amp;nbsp;hablaba sobre algunas de las últimas y/o futuras lecturas realizadas durante esta última temporada. Puesto que no quería convertir dicha entrada en un ladrillo, se me quedaron algunos libros en el tintero que analizaremos a continuación.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/51C7NLhY2aL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://ecx.images-amazon.com/images/I/51C7NLhY2aL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este libro llego a mis manos gracias a un profesor visitante de la UPM que estuvo impartiendo un seminario sobre wait free computing. Siento no recordar ahora su nombre (vaya cabeza que tengo).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los profesores Maurice Herlihy, uno de los precursores de la memoria transaccional, &amp;nbsp;y Nir Shavit nos ofrecen una visión novedosa de los nuevos paradigmas de programación para arquitecturas multinúcleo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los primeros capítulos son más teóricos, dejando la parte más divertida para la segunda mitad del libro. No he tenido ocasión de leérmelo de principio a fin pero si que me he leído capítulos independientes y he de reconocer que me han parecido mucho mejor de lo que esperaba. Espero sacar un poco de tiempo libre para poder leerlo al completo porque todo apunta que se puede convertir en uno de mis libros favoritos.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://ecx.images-amazon.com/images/I/41-CJxuUV+L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://ecx.images-amazon.com/images/I/41-CJxuUV+L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Desde que programo en Scala he aprendido muchas cosas nuevas, ya no sólo del lenguaje, sino de la programación funcional en general.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Siempre he querido dar mis primeros pasos en Haskell pero nunca he tenido tiempo y, sinceramente, me parecía un poco complicado. Tras el inicio de mi andadura en Scala creo que lo veo con otros ojos así que, en la medida de lo posible, voy a intentar dar mis primeros pasos en este lenguaje.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Todas las referencias que tengo de este libro son muy buenas pero ni siquiera lo tengo así que, cuando me decida a dar el paso, creo que será mi próxima adquisición.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://joyofclojure.com/cover.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://joyofclojure.com/cover.jpg" width="159" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mi fascinación por la máquina virtual java crece por momentos (creo que ya quedó patente en la entrada anterior).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Clojure es un lenguaje dinámico (dialecto de Lisp) que se ejecuta sobre la JVM (compila directamente a bytecode). Destaca, y esto es lo que más me gusta, por su eficiente infraestructura para la programación multihilo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Básicamente es un lenguaje puramente funcional que destaca por su amplio abanico de estructuras de datos inmutables y persistentes. En aquellos casos en los que el cambio es algo necesario, Clojure incluye en el propio lenguaje un sistema de memoria transaccional.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De nuevo se me quedan en el tintero muchos otros libros pero, de nuevo, no quiero que la entrada sea demasiado larga. En futuras entradas apostaré por comentar de uno en uno&amp;nbsp;los libros ya leídos, intentando profundizar un poquito más de manera que si alguien estaba dudando si leérselo o no, puede tener una opinión más al respecto.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6954438530753637475?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6954438530753637475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6954438530753637475' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6954438530753637475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6954438530753637475'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/05/libros-ultimas-y-futuras-lecturas-ii.html' title='Libros: últimas y futuras lecturas (II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2830241501247750858</id><published>2011-05-14T09:33:00.000+02:00</published><updated>2011-05-14T09:33:46.177+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><title type='text'>Libros: últimas y futuras lecturas (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durante estos últimos meses mi tiempo libre se ha convertido en un bien escaso (prácticamente nulo) por lo que muchas de las cosas que me gusta hacer las he tenido que ir aplazando hasta encontrar un mejor momento.&amp;nbsp;Una de ellas es actualizar el blog con una frecuencia un poco mayor a la habitual, y aprovechando que estoy en Esslingen (Alemania), que todo el mundo está durmiendo y que llevo rondando por ahí desde las seis y veinte de la maniana he decidido pasarme un rato por aquí :).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En esta ocasión me gustaría compartir con vosotros algunos de los últimos libros que me he leído, estoy leyendo, o tengo intención de leer.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.artima.com/images/pins2Cover500x500.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.artima.com/images/pins2Cover500x500.gif" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Me he leído la primera edición y ahora estoy terminando la segunda. Creo que se trata de una referencia excelente tanto para aquellas personas que desean comenzar su andadura en Scala así como para desarrolladores más experimentados con conocimientos del lenguaje.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si nunca habéis programado en Scala os recomiendo que le echéis un vistazo, os aseguro que no os defraudará. En este blog podréis encontrar una pequenia guía de introducción (en espaniol) así como numerosas entradas relacionadas con diferentes aspectos del lenguaje (espero que en un futuro este tipo de entradas puedan ir incrementando, tanto en calidad como en cantidad)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://imagery.pragprog.com/products/227/vspcon.jpg?1300488499" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://imagery.pragprog.com/products/227/vspcon.jpg?1300488499" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una de mis últimas adquisiciones. Está en Beta pero ya me lo he leído. Necesitará una lectura completa de nuevo, aunque en esta ocasión tendrá que ser delante de una pantalla de manera que pueda "ensuciarme" :) las manos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En este libro se tratan algunas de las técnicas/plataformas más novedosas de programación concurrente sobre la máquina virtual java. Nuevos mecanismos de concurrencia en las últimas versiones de Java, análisis de las bondades de Clojure para la programación concurrente, memoria transaccional, modelos de actores, Akka (hablaremos de Akka en futuras entradas), Scala, GPars.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una lectura recomendable para aquellos que quieran sacarle partido a los procesadores multinúcleo o que quieran actualizar sus conocimientos sobre programación concurrente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.manning.com/ghosh/ghosh_cover150.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://www.manning.com/ghosh/ghosh_cover150.jpg" width="161" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Qué son DSL? Para que se utilizan? Cómo escribo un DSL? En este libro , Debasish Ghosh desgrana hasta el último detalle de un temática tan popular en la actualidad como los lenguajes de dominio específicos.&amp;nbsp;Una visión pragmática sobre la creación y utilización de lenguajes de dominio específicos ante la que ninguno se quedará indiferente.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A lo largo del libro se desarrollan numerosos ejemplos (complejos en muchas ocasiones) de diversa índole. Scala, Groovy, Clojure, Ruby y Java son los lenguajes utilizados en el desarrollo de los ejemplos por lo que, este libro, además de la temática principal, puede servir como una primera toma de contacto con alguno de los lenguajes de la máquina virtual Java que están adquiriendo una notable popularidad en estos días.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://www.packtpub.com/sites/default/files/imagecache/productview/8068EN_MockupCover_1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="https://www.packtpub.com/sites/default/files/imagecache/productview/8068EN_MockupCover_1.jpg" width="164" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En este caso de trata de una recomendación de &lt;a href="http://brigomp.blogspot.com/"&gt;Matín Pérez&lt;/a&gt;&amp;nbsp;a la que hacía tiempo que tenía ganas de meterle mano. No tengo una opinión forjada porque sólo llevo leídos dos capítulos pero la verdad que hasta el momento me está gustando mucho, tanto por la temática como por la manera que está escrito.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Recientemente he tenido la suerte de hacer algunas "cosillas" con la JVM pero por lo que he podido ver hasta el momento, este libro adquiere un nivel de detalle notable.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Prometo un post independiente cuando lo termine por completo pero me quedo con la idea de que este libro puede ayudar a escribir mejor código.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No quiero convertir esta entrada en un ladrillo (si no lo he hecho ya :) ) así que vamos a detenernos aquí. Continuaremos en la siguiente entrada con alguno que se ma quedado en el tintero.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PD: Espero que no haya demasiadas faltas de ortogafía; me está costando escribir desde este teclado alemán.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2830241501247750858?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2830241501247750858/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2830241501247750858' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2830241501247750858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2830241501247750858'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/05/libros-ultimas-y-futuras-lecturas-i.html' title='Libros: últimas y futuras lecturas (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4557706418707350651</id><published>2011-05-07T17:40:00.002+02:00</published><updated>2011-05-07T17:46:32.085+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Parser Combinators'/><category scheme='http://www.blogger.com/atom/ns#' term='Functional programming'/><title type='text'>Parser Combinators: Parsing simple bytecode</title><content type='html'>&lt;div style="text-align: justify;"&gt;Anteriormente,&amp;nbsp;&lt;a href="http://miguelinlas3.blogspot.com/2011/03/parser-combinators-un-poco-de-teoria.html"&gt;http://miguelinlas3.blogspot.com/2011/03/parser-combinators-un-poco-de-teoria.html&lt;/a&gt;, introducíamos de manera somera el concepto de parser combinators y parte de la teoría relacionada con los mismos. Durante esta entrada vamos a construir un sencillo parser que nos permita analizar un conjunto mínimo de instrucciones de la máquina virtual java (simplemente permitiremos la definición de funciones y la capacidad de ejecución de las mismas).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No analizaremos en detalle el funcionamiento de la máquina virtual java ni el conjunto de instrucciones &amp;nbsp;de la misma (podríamos llevarnos algo más que unos cuantos posts :) ) dado que el objetivo principal de esta entrada es profundizar en el concepto de parser combinators y presentar un ejemplo de uso real de los mismos. Pongámonos manos a la obra.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El código fuente que nos servirá como conductor de la entrada será el de la función factorial mostrado a continuación:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;static int fact(int);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Code:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Stack=2, Locals=3, Args_size=1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;0: iconst_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;1: istore_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;2: iconst_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;3: istore_2&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;4: iload_2&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;5: iload_0&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;6: if_icmpgt 19&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;9: iload_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;10: iload_2&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;11: imul&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;12: istore_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;13: iinc 2, 1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;16: goto 4&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;19: iload_1&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;20: ireturn&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Podréis objener el código desensamblado como el mostrado anteriormente mediante el comando &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;javap -v Class&lt;/span&gt; donde Class represente un archivo bytecode.&lt;br /&gt;&lt;br /&gt;El proceso de parsing se lleva a cabo mediante el uso de parser combinators (no perdamos de vista el objetivo de nuestra entrada ;) ) y presenta las siguientes características&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Para cada una de las diferentes tipos de instrucciones soportadas definimos un parser combinator que es el encargado de parsear este tipo de instrucciones.&lt;/li&gt;&lt;li&gt;Cada uno de los parsers anteriores sabe cómo generar un objeto del tipo correspondiente. Se utiliza una jerarquía de tipos en la que cada una de las instrucciones bytecode soportadas está representada mediante una clase Scala.&lt;/li&gt;&lt;li&gt;El parser global construye un AST (en este caso es un simple lista de objetos) y un conjunto de infraestructura adicional con el objetivo de implementar un intérprete que ejecute la secuencia de instrucciones obtenida (fuera del ámbito de esta entrada podéis echarle un vistazo al código fuente)&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;¿Cómo actúan nuestros diferentes parsers? Analicemos por ejemplo el componente encargado de parsear las instrucciones ISTORE&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;lazy val beginInstructionFragment: Parser[Int] = integer &amp;lt;~ ":" ^^ { _.toInt}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;lazy val iStoreBytecode: Parser[List[BytecodeInstruction]] = beginInstructionFragment ~&amp;gt; "istore_" ~ integer ^^ {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; case name ~ value =&amp;gt; new IStoreInstruction(name,value) &amp;nbsp;:: List()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;El parser &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;beginInstructionFragment&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt; es el encargado de parsear la primera parte de la instrucción, la que corresponde al lugar que ocupa la instrucción en el array de instrucciones.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;El segundo parser hace uso del primero y además sabe cómo parsear el texto restante de manera adecuada. En este caso nuestro este analizador es capaz de parsear las instrucciones istore_N donde N representa un número entero positivo cualquiera y devolver un objeto (dentro de una lista) de tipo IStoreInstruction en el que se incluyen el nombre de la instrucción y el entero correspondiente.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;Como seguramente a muchos de los lectores de este post el fragmento de código anterior les suene un poco raro intentaremos analizar las diferentes opciones de combinaciones de parsers disponibles&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt;:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Si escribimos un parser en el que utilizamos una cadena, como por ejemplo "istore", el resultado es la propia cadena.&lt;/li&gt;&lt;li&gt;Podemos utilizar expresiones regulares, como por ejemplo, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;"[A-Z]".r&lt;/span&gt; . En este caso el resultado también sería la propia cadena&lt;/li&gt;&lt;li&gt;Si utilizamos el símbolo ~ (composición secuencial) el resultado del proceso de parseo será la combinación de ambos resultados. Por tanto, si A devuelve "X" y B devuelve "true", el resultado de A~B sería &amp;nbsp;~("X","true") (el tipo de este resultado sería una &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;case class&lt;/span&gt; de tipo ~ . Adicionalmente podemos hacer uso de los operadores &amp;lt;~ y ~&amp;gt; los cuales mantienen los valores a la izquierda y a la derecha respectivamente.&lt;/li&gt;&lt;li&gt;Otro elemento de combinación de parsers sería | . En este caso el valor de retorno sería el de aquel parser que pudiera parsear la entrada con éxito.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;rep(P) o rep(P,separator)&lt;/span&gt; retornan una lista de las múltiples ejecuciones de P.&lt;/li&gt;&lt;li&gt;opt(P) retorna una instancia de tipo &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Option&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Adicionalmente a la combinación de los parsers, necesitaremos un mecanismo que nos permita reescribir la salida de los mismos, en nuestro caso para instanciar los objetos de tipo necesario y configurar nuestro AST. Para ello tendremos que hacer uso del operador de transformación ^^.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una definición formar del operador anterior sería: Dado un parser P y una funcion f cualesquiera, una expresión del tipo P^^f implica que para cada resultado R de P el resultado de la expresión global es f(R)&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;En el ejemplo que estamos tratando nuestra función es un simple pattern matching que transforma la case class retornada por nuestra combinación de parsers en un objeto de tipo&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;IStoreInstruction.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit; font-size: small;"&gt;No me ha resultado sencillo ponerlo por escrito y tampoco estoy seguro de que me haya explicado con la mayor claridad posible. Si estáis interesados os recomiendo que clonéis el repositorio alojado en&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt; &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;git://github.com/migue/parser-combinators.git&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&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/35092134-4557706418707350651?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4557706418707350651/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4557706418707350651' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4557706418707350651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4557706418707350651'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/05/parser-combinators-parsing-simple.html' title='Parser Combinators: Parsing simple bytecode'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6349247457804788067</id><published>2011-04-29T18:58:00.000+02:00</published><updated>2011-04-29T18:58:04.169+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Hip Hop'/><title type='text'>Nuevo disco de Natch</title><content type='html'>&lt;div style="text-align: justify;"&gt;El nuevo disco de Natch Scratch,&amp;nbsp;&lt;b&gt;Mejor que el silencio,&lt;/b&gt; únicamente puede calificarse como algo ABSOLUTAMENTE INCREÍBLE.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una de las canciones que más me gusta:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/ntVCYd3BGGo?rel=0" width="500"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;PD: este finde intentaré continuar con el tema de los combinator parsers en Scala&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6349247457804788067?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6349247457804788067/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6349247457804788067' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6349247457804788067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6349247457804788067'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/04/nuevo-disco-de-natch.html' title='Nuevo disco de Natch'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/ntVCYd3BGGo/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-588477828125944448</id><published>2011-03-30T00:02:00.002+02:00</published><updated>2011-05-07T17:40:32.751+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Parser Combinators'/><category scheme='http://www.blogger.com/atom/ns#' term='Functional programming'/><title type='text'>Parser Combinators: un poco de teoría</title><content type='html'>&lt;div style="text-align: justify;"&gt;Puede que en algunas ocasiones os hayais tenido que enfrentar con la necesidad de escribir un pequeño lenguaje que realice una tarea muy concreta (profundizaremos en el tema de los DSLs en un post futuro): como, por ejemplo, procesar determinados archivos de configuración de vuestra aplicación o la definición de interfaces de usuario de manera sencilla.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Independientemente de las razones por las que estamos desarrollando este componente, necesitaremos un parser que nos ayude a transformar el lenguaje de entrada en una estructura de datos que nuestro programa pueda comprender y procesar. Algunas de las alternativas que se nos plantean son:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Escribir nuestro propio parser&lt;/b&gt; (conllevaría escribir también el analizador léxico). Si no somos expertos en la materia estaremos enfrentándonos a una tarea relativamente complicada.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Utilizar herramientas para la generación de parsers como Antlr,Bison o JavaCC&lt;/b&gt; entre otras muchas. En este caso la dificultad estriba en la necesidad de aprender a manejar una nueva herramienta/lenguaje e integrarlo en nuestro desarrollo y ecosistema.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Durante esta entrada, y posiblemente la siguiente, vamos a presentar un enfoque alternativo a las dos opciones anteriores. En lugar de utilizar un DSL externo como podría ser el ofrecido por Antlr, vamos a utilizar un DSL interno. Dicho DSL estará formado por &lt;b&gt;parser combinators&lt;/b&gt; (funciones y operadores definidos en Scala que servirán como base para la construcción de nuestros futuros parsers).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Siendo originales :), imaginemos que deseamos cosntruir un parser de expresiones aritméticas de números enteros. En primer lugar, definamos la gramática de nuestro lenguaje:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;expr &amp;nbsp;::=&amp;nbsp;term {"+" term | "-" term}.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;term &amp;nbsp;::=&amp;nbsp;factor {"*" factor | "/" factor}.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;factor &amp;nbsp;::=&amp;nbsp;&amp;nbsp;integer | "(" expr ")".&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El fragmento de código anterior representa una gramática libre de contexto (no vamos a profundizar en este tema porque tendríamos que escribir miles de posts) que modela nuestro lenguaje de expresiones aritméticas de números enteros. ¿Y ahora?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una vez definida la gramática anterior hemos llevado a cabo la tarea más complicada de todas. Si utilizais los &lt;b&gt;parser combinators&lt;/b&gt; ofrecidos por Scala tendremos casi todo el trabajo sucio realizado. A modo de ejemplo:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;import scala.util.parsing.combinator._&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;class IntegerArithmetics extends JavaTokenParsers {&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;def expr: Parser[Any] = term~rep("+"~term | "-"~term)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;def term: Parser[Any] = factor~rep("*"~factor | "/"~factor)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp;def factor: Parser[Any] = integer | "("~expr~")"&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si comparamos el código Scala con la definición en notación EBNF de nuestra gramática observaremos que podríamos inferir nuestro código fuente Scala sin más que realizar una serie de reemplazos en nuestra notación EBNF:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ol&gt;&lt;li&gt;Cada regla se convierte en un método por lo que tendremos que prefijarlas con &lt;b&gt;def&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;El tipo de retorno de cada uno de los métodos anteriores es &lt;b&gt;Parser[Any]&lt;/b&gt;&amp;nbsp;(veremos en la siguiente entrada que significa esto) por lo que tendremos que cambiar el símbolo "&lt;b&gt;::=&lt;/b&gt;" por "&lt;b&gt;:Parser[Any] =&lt;/b&gt;"&lt;/li&gt;&lt;li&gt;Insertar el símbolo ~ entre todos los elementos de cada una de las reglas (en la notación EBNF esto es implícito)&lt;/li&gt;&lt;li&gt;La repetición se refleja mediante el uso de &lt;b&gt;rep(...)&lt;/b&gt; en lugar de &lt;b&gt;{...}&lt;/b&gt;&lt;/li&gt;&lt;li&gt;El punto al final de cada regla no es necesario (podríamos poner ; si lo deseamos)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esto no ha sido más que una toma de contacto con el mundo de los parser combinators en Scala. En la siguiente entrada descubriremos cómo realizar construcciones más complejas, formatear la salida de manera que podamos construir las estructuras de datos requeridas para nuestro procesamiento o ejecutar nuestros parsers.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para todo ello diseñaremos y construiremos un pequeño parser que nos permita analizar el bytecode de la máquina virtual una vez desemsamblado (para los más inquietos &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;javap -v ClassFile&lt;/span&gt; (sin .class))&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/35092134-588477828125944448?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/588477828125944448/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=588477828125944448' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/588477828125944448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/588477828125944448'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/03/parser-combinators-un-poco-de-teoria.html' title='Parser Combinators: un poco de teoría'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-712444578975359137</id><published>2011-02-23T08:27:00.000+01:00</published><updated>2011-02-23T08:27:25.660+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Functional programming'/><title type='text'>Introducción a Scala</title><content type='html'>&lt;div style="text-align: justify;"&gt;El siguiente documento es un pequeño resumen (introductorio) sobre el lenguaje de programación &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Scala&lt;/span&gt; y alguno de sus beneficios. No es nada nuevo que no podáis encontrar en los libros de referencia :) pero a lo mejor a alguien le sirve para dar sus primeros pasos en este genial lenguaje de programación.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Espero que os guste:&lt;/div&gt;&lt;br /&gt;&lt;div align="center" id="slides"&gt;&lt;div id="__ss_7026177" style="width: 477px;"&gt;&lt;object height="510" id="__sse7026177" width="477"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=miguelangelpastorolivar-scalaoverview-110223012225-phpapp02&amp;stripped_title=scala-overview-7026177&amp;userName=miguelinlas3" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse7026177" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=miguelangelpastorolivar-scalaoverview-110223012225-phpapp02&amp;stripped_title=scala-overview-7026177&amp;userName=miguelinlas3" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="477" height="510"&gt;&lt;/embed&gt;&lt;/object&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/35092134-712444578975359137?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/712444578975359137/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=712444578975359137' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/712444578975359137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/712444578975359137'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/02/introduccion-scala.html' title='Introducción a Scala'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7552811920471676790</id><published>2011-02-21T22:44:00.000+01:00</published><updated>2011-02-21T22:44:09.767+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>DDD, Spring y AspectJ: inyección de depencias (II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;En la &lt;a href="http://miguelinlas3.blogspot.com/2011/02/ddd-spring-y-aspectj-inyeccion-de.html"&gt;entrada anterior&lt;/a&gt; analizabamos el uso de la anotación &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Configurable&lt;/span&gt; y cómo esta nos ayudaba a realizar la inyección de dependencias en nuestro objetos de dominio, ayudándonos de esta manera a realizar nuestro diseño siguiendo una filosofía orientada al dominio (podréis encontrar mucha información, artículos, referencias, ponencias, . . ., relativas a este tema en&amp;nbsp;&lt;a href="http://domaindrivendesign.org/"&gt;http://domaindrivendesign.org/&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como ya comentamos anteriormente el uso de la anotación &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Configurable&lt;/span&gt;&amp;nbsp;era beneficioso aunque si la clase anotada se instancia un gran número de veces podríamos incurrir en una notable pérdida de rendimiento puesto que la anotación anterior hace uso de la reflectividad. Adicionalmente, indicábamos que &amp;nbsp;otro de los "problemas" era que nuestro código estaba acoplado a la plataforma, en este caso, Spring. Durante esta entrada plantearemos otro mecanismo de inyección de dependencias en nuestros objetos de dominio: &lt;b&gt;inyección basada en interfaces de dominio&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Partiendo del ejemplo analizado en el ejemplo anterior, definiremos un nuevo interface &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;PricingStrategyClient&lt;/span&gt; que presentará el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;setPricingStrategy(PricingyStrategy pricingStrategy)&lt;/span&gt; . Todas aquellas entidades de nuestro dominio que necesiten esta funcionalidad deberán implementar el interfaz anterior.&lt;br /&gt;&lt;br /&gt;Hasta el momento no hemos anotado nuestra clase con ningún artefacto adicional (@Configurable) por lo que ahora tendremos que escribir nuestro propio aspecto para inyectar las dependencias en nuestra clase de dominio. Para llevar a cabo este trabajo extenderemos&amp;nbsp;un aspecto abstracto disponible en &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;spring-aspects-3.0.5.jar&lt;/span&gt; (los ejemplos de estas entradas están desarrollados con la versión 3.0.5 de Spring) de tipo &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;GenericInterfaceDrivenDependencyInjectionAspect&lt;/span&gt;. De manera resumida, este aspecto base determina cuando se crea una nueva instancia (o serializa) de nuestra clase e invoca al método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;configureBean&lt;/span&gt;. Nosotros únicamente deberemos implementar el método &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;configure&lt;/span&gt; tal y como se muestra en el siguiente fragmento de código:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;public aspect PricingStrategyDIAspect extends&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;GenericInterfaceDrivenDependencyInjectionAspect&lt;pricingstrategyclient&gt; {&lt;/pricingstrategyclient&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;protected PricingStrategy pricingStrategy;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public PricingStrategy getPricingStrategy() {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;return pricingStrategy;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public void setPricingStrategy(PricingStrategy pricingStrategy) {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;this.pricingStrategy = pricingStrategy;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;protected void configure(PricingStrategyClient bean) {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;bean.setPricingStrategyClient(pricingStrategy);&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como último paso de nuestra nueva solución sólo tendremos que definir nuestro nuevo aspecto en el contexto de aplicación:&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;bean id="pricingStrategy" class="com.blogspot.miguelinlas3.springexamples.ddd.domain.strategy.SimplePricingStrategy"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;bean class="com.blogspot.miguelinlas3.springexamples.ddd.domain.interfacedibased.PricingStrategyDIAspect"&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;factory-method="aspectOf"&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;property name="pricingStrategy" ref="pricingStrategy"/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;/bean&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Una posible mejora sería incluir el aspecto anterior como un aspecto estático dentro del interfaz &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;PricingStrategyClient&lt;/span&gt; de modo que estaríamos enfatizando la relación entre ambos aunque esto os lo dejo como ejercicio ;)&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/35092134-7552811920471676790?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7552811920471676790/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7552811920471676790' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7552811920471676790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7552811920471676790'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/02/ddd-spring-y-aspectj-inyeccion-de_21.html' title='DDD, Spring y AspectJ: inyección de depencias (II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-897226971005751700</id><published>2011-02-19T09:02:00.000+01:00</published><updated>2011-02-19T09:02:48.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='springio'/><category scheme='http://www.blogger.com/atom/ns#' term='Scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='slides'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><title type='text'>Spring I/O 2011: Hadoop, Cloud y Spring</title><content type='html'>&lt;div style="text-align: justify;"&gt;Las slides utilizadas en mi presentación del Spring I/O Madrid 2011. Muchas gracias a todos los asistentes (no me imaginaba que fueran a venir tantos :) ) por aguantarme durante una hora.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="__ss_6980519" style="text-align: center; width: 425px;"&gt;&lt;div style="text-align: center;"&gt;&lt;object height="355" id="__sse6980519" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miguelpastor-springio-2011-hadoop-spring-110219013739-phpapp02&amp;stripped_title=hadoop-cloud-y-spring&amp;userName=miguelinlas3" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse6980519" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=miguelpastor-springio-2011-hadoop-spring-110219013739-phpapp02&amp;stripped_title=hadoop-cloud-y-spring&amp;userName=miguelinlas3" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;&lt;div style="text-align: justify;"&gt;A lo largo del finde intentaré hacer un resumen de lo que ha sido &amp;nbsp;para mi la Spring I/O Madrid 2011.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;¡De nuevo muchas gracias a todos por asistir a la charla!&lt;/div&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/35092134-897226971005751700?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/897226971005751700/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=897226971005751700' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/897226971005751700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/897226971005751700'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/02/spring-io-2011-hadoop-cloud-y-spring.html' title='Spring I/O 2011: Hadoop, Cloud y Spring'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6781559214992783514</id><published>2011-02-14T18:51:00.000+01:00</published><updated>2011-02-14T18:51:14.847+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Systems'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Grupo sobre escalabilidad en español</title><content type='html'>&lt;div style="text-align: justify;"&gt;El otro día, mientras revisaba alguno de los artículos y libros que tengo a medio leer, me "&lt;i&gt;di cuenta&lt;/i&gt;" de que muchas de las cosas que me gustan están relacionadas con temas de programación distribuida, escalabilidad de sistemas y temáticas similares.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Pues bien, me he movido un poquito por la red y he intercambiado&amp;nbsp; unos cuantos correos electrónicos con dos auténticos cracks: &lt;a href="http://brigomp.blogspot.com/"&gt;Martín Pérez&lt;/a&gt; y &lt;a href="http://distribuint.blogspot.com/"&gt;Marc de Palol&lt;/a&gt; en los que hemos estado hablando,un poco, sobre la posibilidad de crear un grupo relacionado con temáticas de escalabilidad.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Qué cosas tendrían cabida en el grupo os estaréis preguntando? Pues me imagino que las inquietudes y conocimientos de todos los participantes irán marcando un poco el devenir del mismo.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Nosotros, en un principio (Marc, plagio y añado alguna pincelada a tu correo inicial :) ) habíamos pensado en temas relacionados con la computación distribuida y escalabilidad en general: problemática, soluciones, frameworks, arquitecturas, alternativas, etc utilizados (o que podrían ser utilizados) en el desarrollo software de aquellas aplicaciones en las que&amp;nbsp; el soporte a millones de usuarios concurrentes, el manejo de cantidades ingentes de datos o los tiempos de respuesta son requisitos altamente importantes.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La idea del grupo, al menos inicialmente, ya veremos si la cosa evoluciona y cómo evoluciona, no es ceñirse a ninguna tecnología en particular sino tratar los temas anteriores desde una perspectiva un poco más abierta.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las tecnologías que podrían aparecer en el grupo, tal y como decía antes, vendrán marcadas por el interés que demuestre la gente por el mismo así como la orientación que se le quiera dar. A modo de "brainstorming" dejo algunas de los temas/tecnologías que, desde mi punto de vista, podrían aparecer:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Hadoop y todo su ecosistema: HBase, Hive, Zookeeper, Hive, . . . (aquí iría un largo ecétera : )&lt;/li&gt;&lt;li&gt;Modelos de actores: una alternativa "diferente" a la computación distribuida. Aquí habría cabida para hablar largo y tendido: Erlang y OTP, Scala, Akka, . . .&lt;/li&gt;&lt;li&gt;Temáticas relacionadas con el &lt;i&gt;cloud (&lt;/i&gt;desde un punto de vista de sistemas escalables, no de usuario&lt;i&gt;)&lt;/i&gt;: ¿cómo se lleva a cabo la elasticidad de recursos en las plataformas PaaS como GAE, Amazon Beanstalk o Heroku? ¿Cuáles son las arquitecturas que utilizan este tipo de sistemas? ¿Qué técnicas utilizan para dar soporte a tantos usuarios y aplicaciones? . . .&lt;/li&gt;&lt;li&gt;Movimiento NoSQL: CouchDB, Cassandra, Riak, etc y otras alternativas diferentes como pueden ser las aportadas por plataformas como Greenplum o Vertica.&lt;/li&gt;&lt;li&gt;Seguro que muchísimas cosas más . . . .&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Os animáis?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Martín ha comentado algo en su blog &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://brigomp.blogspot.com/2011/02/hadoop-y-hbase-en-lastfm.html"&gt;http://brigomp.blogspot.com/2011/02/hadoop-y-hbase-en-lastfm.html&lt;/a&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&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/35092134-6781559214992783514?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6781559214992783514/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6781559214992783514' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6781559214992783514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6781559214992783514'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/02/grupo-sobre-escalabilidad-en-espanol.html' title='Grupo sobre escalabilidad en español'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3287935659531502690</id><published>2011-02-07T18:27:00.001+01:00</published><updated>2011-02-19T09:10:25.668+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='DDD'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>DDD, Spring y AspectJ: inyección de depencias (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;El paradigma de orentación a objetos promueve que los objetos deberían tener datos y comportamiento. Sin embargo, en la realidad esto no se cumple en muchas ocasiones; especialmente en los objetos de dominio, donde habitualmente las clases se convierten en meros contenedores de información que se van pasando de unas capas a otras, delegando la funcionalidad en capas de servicio externas, creando un modelo anémico (para más información podéis acudir a&amp;nbsp;&lt;a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html"&gt;http://www.martinfowler.com/bliki/AnemicDomainModel.html&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A lo largo de las siguientes entradas promoveremos el paradigma de diseño dirigido por dominio y analizaremos como podremos enriquecer nuestros objetos de dominio mediante la inyección de dependencias. Para aquellos que estéis familiarizados con las últimas versiones de &lt;a href="http://www.springsource.org/"&gt;Spring&lt;/a&gt;, estas entradas no serán más que un paseo por los &lt;i&gt;internals&lt;/i&gt; de &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;@Configurable&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&amp;nbsp;(anotación&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;que podemos encontrar las versiones más recientes de este popular framework) unidos a un poco de teoría.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Imaginemos por un momento que estamos desorrollando una tienda online para la venta de libros electrónicos y que la &lt;a href="http://pastie.org/1533371"&gt;siguiente clase&lt;/a&gt; modela nuestra entidad de dominio libro. Como podemos observar estamos delegando el cálculo del precio del libro en una clase independiente la cual será la encargada de realizar los cálculos necesarios (de este modo podremos configurar el precio del libro en función de nuestras necesidades). Y ahora: ¿cómo llevamos a cabo la inicialización del atributo&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 15px; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;pricingStrategy&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Bitstream Vera Sans Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 12px; line-height: 15px; white-space: pre;"&gt; &lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;Desde aquí vamos a promover el uso de inyección de dependencias, de manera que añadiendo la infraestructura necesaria (en ese caso un simple setter para el atributo en cuestión) podremos delegar en un contenedor la responsabilidad de inyectar las dependencias necesarias en el momento en el que se instancie nuestro objeto. Siguiendo esta filosofía podríamos intercambiar las estrategias de cálculo de precios sin más que realizar una ligera modificación en la configuración, sin la necesidad de modificar nuestro código fuente. Este enfoque también nos permite llevar a cabo nuestras pruebas unitarias de manera extremadamente sencilla.&lt;br /&gt;&lt;br /&gt;Antes de comenzar a escribir nuestros propios aspectos (lo dejaremos para la próxima entrada) veamos cómo podríamos inyectar las dependencias en nuestro objeto de dominio mediante el uso de spring y un poco de configuración.&lt;br /&gt;&lt;br /&gt;En primer lugar tendremos que indicarle a spring que nuestra clase de dominio &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Book&lt;/span&gt; necesita que sus dependencias sean inyectadas: para ello anotamos la definición de nuestra clase con &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;@Configurable&lt;/span&gt; y añadimos un &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;setter&lt;/span&gt; para nuestro atributo de clase &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;pricingStrategy&lt;/span&gt;. Adicionalmente, anotaremos &amp;nbsp;el &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;setter&lt;/span&gt; anterior (o la propiedad) con &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;@Autowired&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;. &lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Finalmente, definiremos en el contexto de aplicación de spring una implementación concreta del interfaz&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;PricingStrategy&lt;/span&gt; e indicamos que estamos haciendo uso &lt;span class="Apple-style-span" style="font-size: x-small;"&gt;@Configurable&lt;/span&gt; mediante la instrucción&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;context:spring-configured&gt;&lt;/context:spring-configured&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Con la sencilla configuración anterior, cada vez que instanciemos un objeto de la clase &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Book&lt;/span&gt; mediante el operador new: &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;Book book = new Book()&lt;/span&gt; el atributo &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;pricingStrategy&lt;/span&gt; será inyectado con la referencia adecuada.&lt;br /&gt;&lt;br /&gt;El uso de &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;@Configurable&lt;/span&gt;&amp;nbsp;hace uso de la reflectividad por lo que en aquellos objetos que se instancian muy a menudo podríamos incurrir en un serio problema de rendimiento. Adicionalmente, el uso de esta anotación acopla nuestro código a Spring, creando una dependencia hacia el framework.&lt;br /&gt;&lt;br /&gt;En la siguiente entrada analizaremos el uso de interfaces de dominio y escribiremos nuestros propios aspectos como alternativa a la solución presentada a lo largo de esta entrada.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&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/35092134-3287935659531502690?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3287935659531502690/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3287935659531502690' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3287935659531502690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3287935659531502690'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/02/ddd-spring-y-aspectj-inyeccion-de.html' title='DDD, Spring y AspectJ: inyección de depencias (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7001217227409617179</id><published>2011-01-28T17:05:00.000+01:00</published><updated>2011-01-28T17:05:59.625+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='First Steps'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><title type='text'>Scala: Clases y objetos</title><content type='html'>Durante esta entrada analizaremos algunas de las características básicas del paradigma orientado a objetos presentes en Scala. Pongámonos manos a la obra:&lt;br /&gt;&lt;br /&gt;Del mismo modo que en todos los lenguajes orientados a objetos Scala permite la definición de clases en las que podremos añadir métodos y atributos:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;class MyFirstClass{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;val a = 1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si deseamos instanciar un objeto de la clase anterior tendremos que hacer uso de la palabra reservada new&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;val v = new MyFirstClass&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;En Scala existen dos tipos de variables, &lt;b&gt;vals y vars&lt;/b&gt;, que deberemos especificar a la hora de definir las mismas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Se utilizará la palabra reservada val para indicar que es inmutable. Una variable de este tipo es similar al uso de final en Java. Una vez inicializada no se podrá reasignar jamás.&lt;/li&gt;&lt;li&gt;De manera contraria, podremos indicar que una variable es de clase var, consiguiendo con esto que su valor pueda ser modificado durante todo su ciclo de vida.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Uno de los principales mecanismos utilizados que garantizan la robustez de un objeto es la afirmación de que su conjunto de atributos (variables de instancia) permanezca constante a lo largo de todo el ciclo de vida del mismo.&amp;nbsp;El primer paso para evitar que agentes externos tengan acceso a los campos de una clase es declarar los mismos como &lt;b&gt;private&lt;/b&gt;. Puesto que los campos privados sólo podrán ser accedidos desde métodos que se encuentran definidos en la misma clase, todo el código podría modificar el estado del mismo estará localizado en dicha clase.&lt;br /&gt;&lt;br /&gt;Por defecto, si no se especifica en el momento de la definición, los atributos y/o métodos, de una clase tienen acceso público. Es decir, &lt;b&gt;public&lt;/b&gt; es el cualificador por defecto en &lt;i&gt;Scala&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso será incorporar funcionalidad a nuestras clases; para ello podremos definir métodos mediante el uso de la palabra reservada def:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;class MyFirstClass{&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;var a = 1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;def add(b:Byte):Unit={&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;a += b&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Una característica importante de los métodos en Scala es que todos los parámetros son inmutables, es decir, &lt;b&gt;vals&lt;/b&gt;. Por tanto, si intentamos modificar el valor de un parámetro en el cuerpo de un método obtendremos un error del compilación:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def addNotCompile(b:Byte) : Unit = {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;b = 1 &amp;nbsp;// Esto no compilará puesto que el&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &amp;nbsp;// parámetro b es de tipo val&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;a += b&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Otro aspecto relevante que podemos apreciar en el código anterior es que no es necesario el uso explícito de la palabra &lt;b&gt;return&lt;/b&gt;, &lt;i&gt;Scala&lt;/i&gt; retornará el valor de la última expresión que aparece en el cuerpo del método. Adicionalmente, si el cuerpo de la función retorna una única expresión podemos obviar la utilización de las llaves.&lt;br /&gt;&lt;br /&gt;Habitualmente los métodos que presentan un tipo de retorno &lt;b&gt;Unit&lt;/b&gt; tienen efectos colaterales, es decir, modifican el estado del objeto sobre el que actúan. Otra forma diferente de llevar a cabo la definición de este tipo de métodos consiste en eliminar el tipo de retorno y el símbolo igual y englobar el cuerpo de la función entre llaves, tal y como se indica a continuación:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;class MyFirstClass {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;private var sum = 0&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;def add(b:Byte) { sum += b }&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En la siguiente entrada introduciremos el concepto de &lt;b&gt;singleton objects. &lt;/b&gt;También intentaré que la apariencia de las entradas sea un poquito más atractiva utilizando el genial servicio ofrecido por &lt;a href="http://pastie.org/"&gt;http://pastie.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7001217227409617179?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7001217227409617179/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7001217227409617179' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7001217227409617179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7001217227409617179'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/01/scala-clases-y-objetos.html' title='Scala: Clases y objetos'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6154851318443382356</id><published>2011-01-27T23:14:00.000+01:00</published><updated>2011-01-27T23:14:38.767+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='First Steps'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><title type='text'>Scala: Primeros pasos (cont)</title><content type='html'>&lt;div style="text-align: justify;"&gt;En la &lt;a href="http://miguelinlas3.blogspot.com/2011/01/scala-primeros-pasos.html"&gt;entrada anterior&lt;/a&gt;&amp;nbsp;comenzabamos nuestra pequeña aventura en Scala analizando las características principales del paradigma orientado a objetos y revisando alguna de las contribuciones que este lenguaje presenta al modelo. Durante la entrada que nos ocupa revisaremos brevemente los fundamentos del paradigma funcional y analizaremos cómo Scala incorpora y unifica lo mejor de ambos paradigmas en un lenguaje estáticamente tipado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La programación funcional es un paradigma en el que se trata la computación como la evaluación de funciones matemáticas y se evitan los programas con estado y datos que puedan ser modificados. Se adopta una visión más matemática del mundo en el que los programas están compuestos por numerosas funciones que esperan una determinada entrada y producen una determinada salida y, en muchas ocasiones, otras funciones.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Otro de los aspectos de la programación funcional es la ausencia de efectos colaterales gracias a los cuales los programas desarrollados son mucho más sencillos de comprender y probar. Adicionalmente, se facilita la programación concurrente, evitando que se convierta en un problema gracias a la ausencia de cambio.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los lenguajes de programación que soportan este estilo de programación deberían ofrecer algunas de las siguientes características:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Funciones de primer nivel&lt;/li&gt;&lt;li&gt;Closures&lt;/li&gt;&lt;li&gt;Asignación simple&lt;/li&gt;&lt;li&gt;Evaluación tardía&lt;/li&gt;&lt;li&gt;Inferencia de tipos&lt;/li&gt;&lt;li&gt;Optimización del tail call&lt;/li&gt;&lt;li&gt;Efectos monadic&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Es importante tener claro que Scala no es un lenguaje funcional puro dado que en este tipo de lenguajes no se permiten las modificaciones y las variables se utilizan de manera matemática (un ejemplo de lenguaje funcional puro sería &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt;).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Durante las dos últimas entradas hemos centrado nuestra atención en algunos de los aspectos más teóricos por lo que posiblemente a los (pocos) que hayáis leído esto se os haya hecho demasiado aburrido.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esperemos que la siguiente entrada sea más entretenida.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6154851318443382356?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6154851318443382356/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6154851318443382356' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6154851318443382356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6154851318443382356'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/01/scala-primeros-pasos-cont.html' title='Scala: Primeros pasos (cont)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-8474004928398998131</id><published>2011-01-18T22:07:00.001+01:00</published><updated>2011-01-18T22:10:32.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scala'/><category scheme='http://www.blogger.com/atom/ns#' term='First Steps'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><title type='text'>Scala: Primeros pasos</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Me gustaría comenzar una serie de post relativos al lenguaje de programación &lt;i&gt;Scala&lt;/i&gt; para que, si alguien se pasa por aquí y tiene interés, pueda dar sus primeros pasos en este fantástico lenguaje. Dejar claro desde el principio que no soy, ni por asomo, &amp;nbsp;un experto :) , aunque intentaré explicarme con la mayor claridad que me sea posible.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Para comenzar, un poquito de teoría e historia:&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;i&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/i&gt; es un lenguaje de propósito general diseñado para expresar los patrones de programación más comunes de una manera sencilla, elegante y segura. Integra de manera sencilla características de orientación a objetos y lenguajes funcionales, permitiendo de este modo que los desarrolladores puedan ser más productivos. Su creador, Martin Odersky, y su equipo comenzaron el desarrollo de este nuevo lenguaje en el año 2001, en el laboratorio de métodos de programación en EPFL (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;École Polytechnique Fédérale de Lausanne)&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;i&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;&lt;/i&gt; hizo su aparación pública sobre la plataforma JVM (Java Virtual Machine) en enero de 2004 y unos meses después haría lo propio sobre la plataforma .NET.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Aunque se trata de un elemento relativamente novedoso dentro del espacio de los lenguajes de programación, ha adquirido una notable popularidad la cual se acrecenta día tras día.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: large;"&gt;&lt;b&gt;&lt;u&gt;Orientación a objetos&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Un lenguaje orientado a objetos "puro" debería presentar las siguientes características:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Ocultación de información.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Herencia.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Polimorfismo/Enlace dinámico.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Todos los tipos predefinidos son objetos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Todas las operaciones son llevadas a cabo mediante en envío de mensajes a objetos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Todos los tipos definidos por el usuario son objetos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Scala da soporte a todas las características anteriores mediante la utilización de un modelo puro de orientación a objetos muy similar al presentado por Smalltalk (lenguaje creado por Alan Kay sobre el año 1980).&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;De manera adicional Scala añade algunas innovaciones en el espacio de los lenguajes orientados a objetos:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Composición modular de mixin. Mecanismo que permite la composición de clases para el diseño de componentes reutilizables evitando los problemas presentados por la herencia múltiple. Similar a los interfaces Java y las clases abstractas. Por una parte se pueden definir múltiples "contratos" (del mismo modo que los interfaces). Por otro lado, se podrían tener implementaciones concretas de los métodos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Self-type. Los mixin no dependen de ningún método y/o atributo de aquellas clases con las que se está entremezclando aunque en determinadas ocasiones será necesario hacer uso de las mismas. Esta capacidad es conocida en Scala como self-type&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Se ha optado por mantener el término original disponible en la documentación del lenguaje.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Abstracción de tipos. Existen dos mecanismos principales de abstracción en los lenguajes de programación: la parametrización y los miembros abstractos. Scala soporta ambos estilos de abstracción de manera uniforme para tipos y valores&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;Vamos a dejar la entrada en este punto para no convertirla en un ladrillo (más aun de lo que ya &amp;nbsp;es) y en el próximo post analizaremos, de manera general, las características generales del paradigma funcional.&lt;/span&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/35092134-8474004928398998131?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/8474004928398998131/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=8474004928398998131' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8474004928398998131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8474004928398998131'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/01/scala-primeros-pasos.html' title='Scala: Primeros pasos'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2965653615802403863</id><published>2011-01-04T21:36:00.000+01:00</published><updated>2011-01-04T21:36:07.911+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Año Nuevo'/><category scheme='http://www.blogger.com/atom/ns#' term='Propósitos'/><title type='text'>2011: Propósitos</title><content type='html'>2010 ha sido un año complicado en muchos sentidos y creo que, en la medida de lo posible, hemos hecho todo lo posible para que las cosas nos hayan ido bien.&lt;br /&gt;&lt;br /&gt;Aunque no soy excesivamente partidario de los propósitos de año nuevo voy a hacer una excepción. Voy a hacer una lista de cosas que me gustaría realizar durante este nuevo año que acabamos de comenzar:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pasar mucho más tiempo con mi futura esposa. Soy consciente de que a veces me enfrasco en muchas cosas que no deberían quitarme tanto tiempo. Es algo en lo que tengo mejorar y por eso está en la primera posición de mi lista&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Casarme. Si señores, como bien habréis deducido del punto anterior, este año me caso. Creo que no necesita mayor explicación :)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Retomar el deporte.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Leer, leer y leer. Terminar la interminable lista de libros y artículos que tengo pendientes además de todos los que están por venir :)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Comenzar mi tésis doctoral. Estoy empezando a escribir la tesina, la cual si todo va bien, servirá como base para mi tésis doctoral. Ligado con el mundo investigador este año me esforzaré por publicar algún artículo.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Programar, programar, y programar. Reactivar mi participación en alguno de los proyectos de software libre en los que participaba hace tiempo y en los que, por diversos motivos, he tenido que reducir mi participación a la mínima expresión.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;. . .&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Seguramente muchas de las anteriores tareas se quedarán en el tintero por diversos motivos aunque esperemos que con muchas ganas y esfuerzo algunas de ellas salgan adelante.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un abrazo y feliz 2011 para tod@s!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2965653615802403863?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2965653615802403863/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2965653615802403863' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2965653615802403863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2965653615802403863'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2011/01/2011-propositos.html' title='2011: Propósitos'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3532946475890732798</id><published>2010-12-19T13:56:00.000+01:00</published><updated>2010-12-19T13:56:17.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><category scheme='http://www.blogger.com/atom/ns#' term='Objectives'/><title type='text'>Objective: to improve my English</title><content type='html'>I need to improve my written English (okay, the spoken as well :) ) so i have decided to change the language of blog posts for a while. I am not clear how long i will be able to do this but i am going to try it. All kind of corrections are (and will be) welcome.&lt;br /&gt;&lt;br /&gt;It's true that i should increase my post's frequency in order to achieve it :)&lt;br /&gt;&lt;br /&gt;Next blog post: OSGI in the enterprise.&lt;br /&gt;&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3532946475890732798?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3532946475890732798/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3532946475890732798' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3532946475890732798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3532946475890732798'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/12/objective-to-improve-my-english.html' title='Objective: to improve my English'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2857800677333822163</id><published>2010-11-04T23:44:00.000+01:00</published><updated>2010-11-04T23:44:40.219+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Libros'/><title type='text'>Retomando la lectura</title><content type='html'>&lt;div style="text-align: justify;"&gt;Estas últimas semanas he retomado, por fin, un hábito que desgraciadamente tenía demasiado oxidado: la lectura :). Aprovechando los trayectos en transporte público al trabajo y a la facultad he logrado leer algunos libros con los que me he divertido mucho:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.casadellibro.com/libro-assassini/986371/2900001009361"&gt;Assassini, de Thomas Gifford&lt;/a&gt;. Intrigas y asesinatos en el seno de la Iglesia ambientado en el año 1982.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.elnombredelviento.com/"&gt;El nombre del viento de&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: small; line-height: 15px;"&gt;&amp;nbsp;Patrick Rothfuss&lt;/span&gt;&lt;/a&gt;. Una fantástica historia de aventuras y fantasía. Completamente recomendable. Esperando con ganas la siguiente entrega :).&lt;/li&gt;&lt;li&gt;Releyendo&amp;nbsp;&lt;a href="http://www.casadellibro.com/libro-el-segundo-mundo/2900001273779"&gt;El segundo mundo de Parag Khanna&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Hace poco le regalé el Kindle a la gordita así que puede que se lo robe en alguna que otra ocasión :) ¿Alguna sugerencia de algún libro interesante?&lt;/div&gt;&lt;br /&gt;Adicionalmente tengo una pila de "&lt;i&gt;otro tipo de libros/articulos" :)&lt;/i&gt; que sigue creciendo por momentos y no tengo ni idea de cuando podré ir dando salida a alguno de ellos. Me gustaría sacar algo de tiempo libre pero la verdad que últimamente no lo estoy haciendo demasiado bien. Puede que realmente tenga mi agenda demasiado ocupada o que no me estoy organizando todo lo bien que debería. No lo tengo claro.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;Migue&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2857800677333822163?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2857800677333822163/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2857800677333822163' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2857800677333822163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2857800677333822163'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/11/retomando-la-lectura.html' title='Retomando la lectura'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6408335649652965325</id><published>2010-10-26T00:21:00.000+02:00</published><updated>2010-10-26T00:21:43.259+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cambios'/><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>¿De regreso?</title><content type='html'>&lt;div style="text-align: justify;"&gt;Intentar actualizar el blog de con una regularidad mínimamente aceptable se ha convertido en una tarea prácticamente imposible: mi nueva situación profesional, las clases (con sus correspondientes exámenes y trabajos), el inicio de mi tésis doctoral (que primero tendrá que ser tésis de máster :) si todo marcha como es debido), un par de ideas que me rondan la cabeza desde hace tiempo, . . ., bueno, bueno, ya vale, que acabo de releer desde el principio y ya me estoy agobiando.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En muchas ocasiones me pregunto que es lo que me motiva a escribir, aunque sea de vez en cuando, alguna entrada en este espacio (uno más entre los cientos de millones de bitácoras disponibles que circulan por la red) ; y siempre llego a la misma conclusión: &lt;b&gt;me divierte&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Así es, sencillamente me divierto durante la escritura de un post. Posiblemente mucha gente no lo entienda, pero el tiempo que dedico a &amp;nbsp;contar cualquiera de las cosas que he escrito o escribiré (esperemos que así sea) en este blog hace que me lo pase bien.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Y a qué viene ésto me pregunto ahora? Pues a nada en particular; estaba estudiando un poquito, no me concentraba demasiado y aprovechando que hace una buena temporada que no escribo pues . . .&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Y ahora? Pues no prometo nada. En la medida que mi tiempo libre me lo permita intentaré añadir nuevas entradas con temáticas relativas a algunas de las cosas a las que me estoy dedicando, por un motivo u otro, durante esta última temporada.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Un abrazo!&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6408335649652965325?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6408335649652965325/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6408335649652965325' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6408335649652965325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6408335649652965325'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/10/de-regreso.html' title='¿De regreso?'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5141288762198612559</id><published>2010-08-11T23:49:00.000+02:00</published><updated>2010-08-11T23:49:42.147+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cambios'/><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='NeoMetrics'/><title type='text'>Tiempo de cambios</title><content type='html'>&lt;div style="text-align: justify;"&gt;Mañana por la mañana pasaré mis últimas horas como integrante de la plantilla de Neo Metrics; ha sido una decisión meditada y espero que el paso del tiempo demuestre que también ha sido acertada.&amp;nbsp;Me marcho dejando grandes compañeros, pero creo que lo más importante de todo, me marcho dejando grandes amigos&lt;br /&gt;&lt;br /&gt;He decidido dar un paso adelante y probar suerte así que a partir del próximo día 22 de Agosto comenzaré una nueva etapa profesional como integrante de &lt;a href="http://www.insa.es/"&gt;INSA&lt;/a&gt;;&amp;nbsp;creo que es un tren que no podía dejar pasar así que allí me voy con toda la ilusión del mundo.&lt;br /&gt;&lt;br /&gt;La verdad que no me apetece seguir escribiendo :) así que ya postearé una entrada con un poco más de detalle dentro de unos días (a la vuelta de mis vacaciones que comienzan mañana mismo).&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt;Migue &amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&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/35092134-5141288762198612559?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5141288762198612559/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5141288762198612559' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5141288762198612559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5141288762198612559'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/08/tiempo-de-cambios.html' title='Tiempo de cambios'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3985518218034892199</id><published>2010-08-01T10:17:00.001+02:00</published><updated>2010-08-01T10:17:17.850+02:00</updated><title type='text'>Platform as a Service overview</title><content type='html'>A sample overview of the main features of PaaS&lt;div style="width:425px" id="__ss_4881368"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/miguelinlas3/platform-as-a-service-overview" title="Platform as a Service overview"&gt;Platform as a Service overview&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4881368" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=paas-slides-100801030531-phpapp02&amp;stripped_title=platform-as-a-service-overview" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4881368" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=paas-slides-100801030531-phpapp02&amp;stripped_title=platform-as-a-service-overview" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelinlas3"&gt;Miguel Pastor&lt;/a&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/35092134-3985518218034892199?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3985518218034892199/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3985518218034892199' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3985518218034892199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3985518218034892199'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/08/platform-as-service-overview.html' title='Platform as a Service overview'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5207403604411916508</id><published>2010-07-27T09:14:00.001+02:00</published><updated>2010-07-27T09:14:50.252+02:00</updated><title type='text'>HadoopDB: a brief overview</title><content type='html'>Not enough free time, so posting here is becoming a difficult task  :(&lt;div style="width:425px" id="__ss_4847239"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/miguelinlas3/hadoopdb" title="HadoopDB"&gt;HadoopDB&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4847239" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hadoop-db-slides-100727020939-phpapp01&amp;stripped_title=hadoopdb" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4847239" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=hadoop-db-slides-100727020939-phpapp01&amp;stripped_title=hadoopdb" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelinlas3"&gt;Miguel Pastor&lt;/a&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/35092134-5207403604411916508?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5207403604411916508/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5207403604411916508' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5207403604411916508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5207403604411916508'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/07/hadoopdb-brief-overview.html' title='HadoopDB: a brief overview'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1491060033133580529</id><published>2010-06-22T10:29:00.000+02:00</published><updated>2010-06-22T10:29:29.553+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Aspect Oriented Programming Intro Guide</title><content type='html'>Hace tiempo que habíamos comenzado una serie de post relativos a la programación orientada a aspectos y los tenemos dispersos a lo largo de diferentes entradas. He decido recolectar todos los post publicados junto a los que estaban por venir y hacer una sola entrega.&lt;br /&gt;&lt;br /&gt;Espero que os guste:&lt;br /&gt;&lt;br /&gt;&lt;div align="center" id="__ss_4570210" style="width: 477px;"&gt;&lt;object height="510" id="__sse4570210" width="477"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/doc_player.swf?doc=aop-100622031207-phpapp01&amp;stripped_title=aop-4570210" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4570210" src="http://static.slidesharecdn.com/swf/doc_player.swf?doc=aop-100622031207-phpapp01&amp;stripped_title=aop-4570210" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="477" height="510"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Está escrito en &lt;a href="http://www.docbook.org/"&gt;docbook &lt;/a&gt;por lo que si alguien está interesado en los fuentes no tiene más que pedírmelos.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-1491060033133580529?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1491060033133580529/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1491060033133580529' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1491060033133580529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1491060033133580529'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/06/aspect-oriented-programming-intro-guide.html' title='Aspect Oriented Programming Intro Guide'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2557713392820572475</id><published>2010-06-19T11:03:00.000+02:00</published><updated>2010-06-19T11:03:54.495+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Crosscutting'/><title type='text'>AOP: crosscutting (II)</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durante la &lt;a href="http://miguelinlas3.blogspot.com/2010/05/aop-crosscutting-i.html"&gt;última entrada&lt;/a&gt; de la serie relacionada con la programación orientada a aspectos analizamos el modo en el que se puede alterar el comportamiento de un sistema, analizando las categorías de advices y realizando una comparativa con los métodos de una clase. A lo largo de esta entrada realizaremos un análisis en profundidad de los &lt;b&gt;&lt;i&gt;advices&lt;/i&gt;&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Before advice&lt;/span&gt;&lt;br /&gt;&lt;/b&gt;Este tipo de advices se ejecutan antes de la ejecución del joint point sobre el que actúan. En el siguiente ejemplo:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; before():execution(@Secured * * (..)){&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // asegurarse de que el usuario puede realizar la operación&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;el advice realiza una comprobación de seguridad antes de que se produzca la ejecución de cualquier método anotado con &lt;i&gt;Secured.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;En caso de que el advice dispare un excepción, el joint point no se ejecutará. Este tipo de advices son comúnmente utilizados en aspectos tales como seguridad o trazabilidad.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;After advice&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se ejecutan después de la ejecución del joint point sobre el que actúan.Dentro de esta categoría, &lt;b&gt;AspectJ &lt;/b&gt;ofrece tres tipos de advices:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Ejecución del advice independientemente del resultado de la ejecución del joint point.&lt;/li&gt;&lt;li&gt;Ejecución del advice única y exclusivamente si el joint point ha finalizado correctamente.&lt;/li&gt;&lt;li&gt;Ejecución del advice después que el joint point haya disparado una excepción.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Veamos en detalle cada uno de los tres tipos anteriores:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1.- Advice After&lt;/b&gt;&lt;br /&gt;Este tipo de advices se ejecutan independientemente del resultado de la ejecución del joint point sobre el que actúan.Habitualmente se conoce a este tipo de advices como after finally puesto que su semántica es similar a la de un bloque &lt;i&gt;finally&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;El siguiente advice:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; after(): call(@Logging * ServiceManager.*(..)){&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // registrar el resultado de la operación&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;/span&gt;registra el resultado de todas las operaciones de la clase &lt;i&gt;ServiceManager&lt;/i&gt; que estén marcadas con la anotación &lt;i&gt;Logging&lt;/i&gt;, independientemente si retornan correctamente o terminan su ejecución de forma inesperada mediante el disparo de una excepción.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2.-Advice After Returning&lt;/b&gt;&lt;br /&gt;En muchas ocasiones,será necesario ejecutar el código de nuestro advice única y exclusivamente cuando la ejecución del joint point haya terminado de forma correcta. Continuando con el ejemplo anterior:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; after () returning: call(@Logging * ServiceManager.*(..)){&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // registrar el resultado de la operación&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;se seguirá registrando el resultado de las operaciones, siempre y cuando, la ejecución haya terminado correctamente, sin el disparo de ninguna excepción.&lt;br /&gt;&lt;br /&gt;AspectJ ofrece una pequeña variante para este tipo de advices:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;after() returning (ReturnType returnObject)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;gracias a la cual se permite recuperar el objeto retornado por la ejecución del joint point dentro del advice. Veamos un pequeño ejemplo ilustrativo:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; after() returning (java.sql.Connection connection):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; call(java.sql.Connection DriverManager.getConnection(..)){&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; System.out.println("Se ha recuperado la conexión "&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; + connection);&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Es importante tener claro que no se puede retornar un objeto nuevo (sí puede ser modificado pero no retornar uno nuevo).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;3.- Advice After Exception&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;Este tipo de advices son similares a los descritos en el apartado anterior. En este caso, el advice se ejecutará única y exclusivamente cuando el joint point dispare una excepción. Presentan la siguiente estructura:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;after() throwing:execution (* ServiceManager+.*(..))&lt;/span&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;El advice del ejemplo anterior se ejecutará siempre y cuando algún método de la clase &lt;i&gt;ServiceManager &lt;/i&gt;(o alguna de sus subclases) dispare una excepción. En el supuesto de que la ejecución del joint point termine correctamente, este tipo de advices no serán ejecutados.&lt;br /&gt;&lt;br /&gt;Al igual que los advices del apartado anterior, &lt;i&gt;AspectJ&lt;/i&gt; ofrece un modo de recuperar la excepción que ha sido disparada por el joint point de manera que esté disponible en el cuerpo del advice. Siguiendo una sintaxis similar a la anterior, tendríamos:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; text-align: center;"&gt;&lt;span style="font-size: x-small;"&gt;after() throwing (ExceptionType exceptionObject):&lt;/span&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Un after throwing advice nunca podrá tragarse la excepción, por lo que seguirá subiendo por la pila de llamadas hasta llegar al objeto que realizó la invocación del joint point.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Around advice&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Este clase de advices engloban al joint point, pudiendo ejecutar la lógica del mismo un número indefinido de veces. Incluso pueden omitir la ejecución del propio joint point. Algunos de los usos principales de este tipo de advices son los siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ejecución de lógica adicional antes y después de la ejecución de un joint point, como por ejemplo, acciones de profiling.&lt;/li&gt;&lt;li&gt;Omitir la ejecución original, y realizar otra en su lugar, como por ejemplo, operaciones con cachés.&lt;/li&gt;&lt;li&gt;Envolver la operación con el objetivo de aplicar una política de gestión de excepciones. Un ejemplo de este uso sería la gestión de transacciones.&lt;/li&gt;&lt;/ul&gt;Este advice ofrece una potencia superior a todos los advices vistos hasta el momento, puesto que podrían sustituir a los anteriores. De todos modos, se considera una buena práctica utilizar el advice más sencillo que cumpla las necesidades de la tarea que necesita ser llevada a cabo.&lt;br /&gt;&lt;br /&gt;Si desde el around advice se desea llevar a cabo la ejecución del joint point, será necesario hacer uso de la palabra reservada &lt;i&gt;proceed()&lt;/i&gt; dentro del cuerpo del advice. Recuérdese que, puesto que la invocación de &lt;i&gt;proceed() &lt;/i&gt;ejecuta el joint point, deberán pasarse el mismo número de argumentos que han sido recolectados por el advice.&lt;br /&gt;Asimismo, puesto que la invocación de &lt;i&gt;proceed()&lt;/i&gt; supone la ejecución del joint point, el valor de retorno será el retornado por éste último.&lt;br /&gt;&lt;br /&gt;A continuación se adjunta un pequeño ejemplo de utilización de advices de este tipo:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void around(User user,int credits) &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throws InsufficientCreditsException:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; call(* User.pay*(int)) &amp;amp;&amp;amp; target(user) &amp;amp; &amp;amp;&amp;nbsp; args(credits){&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; proceed(user,credits);&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }catch(InsufficientCreditsException ex){&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if(!processException()){&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw ex;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Analicemos en detalle la construcción anterior:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El pointcut selecciona cualquier llamada a los métodos de la clase &lt;i&gt;User&lt;/i&gt; cuyo nombre comience por &lt;i&gt;pay &lt;/i&gt;y disparen una excepción de tipo &lt;i&gt;InsufficientCreditsException&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;La segunda parte del pointcut recolecta el contexto del joint point: el usuario sobre el que se está realizando la llamada y el número de créditosque se están pasando como argumento del método que se está ejecutando.&lt;/li&gt;&lt;li&gt;En el cuerpo del advice, se engloba la ejecución del método con un bloque de gestión de excepciones, para realizar una protección adicional en caso de que se produzca una excepción. En el caso de que la protección adicional no sea correcta, la excepción será disparada de nuevo.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Todos los around advices deben declarar un valor de retorno (pudiendo ser void). Habitualmente el tipo de retorno de éstos se corresponde con el tipo de retorno de los joint points sobre los que está actuando.&lt;br /&gt;En algunas ocasiones, todos los joint points sobre los que actúa el advice no presentan el mismo tipo de retorno, como puede ocurrir cuando estamos añadiendo soporte transaccional a diferentes&amp;nbsp; operaciones. En estas situaciones el tipo de retorno que debe declarar el advice será Object. AspectJ acomodará el valor de retorno de acuerdo a las&amp;nbsp; siguientes reglas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Si se está retornando un tipo primitivo, AspectJ realizará el boxing/unboxing correspondiente. Esta característica es similar a la incluida a partir de Java 5, pero AspectJ no precisa de dicha versión de Java para realizar la operación.&lt;/li&gt;&lt;li&gt;En el caso en el que el tipo de retorno no sea primitivo, AspectJ realizará los casts oportunos antes de retornar el valor.&lt;/li&gt;&lt;/ul&gt;Muchas ocasiones es necesario acceder a los objetos que conforman la ejecución del joint point para que el advice pueda llevar a cabo la lógica correspondiente. Por tanto, los pointcuts, necesitan exponer el contexto disponible en la ejecución del joint point de modo que pueda estar disponible en el cuerpo del advice. Dicho contexto puede definirse de dos modos diferentes: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;Objetos (incluyendo los tipos primitivos) que conforman el joint point.&lt;/li&gt;&lt;li&gt;Anotaciones asociadas al joint point.&lt;/li&gt;&lt;/ul&gt;La siguiente tabla describe el conjunto de pointcuts que AspectJ ofrece para recuperar el contexto en los joint points.&lt;/div&gt;&lt;br /&gt;&lt;div id="table"&gt;&lt;table border="1" frame="void" id="d0e3506"&gt;&lt;caption&gt;Table 1.14. Pointcuts para recuperar el contexto en un &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/caption&gt;&lt;col width="25%"&gt;&lt;/col&gt;&lt;col width="75%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;         &lt;th&gt;Pointcut&lt;/th&gt;         &lt;th&gt;Contexto recuperado&lt;/th&gt;        &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;this(obj)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Objeto &lt;span class="italic"&gt;this&lt;/span&gt; en el &lt;span class="italic"&gt;joint point&lt;/span&gt; que se está&lt;br /&gt;ejecutando&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;target(obj)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Objetivo de la llamada en el &lt;span class="italic"&gt;joint&lt;br /&gt;point&lt;/span&gt; que se está ejecutando. En el caso de un&lt;br /&gt;&lt;span class="italic"&gt;joint point&lt;/span&gt; de una&lt;br /&gt;llamada a un método, el &lt;span class="italic"&gt;target&lt;/span&gt; será el objeto que realiza la llamada.&lt;br /&gt;Para la ejecución de un método, el &lt;span class="italic"&gt;target&lt;/span&gt; será el objeto &lt;span class="italic"&gt;this&lt;/span&gt;. En los accesos a campos, el &lt;span class="italic"&gt;target&lt;/span&gt; será el objeto que se está&lt;br /&gt;accediendo. En el resto de &lt;span class="italic"&gt;joint&lt;br /&gt;points&lt;/span&gt; no existe un &lt;span class="italic"&gt;target&lt;/span&gt; disponible&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;args(obj1,obj2,...)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Objetos que representa los argumentos en el &lt;span class="italic"&gt;joint point&lt;/span&gt;. Para las&lt;br /&gt;llamadas/ejecuciones de métodos/constructores, recupera los&lt;br /&gt;argumentos de los mismos. En el caso de los manejadores de&lt;br /&gt;excepciones, recupera la excepción producida. Para los accesos&lt;br /&gt;en modo escritura a un campo, recupera el nuevo valor del&lt;br /&gt;campo.&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;@this(annot)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Anotación asociada con el tipo del objeto &lt;span class="italic"&gt;this&lt;/span&gt; del &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/td&gt;         &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;@target(annot)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Anotación asociada con el tipo del objeto &lt;span class="italic"&gt;target&lt;/span&gt; del &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;@args(annot1, annot2,&lt;br /&gt;...)&lt;/span&gt;&lt;/td&gt;          &lt;td&gt;Anotación asociada con el tipo de los argumentos del &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;@within(annot)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Anotación asociada con el tipo "enclosing" del &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;@withincode(annot)&lt;/span&gt;&lt;/td&gt;          &lt;td&gt;Anotación asociada con el método "enclosing" del &lt;span class="italic"&gt;joint point&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;&lt;span class="italic"&gt;annotation(annot)&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;Anotación asociada con el asunto actual del &lt;span class="italic"&gt;joint point&lt;/span&gt;.&lt;/td&gt;        &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Durante la próxima entrada analizaremos el concepto de &lt;b&gt;Aspecto.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;b&gt; &lt;/b&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2557713392820572475?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2557713392820572475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2557713392820572475' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2557713392820572475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2557713392820572475'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/06/aop-crosscutting-ii.html' title='AOP: crosscutting (II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-39272120837199321</id><published>2010-06-16T07:47:00.000+02:00</published><updated>2010-06-16T07:47:48.892+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Measures'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>Measuring layered architectures adherence</title><content type='html'>&lt;div align="center"&gt;&lt;div id="__ss_4512494" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/miguelinlas3/software-measureslides" title="Software measure-slides"&gt;Software measure-slides&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse4512494" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-measure-slides-100616004253-phpapp02&amp;stripped_title=software-measureslides" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4512494" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=software-measure-slides-100616004253-phpapp02&amp;stripped_title=software-measureslides" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelinlas3"&gt;Miguel Pastor&lt;/a&gt;.&lt;/div&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/35092134-39272120837199321?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/39272120837199321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=39272120837199321' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/39272120837199321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/39272120837199321'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/06/measuring-layered-architectures.html' title='Measuring layered architectures adherence'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5363286354007360424</id><published>2010-06-13T11:02:00.000+02:00</published><updated>2010-06-13T11:02:04.821+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Cocina'/><category scheme='http://www.blogger.com/atom/ns#' term='Restaurantes'/><category scheme='http://www.blogger.com/atom/ns#' term='Gourmet'/><title type='text'>Resérveme esa mesa por favor</title><content type='html'>&lt;div style="text-align: justify;"&gt;Os habréis dado cuenta de que he cambiado la apariencia del blog; no es más que una prueba. Blogger ha liberado una nueva herramienta para personalizar la apariencia y he estado jugando un poco :).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De manera habitual, cuando tengo un poco de tiempo libre, algo que no suele ser demasiado habitual, intento escribir por aquí acerca de algunas de las cosas que más me gustan, las nuevas tecnologías y el mundo del desarrollo de software. Otra de las cosas a las que soy aficionado es a la cocina, y también a los restaurantes :), así que hoy vamos a cambiar un poquito la línea habitual que veníamos siguiendo en las últimas entradas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Mibu, ubicado en el lujoso barrio de &amp;nbsp;Ginza (Tokio) y regentado por Hiroyosi y Tomiko Ishida, es uno de los restaurantes más peculiares del mundo: tiene una única mesa a la que solamente pueden acceder sus 300 socios, junto con sus acompañantes. Ocho personas en dos o tres turnos diarios que pagan unos 25000 yenes (225 euros aproximadamente) son sometidos a un ritual que ha enamorado a algunos de los cocineros españoles más sobresalientes. Todavía es demasiado pronto para saber si Ferrán Adriá está barajando la posibilidad de incluir la mesa única como el nuevo formato del Bulli tras su reapertura en 2014.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A continuación os dejo las referencias a algunos de los 'private cooking' de un solo mantel que podréis encontrar en Madrid:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Taller Inhova. Paco Roncero realiza las pruebas de sus platos para su restaurante La Terraza del Casino. El precio del menú degustación son 250€. Capacidad para seis comensales.&lt;/li&gt;&lt;li&gt;Chefs Lab. En este caso el cocinero es Sergio Pérez y el número de comensales oscila entre 8 y 16. El precio del menú degustación es de uns 120€.&lt;/li&gt;&lt;li&gt;Sergi Arola-Gatro. Menú degustación de unos 160€ presenta una capacidad de 2 a 14 comensales.&lt;/li&gt;&lt;li&gt;Astrid &amp;amp; Gastón. Los cocineros Gastón Acurio y Kike Ceballos ofrecen un menú degustación por unos 95€ y una capacidad de hasta cuatro comensales.&lt;/li&gt;&lt;li&gt;Estadu Puro. De nuevo Paco Roncero ofrece un espacio en el que los menús degustación comienzan desde 45€ para un máximo de ocho comensales.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;La lista anterior únicamente incluye los restaurantes disponibles en Madrid, aunque a lo largo de la geografía española podréis encontrar alguno más como pueden ser El Cenador de Amós en Villaverde de los Pontones (Cantabria), la Cuina de los Angels en Mahón (Menorca) o El Rincón del Chef en Barcelona.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Para terminar, os dejo un &lt;a href="http://www.portaldeamerica.com/index.php?option=com_k2&amp;amp;view=item&amp;amp;id=433:res%C3%A9rveme-esa-mesa-%C3%BAnica-c%C3%B3mo-y-cu%C3%A1ndo-es-rentable-la-gastronom%C3%ADa-privada&amp;amp;Itemid=13&amp;amp;tmpl=component&amp;amp;print=1&amp;amp;lang=es"&gt;enlace&lt;/a&gt; en el que habla de todo ésto que os acabo de contar y, además, analiza si el modelo de negocio adoptado por este tipo de negocios puede resultar rentable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bueno chic@s, voy a ver si aprovecho el domingo y continuo estudiando un rato que todavía me quedan muchísimas cosas por terminar :(.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5363286354007360424?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5363286354007360424/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5363286354007360424' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5363286354007360424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5363286354007360424'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/06/reserveme-esa-mesa-por-favor.html' title='Resérveme esa mesa por favor'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7408218044157387291</id><published>2010-05-30T20:03:00.000+02:00</published><updated>2010-05-30T20:03:45.263+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='Crosscutting'/><title type='text'>AOP: crosscutting (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;A lo largo de las entradas anteriores hemos analizado el modelo de &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; de &lt;i&gt;&lt;b&gt;AspectJ &lt;/b&gt;&lt;/i&gt;y la manera de definir las reglas que permitan seleccionar aquellos &lt;i&gt;&lt;b&gt;joint points&lt;/b&gt;&lt;/i&gt; de nuestro interés.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Durante esta entrada analizaremos el modo en el que se puede alterar el comportamiento de un sistema en los &lt;i&gt;&lt;b&gt;joint points&lt;/b&gt;&lt;/i&gt; seleccionados mediante la definición de los pointcuts.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Descripción general&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Las reglas de tejido están compuestas de dos partes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;advice&lt;/i&gt;&lt;/b&gt;: qué deseamos hacer.&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;pointcuts&lt;/i&gt;&lt;/b&gt;: dónde aplicamos el advice anterior.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;AspectJ &lt;/i&gt;&lt;/b&gt;soporta el crosscutting dinámico mediante el concepto de &lt;b&gt;&lt;i&gt;advices&lt;/i&gt;&lt;/b&gt;, construcciones similares a los métodos gracias a los cuales se permiten definir las acciones a ejecutar en los &lt;i&gt;&lt;b&gt;joint points&lt;/b&gt;&lt;/i&gt; seleccionados por un &lt;i&gt;&lt;b&gt;pointcut&lt;/b&gt;&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Categorías de advices&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Dependiendo de las funcionalidades que se estén implementando será necesario llevar a cabo la lógica en un determinado lugar del flujo de ejecución original; así por ejemplo, si se está construyendo la seguridad de un sistema, el código tendrá que verificar dicha seguridad antes de la ejecución del &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt;. En un sistema de cachés, la nueva funcionalidad tendría que ejecutarse alrededor del joint point original, intentando recuperar el valor de la caché, y en caso de que no exista, ejecutar el código real y añadirlo a la misma para futuras invocaciones. &lt;b&gt;&lt;i&gt;AspectJ&lt;/i&gt;&lt;/b&gt; ofrece tres categorías de advices que satisfacen los escenarios anteriores (y alguno más):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Before Advice&lt;/b&gt;&lt;/i&gt;: se ejecutan anteriormente a la ejecución del &lt;b&gt;&lt;i&gt;joint point&lt;/i&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;After Advice&lt;/b&gt;&lt;/i&gt;: se ejecutan posteriormente a la ejecución del &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt;. Existen tres variantes diferentes&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;i&gt;After finally&lt;/i&gt;&lt;/b&gt;: se ejecuta tras la ejecución del join point independientemente del resultado de la misma.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;After returning&lt;/b&gt;&lt;/i&gt;: se ejecuta tras la ejecución del &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; siempre y cuando ésta última haya finalizado correctamente, es decir, sin lanzar ninguna excepción.&lt;/li&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;After throwing&lt;/b&gt;&lt;/i&gt;: se ejecuta tras la ejecución fallida de un &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt;, es decir, después de que dicho &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; dispare una excepción.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;Around Advice&lt;/b&gt;&lt;/i&gt;: rodean la ejecución del &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sintaxis de los advices&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Aunque la sintaxis varía ligeramente dependiendo del tipo de advice que se esté escribiendo, se podría dividir su estructura general en tres partes claramente diferenciadas:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Declaración del advice&lt;/b&gt;. En esta parte de la declaración se especifica el momento de ejecución del &lt;b&gt;&lt;i&gt;advice&lt;/i&gt;&lt;/b&gt;, es decir, si se ejecutará antes, después o alrededor de los &lt;i&gt;&lt;b&gt;joint points&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Definición de los &lt;i&gt;pointcuts&lt;/i&gt;&lt;/b&gt;. Se especifican los &lt;i&gt;&lt;b&gt;pointcuts &lt;/b&gt;&lt;/i&gt;sobre los que se desea actuar.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Cuerpo del &lt;i&gt;advice&lt;/i&gt;&lt;/b&gt;. Definición del código a ejecutar una vez se haya alcanzado el &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; indicado.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Veamos, por partes, un ejemplo sencillo de definición de un advice:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;En primer lugar se define un sencillo pointcut :&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;pointcut secureOperation(User user):&amp;nbsp;call( * User.*(..)) &amp;amp;&amp;amp; target(user)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En el pointcut anterior estamos capturando todas las llamadas a cualquier método de la clase User, y, adicionalmente estamos recogiendo el objeto que actúa como target de la llamada.&amp;nbsp;A continuación veremos un around advice para ilustrar la sintaxis:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object around(User user):secureOperation(user){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;            &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Syst&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;em.out.println("Securing operation on user "&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;                                  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;+ user.toString());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object retValue = proceed(user);&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;          &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;System.out.println("Finished secured operation on user "&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;+ user.toString());&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;return retValue;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En la definición anterior se puede ver la estructura de la declaración de un &lt;i&gt;&lt;b&gt;advice &lt;/b&gt;&lt;/i&gt;descrita anteriormente:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;La parte que precede a los dos puntos indica el momento de ejecución del &lt;b&gt;&lt;i&gt;advice &lt;/i&gt;&lt;/b&gt;(&lt;i&gt;&lt;b&gt;after,before,around&lt;/b&gt;&lt;/i&gt;). En este caso, se ejecutará alrededor del joint point seleccionado.&lt;/li&gt;&lt;li&gt;La parte que sigue a los dos puntos representa el &lt;b&gt;&lt;i&gt;pointcut&lt;/i&gt;&lt;/b&gt;, es decir, la definición de los criterios que determinan cuándo se ejecutará el &lt;i&gt;&lt;b&gt;advice&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;La última parte representa el cuerpo del &lt;i&gt;&lt;b&gt;advice&lt;/b&gt;&lt;/i&gt;, es decir, el código que se ejecutará cuando alguno de los &lt;b&gt;&lt;i&gt;joint point&lt;/i&gt;&lt;/b&gt; definidos por el &lt;b&gt;pointcut &lt;/b&gt;sea alcanzado.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Advices y métodos&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Al igual que los métodos de una clase, los &lt;b&gt;&lt;i&gt;advices&lt;/i&gt;&lt;/b&gt; se utilizan para definir comportamiento. La sintaxis de éstos últimos es similar a la de los métodos aunque existen algunas diferencias dado que los &lt;i&gt;&lt;b&gt;advices&lt;/b&gt;&lt;/i&gt; son aplicados de manera automática, sin la necesidad de realizar explícitamente la invocación del mismo.&lt;br /&gt;&lt;br /&gt;A continuación se analizan las similitudes entre ambos en tres categorías diferentes: declaración, cuerpo y comportamiento.&amp;nbsp;La declaración de un &lt;b&gt;&lt;i&gt;advice&lt;/i&gt;&lt;/b&gt; es similar a la signatura de un método tradicional en que:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Opcionalmente puede asignarse un nombre al advice mediante el uso de la anotación @AdviceName.&lt;/li&gt;&lt;li&gt;Recibe argumentos a través del contexto del &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt;, que posteriormente podrán ser utilizados en el cuerpo para implementar la lógica necesaria.&lt;/li&gt;&lt;li&gt;Puede declarar el lanzamiento de una excepción.&lt;/li&gt;&lt;li&gt;El cuerpo de los &lt;b&gt;&lt;i&gt;advices &lt;/i&gt;&lt;/b&gt;también es muy parecido al de los métodos puesto que:&lt;/li&gt;&lt;li&gt;El código del cuerpo del &lt;b&gt;&lt;i&gt;advice &lt;/i&gt;&lt;/b&gt;sigue las mismas reglas de acceso a miembros de otros tipos y/o aspectos.&lt;/li&gt;&lt;li&gt;Se puede referenciar a la propia instancia del aspecto mediante el uso de this.&lt;/li&gt;&lt;li&gt;Los &lt;i&gt;&lt;b&gt;advices &lt;/b&gt;&lt;/i&gt;de tipo &lt;b&gt;&lt;i&gt;around &lt;/i&gt;&lt;/b&gt;pueden retornar un valor.&lt;/li&gt;&lt;li&gt;Los &lt;i&gt;&lt;b&gt;advices &lt;/b&gt;&lt;/i&gt;deben declarar las excepciones que sean checked que la implementación podría disparar.&lt;/li&gt;&lt;li&gt;En la categoría relativa al comportamiento, los &lt;i&gt;&lt;b&gt;advices &lt;/b&gt;&lt;/i&gt;:&lt;/li&gt;&lt;li&gt;No pueden declarar el disparo de una excepción que no está declarada en TODOS los &lt;i&gt;&lt;b&gt;joint points&lt;/b&gt;&lt;/i&gt; sobre los que actúa.&lt;/li&gt;&lt;li&gt;Pueden omitir algunas de las excepciones de tipo checked que han sido declaradas por alguno de los &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; sobre los que actúa.&lt;/li&gt;&lt;li&gt;Pueden declarar el disparo de excepciones más específicas (de tipo checked) que las definidas por los &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; sobre los que está actuando.&lt;/li&gt;&lt;li&gt;Pueden lanzar cualquier tipo de excepción de tipo runtime.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En comparación con los métodos, los advices presentan las siguientes diferencias:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La declaración de un nombre es opcional.&lt;/li&gt;&lt;li&gt;No pueden ser invocados directamente.&lt;/li&gt;&lt;li&gt;No presentan especificadores de acceso (relacionado con la característica de que no pueden ser invocados directamente).&lt;/li&gt;&lt;li&gt;No presentan un tipo de retorno en los advices de tipo &lt;i&gt;&lt;b&gt;before &lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;y&lt;/span&gt;&lt;/span&gt; after&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Tienen acceso a unas cuantas variables dentro del propio aspecto: thisJointPoint, thisJointPointStaticPart, thisEnclosingJointPointStaticPart.&lt;/li&gt;&lt;li&gt;Se puede utilizar la palabra reservada &lt;b&gt;&lt;i&gt;proceed &lt;/i&gt;&lt;/b&gt;en los &lt;b&gt;&lt;i&gt;advices &lt;/i&gt;&lt;/b&gt;de tipo &lt;i&gt;&lt;b&gt;around &lt;/b&gt;&lt;/i&gt;para ejecutar el &lt;i&gt;&lt;b&gt;joint point&lt;/b&gt;&lt;/i&gt; sobre el cual se está realizando el &lt;i&gt;&lt;b&gt;advice&lt;/b&gt;&lt;/i&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;La siguiente entrada realizará un análisis más detallado de los &lt;i&gt;&lt;b&gt;advices &lt;/b&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;y cómo se puede acceder a los contextos del &lt;/span&gt;&lt;b&gt;joint point.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;Hasta pronto!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7408218044157387291?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7408218044157387291/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7408218044157387291' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7408218044157387291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7408218044157387291'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/aop-crosscutting-i.html' title='AOP: crosscutting (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7151897334736877888</id><published>2010-05-21T06:33:00.000+02:00</published><updated>2010-05-21T06:33:42.266+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MMOG'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtual Reallity'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>MMOG Architectures</title><content type='html'>&lt;div style="text-align: justify;"&gt;El poco tiempo libre que tengo no me permite realizar una actualización mínimamente interesante; así que os vais a tener que conformar con ésto; lo siento!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Es una pequeña presentación que sirve como introducción a las principales arquitecturas software subyacentes en los populares MMOG.&lt;/div&gt;&lt;div align="center" style="text-align: justify;"&gt;&lt;div align="center" id="__ss_4182304" style="width: 425px;"&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a href="http://www.slideshare.net/miguelinlas3/arquitecturas-mmog" title="Arquitecturas MMOG"&gt;Arquitecturas MMOG&lt;/a&gt;&lt;/strong&gt;&lt;object height="355" id="__sse4182304" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mmog-slides-100520174431-phpapp01&amp;stripped_title=arquitecturas-mmog" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4182304" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mmog-slides-100520174431-phpapp01&amp;stripped_title=arquitecturas-mmog" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;div style="padding: 5px 0 12px;"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/miguelinlas3"&gt;Miguel Pastor&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PD: por fin esta semana ha llegado la hora; nos toca comer en el Diverxo!! bien !!!!! Prometo un post con la crítica!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7151897334736877888?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7151897334736877888/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7151897334736877888' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7151897334736877888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7151897334736877888'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/mmog-architectures.html' title='MMOG Architectures'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6148658229939485616</id><published>2010-05-12T00:21:00.001+02:00</published><updated>2010-05-12T00:22:32.800+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Desilusion'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Luces y sombras</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace medio año que decidí a Madrid y me parece un buen momento para hacer un pequeño balance de como han trasncurrido las cosas hasta este momento.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el terreno personal las cosas marchan genial; sobre todo con la gordita, mucho más ahora que nos estamos comprando un piso (eso dará lugar para otra serie de entradas :) ). Intentamos aprovechar el poco tiempo que tenemos libre para divertirnos, viajar, conocer nuevos restaurantes :), y retomar el contacto con gente a lo que no veíamos con demasiada frecuencia.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Otra de las cosas buenas que me ha pasado tras mi regreso a Madrid ha sido mi admisión en los estudios de doctorado de la politécnica de Madrid. Me está suponiendo un gran esfuerzo (pocas horas de sueño y mucho trabajo, quizás demasiado) pero la verdad que, al menos hasta este momento, la experiencia está siendo gratificante; las clases son interesantes además de que estoy conociendo a gente que presenta mis mismos intereses. Puede que dentro de poco tiempo tenga alguna novedad respecto a este tema pero tampoco quiero adelantarme a los acontecimientos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Sin embargo estar en Madrid también tiene sus cosas "&lt;i&gt;malas&lt;/i&gt;", principalmente porque estás mucho más lejos de la gente con la que has vivido muchos años de tu vida y a la que quieres: tu familia &amp;nbsp;y &amp;nbsp;amigos. Esta entrada quedaría imcompleta si no me acordase de mis padres y mi hermana o de Fer,Rube, Andre,Vicio,Yudi,Miguel,&amp;nbsp;&lt;a href="http://cezonillo.blogspot.com/"&gt;el Mono&lt;/a&gt;, Héctor, Marta,. . . (lo sé, lo sé, me estoy dejando a gente en la lista ).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Visto así, podría parecer que todo está genial, pero&amp;nbsp;&lt;i&gt;la otra&lt;/i&gt; pieza del puzzle, que, por desgracia, también es una parte importante de nuestras vidas, no termina de encajar. Si, es lo que todos estamos pensando, el maldito trabajo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Siempre he dicho que me gusta a lo que me dedico, pero la verdad que cada día que pasa me voy desilusionando (o quizás siendo realista) un poquito más. Regresé a Madrid con la idea de intentar seguir creciendo profesionalmente pero, hasta el momento, lo único que estoy haciendo es ir hacia atrás. Falsas promesas, mentiras, . . . se están convirtiendo en tónica habitual. Prefiero no seguir porque me enciendo y me tengo que ir a la cama :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Y entonces? Pues lo único que tengo claro es que estoy firmemente convencido de darle un giro de 180º a mi carrera y dedicarme a algo completamente diferente. Os mantendré informados :).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Estoy un poco espeso así que voy a dejarlo aquí.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Keep walking :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PD: A partir de ahora comenzaré a escribir el inglés porque necesito practicar. Os agradecería, a los pocos que frecuentais este blog, todo tipo de correcciones&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6148658229939485616?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6148658229939485616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6148658229939485616' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6148658229939485616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6148658229939485616'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/luces-y-sombras.html' title='Luces y sombras'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4322859827435910075</id><published>2010-05-07T06:56:00.002+02:00</published><updated>2010-05-07T07:00:57.008+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Scratch'/><category scheme='http://www.blogger.com/atom/ns#' term='Sexy  Sadie'/><category scheme='http://www.blogger.com/atom/ns#' term='Videos'/><category scheme='http://www.blogger.com/atom/ns#' term='Skin'/><title type='text'>Sexie Sadie: A scratch in my skin</title><content type='html'>No sabría decir cual es el motivo, pero esta es una de mis canciones favoritas (en conjunción con el videoclip :) )&lt;br /&gt;&lt;br /&gt;&lt;div id="video" align="center"&gt;&lt;object width="410" height="310"&gt;&lt;param name="movie" value="http://www.youtube.com/v/vLedvCSJR9w&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/vLedvCSJR9w&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="410" height="310"&gt;&lt;/embed&gt;&lt;/object&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/35092134-4322859827435910075?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4322859827435910075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4322859827435910075' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4322859827435910075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4322859827435910075'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/sexie-sadie-scratch-in-my-skin.html' title='Sexie Sadie: A scratch in my skin'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3737327033102555850</id><published>2010-05-03T23:48:00.000+02:00</published><updated>2010-05-03T23:48:14.958+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Pointcuts'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>AOP: non kinded pointcuts</title><content type='html'>&lt;div style="text-align: justify;"&gt;En la entrada &lt;a href="http://miguelinlas3.blogspot.com/2010/05/aop-kinded-pointcuts.html"&gt;anterior&lt;/a&gt;&amp;nbsp;analizábamos aquellos tipos de pointcuts en los que los&amp;nbsp;&lt;i&gt;joint point&amp;nbsp;&lt;/i&gt;seleccionados encajaban en una determinada categoría (de ahí su nombre).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;El mecanismo implementado mediante &lt;b&gt;non-kinded&amp;nbsp;&lt;/b&gt;&lt;span class="italic"&gt;&lt;b&gt;pointcuts&lt;/b&gt;&lt;/span&gt;&amp;nbsp;permite la selección de&amp;nbsp;&lt;span class="italic"&gt;&lt;i&gt;joint points&lt;/i&gt;&lt;/span&gt;&amp;nbsp;basados en criterios adicionales a las signaturas vistas anteriormente. Por ejemplo, podremos seleccionar todos los&amp;nbsp;&lt;span class="italic"&gt;&lt;i&gt;joint point&lt;/i&gt;&lt;/span&gt;&amp;nbsp;donde el objeto&amp;nbsp;&lt;span class="italic"&gt;&lt;i&gt;this&lt;/i&gt;&lt;/span&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;es de un determinado tipo. Dicho&amp;nbsp;&lt;span class="italic"&gt;&lt;i&gt;joint point&lt;/i&gt;&lt;/span&gt;&amp;nbsp;incluiría las llamadas a métodos, ejecuciones, manejadores de excepciones, etc.&lt;br /&gt;&lt;br /&gt;A continuación, a través de ejemplos, veremos los diferentes tipos de&amp;nbsp;&lt;span class="italic"&gt;&lt;b&gt;non-kinded pointcuts&lt;/b&gt;&lt;/span&gt;&amp;nbsp;ofrecidos por&amp;nbsp;&lt;span class="italic"&gt;&lt;b&gt;AspectJ.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="italic"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;div class="section" style="font-weight: normal;" title="Modelo de Joint Point"&gt;&lt;div class="section" title="Implementación de pointcuts"&gt;&lt;div class="section" title="Non-kinded pointcuts"&gt;&lt;div class="section" title="Non-kinded pointcuts basados en control de flujo"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h6 class="title" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Non-kinded pointcuts basados en control de flujo&lt;/span&gt;&lt;/h6&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" frame="void" id="d0e2227"&gt;&lt;col width="35%"&gt;&lt;/col&gt;&lt;col width="65%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pointcut&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;cflow( execution(* TransactionManager. commit() ))&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;en el flujo de la ejecución de cualquier operación&amp;nbsp;&lt;span class="italic"&gt;commit&lt;/span&gt;&amp;nbsp;de la clase&amp;nbsp;&lt;span class="italic"&gt;TransactionManager&lt;/span&gt;, incluyendo la ejecución del propio método.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;cflowbellow( execution(* TransactionManager. commit() ))&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;en el flujo de la ejecución de cualquier operación&amp;nbsp;&lt;span class="italic"&gt;commit&lt;/span&gt;&amp;nbsp;de la clase&amp;nbsp;&lt;span class="italic"&gt;TransactionManager&lt;/span&gt;, excluyendo la ejecución del método.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;cflow(execution(@Secured * * (..)))&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;en el flujo de la ejecución de cualquier método anotado con la anotación&amp;nbsp;&lt;span class="italic"&gt;Secured&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;cflow(transacted())&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier joint point en el flujo de ejecución de los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;seleccionados por el&amp;nbsp;&lt;span class="italic"&gt;pointcut&lt;/span&gt;&amp;nbsp;&lt;span class="italic"&gt;transacted()&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Non-kinded pointcuts basados en la estructura léxica"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h6 class="title" style="text-align: center;"&gt;&lt;a href="" id="d0e2312" xmlns:saxon="http://icl.com/saxon"&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Non-kinded&amp;nbsp;&lt;/span&gt;&lt;span class="italic"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;pointcuts&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;basados en la estructura léxica&lt;/span&gt;&lt;/h6&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Dentro de este tipo de&amp;nbsp;&lt;span class="italic"&gt;pointcuts&lt;/span&gt;&amp;nbsp;tenemos dos categorías:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;&lt;span class="italic"&gt;&lt;i&gt;within(TypeSingnature)&lt;/i&gt;&lt;/span&gt;: selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;que aparece en el cuerpo de las clases y aspectos que concuerden con el tipo especificado.&lt;/li&gt;&lt;li class="listitem"&gt;&lt;span class="italic"&gt;&lt;i&gt;withincode(ConstructorSignature)&lt;/i&gt;&lt;/span&gt;&lt;i&gt;,&lt;/i&gt;&lt;span class="italic"&gt;&lt;i&gt;withincode(MethodSignature)&lt;/i&gt;&lt;/span&gt;: selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;que aparezca dentro de un método o un constructor, incluyendo la definición de cualquier clase local que pudiera aparecer en los mismos.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" frame="void" id="d0e2345"&gt;&lt;col width="35%"&gt;&lt;/col&gt;&lt;col width="65%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pointcut&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;within(User)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;que aparecen dentro de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;within(User+)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;que aparecen dentro de la clase user y cualquiera de sus clases derivadas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;within(@Transactional *)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;que aparecen dentro de cualquier clase que se encuentre marcada con la notación&amp;nbsp;&lt;span class="italic"&gt;Transactional&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;withincode(* TransactionManager. retrieve*(..))&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona todos los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;que parecen dentro de cualquier método de la clase&amp;nbsp;&lt;span class="italic"&gt;TransactionManager&lt;/span&gt;&amp;nbsp;cuyo nombre comience por&amp;nbsp;&lt;span class="italic"&gt;retrieve&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Non-kinded pointcuts de ejecución"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h6 class="title" style="text-align: center;"&gt;&lt;a href="" id="d0e2420" xmlns:saxon="http://icl.com/saxon"&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Non-kinded&amp;nbsp;&lt;/span&gt;&lt;span class="italic"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;pointcuts&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;de ejecución&lt;/span&gt;&lt;/h6&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Este tipo de&amp;nbsp;&lt;span class="italic"&gt;pointcuts&lt;/span&gt;&amp;nbsp;permite seleccionar&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;en base al tipo de los objetos en tiempo de ejecución. De este modo se dispone de:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;&lt;span class="italic"&gt;this()&lt;/span&gt;. Acepta dos formas diferentes:&amp;nbsp;&lt;span class="italic"&gt;this(ObjectIdentifier)&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span class="italic"&gt;this(Type)&lt;/span&gt;. Seleccionará aquellos&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;cuyo objeto this sea del tipo (o el objeto) indicado.&lt;/li&gt;&lt;li class="listitem"&gt;&lt;span class="italic"&gt;target()&lt;/span&gt;. Similar al concepto anterior, aunque en este caso, se utilizar el&amp;nbsp;&lt;span class="italic"&gt;target&lt;/span&gt;&amp;nbsp;del&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;en lugar del&amp;nbsp;&lt;span class="italic"&gt;this&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" frame="void" id="d0e2465"&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="80%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pointcut&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;this(User)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;en que la expresión&amp;nbsp;&lt;span class="italic"&gt;this instanceof User&lt;/span&gt;&amp;nbsp;sea cierta. Así por ejemplo, seleccionará las llamadas a métodos o accesos a campos donde el objeto actual sea de tipo&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;o cualquier de sus subclases.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;target(User)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;en el que el objeto sobre el que se realiza la llamada al método es&amp;nbsp;&lt;span class="italic"&gt;instanceof User&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Non-kinded pointcuts sobre argumentos"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h6 class="title" style="text-align: center;"&gt;&lt;a href="" id="d0e2515" xmlns:saxon="http://icl.com/saxon"&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Non-kinded&amp;nbsp;&lt;/span&gt;&lt;span class="italic"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;pointcuts&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&amp;nbsp;sobre argumentos&lt;/span&gt;&lt;/h6&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Este tipo de&amp;nbsp;&lt;span class="italic"&gt;pointcuts&lt;/span&gt;&amp;nbsp;permite seleccionar&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;en base al tipo de los argumentos en tiempo de ejecución. Veamos los distintos tipos de argumentos, en función del tipo del&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;En el caso de los&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;manejadores de excepciones el argumento será la excepción manejada.&lt;/li&gt;&lt;li class="listitem"&gt;En los métodos y constructores, los argumentos serán los argumentos del método y constructor.&lt;/li&gt;&lt;li class="listitem"&gt;En los accesos de modificación de un campo, el argumento será el nuevo valor que va a tomar dicho campo.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;br /&gt;&lt;table border="1" frame="void" id="d0e2547"&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="80%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pointcut&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;args(User, . . , String)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;de tipo método o constructor en el que el primer argumento es de tipo&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;(o cualquiera de sus subclases), y el último argumento es de tipo&amp;nbsp;&lt;span class="italic"&gt;String&lt;/span&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;args (SqlException)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;con un único argumento de tipo&amp;nbsp;&lt;span class="italic"&gt;SqlException&lt;/span&gt;. Seleccionaría cualquier método o constructor que esperase un único argumento de tipo&amp;nbsp;&lt;span class="italic"&gt;SqlException&lt;/span&gt;, un acceso de escritura a un campo estableciendo un nuevo valor de tipo&amp;nbsp;&lt;span class="italic"&gt;SqlException&lt;/span&gt;, y también seleccionaría un manejador de excepciones de tipo&amp;nbsp;&lt;span class="italic"&gt;SqlException&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Non-kinded pointcuts condicionales"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h6 class="title" style="text-align: center;"&gt;&lt;a href="" id="d0e2607" xmlns:saxon="http://icl.com/saxon"&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Non-kinded pointcuts condicionales&lt;/span&gt;&lt;/h6&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;Este tipo de&amp;nbsp;&lt;span class="italic"&gt;pointcuts&lt;/span&gt;&amp;nbsp;permiten seleccionar&amp;nbsp;&lt;span class="italic"&gt;joint points&lt;/span&gt;&amp;nbsp;basados en una expresión condicional.&lt;br /&gt;&lt;br /&gt;&lt;table border="1" frame="void" id="d0e2620"&gt;&lt;caption&gt;&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="80%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Pointcut&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;if(debug)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Selecciona cualquier&amp;nbsp;&lt;span class="italic"&gt;joint point&lt;/span&gt;&amp;nbsp;donde el campo estático&amp;nbsp;&lt;span class="italic"&gt;debug&lt;/span&gt;&amp;nbsp;(en la definición del aspecto) toma el valor cierto&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="section" style="text-align: justify;" title="Non-kinded pointcuts condicionales"&gt;Poco a poco vamos completando, de manera sencilla, una idea general de los mecanismos que nos ofrece la orientación a aspectos en general, y &lt;b&gt;AspectJ&lt;/b&gt; en particular. En la siguiente entrada analizaremos los conceptos de crosscutting dinámico y los mecanismos disponibles para la modificación del comportamiento de un programa en un determinado &lt;i&gt;joint point&lt;/i&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" style="font-weight: normal;" title="Crosscutting dinámico"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3737327033102555850?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3737327033102555850/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3737327033102555850' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3737327033102555850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3737327033102555850'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/aop-non-kinded-pointcuts.html' title='AOP: non kinded pointcuts'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2403490484259746186</id><published>2010-05-02T13:26:00.000+02:00</published><updated>2010-05-02T13:26:03.568+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Pointcuts'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>AOP: kinded pointcuts</title><content type='html'>&lt;div style="text-align: justify;"&gt;Continuando la serie de posts relativos a la programación orientada a aspectos y, concretamente, el lenguaje AspectJ, durante esta entrada analizaremos la implementación que este último hace de los pointcuts.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;AspectJ&lt;/i&gt; ofrece dos mecanismos diferentes que permiten a los pointcuts realizar la selección de los joint points:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Kinded pointcuts&lt;/b&gt;. En este caso, los pointcuts seleccionan categorías de joint points (de ahí su nombre). Así, por ejemplo, se ofrece la posibilidad de realizar matching sobre la ejecución de un método.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Non-kinded pointcuts&lt;/b&gt;. Se seleccionan los joint point en base a la información de la que disponen, como los tipos en tiempo de ejecución o su contexto. En esta situación se seleccionan joint points de cualquier clase, siempre y cuando satisfagan la condición descrita.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;A continuación analizaremos los kinded pointcuts y dejaremos para la siguiente entrada la segunda categoría.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Kinded Pointcuts&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;table border="1" frame="void" id="d0e2064"&gt;&lt;caption&gt;&lt;span class="italic"&gt;Joint Points&lt;/span&gt; expuestos y tipos        de &lt;span class="italic"&gt;pointcuts&lt;/span&gt;&lt;/caption&gt;&lt;thead&gt;&lt;tr&gt;         &lt;th&gt;Categoría de Joint Point&lt;/th&gt;         &lt;th&gt;Sintaxis del pointcut&lt;/th&gt;        &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;         &lt;td&gt;Ejecución de un método&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;execution(MethodSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Llamada a un método&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;call(MethodSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Ejecución de un constructor&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;execution(ConstructorSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Llamada a un constructor&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;call(ConstructorSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Inicialización de una clase&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;staticinitializaction(TypeSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Acceso de lectura a un campo&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;get(FieldSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Acceso de escritura a un campo&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;set(FieldSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Ejecución de un manejador de excepciones&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;handler(TypeSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Inicialización de un objeto&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;initialization(ConstructorSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Pre-inicialización de un objeto&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;preinitialization(ConstructorSignature)&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Ejecución de un &lt;span class="italic"&gt;advice&lt;/span&gt;&lt;/td&gt;         &lt;td&gt;&lt;span class="italic"&gt;adviceexecution()&lt;/span&gt;&lt;/td&gt;        &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Por ejemplo, si deseamos seleccionar todas las llamadas a los métodos&amp;nbsp;públicos &lt;span class="italic"&gt;&lt;i&gt;commit()&lt;/i&gt;&lt;/span&gt; de la clase &lt;span class="italic"&gt;&lt;i&gt;TransactionManager&lt;/i&gt;&lt;/span&gt;, escribiríamos un pointcut&amp;nbsp;similar al siguiente:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span class="italic"&gt;&lt;i&gt;call(public void TransactionManager.commit(..))&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;En la siguiente entrada analizaremos en detalle la segunda categoría de &lt;i&gt;pointcuts&lt;/i&gt; ofrecida por &lt;i&gt;AspectJ&lt;/i&gt;&lt;/span&gt;&lt;/b&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/35092134-2403490484259746186?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2403490484259746186/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2403490484259746186' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2403490484259746186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2403490484259746186'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/05/aop-kinded-pointcuts.html' title='AOP: kinded pointcuts'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4314061961029496737</id><published>2010-04-18T11:05:00.001+02:00</published><updated>2010-04-18T11:07:22.371+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>Some signatures examples</title><content type='html'>&lt;div style="text-align: justify;"&gt;En la última entrada dedicada a AOP (podeis verla &lt;a href="http://miguelinlas3.blogspot.com/2010/03/aop-pointcuts-definition.html"&gt;aquí&lt;/a&gt; ) analizamos de manera teórica las características básicas del lenguaje de definición de pointcuts. A continuación realizaremos una serie de ejemplos que intentarán clarificar los conceptos teóricos vistos en anteriores entradas.&lt;br /&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Signaturas de tipos&lt;/li&gt;&lt;/ul&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" id="d0e1300"&gt;&lt;caption&gt;Table&amp;nbsp;1.2.&amp;nbsp;Ejemplos de signaturas de tipos&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de tipos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;AstVisitor&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;AstVisitor&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Sólo el tipo AstVisitor concuerda (ni tipos base ni derivados)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;*AstVisitor&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo cuyo nombre termine en&amp;nbsp;&lt;span class="italic"&gt;AstVisitor&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Por ejemplo,&amp;nbsp;&lt;span class="italic"&gt;HighlightingAstVisitor&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span class="italic"&gt;SemanticAstVisitor&lt;/span&gt;&amp;nbsp;concuerdan con el patrón&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;java.*.Date&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;Date&lt;/span&gt;&amp;nbsp;en cualquier subpaquete directo del paquete java&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;java.util.Date&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span class="italic"&gt;java.sql.Date&lt;/span&gt;&amp;nbsp;son ejemplos de tipos concordantes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;javax..*&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo en el paquete&amp;nbsp;&lt;span class="italic"&gt;javax&lt;/span&gt;&amp;nbsp;y en sus subpaquetes (tanto directos como indirectos)&lt;/td&gt;&lt;td&gt;Cualquier tipo en el paquete&amp;nbsp;&lt;span class="italic"&gt;javax.security&lt;/span&gt;&amp;nbsp;así como cualquiera de sus subpaquetes indirectos como&amp;nbsp;&lt;span class="italic"&gt;javax.security.auth.login&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;javax..*Model&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Todos los tipos en el paquete&amp;nbsp;&lt;span class="italic"&gt;javax&lt;/span&gt;&amp;nbsp;(subpaquetes directos e indirectos) cuyo nombre termine en&amp;nbsp;&lt;span class="italic"&gt;Model&lt;/span&gt;, y todos los subtipos de estos.&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;TableModel&lt;/span&gt;,&amp;nbsp;&lt;span class="italic"&gt;TreeModel&lt;/span&gt;&amp;nbsp;y sus subtipos como&amp;nbsp;&lt;span class="italic"&gt;DefaultTreeModel&lt;/span&gt;&amp;nbsp;o&lt;span class="italic"&gt;DefaultTableModel&lt;/span&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Signaturas de tipos: anotaciones&lt;/li&gt;&lt;/ul&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" frame="void" id="d0e1429"&gt;&lt;caption&gt;Table&amp;nbsp;1.3.&amp;nbsp;Ejemplos de signaturas de tipos:&amp;nbsp;&lt;span class="italic"&gt;&lt;span class="bold"&gt;&lt;strong&gt;anotaciones&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de tipos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;@Secured User&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;anotado con la anotación&amp;nbsp;&lt;span class="italic"&gt;Secured&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;@Secured class User&lt;/span&gt;{. . .}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;@Entity *&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo anotado con la anotación&amp;nbsp;&lt;span class="italic"&gt;Entity&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;@Entity class Section&amp;nbsp;&lt;/span&gt;{. . .},&lt;span class="italic"&gt;@Entity class Report&lt;/span&gt;&amp;nbsp;{. . .}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;@Transactional* Manager+&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;Manager&lt;/span&gt;&amp;nbsp;y cualquiera de sus clases derivadas que estén anotados con una anotación cuyo nombre comience por&amp;nbsp;&lt;span class="italic"&gt;Transactional&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;@TransactionalDefault class Manager&lt;/span&gt;{},&lt;span class="italic"&gt;@TransactionalOracle class OracleManager extends Manager&lt;/span&gt;{}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="section" title="Signaturas de tipos: generics"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Signaturas de tipos:&amp;nbsp;&lt;span class="italic"&gt;generics&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" frame="void" id="d0e1517"&gt;&lt;caption&gt;Table&amp;nbsp;1.4.&amp;nbsp;Ejemplos de signaturas de tipos:&amp;nbsp;&lt;span class="italic"&gt;&lt;span class="bold"&gt;&lt;strong&gt;generics&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de tipos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;Map &lt;integer,string&gt;&lt;/integer,string&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;Map&lt;/span&gt;&amp;nbsp;cuyo primer argumento genérico está fijado a&amp;nbsp;&lt;span class="italic"&gt;Integer&lt;/span&gt;&amp;nbsp;y el segundo a&lt;span class="italic"&gt;String&lt;/span&gt;&lt;/td&gt;&lt;td&gt;En este caso únicamente concordará el tipo&amp;nbsp;&lt;span class="italic"&gt;Map&lt;integer,string&gt;&lt;/integer,string&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;*&lt;user&gt;&lt;/user&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo genérico cuyo único argumento genérico sea de tipo&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;Collection&lt;user&gt;&lt;/user&gt;&lt;/span&gt;,&lt;span class="italic"&gt;List&lt;user&gt;&lt;/user&gt;&lt;/span&gt;, . . .&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;Collection&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;/span&gt;&amp;nbsp;con un parámetro de tipo&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;o derivado&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;Collection&lt;user&gt;&lt;/user&gt;&lt;/span&gt;,&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;domainuser&gt;&lt;/domainuser&gt;&lt;/span&gt;, . . .&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;Collection&lt;/span&gt;&lt;/td&gt;&lt;td&gt;El tipo&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;/span&gt;, cuyo parámetro será uno de los tipos base de&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;Collection&lt;serializable&gt;&lt;/serializable&gt;&lt;/span&gt;,&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;baseuser&gt;&lt;/baseuser&gt;&lt;/span&gt;, asumiendo que,&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;extiende o implementa, directa o indirectamente,&amp;nbsp;&lt;span class="italic"&gt;Serializable&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span class="italic"&gt;BaseUser&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Combinando pointcuts: operadores"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Combinando pointcuts: operadores&lt;/li&gt;&lt;/ul&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" frame="void" id="d0e1638"&gt;&lt;caption&gt;Table&amp;nbsp;1.5.&amp;nbsp;Signaturas de tipo: operadores&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de tipos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;!Collection&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo excepto&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;User&lt;/span&gt;,&lt;span class="italic"&gt;Model&lt;/span&gt;,&amp;nbsp;&lt;span class="italic"&gt;List&lt;/span&gt;&amp;nbsp;(aunque sea subclase de&amp;nbsp;&lt;span class="italic"&gt;Collection&lt;/span&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;Set || Map&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Los tipos&amp;nbsp;&lt;span class="italic"&gt;Set&lt;/span&gt;&amp;nbsp;o&amp;nbsp;&lt;span class="italic"&gt;Map&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Los tipos&amp;nbsp;&lt;span class="italic"&gt;Set&lt;/span&gt;&amp;nbsp;y&amp;nbsp;&lt;span class="italic"&gt;Map&lt;/span&gt;&amp;nbsp;únicamente&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;!@Transactional&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo que se encuentre anotado por la anotación&amp;nbsp;&lt;span class="italic"&gt;Transactional&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;class NonTransactionalManager&lt;/span&gt;{}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;@Serializable @Encrypted *&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo que se encuentre anotado por las dos anotaciones&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;@Serializable @Encrypted class UserCredentials&lt;/span&gt;{}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;(@Serializable || @Encrypted) *&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier tipo que esté anotado por alguna de las dos anotaciones&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;@Serializable class User&amp;nbsp;&lt;/span&gt;{}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="section" title="Signaturas de métodos y constructores"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Signaturas de métodos y constructores&lt;/li&gt;&lt;/ul&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" frame="void" id="d0e1755"&gt;&lt;caption&gt;Table&amp;nbsp;1.6.&amp;nbsp;Signaturas de métodos&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de métodos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;public void User.set*(*)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier método público de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;cuyo nombre comience por&amp;nbsp;&lt;span class="italic"&gt;set&lt;/span&gt;, cuyo tipo de retorno sea&amp;nbsp;&lt;span class="italic"&gt;void&lt;/span&gt;, y que espere un único argumento&lt;/td&gt;&lt;td&gt;class User{ public void setName(String name){} }&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;public void User.*()&lt;/td&gt;&lt;td&gt;Cualquier método público de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;cuyo tipo de retorno sea&amp;nbsp;&lt;span class="italic"&gt;void&lt;/span&gt;&amp;nbsp;y que no espere argumentos&lt;/td&gt;&lt;td&gt;class User { public void updateInfo(){}}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;public * User.*()&lt;/td&gt;&lt;td&gt;Cualquier método público de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;que no espera argumentos y retorna cualquier tipo&lt;/td&gt;&lt;td&gt;class User{ public UserInfo getUserInfo(){}}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;public * User.*(..)&lt;/td&gt;&lt;td&gt;Cualquier método público de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;que retorna cualquier tipo, y espera cualquier número y tipo de argumentos (incluido cero)&lt;/td&gt;&lt;td&gt;class User{ public UserInfo getUserInfo(){},public Date updatesBetween(Date first,Date last){}}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;* *.*(..) o * * (..)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier método independientemente de su tipo, del tipo de retorno, de su nombre y de los argumentos que espere&lt;/td&gt;&lt;td&gt;Cualquier método del sistema&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;!public * User.*(..)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier método que no sea público (privado,protegido o paquete)&lt;/td&gt;&lt;td&gt;class User {protected getUserInfo(){}}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;* * (..) throws Recognition Exception&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier método que declare que puede lanzar una excepción de tipo&lt;span class="italic"&gt;RecognitionException&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;class AntlRBasedParser { public void parser(String file) throws RecognitionException}&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;* User+.*(..)&lt;/td&gt;&lt;td&gt;Cualquier método en la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;y sus subclases&lt;/td&gt;&lt;td&gt;&lt;span class="italic"&gt;class UserDetails extends User&lt;/span&gt;&amp;nbsp;{}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;User UserService.*(..)&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Cualquier método del tipo&amp;nbsp;&lt;span class="italic"&gt;UserService&lt;/span&gt;&amp;nbsp;cuyo tipo de retorno sea&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;. Si alguna de las subclases sobrescribe el tipo de retorno con un subtipo de&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;(mediante el tipo de retorno covariante introducido en Java 5) también será seleccionado.&lt;/td&gt;&lt;td&gt;class UserService{public User retrieveUser(String name){}} class DetailUserService extends UserService{public DetailedUser retrieveUser(String name){}}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;La signatura en el caso de los constructores difiere de la signatura de métodos en los siguientes aspectos:&lt;br /&gt;&lt;div class="itemizedlist"&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li class="listitem"&gt;Los constructores no tienen tipo de retorno por lo que no se permite utilizar el valor de retorno en la especificación de un&amp;nbsp;&lt;span class="italic"&gt;pointcut&lt;/span&gt;&amp;nbsp;de este tipo.&lt;/li&gt;&lt;li class="listitem"&gt;Dado que los nombres de los constructores no pueden ser libres (tienen que utilizar el mismo nombre de la clase), la parte de la signatura destinada al nombre será sustituida con la palabra&amp;nbsp;&lt;span class="italic"&gt;new&lt;/span&gt;.&lt;/li&gt;&lt;li class="listitem"&gt;Por último, puesto que los constructores no pueden ser estáticos, no se podrá utilizar la palabra reservada&amp;nbsp;&lt;span class="italic"&gt;static&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class="itemizedlist" type="disc"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px; font-weight: bold;"&gt;Signaturas de campos&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="section" title="Signaturas de campos"&gt;&lt;div class="titlepage"&gt;&lt;div&gt;&lt;div&gt;&lt;h5 class="title"&gt;&lt;a href="http://www.blogger.com/post-create.g?blogID=35092134" id="d0e1937" xmlns:saxon="http://icl.com/saxon"&gt;&lt;/a&gt;&lt;/h5&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border="1" frame="void" id="d0e1942"&gt;&lt;caption&gt;Table&amp;nbsp;1.7.&amp;nbsp;Signaturas de campos de clase&lt;/caption&gt;&lt;col width="20%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;col width="40%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Patrón de la signatura&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;th&gt;Ejemplos de campos concordantes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span class="italic"&gt;private String User.username&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Campo privado (tanto campo de una instancia como estático) de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&lt;/td&gt;&lt;td&gt;class User { private String username;}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;* User.*&lt;/td&gt;&lt;td&gt;Cualquier campo de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;independiente de sus calificadores, tipo y nombre.&lt;/td&gt;&lt;td&gt;class User{private String username;protected int credits;private UserDetails details;}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;* User+.*&lt;/td&gt;&lt;td&gt;Cualquier campo de la clase&amp;nbsp;&lt;span class="italic"&gt;User&lt;/span&gt;&amp;nbsp;y todas sus subclases, independientemente de sus calificadores, tipo y nombre.&lt;/td&gt;&lt;td&gt;El ejemplo de la fila anterior o&amp;nbsp;&lt;span class="italic"&gt;class SpecificUser extends User {private String address;&lt;/span&gt;}&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-4314061961029496737?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4314061961029496737/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4314061961029496737' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4314061961029496737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4314061961029496737'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/04/some-signatures-examples.html' title='Some signatures examples'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1779245017952713483</id><published>2010-04-10T15:56:00.000+02:00</published><updated>2010-04-10T15:56:49.899+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Error'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Humans'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Disasters'/><title type='text'>Software Disasters</title><content type='html'>De sobra es sabido por todos que algunos desastres históricos han sido ocasionados por errores en el software.&lt;br /&gt;&lt;br /&gt;La siguiente presentación resume alguno de los más conocidos y describe, de manera concreta, dos ejemplos: un fallo de división en un chip de Intel, y un fallo en un sistema de detección de misiles americano.&lt;br /&gt;&lt;br /&gt;&lt;div align="center" style="text-align: center; width: 425px;"&gt;&lt;object align="center" height="355" style="margin: 0px;" width="425"&gt;&lt;param name='movie' value='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacion-software-failures-100410084202-phpapp02&amp;stripped_title=presentacion-software-failures' /&gt;&lt;param name='allowFullScreen' value='true'/&gt;&lt;param name='allowScriptAccess' value='always'/&gt;&lt;embed src='http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentacion-software-failures-100410084202-phpapp02&amp;stripped_title=presentacion-software-failures' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='425' height='355'&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Hasta pronto!&lt;br /&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/35092134-1779245017952713483?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1779245017952713483/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1779245017952713483' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1779245017952713483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1779245017952713483'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/04/software-disasters.html' title='Software Disasters'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2623117859697241991</id><published>2010-03-31T17:25:00.000+02:00</published><updated>2010-03-31T17:25:26.518+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stuttgart'/><category scheme='http://www.blogger.com/atom/ns#' term='Alemania'/><category scheme='http://www.blogger.com/atom/ns#' term='Vacaciones'/><category scheme='http://www.blogger.com/atom/ns#' term='Berlín'/><title type='text'>Cerrado por vacaciones</title><content type='html'>&lt;div style="text-align: justify;"&gt;Últimamente, en la medida que el poco tiempo que tengo me lo permite, había vuelto a postear con una frecuencia que podríamos calificar de "&lt;i&gt;aceptable&lt;/i&gt;" :).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lamentándolo mucho (realmente no, pero queda bien eh?? jejejej) esta misma tarde me marcho de vacaciones a Stuttgart y Berlín hasta la próxima semana por lo que posiblemente no tengais noticias mías hasta finales de la próxima semana.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Migue&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Si todo va bien seguiré actualizando twitter y similares para no perder las buenas costumbres :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2623117859697241991?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2623117859697241991/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2623117859697241991' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2623117859697241991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2623117859697241991'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/cerrado-por-vacaciones.html' title='Cerrado por vacaciones'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7036055380992711076</id><published>2010-03-25T23:16:00.000+01:00</published><updated>2010-03-25T23:16:51.827+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AOP Pointcuts Definition</title><content type='html'>&lt;div style="text-align: justify;"&gt;Durante entregas anteriores hemos analizado los beneficios de la orientación a aspectos, su Hype Cicle, o el modelo de joint point entre otras características. El conjunto formado por el post actual y el siguiente analizarán los conceptos básicos de los &lt;i&gt;pointcuts&lt;/i&gt; junto una serie de sencillos ejemplos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Inicialmente, deberíamos tener claros los siguientes conceptos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Pointcuts anónimos o con nombre:&amp;nbsp;&lt;/b&gt;Se permite la declaración de pointcuts de cualquiera de los dos tipos. Los primeros son similares a las clases anónimas, y por tanto se definen en el lugar en el que se van a utilizar. En el caso de los segundos, podremos referenciarlos desde múltiples lugares, permitiendo de este modo su reutilización.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Operadores&lt;/b&gt;:&amp;nbsp;&lt;i&gt;AspectJ&lt;/i&gt; proporciona el operador unario de negación (!) y dos operadores binarios: &amp;amp;&amp;amp; y ||, gracias a los cuales se permite construir reglas de matching complejas mediante la combinación de pointcuts más sencillos. Tanto la semántica como la precedencia es la misma que en el lenguaje &lt;i&gt;Java&lt;/i&gt;. Así por ejemplo, en el caso del operador binario &amp;amp;&amp;amp;, se seleccionarán aquellos joint points que concuerden con los dos pointcuts que actúan como operando.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;div&gt;Las signaturas son la base de la definición de los pointcuts. El lenguaje debe facilitar una manera sencilla que permita definir criterios de selección sobre los diferentes aspectos transversales que estamos implementando. En el caso de &lt;i&gt;AspectJ&lt;/i&gt;, se utilizan expresiones regulares (wildcards) en combinación con las signaturas. Los siguientes wildcards son soportados:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;*&lt;/b&gt; especifica cualquier número de caracteres, exceptuando el punto (&lt;b&gt;.&lt;/b&gt;). En la signatura de un tipo denota una parte de un tipo o de un paquete. En otros patrones denota una parte del nombre (por ejemplo en métodos o campos).&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;..&lt;/b&gt; determina cualquier número de caracteres, incluyendo en este caso cualquier número de puntos (.). En la signatura de un tipo representa cualquier paquete o subpaquete. En la signatura de un método representa cualquier número de argumentos.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;+&lt;/b&gt; denota cualquier subtipo de un tipo determinado.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Hasta este momento hemos estudiado, de manera resumida, los elementos básicos para la definición de los pointcuts; en la siguiente entrada describiremos, a través de una serie de ejemplos,&amp;nbsp;los diferentes patrones de signaturas ofrecidos por &lt;i&gt;AspectJ&lt;/i&gt; que pueden ser utilizados para seleccionar diferentes &lt;i&gt;joint points&lt;/i&gt;.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&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/35092134-7036055380992711076?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7036055380992711076/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7036055380992711076' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7036055380992711076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7036055380992711076'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/aop-pointcuts-definition.html' title='AOP Pointcuts Definition'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3590864210374840041</id><published>2010-03-16T20:21:00.001+01:00</published><updated>2010-03-16T20:22:46.057+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='R-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>R-Eclipse: some screenshots</title><content type='html'>&lt;div style="text-align: justify;"&gt;En el post&amp;nbsp;&lt;a href="http://miguelinlas3.blogspot.com/2010/03/r-eclipse-10.html"&gt;anterior&lt;/a&gt;&amp;nbsp;comentaba someramente la arquitectura y componentes de &lt;i&gt;R-Eclipse&lt;/i&gt; además de las principales herramientas que he utilizado durante el desarrollo del mismo. En esta entrada os mostraré algunas capturas de pantalla que ilustran el aspecto general del &lt;i&gt;IDE&lt;/i&gt; así como alguna de sus funcionalidades más relevantes.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Inclusión de un nuevo intérprete en el entorno:&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/AddNewRInterpreter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/AddNewRInterpreter.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Primera página en la creación de un proyecto R:&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/NewRProjectWizardPage-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="303" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/NewRProjectWizardPage-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Compleción de código: Intellisense y plantillas&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeCompletionTemplateProposals.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeCompletionTemplateProposals.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Outline view&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeNavigationOutlineView.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeNavigationOutlineView.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Script explorer&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeNavigationScriptExplorer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="179" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorCodeNavigationScriptExplorer.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Editor de código fuente R&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorHighlightingExample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="208" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/REditorHighlightingExample.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ejecuciones de tipo R&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/RLaunchConfiguration-MainTab.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="202" src="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.eclipse.r/trunk/r.doc/manuales/usuario/images/RLaunchConfiguration-MainTab.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las capturas anteriores dan una idea general de las funcionalidades principales del entorno de desarrollo (podéis acceder a más capturas de pantalla en el módulo de documentación disponible en el sistema de control de versiones).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3590864210374840041?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3590864210374840041/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3590864210374840041' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3590864210374840041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3590864210374840041'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/r-eclipse-some-screenshots.html' title='R-Eclipse: some screenshots'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1876577244636887981</id><published>2010-03-15T23:54:00.000+01:00</published><updated>2010-03-15T23:54:10.946+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='R-Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>R-Eclipse 1.0</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace un tiempo comencé a construir un entorno de desarrollo integrado (&lt;i&gt;IDE&lt;/i&gt;) para el lenguaje de programación &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt;, y finalmente he decidido liberar una primera versión. El componente dista mucho de ser perfecto (y completo) pero sinceramente me siento muy orgulloso del trabajo realizado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La herramienta está basada en la arquitectura de plugins de &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;, constando de cinco módulos (plugins/bundles) que a continuación describo de manera muy resumida:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Plugin r.core&lt;/b&gt;: núcleo de la aplicación. Incluye el analizador léxico y sintáctico del lenguaje, infraestructura básica para la construcción y recorrido del AST, indexado, mixin parsers, etc.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Plugin r.completion&lt;/b&gt;: añade a la herramienta la capacidad de realizar la compleción de código.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Plugin r.formatter&lt;/b&gt;: añade a la herramienta la capacidad de ordenación e indentación del código fuente.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Plugin r.launching&lt;/b&gt;: añade a la herramienta la capacidad de ejecución integrada de los programas R.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Plugin r.ui&lt;/b&gt;: contiene la mayor parte de componentes gráficos de la herramienta. Gestión de preferencias de formateo/indexación, editor R, preferencias de compleción de código, resaltado de palabras reservadas, templates, etc&lt;/li&gt;&lt;li&gt;Adicionalmente existe un módulo de documentación que contiene información de diversa índole&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;He utilizado &lt;a href="http://maven.apache.org/"&gt;maven&lt;/a&gt;&amp;nbsp;como herramienta de gestión de dependencias y control del proyecto aunque en este mismo instante está un poco "&lt;i&gt;manga por hombro&lt;/i&gt;" puesto que he estado haciendo varias pruebas para la generación de la &lt;i&gt;feature&lt;/i&gt; final mediante &amp;nbsp;&lt;a href="http://www.eclipse.org/buckminster/"&gt;Buckminster&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Soy consciente de la existencia de varios bugs (y todos los que yo no habré detectado :) ) y de&amp;nbsp;muchas características que podrían añadirse para mejorar la herramienta. A continuación resumo una pequeña lista de defectos/mejoras:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Tal y como indicaba anteriormente, intentaré migrar por completo a Buckminster.&lt;/li&gt;&lt;li&gt;Añadir más pruebas (tanto unitarias como de integración)&lt;/li&gt;&lt;li&gt;Mejorar la compleción de código: ampliar los lugares donde se habilita la compleción del mismo y mejorar algunas de las características ya existentes.&lt;/li&gt;&lt;li&gt;Inclusión de un motor de ejecución remoto, de modo que se permita configurar un intérprete en una máquina diferente que sea capaz de ejecutar nuestros scripts R.&lt;/li&gt;&lt;li&gt;Inclusión de una consola interactiva. En la actualidad la consola simplemente integra los resultados de las ejecuciones de nuestros scripts, pero no permite la interactividad.&lt;/li&gt;&lt;li&gt;Incluir un depurador de código. Puede que sea la más complicada, pero, personalmente, creo que es la características más interesante junto con la ejecución remota descrita en el punto anterior.&lt;/li&gt;&lt;li&gt;Programación visual: diagrama R integrado. Creación de un diagrama que nos permita construir nuestros programas de manera gráfica mediante una paleta de funcionalidades. Estaría basado en Eclipse GMF y puede que entonces también se distribuyera la herramienta como cliente rico (Eclipse RCP)&lt;/li&gt;&lt;li&gt;. . . .&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Se puede obtener acceso al código fuente en modo lectura desde la siguiente URL:&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;&lt;strong&gt;&lt;em&gt;http&lt;/em&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;://reclipse.googlecode.com/svn/trunk/.&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Georgia, 'Times New Roman', serif;"&gt;Si alguien quiere participar le puedo dar acceso al repositorio en modo escritura.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Hasta pronto!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: monospace; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;PD: en la siguiente entrada añadiré unas capturas de pantalla para que se pueda tener una perspectiva general de la herramienta&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-1876577244636887981?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1876577244636887981/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1876577244636887981' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1876577244636887981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1876577244636887981'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/r-eclipse-10.html' title='R-Eclipse 1.0'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2067537760441681138</id><published>2010-03-15T15:06:00.000+01:00</published><updated>2010-03-15T15:06:55.258+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Probando con Marick</title><content type='html'>El pasado sábado tuve la ocasión, y suerte, de asistir al evento&amp;nbsp;&lt;a href="http://www.linkedin.com/osview/canvas?_ch_page_id=1&amp;amp;_ch_panel_id=1&amp;amp;_ch_app_id=7083120&amp;amp;_applicationId=2000&amp;amp;_ownerId=0&amp;amp;appParams={%22go_to%22:%22events/245621%22,%22referrer%22:%22public%22}"&gt;Probando con Marick&lt;/a&gt;&amp;nbsp;y, verdaderamente, &amp;nbsp;resultó muy entretenido.&lt;br /&gt;&lt;br /&gt;En la primera parte del evento, y partiendo de una aplicación que había desarrollado para su &amp;nbsp;mujer, escenificó (mediante alguno de los asistentes que allí nos encontrabamos), un fujo de ejecución de una de las características que ya estaban implementadas, haciendo hincapié en el proceso de testing unitario y hablando acerca de como los mocks resultan de gran ayuda para llevar a cabo este tipo de pruebas. La segunda parte de la charla estuvo más centrada en conversar con él acerca de diferentes enfoques a la hora de llevar a cabo un desarrollo software.&lt;br /&gt;&lt;br /&gt;Trabajo de un modo similar al descrito en su charla desde hace tiempo por lo que no me sorprendió nada de lo que contó; aunque nunca está mal oirlo de boca de uno de los gurús de la materia :).&lt;br /&gt;&lt;br /&gt;Para quienes no lo conozcan, &lt;a href="http://en.wikipedia.org/wiki/Brian_Marick"&gt;Brian Marick&lt;/a&gt;, es uno de los firmantes del &lt;a href="http://agilemanifesto.org/"&gt;Agile Manifesto&lt;/a&gt;&amp;nbsp;y &amp;nbsp;un miembro activo de la comunidad ágil internacional.&lt;br /&gt;&lt;br /&gt;Desde aquí, me gustaría agradecer&amp;nbsp;a &lt;a href="http://jmbeas.iexpertos.com/"&gt;José Manuel Beas&lt;/a&gt;&amp;nbsp;su esfuerzo por que iniciativas de este tipo prosperen en este país. Desde aquí te brindo mi ayuda para cualquier cosa en la que te pueda echar un cable.&lt;br /&gt;&lt;br /&gt;Es una actualización aprisa y corriendo que me tengo que ir a clase!!&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2067537760441681138?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2067537760441681138/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2067537760441681138' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2067537760441681138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2067537760441681138'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/probando-con-marick.html' title='Probando con Marick'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3170438058107084372</id><published>2010-03-08T22:36:00.000+01:00</published><updated>2010-03-08T22:36:06.385+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>AOP Pointcuts theory</title><content type='html'>&lt;div style="text-align: justify;"&gt;Hace tiempo habíamos hablado acerca del modelo de joint point ofrecido por &lt;a href="http://www.eclipse.org/aspectj/"&gt;AspectJ&lt;/a&gt;, concretamente en estas dos entradas: &lt;a href="http://miguelinlas3.blogspot.com/2009/10/modelo-de-joint-point-i.html"&gt;Joint Point I&lt;/a&gt; y &lt;a href="http://miguelinlas3.blogspot.com/2009/10/modelo-de-joint-point-y-ii.html"&gt;Joint Point II&lt;/a&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En los dos posts anteriores indicabamos que un &lt;i&gt;join point&lt;/i&gt;&amp;nbsp;no es más que un punto de ejecución en un sistema. Así por ejemplo, el acceso al campo de una clase, la ejecución de una función o una sentencia for son ejemplos de join points. &lt;i&gt;AspectJ&lt;/i&gt; solamente expone un subconjunto de todos los posibles joint points, limitando de este modo, el acceso a las construcciones más estables.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Los &lt;i&gt;pointcuts&lt;/i&gt;&amp;nbsp;son construcciones que nos permite seleccionar &lt;i&gt;joint points&lt;/i&gt; y recuperar su contexto. Veamos algunas de las características principales:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Los &lt;i&gt;pointcuts&lt;/i&gt; especifican un criterio de selección. Utilizaremos tipos, campos, métodos, anotaciones, etc para generar dichas definiciones. También podremos establecer condiciones en tiempo de ejecución que tendrán que cumplirse en el joint point seleccionado.&lt;/li&gt;&lt;li&gt;Los &lt;i&gt;joint point&lt;/i&gt; disponen de información en tiempo de ejecución. Determinados &lt;i&gt;pointcuts &lt;/i&gt;pueden recolectar dicha información y pasársela al &lt;i&gt;advice&lt;/i&gt;. Por ejemplo, la llamada a un método de un objeto tendrá disponible el propio objeto que realiza la llamada y los argumentos que se están pasando.&lt;/li&gt;&lt;li&gt;En el caso del lenguaje &lt;i&gt;Java&lt;/i&gt;, todos los elementos que componen un programa tienen una signatura. La utilización de patrones para dichas signaturas permiten a los &lt;i&gt;pointcuts&lt;/i&gt; especificar las reglas de selección de los &lt;i&gt;joint point&lt;/i&gt; que se desean capturar.&lt;/li&gt;&lt;/ul&gt;Los párrafos anteriores resumen de manera breve, y teórica, las características principales de los &lt;i&gt;pointcuts&lt;/i&gt;. En la siguiente tabla se resumen las categorías principales de &lt;i&gt;joint points&lt;/i&gt; expuestos por &lt;i&gt;AspectJ&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1" frame="void" id="d0e1047"&gt;&lt;caption&gt;&lt;b&gt;&lt;i&gt;Categorías de joint points expuestas por &lt;/i&gt;&lt;/b&gt;&lt;span class="italic"&gt;&lt;b&gt;&lt;i&gt;AspectJ&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;i&gt; (resumen)&lt;/i&gt;&lt;/b&gt;&lt;/caption&gt;&lt;caption&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/caption&gt;&lt;caption&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/caption&gt;&lt;caption&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/caption&gt;&lt;col width="25%"&gt;&lt;/col&gt;&lt;col width="25%"&gt;&lt;/col&gt;&lt;col width="50%"&gt;&lt;/col&gt;&lt;thead&gt;&lt;tr&gt;         &lt;th&gt;Categoría&lt;/th&gt;         &lt;th&gt;Joint Point Expuesto&lt;/th&gt;         &lt;th&gt;Código que representa&lt;/th&gt;        &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;         &lt;td&gt;Método&lt;/td&gt;         &lt;td&gt;Execution&lt;/td&gt;         &lt;td&gt;Cuerpo del método&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Método&lt;/td&gt;         &lt;td&gt;Call&lt;/td&gt;         &lt;td&gt;Invocación del método&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Constructor&lt;/td&gt;         &lt;td&gt;Execution&lt;/td&gt;         &lt;td&gt;Ejecución de la lógica de creación de un objeto&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Constructor&lt;/td&gt;         &lt;td&gt;Call&lt;/td&gt;         &lt;td&gt;Invocación de la lógica de creación de un objeto&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Acceso a un campo&lt;/td&gt;         &lt;td&gt;Read&lt;/td&gt;         &lt;td&gt;Lectura de un objeto o el campo de una clase&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Acceso a un campo&lt;/td&gt;         &lt;td&gt;Write&lt;/td&gt;         &lt;td&gt;Escritura de un objeto o el campo de una clase&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Proceso de excepciones&lt;/td&gt;         &lt;td&gt;Handler&lt;/td&gt;         &lt;td&gt;Bloque &lt;span class="italic"&gt;catch&lt;/span&gt; para manejar una&lt;br /&gt;excepción&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Inicialización&lt;/td&gt;         &lt;td&gt;Class init&lt;/td&gt;         &lt;td&gt;Proceso de carga de una clase (&lt;span class="italic"&gt;class&lt;br /&gt;loading&lt;/span&gt;)&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Inicialización&lt;/td&gt;         &lt;td&gt;Object init&lt;/td&gt;         &lt;td&gt;Inicialización de un objeto en un constructor&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Inicialización&lt;/td&gt;         &lt;td&gt;Object pre-init&lt;/td&gt;         &lt;td&gt;Pre-inicialización de un objeto en un constructor&lt;/td&gt;        &lt;/tr&gt;&lt;tr&gt;         &lt;td&gt;Advice&lt;/td&gt;         &lt;td&gt;Execution&lt;/td&gt;         &lt;td&gt;Ejecución de un advice&lt;/td&gt;        &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div&gt;En la siguiente entrada (espero que sea lo más pronto posible :) ) analizaremos en detalle la estructura sintáctica de los &lt;i&gt;pointcuts,&lt;/i&gt;&amp;nbsp;haciendo especial hincapié en las signaturas.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hasta pronto!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PD: Últimamente mi tiempo escasea (por llamarlo de alguna manera) pero eso dará para una nueva entrada.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3170438058107084372?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3170438058107084372/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3170438058107084372' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3170438058107084372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3170438058107084372'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/03/aop-pointcuts-theory.html' title='AOP Pointcuts theory'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6497005975955429617</id><published>2010-02-14T16:51:00.001+01:00</published><updated>2010-02-14T16:52:44.184+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Ida de pelota'/><title type='text'>La vuelta al cole</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Como ya os comentaba en el post anterior (si es que se puede llamar así :( ) últimamente el tiempo se ha convertido en un bien escaso. No sé cómo demonios me las apaño pero nunca tengo tiempo a hacer/terminar todas las cosas que me he propuesto.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;El motivo principal de esta entrada era contaros que me han aceptado en un posgrado de la politécnica de Madrid y que a partir del miércoles 17 de febrero regresaré a las clases de manera oficial. Si alguien me preguntase cuáles son las motivaciones que me han llevado de nuevo a la facultad no estoy seguro cuál sería la respuesta; puede que algo tan simple como un "me apetece". En principio parece muy interesante y, aunque compaginarlo con el trabajo implicará grandes esfuerzos, estoy dispuesto a intentarlo. Ya os iré contando qué tal son las clases y cómo me voy defendiendo.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Cambiando de tema, &amp;nbsp;había estado pensando en comprarme un netbook (no es una necesidad imperiosa, es más bien un capricho :) ). ¿Alguno me puede dar alguna recomendación? Había pensado en un DELL pero me da rabia tener que pagar la licencia de Windows. Agradecería cualquier tipo de consejo y/o sugerencia.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Hasta pronto!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6497005975955429617?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6497005975955429617/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6497005975955429617' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6497005975955429617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6497005975955429617'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/02/la-vuelta-al-cole.html' title='La vuelta al cole'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3210318686956758084</id><published>2010-02-05T09:04:00.000+01:00</published><updated>2010-02-05T09:04:13.264+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sin tiempo'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Sin demasiado tiempo</title><content type='html'>Estos últimos días he estado bastante atareado y no he tenido ocasión de escribir nada en el blog. Espero que esta tarde y el fin de semana tenga un hueco para redactar alguna entrada nueva.&lt;br /&gt;&lt;br /&gt;Tendré que sacar tiempo de algún sitio :).&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3210318686956758084?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3210318686956758084/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3210318686956758084' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3210318686956758084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3210318686956758084'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/02/sin-demasiado-tiempo.html' title='Sin demasiado tiempo'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-8638289736581835602</id><published>2010-01-22T06:15:00.000+01:00</published><updated>2010-01-22T06:15:18.499+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Ida de pelota'/><title type='text'>Desilusión</title><content type='html'>&lt;div style="text-align: justify;"&gt;Llevo un par de días en los que no estoy durmiendo demasiado bien (algo muy raro en mi :) ) así que aquí estoy leyendo un poco y viendo la tele hasta que llegue la hora de ir a trabajar.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Últimamente tengo un montón de cosas en la cabeza: la posible vuelta a la Universidad (cuando lo tenga decidido escribiré otro post relativo a este tema), la búsqueda de una casa, . . . &amp;nbsp;y el trabajo. Y creo que es este último el que me está quitando el sueño. Cuando decidí regresar a Madrid lo hice con la firme convicción de seguir creciendo, tanto personal como profesionalmente, y de momento las cosas no están siendo como yo pensaba ni muchísimo menos, es más, creo que en lugar de caminar hacia adelante estoy retrocediendo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;¿Y por qué tengo esta sensación me pregunto? Básicamente porque no se están cumpliendo ninguna de las cosas que me habían dicho; tengo menos responsabilidades y capacidad de decisión que cuando estaba en Gijón así que . . . .&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La primera medida es que no pienso hacer ni un minuto de más, pero ni uno solo. En otras ocasiones hemos hecho horas y horas de más (fines de semana incluidos) que no han tenido ningún tipo de recompensa. Lo que no de tiempo a hacerse no es mi problema, que se las apañen.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Voy a centrarme en las cosas que me interesan y que me permitan seguir creciendo haciendo lo que más me gusta: puede que regrese a la Universidad y voy a poner en marcha un par de proyectos que tenía en mente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por último, voy a considerar seriamente una interesante oferta que tengo sobre la mesa.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ya sé que no son horas de estar levantando, ni mucho menos de soltar este auténtico rollo, pero simplemente me apetecía escribirlo, y para eso el blog es mío :).&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;No os preocupéis, enseguida volverán las cosas aburridas: más Groovy (AST Transformations, DSL, ...), una serie de posts dedicados a la construcción de aplicaciones web basadas en OSGI, intentaré continuar con la serie de post dedicados a AspectJ comenzada hace tiempo, . . . y alguna cosilla más.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bueno, voy a ir duchándome y esas cosas que dentro de un rato tengo que salir para ir cogiendo el metro.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PD: esta tarde la gordita y yo iremos a una feria de la vivienda de segunda mano que se celebra en el palacio de congresos. Los pisos que allí se expongan deben presentar un precio reducido entre un 30 y un 40% respecto a su valor de tasación máximo en 2006. Ya os contaré a la vuelta.&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/35092134-8638289736581835602?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/8638289736581835602/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=8638289736581835602' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8638289736581835602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8638289736581835602'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/01/desilusion.html' title='Desilusión'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6349351230736526890</id><published>2010-01-21T19:15:00.000+01:00</published><updated>2010-01-21T19:15:17.759+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>El segundo mundo</title><content type='html'>Este es el título del libro que estoy leyendo actualmente. Un viaje a lo largo de todo el mundo mostrando cómo el dominio estadounidense se está viendo reemplazado por un mercado geopolítico en el que tanto China como la Unión Europeoa compiten con Estados Unidos para configurar el nuevo orden mundial en sus propios términos. Todavía no he terminado de leerlo pero la verdad que hasta el momento me está gustando bastante.&lt;br /&gt;&lt;br /&gt;Aquí os dejo un enlace al libro:&amp;nbsp;&lt;a href="http://www.casadellibro.com/libro-el-segundo-mundo/2900001273779"&gt;El Segundo Mundo&lt;/a&gt;, y un enlace a la bibliografía del autor: &lt;a href="http://www.paragkhanna.com/bio.htm"&gt;Parag Khanna&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6349351230736526890?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6349351230736526890/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6349351230736526890' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6349351230736526890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6349351230736526890'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/01/el-segundo-mundo.html' title='El segundo mundo'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-1853093067366952062</id><published>2010-01-17T11:44:00.000+01:00</published><updated>2010-01-17T11:44:53.288+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comedia'/><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='Monólogos'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>AIGUANTULIVINAMERICA</title><content type='html'>&lt;div style="text-align: justify;"&gt;Ayer por la noche la gordita y yo estuvimos en el teatro de &lt;a href="http://www.lachocitadelloro.com/"&gt;La Chocita del Loro&lt;/a&gt; para ver en directo uno de los últimos monólogos de Goyo Jiménez,&amp;nbsp;AIGUANTULIVINAMERICA. Sinceramente, no tengo palabras para describir el arte que tiene el tío: gracioso, ameno, espontáneo, interactuando con el público, infinidad de recursos, . . ., en fin, un fuera de serie. Lo conocía de ver sus monólogos en &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;, pero, desde luego, el directo supera con creces todos los vídeos que había visto hasta el momento.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A lo largo de su actuación realiza una comparativa de las vidas españolas respecto a sus homólogas americanas, explicando los motivos por los que éstas últimas son mucho mejores. Dos horas de diversión ininterrumpida altamente recomenbables.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Por si a alguien le interesa, nosotros compramos las entradas en &lt;a href="http://www.atrapalo.com/"&gt;Atrápalo&lt;/a&gt;&amp;nbsp;con unos diez días de antelación aproximadamente, y nos costarón 16€/persona. El próximo martes iremos a la sala Joy Slava para ver en directo a varios de los monologuistas de &lt;a href="http://www.atrapalo.com/entradas/en-joy-con-paramount-comedy-monologos_e22137/"&gt;Paramount Comedy&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;PD: Ayer he conocido una tienda de gominolas en la calle Fuencarral para quitar el hipo. La tienda es muy cara (creo que a 1.80€ los 100 gramos) pero desde luego son las mejores gominolas que he comido en la vida.&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/35092134-1853093067366952062?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/1853093067366952062/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=1853093067366952062' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1853093067366952062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/1853093067366952062'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/01/aiguantulivinamerica.html' title='AIGUANTULIVINAMERICA'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4237566367031205466</id><published>2010-01-06T15:12:00.000+01:00</published><updated>2010-01-06T15:12:02.565+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Año Nuevo'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Ida de pelota'/><title type='text'>Primer post del año</title><content type='html'>&lt;div style="text-align: justify;"&gt;Día de Reyes y aquí estoy sentado en el sofá leyendo uno de los múltiples libros que tengo pendientes. Parece ser que este año me he portado bastante bien porque los Reyes Magos me han dejado unos cuantos regalos: chaqueta y jersey de G-Star, un pijama, un máquina para cortar el pelo ( y la barba :) ), un juego de sumiller, un lector de DNIe ( y varios tipos de tarjetas) y algo de dinero; la verdad es que no me puedo quejar.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como ya os había comentado en una entrada anterior, he pasado las Navidades en casa de mis padres, intentando aprovechar al máximo los pocos días disponibles: he pasado bastante tiempo con mi familia y los peques, he quedado con Andre,Moreno y Vicio, con mis amigos de Lastres (por fin he conocido el &lt;a href="http://www.facebook.com/group.php?v=wall&amp;amp;ref=ts&amp;amp;gid=91592418994"&gt;Rancho Chico&lt;/a&gt;), . . . no sé, realmente me han resultado fructíferas estas vacaciones.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Y ahora que las Navidades ya se han terminado comienzo el año con energías renovadas y ganas de poner en marcha alguna de las ideas que me rondan por la cabeza. Puede que dentro de poco se avecinen cambios pero tampoco quiero adelantarme a los acontecimientos.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para terminar os dejo alguna foto que Ita y yo hicimos con los peques cuando estuvimos en Mercaplana:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_XFfdslVc5Pw/S0R_WHCGWKI/AAAAAAAABGc/aYEyWXwre2s/s1600-h/P1010647.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_XFfdslVc5Pw/S0R_WHCGWKI/AAAAAAAABGc/aYEyWXwre2s/s400/P1010647.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_XFfdslVc5Pw/S0R96YqpUcI/AAAAAAAABGM/hCGOvEGfYjI/s1600-h/P1010601.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_XFfdslVc5Pw/S0R96YqpUcI/AAAAAAAABGM/hCGOvEGfYjI/s400/P1010601.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_XFfdslVc5Pw/S0R-hrTjRTI/AAAAAAAABGU/FQFdfwhtlkA/s1600-h/P1010596.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_XFfdslVc5Pw/S0R-hrTjRTI/AAAAAAAABGU/FQFdfwhtlkA/s400/P1010596.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hasta pronto!&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/35092134-4237566367031205466?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4237566367031205466/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4237566367031205466' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4237566367031205466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4237566367031205466'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2010/01/primer-post-del-ano.html' title='Primer post del año'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XFfdslVc5Pw/S0R_WHCGWKI/AAAAAAAABGc/aYEyWXwre2s/s72-c/P1010647.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5725575132361907167</id><published>2009-12-23T00:30:00.000+01:00</published><updated>2009-12-23T00:30:59.035+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Vacaciones'/><title type='text'>Año viejo. Año nuevo</title><content type='html'>&lt;span style="font-family: Verdana, sans-serif;"&gt;Posiblemente este sea el último post del año puesto que mañana me quedo de vacaciones y en casa de mis padres no dispondré de conexión a Internet. Si alguien me necesita que recurra al viejo truco del teléfono móvil.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Antes de continuar con el post me gustaría deciros que ya he recibido mi regalo de Papa Noel que me ha hecho la gordita:&lt;/span&gt; &amp;nbsp;&lt;span class="Apple-style-span" style="color: #333333; font-family: 'Courier New', Courier, monospace; letter-spacing: -1px;"&gt;&lt;a href="http://www.pragprog.com/titles/tpdsl/language-implementation-patterns"&gt;Language Implementation Patterns: Create Your Own Domain-Specific and General Programming Languages&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: 'Courier New', Courier, monospace;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;No se ha liberado todavía (posiblemente en Enero) pero de esta manera iré recibiendo todas las actualizaciones del libro a medida que se vayan realizando. Tengo que terminar un par de lecturas que tengo a medias aunque no se si podré esperar para comenzar a leerlo :).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;En primer lugar quería desearos desde aquí una Feliz Navidad y año nuevo, que disfruteis mucho de estos días de vacaciones (aquellos que podais disfrutar de ellos) en compañía de vuestra gente.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;No suelo hacer los típicos propósitos de año nuevo, aunque si voy a dejar por escrito las cosas que me gustaría hacer el próximo año. Si logro cumplirlas, bienvenido sea, aunque si no las realizo tampoco pasará nada :).&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Pasar mucho más tiempo con la gordita (esta es la más importante)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Viajar a Japón&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Regresar a Alemania (para ésto ya tenemos billetes :) )&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Intentar quedar lo máximo posible con los amigos que ahora no están tan cerca (esto también es muy importante)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Comenzar las clases del Máster (esto no depende de mi directamente, sino de la Politécnica de Madrid)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Continuar con la construcción de &lt;i&gt;R-Eclipse&lt;/i&gt;: soporte para intérpretes remotos y construcción de un depurador.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Comenzar el desarrollo de &lt;i&gt;Visual-R&lt;/i&gt;, una herramienta gráfica para el desarrollo de aplicaciones &lt;i&gt;R&lt;/i&gt;. La idea es que se complemente con &lt;i&gt;R-Eclipse&lt;/i&gt; de manera sencilla. Estará basada en EclipseRCP, GMF,EMF, GEF,Spring,Maven, etc. Lo voy a liberar así que si alguien se anima y quiere participar no tiene más que decírmelo.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Terminar de darle caña a &lt;i&gt;Erlang&lt;/i&gt; que cada día que pasa me gusta más. (también debería continuar con &lt;i&gt;Scala&lt;/i&gt; que hace tiempo que lo tengo parado)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Leer todos los libros que tengo pendientes. No los enumero porque se me haría un post eterno :)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Ver todos los videos que me he bajado de &lt;i&gt;&lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt;&lt;/i&gt;, para ello el &lt;i&gt;Itouch&lt;/i&gt; será un inestimable compañero de viaje.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Repaso la lista y me parece que son demasiadas cosas (más algunas que no he puesto). Esperemos que dentro de un año me pueda sentar frente al ordenador y pueda revisar cuáles he llevado a cabo y cuáles se han quedado en el tintero.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Ya me despido que es demasiado tarde y mañana, bueno hoy :), tengo que madrugar. Desearos de nuevo unas felices fiestas y todo lo mejor para el próximo año.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Un abrazo!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #333333; font-family: Verdana, sans-serif;"&gt;&lt;span class="Apple-style-span" style="letter-spacing: -1px;"&gt;Migue&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5725575132361907167?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5725575132361907167/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5725575132361907167' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5725575132361907167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5725575132361907167'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/12/ano-viejo-ano-nuevo.html' title='Año viejo. Año nuevo'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2600788280739095861</id><published>2009-12-20T18:24:00.002+01:00</published><updated>2009-12-21T08:44:27.232+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Metaprogramming'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Categories'/><title type='text'>Groovy Metaprogramming: Categories (I)</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;i&gt;Groovy&lt;/i&gt; nos ofrece un amplio conjunto de técnicas de metaprogramación: &lt;i&gt;Categories, Interceptors, metaclases&lt;/i&gt;, etc. A lo largo de una serie de posts analizaremos en detalle algunas de las características anteriores: comencemos por las &lt;i&gt;Categories.&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En muchas ocasiones es necesario que alguna clase que no está bajo nuestro control disponga de métodos adicionales. Gracias a las &lt;i&gt;Categories,&lt;/i&gt;&amp;nbsp;&lt;i&gt;Groovy&lt;/i&gt;&amp;nbsp;introduce esta funcionalidad en el lenguaje (la ha tomado prestada de &lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_4_section_7.html"&gt;Objective-C&lt;/a&gt;). El propio lenguaje incorpora alguna &lt;i&gt;Category &lt;/i&gt;como &lt;i&gt;DOMCategory o&lt;/i&gt;&amp;nbsp;&lt;i&gt;ServletCategory&lt;/i&gt;, de la cual vamos a ver algún sencillo ejemplo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El principal objetivo de&amp;nbsp;&lt;i&gt;ServletCategory&lt;/i&gt; persigue que&amp;nbsp;los atributos de objetos que implementan el &lt;i&gt;Servlet API &lt;/i&gt;puedan ser&lt;i&gt;&amp;nbsp;&lt;/i&gt;tratados como &lt;i&gt;properties&amp;nbsp;&lt;/i&gt;dado que no siguen las convenciones establecidas por &lt;i&gt;JavaBeans&lt;/i&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el ejemplo de &lt;i&gt;GroovyServlet&lt;/i&gt; visto en un post anterior (&lt;a href="http://miguelinlas3.blogspot.com/2009/12/groovlets.html"&gt;Groovlets&lt;/a&gt;), analizamos cómo nuestros scripts &lt;i&gt;Groovy&lt;/i&gt;&amp;nbsp;podían actuar como &lt;i&gt;servlets, &lt;/i&gt;permitiéndonos realizar accesos mediante&lt;i&gt; properties&lt;/i&gt; contra el objeto de la &lt;i&gt;request&lt;/i&gt;. Para conseguir ésto, desde el código Java, se invoca a GroovyCategorySupport de un modo similar al siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma,verdana,sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="code-java"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;Closure closure = &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; Closure(gse) {&lt;br /&gt;   &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="background-color: inherit; color: #910091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;Object&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; call() {&lt;br /&gt;       &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; {&lt;br /&gt;           &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; ((GroovyScriptEngine) getDelegate()).run(scriptUri, binding);&lt;br /&gt;       } &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;catch&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; (ResourceException e) {&lt;br /&gt;           &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;throw&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; RuntimeException(e);&lt;br /&gt;       } &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;catch&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; (ScriptException e) {&lt;br /&gt;           &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;throw&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;new&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; RuntimeException(e);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;};&lt;br /&gt;GroovyCategorySupport.use(ServletCategory.class, closure);&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Gracias al código anterior podríamos acceder mediante su nombre a diversos componentes como la &lt;i&gt;session&lt;/i&gt; o la &lt;i&gt;request:&lt;/i&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma,verdana,sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="code-java"&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; (session.count == &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;) session.count = 1;&lt;/span&gt;&lt;/pre&gt;en lugar de acceder a través del API:&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma,verdana,sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="code-java"&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;if&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt; (session.getAttribute(&lt;/span&gt;&lt;span style="background-color: inherit; color: #009100;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;"count"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;) == &lt;/span&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;null&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;) then session.setAttribute(&lt;/span&gt;&lt;span style="background-color: inherit; color: #009100;"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;"count"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;, 1);&lt;/span&gt;&lt;/pre&gt;Con este pequeño ejemplo hemos visto qué son y cómo podemos utilizar las&amp;nbsp;&lt;i&gt;Categories&lt;/i&gt; proporcionadas por el lenguaje pero . . . ¿Cuáles son los pasos a seguir si deseamos crear nuestras propias &lt;i&gt;Categories&lt;/i&gt;?&lt;br /&gt;Asentemos los conocimientos que hemos adquirido en esta entrada para generar nuestras propias construcciones en el siguiente post :).&lt;br /&gt;&lt;br /&gt;Hasta pronto!&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/35092134-2600788280739095861?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2600788280739095861/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2600788280739095861' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2600788280739095861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2600788280739095861'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/12/groovy-metaprogramming-categories-i.html' title='Groovy Metaprogramming: Categories (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-622212117060016883</id><published>2009-12-18T00:20:00.000+01:00</published><updated>2009-12-18T00:20:56.808+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cambios'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>Un paso atrás</title><content type='html'>Ya han pasado quince días desde que he regresado a Madrid y me gustaría hacer un pequeño balance en voz alta de cómo están siendo las cosas hasta este momento.&lt;br /&gt;&lt;br /&gt;La nueva vida aquí con la gordita no dista mucho de la que hacíamos en Gijón e intentamos aprovechar al máximo el poco tiempo que tenemos disponible: un finde en Valencia, una cata de cacique 500 en casa de unos amigos, de cañitas siempre que podemos, nos hemos comprado unos billetes para Berlín y Stuttgart por Semana Santa, el otro día estuvimos comiendo en el Viavélez, . . . seguro que se me olvida algo :) .&lt;br /&gt;&lt;br /&gt;También es cierto que regresar a Madrid ha tenido cosas sus efectos "&lt;i&gt;negativos&lt;/i&gt;", y ahora tenemos un poco más lejos al "Fori" y a Martita, a Andre y Moreno, a Vicio, . . .. Será algo a los que nos tendremos que ir acostumbrando con el paso del tiempo. ¡Os echo de menos!&lt;br /&gt;&lt;br /&gt;Por último, y es el tema por el que estoy un poco preocupado, el trabajo. Uno de los motivos por los que decidí regresar a Madrid fue la de intentar darle un nuevo empujón a mi carrera e intentar seguir mejorando al máximo. Pues bien, tal y como reza el título del post, me parece que estoy caminando hacia atrás y las cosas no están siendo ni mucho menos como yo esperaba. Me siento engañado y eso es algo que no soporto en absoluto. No voy a extenderme demasiado respecto a este tema porque, sinceramente, estoy bastante, decepcionado y sé que si continuo escribiendo me voy a poner de más mala leche todavía si cabe.&lt;br /&gt;&lt;br /&gt;Para terminar, que se está haciendo tarde, voy a hacer un propósito de intenciones :). Voy a intentar escribir todos los días en el blog sobre las cosas que más me gustan: arquitectura de software, lenguajes de programación, libros, frameworks, diseño, calidad, etc. De vez en cuando haré algún post de este calibre para contaros como continuan las cosas o si tengo alguna novedad.&lt;br /&gt;&lt;br /&gt;Un abrazo!&lt;br /&gt;&lt;br /&gt;Migue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-622212117060016883?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/622212117060016883/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=622212117060016883' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/622212117060016883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/622212117060016883'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/12/un-paso-atras.html' title='Un paso atrás'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7667659192971921171</id><published>2009-12-16T23:36:00.002+01:00</published><updated>2009-12-16T23:39:38.715+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovlets</title><content type='html'>&lt;div style="text-align: justify;"&gt;Me imagino que la gente dedicada al desarrollo web estará acostumbrada al concepto de &lt;i&gt;servlet,&lt;/i&gt; y posiblemente, hayan escrito muchos de ellos.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Voy a mostraros una forma sencilla de escribir y configurar servlets en el lenguaje Groovy. Esta funcionalidad compilará nuestros archivos &lt;i&gt;.groovy&lt;/i&gt; en el bytecode correspondiente, cargará la clase, y la cacheará, hasta que se produzca un cambio en el archivo &lt;i&gt;groovy&lt;/i&gt; inicial.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;El primer paso que vamos a dar es añadir el soporte para los &lt;i&gt;Groovlets&lt;/i&gt;, para lo que necesitaremos añadir en el archivo &lt;i&gt;web.xml&lt;/i&gt; de la aplicación web el siguiente fragmento de código:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: monospace; font-size: 12px; line-height: 10px; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: #eeeeee; border: 2px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 11px; line-height: 11px; overflow: auto; padding: 1px; width: 90%;"&gt;&lt;code&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="color: #000091; font-size: 13px; line-height: normal;"&gt;&amp;lt;servlet&amp;gt;&amp;lt;servlet-name&amp;gt;Groovy&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre class="code-xml"&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 10px; white-space: pre-wrap;"&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 13px; line-height: normal; white-space: pre;"&gt;&amp;lt;servlet-class&amp;gt;groovy.servlet.GroovyServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code-xml"&gt;&lt;span style="color: black; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 15px; white-space: pre-wrap;"&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: 13px; line-height: normal; white-space: pre;"&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;Groovy&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;*.groovy&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Ahora estamos en disposición de escribir un servlet en el lenguaje Groovy (llamemoslo &lt;i&gt;hello.groovy&lt;/i&gt;). Veamos un ejemplo sencillito:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border-bottom-color: rgb(153, 153, 153); border-bottom-style: dashed; border-bottom-width: 2px; border-left-color: rgb(153, 153, 153); border-left-style: dashed; border-left-width: 2px; border-right-color: rgb(153, 153, 153); border-right-style: dashed; border-right-width: 2px; border-top-color: rgb(153, 153, 153); border-top-style: dashed; border-top-width: 2px; color: black; font-family: 'Andale Mono', 'Lucida Console', Monaco, fixed, monospace; font-size: 11px; line-height: 11px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; overflow-x: auto; overflow-y: auto; padding-bottom: 1px; padding-left: 1px; padding-right: 1px; padding-top: 1px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;span style="font-size: 13px; line-height: normal;"&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; white-space: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000091; font-size: small;"&gt;&lt;pre class="code-java"&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;if&lt;/span&gt; (!session) {&lt;br /&gt;  session = request.session(&lt;span style="background-color: inherit; color: #000091;"&gt;true&lt;/span&gt;)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;if&lt;/span&gt; (!session.counter) {&lt;br /&gt;      session.counter = 1&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;html.html {    &lt;span style="background-color: inherit; color: grey;"&gt;// utilizamos del MarkupBuilder&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code-java"&gt;&lt;span style="background-color: inherit; color: grey;"&gt;               // para construir una página tonta de respuesta&lt;br /&gt;&lt;/span&gt;  head {&lt;br /&gt;      title(&lt;span style="background-color: inherit; color: #009100;"&gt;"Esto es un Groovy Servlet"&lt;/span&gt;)&lt;br /&gt;  }&lt;br /&gt;  body {&lt;br /&gt;    p(&lt;span style="background-color: inherit; color: #009100;"&gt;"Bienvenido, ${request.remoteHost}: ${session.counter}! ${&lt;span style="background-color: inherit; color: #000091;"&gt;new&lt;/span&gt; Date()}"&lt;/span&gt;)&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;pre class="code-java"&gt;&lt;span style="font-family: tahoma, verdana, sans-serif; white-space: normal;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code-java" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="background-color: inherit; color: grey;"&gt;// incrementamos el contador en la session&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;session.counter = session.counter + 1&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;En el &lt;i&gt;servlet &lt;/i&gt;(&lt;i&gt;groovlet&lt;/i&gt;) anterior existen una serie de variables implícitas tales como, request, response, context, application, session, params, headers, out, sout y html.&lt;br /&gt;&lt;br /&gt;Un paso adicional de configuración, sumamente importante, para poner nuestro &lt;i&gt;groovlet&lt;/i&gt; en marcha, consiste en incluir las dependencias necesarias. La opción más sencilla es incluir el archivo &lt;i&gt;groovy-all-XXX.jar&lt;/i&gt; en el directorio &lt;i&gt;WEB-INF/lib&lt;/i&gt; de la aplicación web.&lt;br /&gt;&lt;br /&gt;Si, por ejemplo, colocamos los archivos &lt;i&gt;.groovy&lt;/i&gt; en el raiz de nuestra aplicación el servlet de &lt;i&gt;groovy&lt;/i&gt; se encargará de compilar los archivos. En el caso de tomcat podríamos editar el archivo&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;tomcat/conf/server.xml&lt;/i&gt; del siguiente modo:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;&lt;span style="font-size: 13px; line-height: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;pre class="code-xml"&gt;&lt;span style="background-color: inherit; color: #000091;"&gt;&amp;lt;Context path=&lt;span style="background-color: inherit; color: #009100;"&gt;"/groovy"&lt;/span&gt; docBase=&lt;span style="background-color: inherit; color: #009100;"&gt;"c:/groovy-servlet-base"&lt;/span&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code-xml"&gt;&lt;span style="color: #000091;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="code-xml"&gt;&lt;span style="color: #000091;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;Podríamos acceder al archivo creado anteriormente mediante la siguiente ur:l&amp;nbsp;&lt;a class="external-link" href="http://localhost:8080/groovy/hello.groovy" style="color: #2266cc; text-decoration: none;"&gt;&lt;b&gt;http://localhost:8080/groovy/hello.groovy&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;Hasta pronto,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #222233; font-family: tahoma, verdana, sans-serif; font-size: small;"&gt;&lt;span style="font-size: 12px; line-height: 18px;"&gt;Migue&lt;/span&gt;&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/35092134-7667659192971921171?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7667659192971921171/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7667659192971921171' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7667659192971921171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7667659192971921171'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/12/groovlets.html' title='Groovlets'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4451512218270987425</id><published>2009-12-01T18:14:00.001+01:00</published><updated>2009-12-16T22:36:52.516+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>No Internet</title><content type='html'>Estoy a la espera de que nos instalen la conexión ADSL y el teléfono fijo en casa así que hasta que no llegue dicho momento sólo podré postear alargando un poco la estancia en la oficina. Esperemos que nos hagan pronto la instalación.&lt;br /&gt;&lt;br /&gt;Por si a alguien no se lo había comentado, he regresado a Madrid, a ver que pasa. De momento las cosas no han empezado demasiado bien, y me parece que me han tomado por tonto, ya veremos a ver que pasa . . .&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-4451512218270987425?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4451512218270987425/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4451512218270987425' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4451512218270987425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4451512218270987425'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/12/no-internet.html' title='No Internet'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-9094635591927027066</id><published>2009-11-28T09:41:00.000+01:00</published><updated>2009-11-28T09:41:58.038+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Personal'/><title type='text'>Por fin</title><content type='html'>Ayer, después de tres largos años que terminé la carrera, por fin entregué el proyecto. Ha sido, y soy sincero, un tiempo en el que no ha habido un único día en el que me fuese a la cama sin pensar en que lo tenía pendiente, que me debería poner en serio, pero por una cosa u otra nunca lo hacía. En unas ocasiones el trabajo, en otras que las ganas escaseaban, de nuevo el trabajo :), etc, etc,etc.&lt;br /&gt;&lt;br /&gt;Cuando este verano comenzamos la jornada continua me propuse que, costara lo que costara, me pondría en serio,y, así ha sido; por fin lo he terminado. Además, y a&amp;nbsp; nadie le amarga un dulce, me han calificado con matrícula de honor, con la que la alegría ha sido un poquito mayor :).&lt;br /&gt;&lt;br /&gt;Desde aquí, y aunque ya lo he hecho en persona, me gustaría darle las gracias a mis padres por insistir hasta la saciedad para que terminase; muchas gracias! Y como no a Iratxe, porque sin ella todo estoy seguro de que todo ésto no hubiese sido posible.&lt;br /&gt;&lt;br /&gt;También me gustaría agradecer a Luciano, mi director de proyecto, la paciencia que ha tenido conmigo, cambiándole de proyecto cada dos por tres jajaja.&lt;br /&gt;&lt;br /&gt;Muchas gracias a todos!!&lt;br /&gt;&lt;br /&gt;Hasta pronto&lt;br /&gt;&lt;br /&gt;PD: tal y como os comentaba en algún post anterior ahora le dedicaré más tiempo al blog así que a ver si logro hacer de este pequeño sitio en Internet un poquito más interesante&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-9094635591927027066?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/9094635591927027066/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=9094635591927027066' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/9094635591927027066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/9094635591927027066'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/por-fin.html' title='Por fin'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7121986013875657618</id><published>2009-11-23T17:11:00.004+01:00</published><updated>2009-11-23T19:44:20.546+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social Networks'/><category scheme='http://www.blogger.com/atom/ns#' term='Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Análisis de Redes Sociales</title><content type='html'>Las redes sociales y el análisis de la mismas se han convertido en algo muy popular. Asi por ejemplo, aplicaciones como Twitter,Facebook o Linkedin han adquirido una popularidad desmesurada en los tiempos que corren. Personalmente, y esta es  mi humilde opinión, creo que debería hacerse un uso controlado de las mismas (del mismo modo que el resto de Internet, claro está), puesto que ,aunque pueden ser una herramienta sumamente beneficiosa, un uso inadecuado de las mismas podría acarrear grandes problemas. De todos modos,aunque relacionado con las redes sociales, éste no era el asunto inicial de esta entrada (podríamos hablar horas acerca de ésto).&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hace poquito, para estrenar de manera oficial el entorno de desarrollo integrado que he construido para R (os contaré alguna cosilla relacionada con dicho entorno en el  futuro), he escrito un pequeño programa que realiza un análisis de redes sociales.&lt;br /&gt;&lt;br /&gt;El programa es bastante sencillo. Os resumo de manera esquemática lo que realiza:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Recupera los últimos N twetts que contengan la etiqueta TAG.&lt;/li&gt;&lt;li&gt;A partir los anteriores N twetts, recupera los usuarios (eliminando repetidos) que han realizado dichos twetts.&lt;/li&gt;&lt;li&gt;Para cada uno de los usuarios anteriores recupera su red de contactos (siempre y cuando su red no esté protegida).&lt;/li&gt;&lt;li&gt;Con toda la información anterior, realiza la construcción de una red en la que se pueden como se relacionan entre sí todos los contactos.&lt;/li&gt;&lt;/ul&gt;Es un análisis bastante sencillo (mis conocimientos de estadística/matemáticas son prácticamente nulos), pero me ha servido para probar el entorno recién construido así como para enseñar un poco las capacidades de R y las ventajas que aporta su utilización.&lt;br /&gt;&lt;br /&gt;A continuación os pongo algunas imágenes de los resultados obtenidos.&lt;br /&gt;&lt;br /&gt;La siguiente red está construida a partir de los últimos 10 twitts que contenían el tag &lt;span style="font-weight: bold;"&gt;eclipse&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFfdslVc5Pw/SwrV86yRHWI/AAAAAAAABFw/sI_4ledphVI/s1600/10Eclipse.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_XFfdslVc5Pw/SwrV86yRHWI/AAAAAAAABFw/sI_4ledphVI/s320/10Eclipse.png" alt="" id="BLOGGER_PHOTO_ID_5407369545160662370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En esta ocasión la red está construida a partir de los últimos 10 twitts que contenían el tag &lt;span style="font-weight: bold;"&gt;rstats&lt;/span&gt;:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XFfdslVc5Pw/SwrWLLXym3I/AAAAAAAABF4/dv565PGcprE/s1600/10Rstats.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_XFfdslVc5Pw/SwrWLLXym3I/AAAAAAAABF4/dv565PGcprE/s320/10Rstats.png" alt="" id="BLOGGER_PHOTO_ID_5407369790131182450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En este último ejemplo la red está construida a partir de los últimos 10 twitts que contenían el tag &lt;span style="font-weight: bold;"&gt;erlang&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XFfdslVc5Pw/SwrWaOJ2thI/AAAAAAAABGA/s_fo6pNYiPo/s1600/10Erlang.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_XFfdslVc5Pw/SwrWaOJ2thI/AAAAAAAABGA/s_fo6pNYiPo/s320/10Erlang.png" alt="" id="BLOGGER_PHOTO_ID_5407370048576075282" border="0" /&gt;&lt;/a&gt;Podeis obtener una copia de trabajo desde la siguiente URL del servidor subversion en el que se encuentra alojado:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://reclipse.googlecode.com/svn/DemoProject/trunk/demo-r-module/source/twitter/Twitter-SNA.R"&gt;https://reclipse.googlecode.com/svn/DemoProject/trunk/demo-r-module/source/twitter/Twitter-SNA.R&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hasta pronto!&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/35092134-7121986013875657618?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7121986013875657618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7121986013875657618' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7121986013875657618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7121986013875657618'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/analisis-de-redes-sociales.html' title='Análisis de Redes Sociales'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_XFfdslVc5Pw/SwrV86yRHWI/AAAAAAAABFw/sI_4ledphVI/s72-c/10Eclipse.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2077114551564832384</id><published>2009-11-20T17:17:00.006+01:00</published><updated>2009-11-20T17:41:49.498+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JDT'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Equinox'/><category scheme='http://www.blogger.com/atom/ns#' term='Osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>JDT Weaving Service (y II)</title><content type='html'>Tal y como os había prometido en el post anterior, ahora os dejo un pequeño proyecto con un único archivo que contiene un programa de ejemplo del lenguaje que nos hemos inventado en la entrada previa.&lt;br /&gt;&lt;br /&gt;Podeis obtener una copia de trabajo desde la siguiente &lt;span style="font-style: italic;"&gt;URL&lt;/span&gt; del servidor &lt;span style="font-style: italic;"&gt;subversion&lt;/span&gt; en el que está alojado:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://reclipse.googlecode.com/svn/trunk/com.blogspot.miguelinlas3.ajdt.demoexample"&gt;http://reclipse.googlecode.com/svn/trunk/com.blogspot.miguelinlas3.ajdt.demoexample&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Gracias al plugin cosntruido en la entrada anterior, el archivo de código fuente obtenido en el checkout anterior se visualizaría del siguiente modo:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFfdslVc5Pw/SwbF07Y2zoI/AAAAAAAABFo/Pvei765y-nk/s1600/jdt-integration-example.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 199px;" src="http://2.bp.blogspot.com/_XFfdslVc5Pw/SwbF07Y2zoI/AAAAAAAABFo/Pvei765y-nk/s320/jdt-integration-example.png" alt="" id="BLOGGER_PHOTO_ID_5406225915790675586" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Como veis, hemos integrado nuestro lenguaje de ejemplo en el modelo JDT de Eclipse de una manera relativamente sencilla.&lt;br /&gt;&lt;br /&gt;Posiblemente ahora comienze a tener algo más de tiempo libre así que intentaré aumentar la frecuencia de los posts. Puede que en las siguientes entradas cambiemos un poco estas últimas entradas dedicadas a los lenguajes y sus entornos y veamos algo más "empresarial".&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2077114551564832384?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2077114551564832384/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2077114551564832384' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2077114551564832384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2077114551564832384'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/jdt-weaving-service-y-ii.html' title='JDT Weaving Service (y II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XFfdslVc5Pw/SwbF07Y2zoI/AAAAAAAABFo/Pvei765y-nk/s72-c/jdt-integration-example.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6007760123155334590</id><published>2009-11-18T21:55:00.004+01:00</published><updated>2009-11-18T22:49:20.481+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Equinox'/><category scheme='http://www.blogger.com/atom/ns#' term='Osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>JDT Weaving Service</title><content type='html'>Tal y como comentabamos hace uno o dos posts, algunos equipos como &lt;span style="font-style: italic;"&gt;AJDT&lt;/span&gt; o &lt;span style="font-style: italic;"&gt;Scala IDE&lt;/span&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;construyen el entorno de desarrollo para &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; basándose en el servicio de tejido de &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;JDT Weaving Service&lt;/span&gt;).&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Vamos a realizar un pequeño ejemplo para nuestro lenguaje (ficticio) de programación &lt;span style="font-style: italic;"&gt;Demo&lt;/span&gt;, que corre sobre la máquina virtual de &lt;span style="font-style: italic;"&gt;Java&lt;/span&gt;, integrándolo en el modelo &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt; (voy a asumir que se disponen de una serie de conocimientos básicos de &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;En primer lugar necesitaremos tener disponibles las siguientes dependencias en nuestro entorno de desarrollo:&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; 3.5 o superior.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;AJDT 1.6.4 o superior (http://download.eclipse.org/tools/ajdt/35/update).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Servicio JDT de weaving debe estar activado.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Con el objetivo de facilitar el seguimiento de este pequeño ejemplo creo que será mejor disponer del proyecto desde el principio, por lo que, desde vuestro cliente &lt;span style="font-style: italic;"&gt;subversion&lt;/span&gt; preferido obteneis una copia de trabajo desde la siguiente dirección:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.ajdt.demo/trunk/"&gt;http://reclipse.googlecode.com/svn/com.blogspot.miguelinlas3.ajdt.demo/trunk/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(y haceis un &lt;span style="font-style: italic;"&gt;Import&lt;/span&gt; del proyecto en el &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; si habeis obtenido la copia de trabajo desde un cliente externo).&lt;br /&gt;&lt;br /&gt;Una vez disponemos del proyecto accederemos al archivo &lt;span style="font-style: italic;"&gt;plugin.xml&lt;/span&gt; y veremos los siguientes puntos de extensión:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFfdslVc5Pw/SwRnDsR1DUI/AAAAAAAABFg/Sdy2DrzeUvM/s1600/weaving-extension-points.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 198px;" src="http://2.bp.blogspot.com/_XFfdslVc5Pw/SwRnDsR1DUI/AAAAAAAABFg/Sdy2DrzeUvM/s320/weaving-extension-points.png" alt="" id="BLOGGER_PHOTO_ID_5405558765874646338" border="0" /&gt;&lt;/a&gt;Los puntos de extensión &lt;span style="font-weight: bold;"&gt;org.eclipse.contribution.weaving.*&lt;/span&gt; nos permiten extender el modelo &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt;, integrando en él los componentes de nuestro lenguaje.&lt;br /&gt;&lt;br /&gt;La clase principal es &lt;span style="font-style: italic;"&gt;DemoSourceProvider&lt;/span&gt;, la cual contribuye al modelo mediante el punto de extensión &lt;span style="font-weight: bold;"&gt;org.eclipse.contribution.weaving.jdt.sourcetransformer.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;El objetivo principal de la clase anterior consiste en traducir nuestro lenguaje (completamente absurdo :) ). Si la definición de un archivo de código fuente de nuestro lenguaje fuese algo como lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  name: MyDemo {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           x: 10&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;           y: 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;          z: 12&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;el traductor intentará convertirlo en algo como lo que sigue:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;class MyDemo {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        int x= 10;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        int y= 5;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;        int z = 12;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Intentad darle un vistazo al código (son cuatro clases con muy poco código) y mañana os dejaré un proyecto de ejemplo que haga uso de esta construcción para que veais que realmente se integra nuestro absurdo lenguaje!&lt;br /&gt;&lt;br /&gt;Hasta pronto!&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/35092134-6007760123155334590?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6007760123155334590/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6007760123155334590' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6007760123155334590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6007760123155334590'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/jdt-weaving-service.html' title='JDT Weaving Service'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_XFfdslVc5Pw/SwRnDsR1DUI/AAAAAAAABFg/Sdy2DrzeUvM/s72-c/weaving-extension-points.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6324555128914210170</id><published>2009-11-13T09:38:00.003+01:00</published><updated>2009-11-13T09:44:54.779+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Definición de DSL</title><content type='html'>&lt;div style="text-align: justify;"&gt;Los &lt;span style="font-style: italic;"&gt;DSL's &lt;/span&gt;son lenguajes de programación específicos desarrollados para resolver problemas en un dominio especializado.&lt;br /&gt;&lt;br /&gt;El dominio anterior podría ser multitud de cosas diferentes, por ejemplo, podría ser relativo a la industria: inteligencia analítica, banca, seguros, marketing, . . . o relativo a la tecnología: JEE,.Net, servicios de mensajes, arquitectura o bases de datos.&lt;br /&gt;&lt;br /&gt;Existe tres tipos diferentes de DSL: externos, internos, y workbench languages&lt;br /&gt;&lt;/div&gt;donde cada uno de los anteriores tiene una audiencia definida, y, por normal general, no suelen solaparse:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;Los &lt;span style="font-weight: bold;"&gt;DSL externos&lt;/span&gt; utilizan un lenguaje diferente al de la aplicación que los está utilizando. Generalmente tienen un lenguaje específico, aunque en otras ocasiones, utilizan otra sintáxis diferente (XML es el ejemplo más claro). Algunos ejemplos de DSL externos que seguramente  os puedan sonar son: SQL,awk o los ficheros xml de configuración de herramientas como Hibernate o Spring.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Los &lt;span style="font-weight: bold;"&gt;DSL's internos&lt;/span&gt; utilizan el mismo lenguaje de propósito general más utilizado en el sistema, aunque haciendo un uso limitado del mismo. Se utiliza un subconjunto de las construcciones del lenguaje, enfocadas a un aspecto determinado de la aplicación. Tanto Groovy como Ruby han generado una gran cultura en la construcción de DSL's. Mucha gente ve los frameworks más populares asociados a los dos lenguajes anteriores (Grails y Rails) como una colección de DSL's.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Language Workbenches&lt;/span&gt; (este término ha sido acuñado por &lt;a href="http://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;) son IDE's diseñados para la construcción de DSL's. Estas herramientas permitirán definir la sintaxis del lenguaje, junto a editores y generadores. Los primeros nos permitirán disponer de sofisticados entornos de programación para los DSL's, de manera idéntica a los actuales IDE's. Ejemplos de este tipo pueden ser los proyectos de eclipse de GMF o las herramientas de ANTLR para Eclipse.&lt;/li&gt;&lt;/ul&gt;En próximos post intentaremos profundizar en el tema.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&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/35092134-6324555128914210170?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6324555128914210170/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6324555128914210170' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6324555128914210170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6324555128914210170'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/definicion-de-dsl.html' title='Definición de DSL'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5633176184633904549</id><published>2009-11-05T21:41:00.005+01:00</published><updated>2009-11-05T21:57:15.578+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='DLTK'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>New Languages. Building IDE's</title><content type='html'>En los últimos años han surgido muchos lenguajes similares a &lt;span style="font-style: italic;"&gt;Java&lt;/span&gt; que se ejecutan sobre la propia máquina virtual de este último (&lt;span style="font-style: italic;"&gt;JVM&lt;/span&gt;) lo cual es un indicador bastante fiable de cual será el futuro del desarrollo de aplicaciones sobre esta plataforma.&lt;br /&gt;&lt;br /&gt;Sin embargo, &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; y su solución &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt;, no ofrecen soporte para la integración de estos nuevos lenguajes en su modelo subyacente. Por ejemplo, no existe un modo de incluir jerarquías de tipos,jerarquías de llamadas, etc de manera directa.&lt;br /&gt;&lt;br /&gt;Una aproximación utilizada por muchos entornos de desarrollo de lenguajes actuales, como por ejemplo el caso de &lt;span style="font-style: italic;"&gt;Scala&lt;/span&gt;, es la utilización de servicio de tejido de &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt;. Las características principales son:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Utiliza &lt;span style="font-style: italic;"&gt;AspectJ&lt;/span&gt; añadiendo puntos de unión al modelo &lt;span style="font-style: italic;"&gt;JDT&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Se encapsula en puntos de extensión de &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt;, haciéndolo extensible a terceras partes.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Utiliza un proyecto de &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; conocido como &lt;span style="font-style: italic;"&gt;Equinox Aspects&lt;/span&gt; que soporta el proceso de tejido en tiempo de carga en un entorno &lt;span style="font-style: italic;"&gt;OSGI&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;La construcción de entornos de desarrollo para otro tipo de lenguajes, que podríamos denominar de &lt;span style="font-style: italic;"&gt;scripting,&lt;/span&gt; como puede ser &lt;span style="font-style: italic;"&gt;JavaScript,Python,Tcl o Ruby&lt;/span&gt;  se puede basar en un enfoque diferente al anterior, mediante el uso del proyecto &lt;span style="font-style: italic;"&gt;DLTK&lt;/span&gt; de &lt;span style="font-style: italic;"&gt;Eclipse&lt;/span&gt; (&lt;a href="http://www.eclipse.org/dltk"&gt;www.eclipse.org/dltk&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;En próximas entradas analizaremos las claves de la construcción de un &lt;span style="font-style: italic;"&gt;IDE&lt;/span&gt; para el lenguaje de programación &lt;span style="font-style: italic;"&gt;R&lt;/span&gt; (&lt;a href="http://www.r-project.org/"&gt;www.r-project.org)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5633176184633904549?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5633176184633904549/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5633176184633904549' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5633176184633904549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5633176184633904549'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/11/new-languages-building-ides.html' title='New Languages. Building IDE&apos;s'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6951031438422776116</id><published>2009-10-16T18:18:00.004+02:00</published><updated>2009-10-16T18:27:33.558+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Architecture'/><title type='text'>Modelo de Joint Point (y II)</title><content type='html'>El modelo de "joint point" que introducíamos en el post anterior está compuesto de dos partes claramente diferenciadas: los "&lt;span style="font-style: italic;"&gt;join point&lt;/span&gt;", que no son más que puntos en la ejecución de un programa, y los "&lt;span style="font-style: italic;"&gt;pointcuts&lt;/span&gt;", un mecanismo de selección de los puntos anteriores.&lt;br /&gt;&lt;br /&gt;Imaginemos por un momento que nos encontramos desarrollando un sistema que necesita gestión de la seguridad, algo muy común en el mundo en el que nos movemos, y, que, debido a la naturaleza transversal del mismo, elegimos &lt;span style="font-style: italic;"&gt;AOP&lt;/span&gt; como enfoque principal nuestra solución. ¿Cuáles son los pasos que deberíamos seguir?&lt;br /&gt;&lt;br /&gt;A continuación esbozamos, de manera esquemática, los pasos que se deberían seguir:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Identificar los puntos del sistema que necesitan ser protegidos, comprobando, antes de realizar el acceso, que el usuario que está realizando el acceso está autenticado y tiene los privilegios necesarios para hacerlo. En resumen, estamos identificando los "joint point" que requieren ser securizados.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Construiremos un &lt;span style="font-style: italic;"&gt;pointcut&lt;/span&gt; (o varios, todos los que sean necesarios), que permitan la selección de los "&lt;span style="font-style: italic;"&gt;joint point&lt;/span&gt;" descritos en el punto anterior.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Construiremos un aspecto que encapsule toda la lógica de seguridad requerida.&lt;/li&gt;&lt;/ul&gt;Esto es un mera introducción a los conceptos que componen un sistema orientado a aspectos, concretamente &lt;span style="font-style: italic;"&gt;AspectJ&lt;/span&gt;. En el siguiente post analizaremos las categorías de &lt;span style="font-style: italic;"&gt;joint points&lt;/span&gt; expuestas por &lt;span style="font-style: italic;"&gt;AspectJ&lt;/span&gt; y el modo en el que podemos realizar la definición de los &lt;span style="font-style: italic;"&gt;pointcuts&lt;/span&gt; que las capturen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6951031438422776116?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6951031438422776116/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6951031438422776116' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6951031438422776116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6951031438422776116'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/10/modelo-de-joint-point-y-ii.html' title='Modelo de Joint Point (y II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-7539319185215344182</id><published>2009-10-08T23:19:00.002+02:00</published><updated>2009-10-08T23:25:46.534+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Sofware Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>Modelo de Joint Point (I)</title><content type='html'>El modelo de "&lt;span style="font-style: italic;"&gt;joint point&lt;/span&gt;" está compuesto de dos partes claramente diferenciadas: los propios "&lt;span style="font-style: italic;"&gt;join point&lt;/span&gt;", que no son más que puntos en la ejecución de un programa, y los "&lt;span style="font-style: italic;"&gt;pointcuts&lt;/span&gt;", un mecanismo de selección de los puntos anteriores.&lt;br /&gt;&lt;br /&gt;Imaginemos por un momento que nos encontramos desarrollando un sistema que necesita gestión de la seguridad, algo muy común en el mundo en el que nos movemos, y, que, debido a la naturaleza transversal del mismo, elegimos AOP como enfoque principal nuestra solución. ¿Cuáles son los pasos que deberíamos seguir?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Identificar los puntos del sistema que necesitan ser protegidos, comprobando, antes de realizar el acceso, que el usuario que está realizando el acceso está autenticado y tiene los privilegios necesarios para hacerlo. En resumen, estamos identificando los "joint point" que requieren ser securizados.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Construiremos un pointcut (o varios, todos los que sean necesarios), que permitan la selección de los "&lt;span style="font-style: italic;"&gt;joint point&lt;/span&gt;" descritos en el punto anterior.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Construiremos un aspecto que encapsule toda la lógica de seguridad requerida.&lt;/li&gt;&lt;/ul&gt;Los conceptos anteriores son sumamente importantes dado que componen la base de AOP. A lo largo de los siguientes postz profundizaremos en cada uno de ellos.&lt;br /&gt;&lt;br /&gt;Para terminar esta entrada simplemente analizaremos la definición de &lt;span style="font-style: italic;"&gt;joint point&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;Un join point es un punto de ejecución en un sistema. Así por ejemplo, el acceso al campo de una clase, la ejecución de una función o una sentencia for son ejemplos claros de join points.&lt;br /&gt;&lt;br /&gt;AspectJ solamente expone un subconjunto de todos los posibles joint points, limitando de este modo, el acceso a las construcciones más estables.&lt;br /&gt;&lt;br /&gt;En el siguiente post analizaremos con un poco más de profundidad los &lt;span style="font-style: italic;"&gt;pointcuts&lt;/span&gt;,para, posteriormente, analizar las categorías de &lt;span style="font-style: italic;"&gt;joint points&lt;/span&gt; existentes.&lt;br /&gt;&lt;br /&gt;Hasta pronto,&lt;br /&gt;&lt;br /&gt;Migue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-7539319185215344182?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/7539319185215344182/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=7539319185215344182' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7539319185215344182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/7539319185215344182'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/10/modelo-de-joint-point-i.html' title='Modelo de Joint Point (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4696369806910185075</id><published>2009-10-04T21:49:00.003+02:00</published><updated>2009-10-04T22:02:45.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AspectJ'/><category scheme='http://www.blogger.com/atom/ns#' term='Real World'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring DM'/><category scheme='http://www.blogger.com/atom/ns#' term='Osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AOP en el mundo real</title><content type='html'>Hace tiempo había escrito algún post relativo a AOP y AspectJ y nunca he tenido la ocasión de continuar con aquella de serie de posts, así que . . . . intentando retomar la dinámica de escribir aquí con una frecuencia aceptable; continuemos aquella miniserie con una visión del uso en el mundo real de AOP.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Aplicaciones empresariales&lt;/span&gt; .Gestión de transacciones, seguridad, auditoría, monitorización, gestión de la concurrencia, manejor de errores y un largo ecétera son funcionalidades transversales en la mayoría de aplicaciones empresariales. Aquellas aplicaciones que usen Spring como base de su arquitectura ya estarán utilizando algunos de los aspectos que vienen facilitados por el framework. Gracias a las anotaciones, concretamente &lt;span style="font-style: italic;"&gt;@Aspect&lt;/span&gt;, la construcción de aspectos se ha convertido en una tarea habitual.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Web y servidores de aplicaciones.&lt;/span&gt; Aplicación de políticas, FFDC, recolección de contextos,trazabilidad o monitorización son algunas de las funcionalidades basadas en AOP que podemos encontrar en los servidores de aplicaciones. Spring Source DM Server y TC Server son un claro ejemplo de estas funcionalidades.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Frameworks&lt;/span&gt;. Gestión de transacciones y seguridad son habitualmente implementadas mediante aspectos. Asimismo, otras utilizaciones de los aspectos podría ser la inyección de dependencias en en objetos de dominio. Para obtener un amplio abanico de posibilidades de uso de los aspectos, el usuario podría visitar los proyectos de Spring Roo o Apache Magma.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;Herramientas de monitorización. &lt;span style="font-weight: normal;"&gt;El uso de aspectos facilita también la construcción de herramientas de monitorización. Muchas herramientas utilizan AspectoJ como tecnología subyacente: Glassbox,Perf4J,Contract4J,JXInsight o MaintainJ son algunos de los ejemplos&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Compiladores e integración de IDE's&lt;/span&gt;.La propia gente de AspectJ utiliza la propia tecnologia para extender el compilador de JDT de manera que sea capaz de sopotar las nuevas construcciones. AJDT utilizan un proceso de weaving a través de una implementación basada en OSGI ofrecida por el proyecto Equinox. Scala IDE en Eclipse utiliza un enfoque similar para la construcción de su entorno de desarrollo.&lt;/li&gt;&lt;/ul&gt;En el desarrollo de nuestros productos software nosotros también hacemos uso de AOP para arquitectar nuestras soluciones (además de las enumeradas anteriormente), así por ejemplo, utilizamos AspectJ para la gestión del estado "dirty" de un metamodelo, o para la generación de las licencias de uso de nuestros productos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-4696369806910185075?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4696369806910185075/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4696369806910185075' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4696369806910185075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4696369806910185075'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/10/aop-en-el-mundo-real.html' title='AOP en el mundo real'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3956355772288824041</id><published>2009-10-01T15:00:00.004+02:00</published><updated>2009-10-01T15:32:53.396+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><title type='text'>Great ebook</title><content type='html'>An amazing reading about software developement.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codersatwork.com"&gt;&lt;br /&gt;Ebook link&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Interviewers with 15 of the most interesting programmers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Frances Allen: Pioneer in optimizing compilers, first woman to win the Turing Award (2006) and first female IBM fellow&lt;/li&gt;&lt;li&gt;Joe Armstrong: Inventor of Erlang&lt;/li&gt;&lt;li&gt;Joshua Bloch: Author of the Java collections framework, now at Google&lt;/li&gt;&lt;li&gt;Bernie Cosell: One of the main software guys behind the original ARPANET IMPs and a master debugger&lt;/li&gt;&lt;li&gt;Douglas Crockford: JSON founder, JavaScript architect at Yahoo!&lt;/li&gt;&lt;li&gt;L. Peter Deutsch: Author of Ghostscript, implementer of Smalltalk-80 at Xerox PARC and Lisp 1.5 on PDP-1&lt;/li&gt;&lt;li&gt;Brendan Eich: Inventor of JavaScript, CTO of the Mozilla Corporation &lt;/li&gt;&lt;li&gt;Brad Fitzpatrick: Writer of LiveJournal, OpenID, memcached, and Perlbal &lt;/li&gt;&lt;li&gt;Dan Ingalls: Smalltalk implementor and designer&lt;/li&gt;&lt;li&gt;Simon Peyton Jones: Coinventor of Haskell and lead designer of Glasgow Haskell Compiler&lt;/li&gt;&lt;li&gt;Donald Knuth: Author of &lt;em&gt;The Art of Computer Programming&lt;/em&gt; and creator of TeX&lt;/li&gt;&lt;li&gt;Peter Norvig: Director of Research at Google and author of the standard text on AI&lt;/li&gt;&lt;li&gt;Guy Steele: Coinventor of Scheme and part of the Common Lisp Gang of Five, currently working on Fortress&lt;/li&gt;&lt;li&gt;Ken Thompson: Inventor of UNIX&lt;/li&gt;&lt;li&gt;Jamie Zawinski: Author of XEmacs and early Netscape/Mozilla hacker&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt; &lt;br /&gt;I think it's a recommended reading!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3956355772288824041?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3956355772288824041/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3956355772288824041' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3956355772288824041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3956355772288824041'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/10/great-ebook.html' title='Great ebook'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6055514443357663612</id><published>2009-09-30T07:52:00.003+02:00</published><updated>2009-09-30T08:08:27.100+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Technologies'/><title type='text'>Hype Cicle</title><content type='html'>Hype Cycle es una representación gráfica del grado de madurez, adopción y aplicación en el mundo real de una tecnología determinada.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XFfdslVc5Pw/SsL0pMK7vFI/AAAAAAAABFY/UazXN503Mhc/s1600-h/Gartner_Hype_Cycle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 208px;" src="http://4.bp.blogspot.com/_XFfdslVc5Pw/SsL0pMK7vFI/AAAAAAAABFY/UazXN503Mhc/s320/Gartner_Hype_Cycle.png" alt="" id="BLOGGER_PHOTO_ID_5387137092767431762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si comprendemos bien el gráfico anterior, y la posición que la tecnología que estamos considerando ocupa en el mismo, dispondremos de una visión mucho más ajustada de los riesgos y beneficios a los que nos estamos exponiendo.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;La interpretación de la curva Hype Cicle implica cinco fases diferentes las cuales analizaremos a continuación. &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Activación de la tecnología&lt;/span&gt;: Este es el momento en el que la tecnología aparece con la intención/promesa de solucinar un conjunto determinado de problemas. Podría ser el anuncio de un nuevo producto o la liberación de una nueva versión de un produco ya existente.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Expectativas irreales ("peak")&lt;/span&gt;:Durante esta fase la tecnlogía se hace muy popular. Todo el mundo quiere conocerla y tiene una opinión sobre ella aunque muy poca gente la utiliza en aplicaciones reales.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Desilusión&lt;/span&gt;: Esta es la fase de ciclo Hype en la que la tecnología comienza a perder toda la atención que se le había prestado hasta el momento.&lt;br /&gt;Mientras que los equipos que la adoptaron desde sus inicios continuan utilizándola con el objetivo de obtener una ventaja competitiva, muchos otros comienzan a observar con cierto escepticismo. Nuevas tecnologías aparecen en escena aportando soluciones diferentes al mismo problema. Resulta interesante destacar que muchos de estos nuevos competidores están en la fase de "expectativas irreales".&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Viendo la luz&lt;/span&gt;:Numerosos factores intervienen en el desarrollo de esta fase: maduración de la tecnología, cambios en la misma para acercarse a la realidad, búsqueda de un contexto de uso en el que realmente se cause impacto o la "desilusión" con otras alternativas, que en su momento fueron competidores, son algunas de ellas.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Plena productividad&lt;/span&gt;:La última fase definida en el ciclo Hype. En esta situación la tecnología está ampliamente difundida y se utiliza en las solución de problemas para los que ofrece una gran respuesta. Será en esta fase cuando se produzca una aceptación mavisa de la tecnología.&lt;/li&gt;&lt;/ul&gt;Si a alguien le interesa, Harvard Business Press publicó el libro &lt;i&gt;Mastering the Hype Cycle: How to Adopt the Right Innovation at the Right Time.&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;Hasta pronto&lt;br /&gt;&lt;br /&gt;Migue&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-6055514443357663612?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/6055514443357663612/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=6055514443357663612' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6055514443357663612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/6055514443357663612'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/09/hype-cicle.html' title='Hype Cicle'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XFfdslVc5Pw/SsL0pMK7vFI/AAAAAAAABFY/UazXN503Mhc/s72-c/Gartner_Hype_Cycle.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2188014931835247979</id><published>2009-09-12T12:19:00.003+02:00</published><updated>2009-09-12T12:20:57.676+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Music'/><category scheme='http://www.blogger.com/atom/ns#' term='Fito'/><category scheme='http://www.blogger.com/atom/ns#' term='General'/><title type='text'>El puto amo</title><content type='html'>Hay cosas que no cambian nunca:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ALcJWC8aMxw&amp;hl=es&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ALcJWC8aMxw&amp;hl=es&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sintiendolo mucho no tengo mas tiempo para el blog, espero que dentro de poquito pueda dedicarle todo el tiempo que me gustaria.&lt;br /&gt;&lt;br /&gt;Un abrazo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-2188014931835247979?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2188014931835247979/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2188014931835247979' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2188014931835247979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2188014931835247979'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/09/el-puto-amo.html' title='El puto amo'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3434237460394912196</id><published>2009-08-22T12:14:00.003+02:00</published><updated>2009-08-22T12:17:28.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern Design'/><title type='text'>C++ Singleton Pattern (y II)</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;&lt;div style="text-align: justify; "&gt;Y ya que estamos, os dejo la segunda parte que también había escrito hace bastante tiempo :)  &lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;Vamos a continuar con el patrón de diseño Singleton que habíamos comenzado en un post anterior. Intentaremos añadir alguna que otra mejora. Vayamos poquito a poquito:&lt;br /&gt;&lt;br /&gt;Un primer cambio que podríamos realizar sería el de retornar una referencia en lugar de un puntero en el método getInstance(); de este modo evitaríamos que el usuario que obtiene una referencia del objeto intentase aplicarle el operador delete. El prototipo del nuevo método podría ser algo parecido a lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; "&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;static singletonPattern &amp;amp; getInstance();&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ahora podríamos pensar en que ocurre cuando se destruye el singleton.Realmente no se trata un &lt;span style="font-style: italic; "&gt;memory leak&lt;/span&gt; tradicional sino un &lt;span style="font-style: italic; "&gt;resource leak&lt;/span&gt;. El singleton podría haber adquirido diversos recursos del sistema operativo como un socket,un semáforo,...... Con el objetivo de solucionar este problema, Scott Meyers facilitó una solución sencilla (y muy elegante): en lugar de almacenar un puntero a un objeto de tipo Singleton instancial una variable local estática del siguiente modo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; "&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;singletonPattern &amp;amp; getInstance(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;static &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;singletonPattern instance;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;br /&gt;return instance;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify; "&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;/span&gt;El fragmento anterior se conoce como el singleton de Meyers y se basa en, tal y como describe Alexandrecu en su libro &lt;a href="http://www.amazon.com/Modern-Design-Programming-Patterns-Depth/dp/0201704315"&gt;Modern C++ Desing:Generic Programming and Patterns Applied&lt;/a&gt;, "&lt;i&gt;some compiler magic&lt;/i&gt;": un objeto estático de una función es inicializado, en tiempo de ejecución, en el momento de la primera pasada de la definición.&lt;br /&gt;&lt;br /&gt;Este par de soluciones son, aparentemente sencillas, y pueden ayudarnos a construir un Singleton mucho más robusto.&lt;br /&gt;&lt;br /&gt;En el libro de Alexandrescu mencionado anteriormente plantea otros problemas tales como las referencias muertas (a las cuales aplica soluciones elegantes e ingeniosas) o los problemas derivados de la interacción de los hilos y los singleton.&lt;br /&gt;&lt;br /&gt;Desde mi punto de vista el singleton es un patrón de diseño muy sencillo conceptualmente pero que, llegada la hora de implementarlo, no resulta tan evidente como pueda parecer en un principio.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-3434237460394912196?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3434237460394912196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3434237460394912196' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3434237460394912196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3434237460394912196'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/08/c-singleton-pattern-y-ii.html' title='C++ Singleton Pattern (y II)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5210618775105981155</id><published>2009-08-22T12:03:00.003+02:00</published><updated>2009-08-22T12:14:01.455+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Pattern Design'/><title type='text'>C++ Singleton Pattern (I)</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: 'Times New Roman'; "&gt;&lt;div style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; width: auto; font: normal normal normal 100%/normal Georgia, serif; text-align: left; "&gt;&lt;div style="text-align: justify; "&gt;Os dejo un post que había escrito hace mucho tiempo en otro blog; está dedicado a C++ y a los patrones de diseño.&lt;/div&gt;&lt;div style="text-align: justify; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify; "&gt;Os propongo una implementación del patrón de diseño Singleton (uno de los patrones de diseño más simples aunque creo que muchas veces lo utilizamos de forma no demasiado apropiada).&lt;br /&gt;&lt;br /&gt;El patrón anterior nos garantiza que, desde el momento en que instanciamos un objeto de dicha clase, será esa la única instancia que exista de dicho objeto. Existen multitud de libros acerca de patrones de diseño y con multitud de aplicaciones de los mismos. Yo desde aquí nada más pretendo dejaros mi experiencia y el uso que yo le he dado en mis aplicaciones. Por ejemplo, este patrón lo he utilizado en el desarrollo de un compilador para representar los &lt;span style="font-style: italic; "&gt;builtin type&lt;/span&gt;. Vamos allá:&lt;br /&gt;&lt;br /&gt;En primer lugar definimos la clase singletonPattern y el método que nos permitira obtener una referencia al mismo (hacemos que el constructor sea privado para que no se puedan crear objetos de ese tipo):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;class singletonPattern{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0); font-family:courier new;"&gt;private:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;span style="color: rgb(51, 204, 0); "&gt;/// unique instance of the object&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;static singletonPattern * instance;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;&lt;span style="color: rgb(51, 204, 0); "&gt;/// Default Constructor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;singletonPattern(){}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0); font-family:courier new;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family:courier new;"&gt;/*!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family:courier new;"&gt;Returns the reference&lt;br /&gt;to the unique instance of the object&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family:courier new;"&gt;(if it's the first time create de reference)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;static singletonPattern * getInstance(){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;if(instance == NULL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;instance = new singletonPattern();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;return instance;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0); font-family:courier new;"&gt;// init the static member&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255); font-family:courier new;"&gt;singletonPattern * singletonPattern :: instance = NULL;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El código anterior no estaría completo dado que nos queremos asegurar de que nuestra instancia sea única por lo que tendremos que implementar el constructor de copia y el operador de asignación (no tiene sentido el operador de asignación en el singleton) como privados dentro de nuestra clase singletonPattern. Algo como lo que sigue:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); "&gt;/// Copy Constructor&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; font-family:courier new;"&gt;singletonPattern(const singletonPattern &amp;amp; sp){}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-weight: bold; "&gt;/// Assignement Operator&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; font-family:courier new;"&gt;singletonPattern &amp;amp; operator=(singletonPattern &amp;amp; sp){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; font-family:courier new;"&gt;return *this;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si quisieramos utilizar esta clase en uno de nuestros programas no tendríamos más que declarar un objeto tal y como a continuación se muestra:&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; "&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold; font-family:courier new;"&gt;singletonPattern * singleton = singletonPattern::getInstance();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y listo. Con esto tendremos nuestro patrón de diseño Singleton listo para disponer de el cuando deseemos.&lt;br /&gt;&lt;br /&gt;Desde el siguiente enlace podeis descargaros el código fuente completo junto con un makefile:&lt;a href="http://www.box.net/public/z0u1c2c0ao"&gt;singletonPatterC++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5210618775105981155?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5210618775105981155/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5210618775105981155' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5210618775105981155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5210618775105981155'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/08/c-singleton-pattern-i.html' title='C++ Singleton Pattern (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-8686332202664285260</id><published>2009-08-07T11:07:00.004+02:00</published><updated>2009-08-07T11:21:47.928+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vigo'/><category scheme='http://www.blogger.com/atom/ns#' term='Madrid'/><category scheme='http://www.blogger.com/atom/ns#' term='NeoMetrics'/><category scheme='http://www.blogger.com/atom/ns#' term='Holidays'/><title type='text'>Vigo &amp; Madrid</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_XFfdslVc5Pw/SnvxQKDMmuI/AAAAAAAABDA/nwwlW6_Umi4/s640/P1010275.JPG"&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Some weekends ago we have been in Vigo and Madrid (to a company meeting) :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_XFfdslVc5Pw/SnvwDAt4sTI/AAAAAAAABBY/stZpgm2VOlI/s640/P1010250.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 640px; height: 480px;" src="http://lh4.ggpht.com/_XFfdslVc5Pw/SnvwDAt4sTI/AAAAAAAABBY/stZpgm2VOlI/s640/P1010250.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://lh6.ggpht.com/_XFfdslVc5Pw/SnvwZxsDf0I/AAAAAAAABB0/1pLao5djVCU/s640/P1010257.JPG" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 640px; height: 480px; " /&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://lh4.ggpht.com/_XFfdslVc5Pw/SnvwjF7gjaI/AAAAAAAABCE/SbeMqdC24-w/s640/P1010261.JPG" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 640px; height: 480px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;img src="http://lh4.ggpht.com/_XFfdslVc5Pw/SnvxQKDMmuI/AAAAAAAABDA/nwwlW6_Umi4/s640/P1010275.JPG" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 640px; height: 480px; " /&gt;&lt;/span&gt;&lt;img src="http://lh3.ggpht.com/_XFfdslVc5Pw/SnvxNpuRZNI/AAAAAAAABC8/4xGdHP151iM/s512/P1010274.JPG" border="0" alt="" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 384px; height: 512px; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Bye!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-8686332202664285260?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/8686332202664285260/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=8686332202664285260' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8686332202664285260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8686332202664285260'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/08/vigo-madrid.html' title='Vigo &amp; Madrid'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_XFfdslVc5Pw/SnvwDAt4sTI/AAAAAAAABBY/stZpgm2VOlI/s72-c/P1010250.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4180496715757360544</id><published>2009-08-07T10:43:00.003+02:00</published><updated>2009-08-07T10:58:41.905+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Framekorks'/><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Frameworks</title><content type='html'>Some weeks ago an interesting book arrives to my personal library :)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;a href="http://www.amazon.com/gp/product/1430209739/ref=cm_rdp_product"&gt;Practical API Design. Confessions of a Java.Framework Architect&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Althought last weeks  my enjoy time is not enought to read the whole book i have been reading the starting chapters. Anyone has read it completely?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-4180496715757360544?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4180496715757360544/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4180496715757360544' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4180496715757360544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4180496715757360544'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/08/frameworks.html' title='Frameworks'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-3855604996510087299</id><published>2009-07-11T11:29:00.004+02:00</published><updated>2009-07-11T11:54:22.408+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='MOP'/><category scheme='http://www.blogger.com/atom/ns#' term='Dynamic Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy Metaclass</title><content type='html'>One of my favourites Groovy´s features is its MOP architecture. It allow us introducing new methods at runtime thanks to the &lt;a href="http://groovy.codehaus.org/MetaClass+Redesign+(by+blackdrag)"&gt;metaClass&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We can define a new class&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;class SampleClass {&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   // class field&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   def propertyOne&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   // one sample Closure&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   def closureOne = {&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;       println "I´m the closure one"&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Now we add a new method at runtime&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;SampleClass.metaClass.runtimeAddedMethod = {&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    println "I´m runtimeAddedMethod"&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Declare a new instance an test all the methods&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;def instance = new SampleClass()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Call to the closure declared in class definition&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;instance.closureOne()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Call to the method added at runtime&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;instance.runtimeAddedMethod()&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;We add a method to the "instance" too&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;instance.metaClass.instanceRuntimeAddedMethod = { &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;    println "I´m the method added at runtime to a single instance"&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;instance.instanceRuntimeAddedMethod()&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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/35092134-3855604996510087299?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/3855604996510087299/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=3855604996510087299' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3855604996510087299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/3855604996510087299'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/07/groovy-metaclass.html' title='Groovy Metaclass'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-455168055062973855</id><published>2009-07-03T19:44:00.005+02:00</published><updated>2009-07-03T20:12:09.163+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trips'/><category scheme='http://www.blogger.com/atom/ns#' term='Amsterdam'/><category scheme='http://www.blogger.com/atom/ns#' term='Europe'/><category scheme='http://www.blogger.com/atom/ns#' term='Photos'/><category scheme='http://www.blogger.com/atom/ns#' term='Holidays'/><title type='text'>Amsterdam Photos</title><content type='html'>&lt;div&gt;Some photos of our last trip to Amsterdam:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_XFfdslVc5Pw/Skk6snc5ERI/AAAAAAAAA18/vEji3Eyk5ow/s576/P1010223.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;" src="http://lh5.ggpht.com/_XFfdslVc5Pw/Skk6snc5ERI/AAAAAAAAA18/vEji3Eyk5ow/s576/P1010223.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_XFfdslVc5Pw/Skk7UYDu7cI/AAAAAAAAA2c/KoA8ok8Qevw/s576/P1010231.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;" src="http://lh5.ggpht.com/_XFfdslVc5Pw/Skk7UYDu7cI/AAAAAAAAA2c/KoA8ok8Qevw/s576/P1010231.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Chihi: Art essence (trying to become famous jajajaja)&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_XFfdslVc5Pw/Skk3FppCsvI/AAAAAAAAAyk/N9l5SeI9zKw/s400/P1010172.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://lh6.ggpht.com/_XFfdslVc5Pw/Skk3FppCsvI/AAAAAAAAAyk/N9l5SeI9zKw/s400/P1010172.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;i amsterdam&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_XFfdslVc5Pw/SkkxLNZaiZI/AAAAAAAAAsY/GlitJQ_nCv0/s576/P1010075.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;"  src="http://lh4.ggpht.com/_XFfdslVc5Pw/SkkxLNZaiZI/AAAAAAAAAsY/GlitJQ_nCv0/s576/P1010075.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;all the travelers (I was tooking the photo)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_XFfdslVc5Pw/SkkzUN5LDlI/AAAAAAAAAvM/5yAvwx-Zz1I/s576/P1010117.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;" src="http://lh5.ggpht.com/_XFfdslVc5Pw/SkkzUN5LDlI/AAAAAAAAAvM/5yAvwx-Zz1I/s576/P1010117.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;Ita&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh4.ggpht.com/_XFfdslVc5Pw/SkkvtRU5FzI/AAAAAAAAAqQ/3YSKWLj6W2M/s400/P1010043.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://lh4.ggpht.com/_XFfdslVc5Pw/SkkvtRU5FzI/AAAAAAAAAqQ/3YSKWLj6W2M/s400/P1010043.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Dam Plac&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;e&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_XFfdslVc5Pw/SkkvwD0YkjI/AAAAAAAAAqU/1wrfKh9qyCA/s576/P1010044.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;" src="http://lh6.ggpht.com/_XFfdslVc5Pw/SkkvwD0YkjI/AAAAAAAAAqU/1wrfKh9qyCA/s576/P1010044.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;b&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Dam Plac&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;e&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh6.ggpht.com/_XFfdslVc5Pw/SkkxF3ktS3I/AAAAAAAAAsU/KV1GYt2jcfg/s576/P1010074.JPG"&gt;&lt;img style="display:block; margin:0px auto 15px; text-align:center;cursor:pointer; cursor:hand;width: 410px; height: 350px;" src="http://lh6.ggpht.com/_XFfdslVc5Pw/SkkxF3ktS3I/AAAAAAAAAsU/KV1GYt2jcfg/s576/P1010074.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;b&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Ita again&lt;/span&gt;&lt;/div&gt;&lt;/b&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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/35092134-455168055062973855?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/455168055062973855/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=455168055062973855' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/455168055062973855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/455168055062973855'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/07/amsterdam-photos.html' title='Amsterdam Photos'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_XFfdslVc5Pw/Skk6snc5ERI/AAAAAAAAA18/vEji3Eyk5ow/s72-c/P1010223.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4637646391239288408</id><published>2009-06-25T22:32:00.002+02:00</published><updated>2009-06-25T22:39:32.185+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Trips'/><category scheme='http://www.blogger.com/atom/ns#' term='Amsterdam'/><category scheme='http://www.blogger.com/atom/ns#' term='Holidays'/><title type='text'>Amsterdam Trip</title><content type='html'>Next few days (till next Monday) we are going to be in &lt;a href="http://es.wikipedia.org/wiki/Amsterdam"&gt;Amsterdam&lt;/a&gt; . I´ll upload some pictures to the back.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;PD: I have some incoming posts: R grammar and ANTLR (PFC), AspectJ examples, Groovy/Grails introduction and something more.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-4637646391239288408?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4637646391239288408/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4637646391239288408' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4637646391239288408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4637646391239288408'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/06/amsterdam-trip.html' title='Amsterdam Trip'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-8047604004812780601</id><published>2009-06-16T23:09:00.003+02:00</published><updated>2009-06-16T23:28:50.597+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Sofware Architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><title type='text'>AOP Benefits</title><content type='html'>&lt;p style="text-align: justify;"&gt;Muchas de las críticas sobre la metodología AOP argumenta que en muchas ocasiones es demasiado complejo. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;Personalmente, creo que al igual que cuando otras metodologías dieron el salto, como por ejemplo OOP, la novedad hace de ella su principal handicap.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Algunos de los beneficios del uso de una metodología AOP:&lt;/p&gt;&lt;div class="itemizedlist"&gt;&lt;ul&gt;&lt;li&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Responsabilidades claramente diferenciadas&lt;/em&gt;&lt;/span&gt; . Cada módulo es el responsable de su funcionalidad principal; dejando a un lado los conceptos transversales (croscutting concerns). Así por ejemplo, un módulo cuyo principal cometido es implementar la lógica de acceso a datos de un sistema de ventas por internet, no tendrá que preocuparse de realizar pooling sobre la base de datos o de la transaccionalidad. Gracias a esta clara asignación de responsabilidades conseguimos una alta trazabilidad entre los requisitos y su correspondiente implementación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Incremento de la modularidad&lt;/em&gt;&lt;/span&gt; . Utilizando AOP conseguimos manejar cada uno de los conceptos de manera independiente con un acoplamiento mínimo. Incluso aunque tengamos presentes conceptos transversales que afecten en todos los ámbitos del sistema, la implementación resultante es modular.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Retraso en las decisiones de diseño&lt;/em&gt;&lt;/span&gt; . Cuando se arquitecta un nuevo sistema siempre aparece el siguiente dilema: ¿debemos realizar un diseño sumamente complejo y detallado que intente abarcar todas las funcionalidades,incluso las futuras? o, por el contrario, ¿debemos arquiectar una solución que se corresponda con la situación actual?.&lt;/p&gt;&lt;p style="text-align: justify;"&gt;Gracias a AOP, el arquitecto de la solución, puede retrasar la toma de determinadas decisiones de diseño dado que los futuros requerimientos se implementarán en aspectos independientes.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Mejoras/Evoluciones más sencillas&lt;/em&gt;&lt;/span&gt; . AOP permite añadir una nueva funcionalidad sin más que desarrollar un nuevo aspecto (el cual no afecta al núcleo del sistema). Gracias a ello, el tiempo de respuesta ante nuevos requerimientos disminuye notablemente puesto que la implentación y diseño de los nuevos requisitos no supondrán, idealmente, una modificación del núcleo del sistema que estamos construyendo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Reutilización del código &lt;/em&gt;&lt;/span&gt; .AOP establece cada uno de los aspectos es un módulo independiente, de modo que resultan independientes entre si. En general, cada uno de ellos no suelen tener conocimiento del resto de elementos que conforman el sistema final. &lt;/p&gt;&lt;p style="text-align: justify;"&gt;El único elemento consciente del acoplamiento entre los diferentes módulos son las &lt;span class="emphasis"&gt;&lt;em&gt;reglas de tejido (weaving rules)&lt;/em&gt;&lt;/span&gt; , de modo que, si cambiamos éstas, podemos componer un sistema final completamente diferente.&lt;/p&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;span class="emphasis"&gt;&lt;em&gt;Reducción de costes&lt;/em&gt;&lt;/span&gt;. Las características descritas en los puntos anteriores generan sistemás desarrollos mucho más rápidos. Asimismo, eliminando la necesidad de modificar múltiples módulos para la implementación de un nuevo concepto que afecta al sistema completo, AOP provoca que dicha implementación sea más barata. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="text-align: justify;"&gt;&lt;i&gt;Areas de conocimiento. P&lt;/i&gt;ermitiendo que los desarrolladores estén centrados en su especialidad lograremos que el coste del desarrollo disminuya puesto que estaremos concentrando los esfuerzos.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;En siguientes post veremos una introducción a AspectJ para adentrarnos un poquito más en el mundo de la orientación a aspectos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hasta pronto!&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-8047604004812780601?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/8047604004812780601/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=8047604004812780601' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8047604004812780601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/8047604004812780601'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/06/aop-benefits.html' title='AOP Benefits'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-4304875987316729824</id><published>2009-06-03T21:01:00.008+02:00</published><updated>2009-06-03T21:59:39.347+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='New York'/><category scheme='http://www.blogger.com/atom/ns#' term='Trips'/><category scheme='http://www.blogger.com/atom/ns#' term='Photos'/><title type='text'>Some New York Photos (I)</title><content type='html'>&lt;div&gt;Some of our New York pictures:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Murrays bagel: ummmmm!!! Our favourite breakfast :-)&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XFfdslVc5Pw/SibTcGiTjbI/AAAAAAAAAT4/zZ4wm8mHRMY/s1600-h/MurraysBagels.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_XFfdslVc5Pw/SibTcGiTjbI/AAAAAAAAAT4/zZ4wm8mHRMY/s400/MurraysBagels.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343190487665970610" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;M&amp;amp;M´s store:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFfdslVc5Pw/SibMnUa8oPI/AAAAAAAAATw/7k4zoREqb0A/s1600-h/Emanems.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_XFfdslVc5Pw/SibMnUa8oPI/AAAAAAAAATw/7k4zoREqb0A/s400/Emanems.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343182983790371058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Central Park from TOR:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFfdslVc5Pw/SibMnPxkvTI/AAAAAAAAATo/1-bfzF7nv1U/s1600-h/CentralParkFromTor.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_XFfdslVc5Pw/SibMnPxkvTI/AAAAAAAAATo/1-bfzF7nv1U/s400/CentralParkFromTor.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343182982543097138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;St Pauls Chapel&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XFfdslVc5Pw/SibMmwbZTwI/AAAAAAAAATg/l3-OAbiwPk8/s1600-h/Bell.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_XFfdslVc5Pw/SibMmwbZTwI/AAAAAAAAATg/l3-OAbiwPk8/s400/Bell.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343182974128574210" /&gt;&lt;/a&gt;Manhattan:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XFfdslVc5Pw/SibMmsmQUBI/AAAAAAAAATY/AzJF_CCttOs/s1600-h/ManhatanDesdeBarco.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_XFfdslVc5Pw/SibMmsmQUBI/AAAAAAAAATY/AzJF_CCttOs/s400/ManhatanDesdeBarco.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343182973100380178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;New York night from Empire State:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XFfdslVc5Pw/SibMmelY11I/AAAAAAAAATQ/kmzSxDHa8zY/s1600-h/NewYorkNIght.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_XFfdslVc5Pw/SibMmelY11I/AAAAAAAAATQ/kmzSxDHa8zY/s400/NewYorkNIght.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5343182969338648402" /&gt;&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The SDHC card has more than 750 pictures :) ; i´ll upload some of them in future posts!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!!&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/35092134-4304875987316729824?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/4304875987316729824/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=4304875987316729824' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4304875987316729824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/4304875987316729824'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/06/some-new-york-photos-i.html' title='Some New York Photos (I)'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_XFfdslVc5Pw/SibTcGiTjbI/AAAAAAAAAT4/zZ4wm8mHRMY/s72-c/MurraysBagels.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-5082100832622200413</id><published>2009-05-18T07:57:00.002+02:00</published><updated>2009-05-18T08:01:34.667+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='New York'/><category scheme='http://www.blogger.com/atom/ns#' term='Trips'/><category scheme='http://www.blogger.com/atom/ns#' term='Holidays'/><title type='text'>New York Holidays</title><content type='html'>Next few days i will be in New York with my girlfriend :).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I´ll tell you to the back!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See you soon!!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35092134-5082100832622200413?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/5082100832622200413/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=5082100832622200413' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5082100832622200413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/5082100832622200413'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/05/new-york-holidays.html' title='New York Holidays'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-2528112597416174397</id><published>2009-05-13T22:27:00.003+02:00</published><updated>2009-05-13T23:18:51.244+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ebooks'/><category scheme='http://www.blogger.com/atom/ns#' term='GMF'/><category scheme='http://www.blogger.com/atom/ns#' term='EMF'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Refactor'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>My last favourite ebooks</title><content type='html'>Some of my favourite last reads:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"&gt;Clean Code, A handbook of Agile Software Craftsmanship&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Programming-Erlang-Software-Concurrent-World/dp/193435600X"&gt;Programming Erlang: Software for a Concurrent World&lt;/a&gt; (i am reading it now)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Refactoring-Large-Software-Projects-Restructurings/dp/0470858923"&gt;Refactoring in Large Software Projects: Performing Complex Restructurings Succesfully&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Incoming . . . &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Equinox-OSGi-Power-Behind-Eclipse/dp/0321585712"&gt;Equinox and Osgi: The power behind Eclipse&lt;/a&gt; (noy yet published)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amazon.com/Eclipse-Modeling-Project-Domain-Specific-Language/dp/B001XT60YW"&gt;Eclipse Modeling Project: A domain-specific language (DSL) Toolkit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.manning.com/laddad2/"&gt;AspectJ in Action,Second Edition&lt;/a&gt;&lt;a href="http://www.manning.com/laddad2/"&gt; (&lt;/a&gt;MEAP available)&lt;/li&gt;&lt;li&gt;. . . . . . &lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I´m trying to practice my poor English :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bye!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&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/35092134-2528112597416174397?l=miguelinlas3.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://miguelinlas3.blogspot.com/feeds/2528112597416174397/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35092134&amp;postID=2528112597416174397' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2528112597416174397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35092134/posts/default/2528112597416174397'/><link rel='alternate' type='text/html' href='http://miguelinlas3.blogspot.com/2009/05/my-last-favourite-ebooks.html' title='My last favourite ebooks'/><author><name>migue</name><uri>http://www.blogger.com/profile/00380329298723040751</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://2.bp.blogspot.com/_XFfdslVc5Pw/Si1MXaE5SpI/AAAAAAAAAUc/UyT58jizod8/S220/me.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35092134.post-6088829376346355453</id><published>2009-04-20T22:50:00.004+02:00</published><updated>2009-04-20T23:01:04.642+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>Maven next generation</title><content type='html'>&lt;span property="media:title"&gt;Presentación sobre Maven 3 de &lt;a href="http://www.sonatype.com/people/author/jason/"&gt;Jason&lt;/a&gt;&lt;a href="http://www.sonatype.com/people/author/jason/"&gt; van Zyel&lt;/a&gt; en&lt;/span&gt;&lt;span property="dc:description"&gt; el Maven Meetup del 19 de Marzo de este año&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Son 28 transparencias acerca del futuro de Maven, la verdad que no tienen desperdicio&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_453595636924594" name="doc_453595636924594" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" rel="media:document" resource="http://d.scribd.com/ScribdViewer.swf?document_id=14458957&amp;amp;access_key=key-2fz3siqzg0w1i9sw47gv&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=" media="http://search.yahoo.com/searchmonkey/media/" dc="http://purl.org/dc/terms/" width="100%" align="middle" height="500"&gt;  &lt;param name="movie" value="http://d.scribd.com/ScribdViewer.swf?document_id=14458957&amp;amp;access_key=key-2fz3siqzg0w1i9sw47gv&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode="&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;        &lt;embed src="http://d.scribd.com/ScribdViewer.swf?document_id=14458957&amp;amp;access_key=key-2fz3siqzg0w1i9sw47gv&amp;amp;page=1&amp;amp;version=1&amp;amp;viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_453595636924594_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" width="100%" align="middle" height="500"&gt;&lt;/embed&gt;             &lt;span rel="media:thumbnail" href="http://i.scribd.com/public/images/uploaded/22130692/7Qd6Al8iTPDUih5QlqSE_thumbnail.jpeg"&gt;       &lt;/span&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;Aquí os dejo también el video de la presentación:&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4156556&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.c
