Enrique Zamudio https://sg.com.mx/ en ¿Qué significa ser un programador en Bitso? https://sg.com.mx/buzz/ponencias/talks-2-code/que-significa-ser-un-programador-en-bitso <span class="field field--name-title field--type-string field--label-hidden">¿Qué significa ser un programador en Bitso?</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/talks-2-code-edicion-2020" hreflang="zxx">Talks 2 Code Edición 2020</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/57695" lang="" about="/user/57695" typeof="schema:Person" property="schema:name" datatype="" class="username">AlbertoRJ</a></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 06/25/2020 - 21:26</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/vbdpO3ns9GY" width="560"></iframe></p> <p><iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/2sDhglc7GmV5tM" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="595"></iframe></p> <div style="margin-bottom:5px"><strong><a href="//www.slideshare.net/RevistaSG/qu-significa-ser-un-programador-en-bitso" target="_blank" title="¿Qué significa ser un programador en Bitso?">¿Qué significa ser un programador en Bitso?</a> </strong> from <strong><a href="https://www.slideshare.net/RevistaSG" target="_blank">Software Guru</a></strong></div> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p> <style type="text/css"><!--td {border: 1px solid #ccc;}br {mso-data-placement:same-cell;}--> </style> Te has preguntado hacia dónde te quieres dirigir como programador y como llegar a ese punto.<br /> En esta charla Enrique nos habla sobre la importancia de saber responder esta pregunta y encontrar un lugar de trabajo que te ayude a crecer como programador.</p> </div> <div class="field field--name-field-start-date field--type-datetime field--label-above"> <div class="field__label">Fecha de sesión</div> <div class="field__item"><time datetime="2020-06-18T12:00:00Z" class="datetime">Thu, 06/18/2020 - 12:00</time> </div> </div> Fri, 26 Jun 2020 02:26:09 +0000 AlbertoRJ 9250 at https://sg.com.mx Bitso https://sg.com.mx/buzz/ponencias/showcase-bp2c-2020-ciudad-de-mexico/bitso <span class="field field--name-title field--type-string field--label-hidden">Bitso</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/showcase-bp2c-2020-ciudad-de-mexico" hreflang="zxx">Showcase BP2C 2020 Ciudad de México</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/44582" lang="" about="/user/44582" typeof="schema:Person" property="schema:name" datatype="" class="username">Ivett Sanchez</a></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 03/11/2020 - 12:21</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> <li><a href="/buzz/autores/andres-martinez-osorio" hreflang="zxx">Andrés Martínez Osorio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/Ab-LXCREymg" width="560"></iframe></p> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Bitso’s story begins with the inception of Bitcoin. In 2008, an anonymous person or group of people released the Bitcoin White Paper.</p> </div> <div class="field field--name-field-start-date field--type-datetime field--label-above"> <div class="field__label">Fecha de sesión</div> <div class="field__item"><time datetime="2020-03-06T12:00:00Z" class="datetime">Fri, 03/06/2020 - 12:00</time> </div> </div> Wed, 11 Mar 2020 18:21:11 +0000 Ivett Sanchez 9062 at https://sg.com.mx Bitso: El viaje para convertir una arquitectura monolítica en un monolito distribuido https://sg.com.mx/buzz/ponencias/real/bitso-el-viaje-para-convertir-una-arquitectura-monolitica-en-un-monolito <span class="field field--name-title field--type-string field--label-hidden">Bitso: El viaje para convertir una arquitectura monolítica en un monolito distribuido</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/real" hreflang="zxx">REAL</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/44582" lang="" about="/user/44582" typeof="schema:Person" property="schema:name" datatype="" class="username">Ivett Sanchez</a></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 12/02/2019 - 16:21</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> <li><a href="/buzz/autores/sergio-martinez" hreflang="zxx">Sergio Martinez</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/HNNPXHwc6AZVUJ" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="595"></iframe></p> <div style="margin-bottom:5px"><strong><a href="//www.slideshare.net/RevistaSG/bitso-el-viaje-para-convertir-una-arquitectura-monoltica-en-un-monolito-distribuido" target="_blank" title="Bitso: El viaje para convertir una arquitectura monolítica en un monolito distribuido">Bitso: El viaje para convertir una arquitectura monolítica en un monolito distribuido</a> </strong> de <strong><a href="https://www.slideshare.net/RevistaSG" target="_blank">Software Guru</a></strong></div> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Estamos convirtiendo una arquitectura monolítica en un monolito distribuido y pasamos de administrar servidores y aplicaciones manualmente a usar kubernetes e implementar CD/CI.<br /> <em>Puntos clave: Continuous integration, sistemas distribuidos, kubernetes</em></p> </div> Mon, 02 Dec 2019 22:21:45 +0000 Ivett Sanchez 8975 at https://sg.com.mx Cómo convertir proyectos laborales en open source, el caso de j8583 y jAlarms https://sg.com.mx/buzz/ponencias/ccoss-2019/como-convertir-proyectos-laborales-en-open-source-el-caso-de-j8583-y <span class="field field--name-title field--type-string field--label-hidden">Cómo convertir proyectos laborales en open source, el caso de j8583 y jAlarms</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/ccoss-2019" hreflang="zxx">CCOSS 2019</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/57695" lang="" about="/user/57695" typeof="schema:Person" property="schema:name" datatype="" class="username">AlbertoRJ</a></span> <span class="field field--name-created field--type-created field--label-hidden">Sun, 09/15/2019 - 10:01</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p>La historia de cómo logré publicar estos proyectos, que fueron hechos como parte de proyectos laborales, no tiempo libre.</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/BqVRvPwSVvY" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>La historia de cómo logré publicar estos proyectos, que fueron hechos como parte de proyectos laborales, no tiempo libre.</p> </div> Sun, 15 Sep 2019 15:01:37 +0000 AlbertoRJ 9032 at https://sg.com.mx Desmitificando el blockchain https://sg.com.mx/buzz/ponencias/sg-next-2017/desmitificando-el-blockchain <span class="field field--name-title field--type-string field--label-hidden">Desmitificando el blockchain</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/sg-next-2017" hreflang="und">SG Next 2017</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/user/1" lang="" about="/user/1" typeof="schema:Person" property="schema:name" datatype="" class="username">sg</a></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 06/22/2017 - 11:15</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/Amyw30YjFQf8NR" style="border: 1px solid #CCC; border-width: 1px; margin-bottom: 5px; max-width: 100%;" width="595"></iframe></p> <div style="margin-bottom: 5px;"><strong><a href="//www.slideshare.net/RevistaSG/desmitificando-el-blockchain" target="_blank" title="Desmitificando el blockchain">Desmitificando el blockchain</a> </strong> de <strong><a href="https://www.slideshare.net/RevistaSG" target="_blank">Software Guru</a></strong></div> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>En esta plática explicaremos de manera sencilla y objetiva qué es el blockchain, qué resuelve actualmente y qué requisitos debe tener algo para ser considerado blockchain. También revisaremos ejemplos de dónde sí es útil su aplicación y en qué otros casos es mejor buscar otro tipo de solución</p> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Acerca del conferencista</div> <div class="field__item"><p>Enrique tiene más de 20 años desarrollando software profesionalmente, ocupando roles de liderazgo técnico en empresas como MeXT, Nasoft y Red Hat.&nbsp;</p> </div> </div> Thu, 22 Jun 2017 16:15:00 +0000 sg 7314 at https://sg.com.mx Superando las limitaciones de Java, con Ceylon https://sg.com.mx/buzz/ponencias/sg-virtual-11/superando-las-limitaciones-de-java-con-ceylon <span class="field field--name-title field--type-string field--label-hidden">Superando las limitaciones de Java, con Ceylon</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/sg-virtual-11" hreflang="und">SG Virtual #11</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/users/ezamudio" lang="" about="/users/ezamudio" typeof="schema:Person" property="schema:name" datatype="" class="username">ezamudio</a></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 09/27/2016 - 20:02</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/7QszPj29ln0" width="560"></iframe></p> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>El sistema de tipos de Java tiene algunas limitaciones con las cuales hay que lidiar constantemente, a tal grado que los programadores ya ni siquiera las ven como un problema, sin embargo sí afecta el diseño del software que desarrollan. Ceylon arregla muchos de estos problemas con su sistema de tipos, permitiendo dejar atrás algunos de los patrones que a pesar de ser erróneos se usan por no tener alternativas, para poder escribir código más claro y con una intención bien definida.</p> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Acerca del conferencista</div> <div class="field__item"><p>Enrique Zamudio es programador profesional desde 1994, especializado en desarrollos del lado del servidor en Java desde 2000, tales como switches transaccionales para comercio electrónico y plataformas de pago. Es el autor de los proyectos jAlarms, j8583 y ScalaSQL. Enrique se integró al equipo que desarrolla Ceylon en enero de 2012 y desde entonces ha contribuido al módulo del lenguaje, al web IDE, al compilador para JVM, y es el desarrollador principal del compilador de Ceylon a JavaScript. Fue nombrado Java Champion en 2015.</p> </div> </div> Wed, 28 Sep 2016 01:02:52 +0000 ezamudio 6755 at https://sg.com.mx Diseño de compiladores: Un vistazo a Ceylon-JS https://sg.com.mx/buzz/ponencias/sg-conferencia-y-expo-2015/diseno-de-compiladores-un-vistazo-ceylon-js <span class="field field--name-title field--type-string field--label-hidden">Diseño de compiladores: Un vistazo a Ceylon-JS</span> <div class="field field--name-field-evento field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Evento</h3> <ul class='links field__items'> <li><a href="/buzz/evento-sg/sg-conferencia-y-expo-2015" hreflang="und">SG Conferencia y Expo 2015</a></li> </ul> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><a title="View user profile." href="/users/ezamudio" lang="" about="/users/ezamudio" typeof="schema:Person" property="schema:name" datatype="" class="username">ezamudio</a></span> <span class="field field--name-created field--type-created field--label-hidden">Tue, 04/21/2015 - 16:10</span> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Conferencista(s)</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-field-embedded-multimedia field--type-text-long field--label-hidden field__item"><p><iframe frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/7fLqFiDjASDt3k" style="border: 1px solid #CCC; border-width: 1px; margin-bottom: 5px; max-width: 100%;" width="595"></iframe></p> <div style="margin-bottom: 5px;"><strong><a href="//www.slideshare.net/chochosmx/diseo-de-compiladores-un-vistazo-a-ceylonjs" target="_blank" title="Diseño de compiladores: Un vistazo a Ceylon-JS">Diseño de compiladores: Un vistazo a Ceylon-JS</a> </strong> from <strong><a href="//www.slideshare.net/chochosmx" target="_blank">Enrique Zamudio López</a></strong></div> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Tomando como ejemplo el compilador de Ceylon a JavaScript, damos un vistazo al diseño de un compilador que utiliza el patrón Visitor, la manera en que se han realizado algunas optimizaciones y cómo se han implementado algunas características particulares de este "transpilador".</p> </div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Acerca del conferencista</div> <div class="field__item"><p>Enrique Zamudio se dedica a la programación profesional desde 1994. Es parte del equipo que desarrolla el lenguaje de programación Ceylon, liderado por Gavin King. Fue nombrado Java Champion en Febrero de 2015.</p> </div> </div> Tue, 21 Apr 2015 21:10:32 +0000 ezamudio 5739 at https://sg.com.mx Construcción de Proyectos con Gradle https://sg.com.mx/revista/33/construccion-proyectos-gradle <span class="field field--name-title field--type-string field--label-hidden">Construcción de Proyectos con Gradle</span> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" typeof="schema:Person" property="schema:name" datatype="">Anonymous</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 08/24/2011 - 17:23</span> <div class="field field--name-field-numrevista field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Publicado en</h3> <ul class='links field__items'> <li><a href="/revista/33" hreflang="und">SG #33</a></li> </ul> </div> <div class="field field--name-field-seccion field--type-entity-reference field--label-hidden field--entity-reference-target-type-taxonomy-term clearfix"> <ul class='links field__items'> <li><a href="/revista/secciones/herramientas" hreflang="und">Herramientas y Tecnologías</a></li> </ul> </div> <div class="field field--name-field-autor field--type-entity-reference field--label-inline field--entity-reference-target-type-taxonomy-term clearfix"> <h3 class="field__label inline">Autor</h3> <ul class='links field__items'> <li><a href="/buzz/autores/enrique-zamudio" hreflang="und">Enrique Zamudio</a></li> </ul> </div> <div class="text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Una parte importante del desarrollo de software es la construcción de los proyectos y los sistemas completos. Desde la clásica herramienta make en los 70’s, ha habido varios mecanismos y sistemas distintos para construcción de proyectos, algunos enfocados a ciertos aspectos de la construcción, otros tratando de abarcar todo el espectro: compilación, manejo de dependencias, integración contínua, automatización del proceso de construcción, etc. En el mundo Java, primero tuvimos Ant, una herramienta en cierta forma similar al make pero hecha 100% en Java, enfocada a construcción de proyectos Java. Al principio parecía muy buena, porque la sintaxis no era tan oscura como la de make, sino que usa XML, de modo que es más entendible lo que se quiere hacer. Pero cuando se comienzan a hacer scripts más complejos, la XML-itis se vuelve difícil de entender y modificar.</p><p>Luego hemos tenido otras cosas como Ivy y Maven. Ivy se enfoca al manejo de dependencias, que consiste en indicar qué bibliotecas externas de software se necesitan para poder compilar el proyecto, cuáles se necesitan para correrlo, cuáles para probarlo, etc. Maven, por su parte, abarca el ciclo completo: compilación, manejo de dependencias, pruebas unitarias, documentación técnica (javadoc) y hasta el sitio del proyecto puede hacer, todo esto gracias a que tiene una arquitectura de plugins bastante completa. Pero Maven, al ser tan completo, se vuelve a la vez complejo: para compilar un proyecto tipo “hola, mundo!” y generar su documentación se requieren unas 30 líneas de XML (probablemente más líneas que el mismo código fuente de un proyecto tan simple).</p><h3>Gradle: Un sistema muy groovy</h3><p>Nos saltamos a 2008, cuando surge el proyecto Gradle (pronunciado más o menos greirol). Este sistema para construcción de proyectos toma lo mejor de lo que ya existe: puede integrar tareas de Ant, usar el manejo de dependencias de Ivy, ciclos de compilación y pruebas tipo Maven y, lo mejor de todo, sigue el paradigma de convención sobre configuración; es decir, todas las opciones configurables tienen valores por defecto con lo más común o útil, de modo que sólo es necesario modificarlos para casos especiales, pero para la mayoría de los casos se puede usar el valor por omisión, lo cual nos permite tener scripts bastante breves.</p><p>Una de las características que hacen a Gradle tan sencillo de usar, es que los scripts usan un lenguaje específico de dominio (Domain-Specific Language, DSL) que extiende el lenguaje de programación Groovy. Esto le da a Gradle a la vez sencillez y poder, ya que en los scripts se pueden utilizar elementos tanto de programación orientada a objetos como de programación funcional. Gradle cuenta también con una arquitectura de plugins y de entrada ofrece varios muy útiles: para compilar proyectos Java, proyectos Groovy (y por supuesto híbridos Java+Groovy), crear artefactos para publicar en repositorios Maven, generar documentación técnica (Javadoc/Groovydoc), realizar pruebas unitarias y generar reportes con los resultados, etc. Y por supuesto, cuenta con una API para que terceros puedan crear sus propios plugins.</p><p>Veamos un ejemplo sencillo, para lo cual necesitamos crear un proyecto muy sencillo, algo un poquito arriba del típico “Hola, Mundo!” para poder integrar pruebas unitarias y documentación.</p><h3>Hola, Gradle</h3><p>Lo primero, por supuesto, es instalar Gradle. El único prerrequisito previo es tener instalado un JDK. Teniendo esto, descargamos la versión más reciente de Gradle en http://gradle.org (que al momento de escribir este artículo, es 1.0-milestone-3), desempaquetamos el .zip en el destino de nuestra preferencia, y apuntamos a ese directorio la variable de ambiente GRADLE_HOME. También es recomendable agregar a la ruta de ejecutables (PATH) el directorio $GRADLE_HOME/bin para que podamos llamar al ejecutable de gradle desde cualquier directorio. Para probar que la instalación es correcta, podemos ejecutar en una línea de comando gradle -v y nos debe regresar el número de versión de gradle que instalamos.</p><p>Una vez que hemos completado la instalación, crearemos un proyecto Java. Por el momento, vamos a crear de forma manual la estructura de directorios del proyecto, pueden hacerlo ya sea desde línea de comando o con el administrador de archivos de su sistema operativo. Hay que crear un directorio raíz para el proyecto, HolaSG (Gradle usará el nombre de este directorio para el nombre del proyecto) y debemos tener la siguiente estructura de directorios debajo:</p><p><code>src/main/java/ejemplo<br />src/main/resources<br />src/test/java/ejemplo<br />src/test/resources</code></p><p>Si les parece conocida la estructura, es porque está basada en la que Maven ha hecho tan popular. En src/main/java va el código fuente, src/test/java contiene las pruebas unitarias. Los directorios src/main/resources y src/test/resources son para recursos auxiliares (XML, properties, imágenes, etc), tanto para el proyecto como para sus pruebas unitarias, pero este ejemplo es muy simple y no vamos a usar archivos auxiliares, de modo que podemos simplemente omitir estos directorios.</p><h3>El código</h3><p>Ahora sí, vamos a crear una clase en Java:<br /> <img src="http://sg.com.mx/images/stories/sg33/gradlefig1.png" alt="" border="0" /><br /> Por ahora vamos a saltarnos la prueba unitaria, para irnos directo a compilar. A fin de cuentas, este artículo es de Gradle, no de Test Driven Development.</p><h3>El script</h3><p>El script de Gradle debe ir directamente bajo el directorio HolaSG.</p><p>Puede tener cualquier nombre, pero así como en ant la convención es un build.xml, en Gradle es un build.gradle. Y debe contener la fabulosa cantidad de una línea de código:<br /> <img src="http://sg.com.mx/images/stories/sg33/gradlefig2.png" alt="" border="0" /></p><p>Como mencioné al principio, Gradle usa la convención sobre la configuración. De modo que lo único que estamos haciendo aquí es indicarle que cargue el plugin para proyectos Java, y ese plugin se encargará del resto. Este plugin es bastante completo, ya que va a descargar las dependencias necesarias (ninguna por el momento), compilar el código, ejecutar las pruebas unitarias y hasta puede generarnos un JAR con las clases compiladas. Vamos a ejecutarlo, en la línea de comando debemos ir al directorio HolaSG y teclear:</p><p><code>gradle build</code></p><p>Veremos cómo se ejecutan varias tareas: compileJava (compila el código), processResources (copia los archivos de src/main/resources a donde quedaron las clases compiladas), classes, jar, assemble (arma los artefactos o entregables definidos para el proyecto), compileTestJava (compila las pruebas unitarias), processTestResources (copia los archivos de src/test/resources a donde quedaron las pruebas unitarias compiladas), testClasses y test (que ejecutan las pruebas unitarias), check y finalmente, build. Debemos al final ver el mensaje de BUILD SUCCESSFUL y el tiempo que le tomó todo el proceso.</p><p>Ahora podemos ver que tenemos dos directorios nuevos bajo HolaSG: .gradle y build. El .gradle es un directorio interno de Gradle para almacenar el estado de todos los recursos involucrados en la construcción del proyecto, lo cual le permite saber entre otras cosas, qué clases hay que recompilar en ejecuciones subsecuentes. Y el directorio build contiene el resultado del proceso. Dentro podemos ver un directorio classes/main y ahí encontraremos nuestro HolaJava.class; y si vemos en libs encontraremos un HolaSG.jar.</p><p>Si ejecutamos nuevamente gradle build, veremos la lista de tareas nuevamente pero junto a cada una saldrá la leyenda UP-TO-DATE, esto gracias al cache que le permite a Gradle saber que todo está actualizado y por lo tanto ninguna tarea hizo realmente nada.</p><h3>Pruebas unitarias</h3><p>Bien, ahora que ya vimos a Gradle en acción por primera vez, agreguemos una prueba unitaria al proyecto. En este caso utilizaré jUnit para mis pruebas, para mostrar lo fácil que es configurarlo y utilizarlo:<br /> <img src="http://sg.com.mx/images/stories/sg33/gradlefig5.png" alt="" border="0" /></p><p>Y ahora debemos agregar unas líneas al script de Gradle, para que quede así:<br /> <img src="http://sg.com.mx/images/stories/sg33/gradlefig4.png" alt="" border="0" /></p><p>Con esto modificamos la configuración de Gradle: primero, definimos repositorios de código para poder descargar las dependencias necesarias. Dado que el repositorio central de Maven es el lugar más utilizado, Gradle ya tiene un método para agregar su configuración a los repositorios, de modo que sólo tenemos que invocarlo.</p><p>Y para las dependencias, estamos indicando que para la compilación de las pruebas unitarias queremos usar jUnit 4.8.2. Las dependencias se pueden indicar simplemente con una cadena en formato groupID:artifactID:version para buscarlas en el repositorio de Maven. En este caso definimos dependencias para la tarea de compilación de pruebas con testCompile, pero también lo podemos hacer para otras tareas como compile (compilación de clases del proyecto), runtime (ejecución de la aplicación) o testRuntime (se usan para correr las pruebas, no para compilarlas). Es posible definir dependencias para tareas adicionales en caso que fuera necesario, pero estas que menciono son las más comunes.</p><p>Para ejecutar las pruebas tecleamos gradle test. Veremos pasar las tareas de compileJava y demás con la señal UP-TO-DATE y posteriormente compileTestJava donde se compila nuestra nueva clase de prueba. Luego, al llegar a la tarea test que es donde se ejecutan las pruebas, nos encontraremos con un mensaje de error. La prueba unitaria falló (la clase HolaJava tiene un error intencional). Podemos abrir el reporte en build/reports/tests/index.html para ver la razón (Gradle nos entrega un reporte muy bonito en HTML con el resultado de las pruebas unitarias, ver figura 1).<img src="http://sg.com.mx/images/stories/sg33/gradlefig3.png" alt="" border="0" /></p><p>Al revisar la prueba podemos ver que tenemos un defecto en nuestra clase HolaJava. Corregimos el código, cambiando la línea que genera el saludo para agregar el parámetro faltante:</p><p><code>return String.format(“Hola, %s! (en Java)”, quien);</code></p><p>Ahora ejecutamos nuevamente las pruebas con gradle test para verificar que salen bien.</p><p>Aprovechemos este momento para agregarle una etiqueta con la versión y descripción a nuestro proyecto. Para agregar estos datos, simplemente hay que agregar unas líneas en nuestro script de gradle, debajo de nuestra línea donde invocamos el plugin de java.</p><p><code>version = ‘0.1’ description = ‘Ejemplo de uso de Gradle para Revista SG’</code></p><h3><br />Documentación Técnica</h3><p>La documentación técnica es una parte fundamental de todo proyecto. En Java tenemos la facilidad del javadoc que nos permite generar documentación de cada clase y cada método a partir de los comentarios que se le pongan al código, siguiendo ciertos lineamientos. El problema generalmente es generar la documentación, ya que el comando es muy engorroso de invocar. Herramientas como Ant lo hacen un poco menos complicado y Maven incluye lo necesario para poder generar la documentación; por supuesto Gradle no se queda atrás.</p><p>Primero que nada, hay que agregar los comentarios a nuestro código, para que haya algo que generar:<br /> <img src="http://sg.com.mx/images/stories/sg33/gradlefig6.png" alt="" border="0" /><br /> Y ahora simplemente debemos ejecutar gradle javadoc y después podemos abrir en un navegador el archivo build/docs/javadoc/index.html para ver la documentación generada.</p><p>Adicionalmente, en proyectos de tipo biblioteca de clases, es común generar por separado un JAR con el javadoc y otro JAR con los archivos de código fuente (en proyectos de software libre y en proyectos subcontratados), para tener una distribución completa.</p><p>Para crear los JARs, necesitamos definir dos tareas nuevas. En Gradle, las tareas llevan un nombre, un tipo, y algunas otras propiedades, como dependencias con otras tareas, etc. Cada tarea puede tener propiedades distintas. Una tarea se declara con la palabra task y el nombre de la misma. Cada tarea lleva una serie de acciones y se le pueden agregar acciones a las tareas existentes, así como modificar sus propiedades. Gradle mantiene una lista de todas las tareas en la propiedad tasks y se pueden obtener por nombre.</p><p>Primero agreguemos a las opciones de javadoc la lista de ligas externas con la referencia a la documentación de Java, para que el parámetro y valor de retorno del método saluda tengan referencia a la clase String. Agreguemos esta linea al final de build.gradle:</p><p><code>tasks.javadoc.options.links=[<br /> ‘http://download.oracle.com/javase/6/docs/api/’<br /> ]</code></p><p>En esa lista se pueden agregar referencias a la documentación de otras dependencias del proyecto, pero por el momento no tenemos ninguna. Las tareas que necesitamos definir para crear los JARs son estas (las podemos agregar al final del script):</p><p><code>task javadocJar(type:Jar, dependsOn:’javadoc’) {<br /> from javadoc.destinationDir<br /> classifier=’javadoc’<br /> }<br /> task sourcesJar(type:Jar) {<br /> from sourceSets.main.allSource<br /> classifier=’sources’<br /> }</code></p><p>Lo que estamos haciendo es definir la tarea javadocJar, de tipo Jar y que depende de la tarea javadoc; es importante definir esta dependencia para obligar a que primero se genere la documentación, sino vamos a generar un jar vacío o con documentación desactualizada. Para el segundo Jar no tenemos dependencias porque sólo vamos a incluir los fuentes, pero hay que indicar que queremos únicamente los fuentes del proyecto y no los de las pruebas. Cabe mencionar que el plugin de Java agrega el concepto de sourceSets a Gradle, que son precisamente los conjuntos de archivos de código fuente. Por omisión se definen dos conjuntos: main, con las clases del proyecto, y test, con las pruebas unitarias. Por omisión, los fuentes del conjunto main están en src/main/java. Dado que estamos siguiendo convenciones, no es necesario que especifiquemos todo esto de forma explícita en nuestro script. En la tarea de sourcesJar, estamos incluyendo TODOS los fuentes (incluyendo recursos) del conjunto main.</p><p>Y a cada Jar le pusimos un clasificador, el cual irá en el nombre del archivo resultante, ya que por omisión Gradle va a crear los Jars usando el nombre del proyecto, la versión y el clasificador.</p><p>Y ahora podemos ejecutar estas tareas de manera secuencial, simplemente hay que indicar cada una en la línea de comando. De modo que tecleamos gradle javadocJar sourcesJar y al final en el directorio build/libs tendremos HolaSG-0.1-javadoc.jar y HolaSG-0.1-sources.jar.</p><p>Pero estas son tareas definidas específicamente en este proyecto, no parecen ser algo estándar; la idea de estos scripts y herramientas es facilitarle la vida a cualquier persona que quiera construir el proyecto, permitiéndoles ejecutar el script sin tener siquiera que verlo; honestamente, ¿cuántos de nosotros hemos visto un Makefile de un proyecto que bajamos y construimos desde fuentes? Simplemente le damos ./configure &amp;&amp; make &amp;&amp; sudo make install y listo. Afortunadamente, el plugin de Java para Gradle detecta cualquier tarea de tipo Jar y la agrega automáticamente a la tarea de assemble. Y esa tarea a su vez depende de las de compilación (pero no de las de pruebas). De modo que podemos definir que algunas tareas se ejecuten por omisión en nuestro script. Agreguemos esta línea después de donde definimos la versión:</p><p><code>defaultTasks ‘build’, ‘assemble’</code></p><p>Ahora, podremos simplemente ejecutar gradle sin ningún argumento adicional y se ejecutarán las tareas de compilación, pruebas, javadoc, etc. Puedes borrar todo tu directorio build antes de correr la tarea, para asegurar que sí se recree todo. Al final, en build/libs tendremos tres JARs: el binario, el de fuentes y el de documentación.</p><h3>Capacidades avanzadas</h3><p>La simplicidad de uso de Gradle puede ser engañosa, pues es realmente una herramienta muy, muy poderosa. En esta ocasión quise resaltar lo sencillo que puede ser su uso, para compilar un proyecto muy sencillo. Algunas capacidades avanzadas que no se cubrieron en este tutorial de introducción pero que seguramente requerirán en proyectos complejos son: incluir dependencias en la configuración de compile y tal vez la de testRuntime; agregar dependencias locales, para esos casos tan comunes en que se tiene un directorio con muchos JARs existentes; convertir el proyecto en uno políglota, cambiando el plugin de Java por el de Groovy para compilar y probar clases en ambos lenguajes; crear scripts multi-proyecto, para poder compilar, armar y juntar varios proyectos con un solo comando, manejando dependencias y otras configuraciones tanto de manera individual como global. Esta última capacidad hace a Gradle mucho muy superior a otras herramientas de construcción populares. También es posible crear tareas de manera dinámica, es decir, que no están definidas de manera formal en el script pero éste contiene código que al momento de ejecutarlo, genera tareas que pueden depender de otras tareas y agregarse a las existentes. Esto parece muy esotérico al principio, pero realmente puede facilitarnos la vida, especialmente cuando se usa Gradle para organizar, integrar y automatizar la construcción de proyectos existentes.</p><p>El código fuente utilizado para este tutorial está disponible en: <a href="https://github.com/chochos/HolaSG">https://github.com/chochos/HolaSG</a></p></div> <div class="text-formatted field field--name-field-autor-bio field--type-text-long field--label-above"> <div class="field__label">Bio</div> <div class="field__item"><p>Enrique Zamudio es Licenciado en Sistemas Computacionales egresado de la Universidad Iberoamericana y tiene 17 años desarrollando software profesionalmente, principalmente utilizando tecnologías relacionadas con Java del lado del servidor. Es autor de los proyectos de software libre jAlarms y j8583, y forma parte del staff de la comunidad de desarrolladores JavaMéxico. <a href="http://twitter.com/#!/chochosmx">@chochosmx</a> <a href="https://github.com/chochos">github.com/chochos</a>.</p></div> </div> <section class="field field--name-comment field--type-comment field--label-above comment-wrapper"> </section> Wed, 24 Aug 2011 22:23:57 +0000 Anonymous 1119 at https://sg.com.mx https://sg.com.mx/revista/33/construccion-proyectos-gradle#comments