<?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-5627012673659001624</id><updated>2011-07-07T17:36:51.419-07:00</updated><category term='Integracion Continua'/><category term='String'/><category term='Grails'/><category term='Adf Faces'/><category term='Add new tag'/><category term='Spring'/><category term='Jdbc'/><category term='Acegi'/><category term='Groovy'/><category term='Conferencia'/><title type='text'>Edwin Farfan Colan</title><subtitle type='html'>Trabajo con Java mas de 3 años, mayormente en web, he investigado y he realizado trabajos con grails (groovy), y también he utilizado herramientas de integración continua.   Ahora me encuentro certificado (en SCJP 5.0) y estoy próximo a dar mi segundo examen.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-6836244154058075682</id><published>2010-02-17T14:17:00.000-08:00</published><updated>2010-02-19T07:47:47.875-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Integracion Continua'/><title type='text'>Integración continua</title><content type='html'>Consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible para así poder detectar fallos cuanto antes. Entendemos por integración la compilación y ejecución de tests de todo un proyecto. (&lt;a href="http://www.martinfowler.com/articles/continuousIntegration.html"&gt;Martin Fowler&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;La Integración Continua está asociado con las metodologías de programación extrema  (XP) y desarrollo ágil.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ventajas&lt;/span&gt;&lt;br /&gt;- Reducción del tiempo de integración.&lt;br /&gt;- Detección de errores lo más pronto posible.&lt;br /&gt;- Pruebas inmediatas tras un cambio en el código.&lt;br /&gt;- Disponibilidad del código para test, demos, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Desventajas&lt;/span&gt;&lt;br /&gt;- Sobrecarga por el mantenimiento del sistema.&lt;br /&gt;- Necesidad potencial de un servidor dedicado a build.&lt;br /&gt;- El impacto inmediato al subir código erróneo provoca que los desarrolladores no  hagan tantos commits como sería conveniente como copia de seguridad&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;QUE NECESITAMOS???&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Software&lt;/span&gt;&lt;br /&gt;- Control de Versiones (SVN)&lt;br /&gt;- Herramienta para generar Build y automizacion de tareas (Maven - Hudson)&lt;br /&gt;- Repositorio local (Nexus)&lt;br /&gt;- Estadisticas y/o reportes de Analisis de Codigo  (Sonar)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Hardware&lt;/span&gt;&lt;br /&gt;- Servidor dedicado a IC&lt;br /&gt;- Espacio en el disco&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SUBVERSION&lt;/span&gt;&lt;br /&gt;Es un sistema de control de versiones, cuyo proposito  es administrar el acceso a un conjunto de ficheros, y mantener un historial de cambios realizados, es útil para guardar cualquier documento que cambie con frecuencia, como, el código fuente de un programa.&lt;br /&gt;&lt;br /&gt;Caracteristicas:&lt;br /&gt;- Actualiza ficheros modificados&lt;br /&gt;- Historial de cambios.&lt;br /&gt;- Registra cambios en la estructura de directorios (permite mover y  renombrar sin perder el historial).&lt;br /&gt;- Commits atómicos, se realizan todos o ninguno.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MAVEN&lt;/span&gt;&lt;br /&gt;Es una herramienta de software para la gestión y construcción de proyectos Java.&lt;br /&gt;Utiliza un Project Object Model (POM) para describir el proyecto de software a construir, sus dependencias de otros módulos y componentes externo, y el orden de construcción de los elementos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;NEXUS&lt;/span&gt;&lt;br /&gt;Nexus es un administrador visual de repositorios para Maven.&lt;br /&gt;Nexus actúa como una caché de objetos entre su organización y el repositorio de Maven público. Esto significa que los artefactos (jars) y sus dependencias, sólo tienen que descargar una vez, y despues se descargan de su repositorio local.Para Jars propietarios y/o propios, se puede hacer un repositorio especial (thirdparty).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HUDSON&lt;/span&gt;&lt;br /&gt;Herramienta open source que nos ayuda a monotorizar la ejecución de tareas repetitivas como el compilar un proyecto cada cierto tiempo. Además se enfoca en la construcción y prueba de proyectos de software contínuamente y en monitorizar la ejecución de tareas ejecutadas externamente.&lt;br /&gt;Se integra facilmente con Maven y tiene un sin numero de plugin que se pueden utilizar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;SONAR&lt;/span&gt;&lt;br /&gt;Permite la verificacion de la calidad del codigo java, en otras palabras, calcula y muestra en formato web metricas de nuestros proyecto.&lt;br /&gt;Herramientas como PMD, CheckStyle, FindBugs, Cobertura, etc, etc; ya vienen embebidas en Sonar.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Comenzamos con Nuestra Integracion Continua&lt;/b&gt;&lt;br /&gt;En este caso esta instalado sobre un servidor linux (redhat)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalar java&lt;/b&gt;&lt;br /&gt;$ chmod +x jdk-6xxx.bin (para rpms ... chmod a+x jdk-6xxx-rpm.bin)&lt;br /&gt;$ ./jdk-6xxx.bin&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Subversion&lt;/b&gt;&lt;br /&gt;Lo primero que tenemos que hacer es instalar el Subversion nos bajamos los siguientes archivos rpm’s de la &lt;a href="http://subversion.tigris.org/project_packages.html"&gt;página oficial&lt;/a&gt;.&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;rpm -i CollabNetSubversion-client-1.6.6-1.i386.rpm&lt;br /&gt;rpm -i CollabNetSubversion-server-1.6.6-1.i386.rpm&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;detenemos el subversion para configurarlo.&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$ sudo /etc/rc.d/init.d/collabnet_subversion stop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;agregar la variable de entorno para subversion&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;PATH=/opt/CollabNet_Subversion/bin:$PATH&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ejecutar el siguiente script:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$ sudo Configure-CollabNet-Subversion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este script te configura todo para Subversion, (usuarios, repositorios, usuarios. etc)&lt;br /&gt;&lt;br /&gt;Es muy probable que tu servidor tenga Proxy, para solucionar esto podrias utilizar https, mediante el Openssl que ya viene instalado en el colabNet&lt;br /&gt;Para que subversion acepte SSL&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$ openssl genrsa -des3 -out server.key 1024&lt;br /&gt;$ openssl req -new -key server.key -out server.csr&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;Enter pass phrase for server.key:&lt;br /&gt;You are about to be asked to enter information that will be incorporated&lt;br /&gt;into your certificate request.&lt;br /&gt;What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;There are quite a few fields but you can leave some blank&lt;br /&gt;For some fields there will be a default value,&lt;br /&gt;If you enter '.', the field will be left blank.&lt;br /&gt;-----&lt;br /&gt;Country Name (2 letter code) [GB]:PE&lt;br /&gt;State or Province Name (full name) [Berkshire]:Lima&lt;br /&gt;Locality Name (eg, city) [Newbury]:Lima&lt;br /&gt;Organization Name (eg, company) [My Company Ltd]:Asociacion Privada&lt;br /&gt;Organizational Unit Name (eg, section) []:Sistemas&lt;br /&gt;Common Name (eg, your name or your server's hostname) []:localhost&lt;br /&gt;Email Address []:yourmail@mail.com&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$ openssl req -new -key server.key -x509 -out server.crt&lt;br /&gt;$ cp server.key server.key.save&lt;br /&gt;$ openssl rsa -in server.key.save -out server.key&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;En el archvo de configuración collabnet_subversion_httpd.conf:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;&amp;lt;location repos=""&amp;gt;&lt;br /&gt;....&lt;br /&gt;&amp;lt;ifdefine ssl=""&amp;gt;&lt;br /&gt;SSLRequireSSL&lt;br /&gt;&amp;lt;/ifdefine&amp;gt;&lt;br /&gt;....&lt;br /&gt;&amp;lt;/location&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;b&gt;Maven&lt;/b&gt;&lt;br /&gt;Se descomprime el archivo de instalación y se crea una variable de entorno:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;export MAVEN_HOME=/directorio/donde/estadescompimido/maven&lt;br /&gt;export PATH=$PATH:$MAVEN_HOME/bin&lt;br /&gt;$mvn --version&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por ultimo, si todo esta bien, tenemos que copiar y pegar nuestro setting.xml en&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$HOME/.m2/setting.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Configuracion del tomcat&lt;/b&gt;&lt;br /&gt;Para instalar tomcat, simplemente se descomprime el archivo en una ruta valida.&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;unzip apache-tomcat-6.0.20.zip&lt;/span&gt;&lt;br /&gt;configurar el puerto del tomcat:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;&amp;lt;connector port="8082"&amp;gt;&amp;lt;/connector&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Despues de configurar el Tomcat, inscribimos unas variables de entorno en el $home/.bashrc.&lt;span class="Apple-style-span"  style="color:#339999;"&gt;&lt;br /&gt;MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m"&lt;br /&gt;&lt;br /&gt;CATALINA_OPTS="-Xms1024m-Xmx1024m  -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:MaxPermSize=256m"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Cambiando la Base de datos para Sonar:&lt;/b&gt;&lt;br /&gt;Debemos de tener instalado una base de datos, en este caso al Mysql&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$mysql -u root -p&lt;/span&gt;&lt;br /&gt;(aqui pones el password)&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;mysql$ CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;br /&gt;mysql$ grant all privileges on sonar.* to 'sonar'@'localhost' identified by 'sonar';&lt;br /&gt;mysql$ flush privileges&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalación de Sonar&lt;/b&gt;&lt;br /&gt;La instalación es bastante sencilla.Download y unzip en el directorio donde se va a guardar Sonar, lo descargamos de su pagina &lt;a href="http://sonar.codehaus.org/downloads/"&gt;web&lt;/a&gt;, desempaquetar el zip:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;$ unzip sonar-1.11.zip&lt;/span&gt;&lt;br /&gt;Generamos el war:&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#339999;"&gt;InstalSonarDir/war$ ./build-war.sh &lt;/span&gt;---&gt; con esta sentencia generamos el war.&lt;br /&gt;Solo basta colocar el war que generarmos en el webapp de tomcat y listo.&lt;br /&gt;Http://localhost:8082/sonar&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Instalación de Hudson&lt;/b&gt;&lt;br /&gt;Descargar en esta &lt;a href="https://hudson.dev.java.net/"&gt;dirección&lt;/a&gt;. Instalar Hudson, solamente basta con copiar y pegar en el webapp del tomcat.&lt;br /&gt;&lt;br /&gt;Ahora solo falta levantar el tomcat.&lt;br /&gt;$tomcat/bin/ ./startup.sh&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;y listo... ya tengo instalado nuestra integracion continua..&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/5627012673659001624-6836244154058075682?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/6836244154058075682/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=6836244154058075682' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/6836244154058075682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/6836244154058075682'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2010/02/integracion-continua.html' title='Integración continua'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-4561359369637594386</id><published>2009-07-23T20:53:00.000-07:00</published><updated>2010-02-17T14:08:36.997-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Repasando algunas caracteristicas de Groovy</title><content type='html'>En este articulo veremos y explicaremos algunas de las caracteristicas de Groovy para aprender mas sobre este lenguaje dinámico, esperemos que les guste y espero muchas preguntas y/o comentarios.&lt;br/&gt;&lt;br/&gt;Antes de comenzar este pequeño articulo debo de hacer una advertencia, y es que este artículo asume que ya instalaste Groovy y por lo menos sabes que es Groovy, si es todavia no lo haz instalado o no sabes que es Groovy, en la internet hay muy buenas guias que te pueden servir de ayuda.&lt;br/&gt;Por otro lado tambien decirles que para ejecutar cada ejmplo de Groovy he utilizado la CONSOLA DE GROOVY(esto se logra escribiendo en la consola $groovyConsole), desde alli puedes ejecutar cada uno de los ejemplos que les muestro... diviertanse.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;Objetivo.- como dije al principio, es el dar a conocer algunas caracteristicas de Groovy, se verán algunas diferencias y sobre todo como Groovy ahorra muchas líneas de código al programar y por ende nos hace la vida mas fácil. En conclusión mi objetivo es que se enamoren de este lenguaje.&lt;br/&gt;&lt;br/&gt;Comenzaré por decir que en Groovy hay una serie funcionalidades que son opcionales, que detallo a continuación:&lt;br/&gt;&lt;br/&gt;- En groovy el punto y coma (';'), al final de cada sentencia es opcional, .&lt;br/&gt;- Los paréntesis '()', tambien son opcionales: ejm:&lt;br/&gt;    printl "hola"  || tambien puede ser asi: println("hola")&lt;br/&gt;&lt;br/&gt;- En un archivo .groovy se importa automaticamente los siguientes paquetes, asi es que no hay necesitad de importarlos explicitamente.&lt;br/&gt;    - groovy.lang.*&lt;br/&gt;    - groovy.util.*&lt;br/&gt;    - java.lang.*&lt;br/&gt;    - java.util.*&lt;br/&gt;    - java.net.*&lt;br/&gt;    - java.io.*&lt;br/&gt;    - java.math.BigDecimal&lt;br/&gt;    - java.math.BigInteger&lt;br/&gt;- En groovy no es obligario el manejo de Excepciones Ejm:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;    import groovy.sql.Sql&lt;br/&gt;    class GroovySqlExample1{&lt;br/&gt;      static void main(String[] args) {&lt;br/&gt;        def sql = Sql.newInstance("jdbc:mysql://localhost:3306/myBD", "root","root", "com.mysql.jdbc.Driver")&lt;br/&gt;      }&lt;br/&gt;    }&lt;br/&gt;[/sourcecode]&lt;br/&gt;- El retorno al final de cada método y/o bucle ya no son necesarios, en groovy la ultima sentencia que se ejecuta (en el caso de un closure) es lo que retorna. ejm:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;def retornotrue= {&lt;br/&gt;    x,y -&gt;&lt;br/&gt;     x*y&lt;br/&gt;}&lt;br/&gt;def z= retornotrue(4,8)&lt;br/&gt;[/sourcecode]&lt;br/&gt;En este caso el closure recibe dos parametros (devuelve el producto de x*y) el resultado de ejecutar este codigo nos dará 32.&lt;br/&gt;&lt;br/&gt;- Como habrán notado en el anterior ejemplo, estoy obviando el tipo de declaracion de las variables, lo cual sí esta permitido en Groovy, es por lo tanto un lenguaje opcionalmente tipado.&lt;br/&gt;&lt;br/&gt;- También he usado la palabra 'def', pues esta palabra no es mas que una variable dinamica usada bastante en los lenguajes dinámicos como lo es Groovy.&lt;br/&gt;por ejemplo:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;        def varStr = "cadena"&lt;br/&gt;        def varInt = 345&lt;br/&gt;        println varInt.getClass()&lt;br/&gt;        println varStr.getClass()&lt;br/&gt;[/sourcecode]&lt;br/&gt;La ejecución de este código nos dará el sgte resultado:&lt;br/&gt;class java.lang.Integer&lt;br/&gt;class java.lang.String&lt;br/&gt;&lt;br/&gt;De este modo comprobamos lo que estamos diciendo, la variable 'def' se comporta de una manera dinamica, adecuandose al tipo de variable que tiene al frente de ella.&lt;br/&gt;Definiremos lo que es tambien un Closures, que en terminos prácticos digamos que es un método y se han fijado son muy parecidas a las clases anominas que existen en Java, para describirlo mejor es una porcion de código encerrado entre llaves, se pueden asignar a variables como si fuera un objeto más y por supuesto pueden recibir parametros y lo que retorna es la última sentencia que se ejecuta. Todo esto aporta agilidad y eficiencia a la hora de escribir un codigo.&lt;br/&gt;Por Ejm:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;def lenguajes=['Java','Scala','Python','Groovy']&lt;br/&gt;&lt;br/&gt;def imprime = lenguajes.find{&lt;br/&gt;    if(it.equals('Groovy')){&lt;br/&gt;     println "Estoy en Groovy"&lt;br/&gt;     return&lt;br/&gt;    }&lt;br/&gt;    println("estoy en otro lenguajes")&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;En este caso estoy definiendo una lista de Strings, que despues las mando a través del closure 'imprime', llamo al metodo 'find()'(el cual hace una busqueda usando hibernate) y si es que encuentro una palabra que coincida con 'Groovy' que imprima "Estoy en Groovy", en caso contrario "Estoy en otro lenguaje".&lt;br/&gt;&lt;br/&gt;Veamos un ejemplo de como haces un archivo xml en Groovy&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;def sw = new StringWriter()&lt;br/&gt;def xml = new groovy.xml.MarkupBuilder(sw)&lt;br/&gt;xml.langs(type:"current"){&lt;br/&gt;  language("Java")&lt;br/&gt;  language("Groovy")&lt;br/&gt;  language("JavaScript")&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;def writer = new File("lenguajes.xml")&lt;br/&gt;writer.write(sw.toString())&lt;br/&gt;[/sourcecode]&lt;br/&gt;el resultado seria un archivo .xml que se llamará lenguajes.xml, y mostrará lo siguiente:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;&lt;langs type='current'&gt;&lt;br/&gt;  &lt;language&gt;Java&lt;/language&gt;&lt;br/&gt;  &lt;language&gt;Groovy&lt;/language&gt;&lt;br/&gt;  &lt;language&gt;JavaScript&lt;/language&gt;&lt;br/&gt;&lt;/langs&gt;&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;También se puede hacer un .groovy con codigo java puro (como ya lo mostré en un blog anterior), pero no tendría sentido ya que no podriamos aprovechar las bondades que nos brinda groovy.&lt;br/&gt;&lt;br/&gt;Como se habrán dado cuenta, en groovy se simplifica las lineas a codificar y por supuesto disminuye el riesgo de errores.&lt;br/&gt;&lt;br/&gt;Este articulo continuará.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-4561359369637594386?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/4561359369637594386/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=4561359369637594386' title='20 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4561359369637594386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4561359369637594386'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/07/repasando-algunas-caracteristicas-de.html' title='Repasando algunas caracteristicas de Groovy'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-4885435593047807203</id><published>2009-07-03T16:45:00.000-07:00</published><updated>2010-02-17T14:08:36.896-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy... una mirada superficial</title><content type='html'>Para que entiendan Grails primero tienen que entender Groovy ya que Grails esta basado en groovy, en este articulo doy un ejemplo trivial pero importante dado a los nuevos conceptos que nos da este lenguaje dinámico.&lt;br/&gt;Groovy es un lenguaje moderno de programación que se ejecuta en la plataforma Java (JVM). Que ofrece una muy buena integración con el código Java existente al tiempo que intr oduce nuevas características como closures y metaprogramming.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;En palabras de&lt;a href="http://ferrocastro.blogspot.com/2009/06/la-esencia-de-groovy.html"&gt; Jorge Ferro &lt;/a&gt; Groovy es un lenguaje orientado a objetos que genera código ejecutable (byte code)&lt;br/&gt;para la máquina virtual de Java. Toma “prestado” las ideas de otros lenguajes como Smalltalk, Ruby y Python y mantiene una sintaxis familiar a la de Java, cosa muy conveniente para los “Javeros”&lt;br/&gt;&lt;br/&gt;Sin mas preambulos vallamos a un ejemplo clásico que supongo que ya lo habran visto, el "hola mundo", para este ejemplo se asume que ya tienes instalado Groovy, que simplemente se reduce a bajar el .zip, y crear tu variable de entorno. Lo pruebas poniendo en la linea de comando "groovy -version".  &lt;a href=" http://grails.org.mx/codice/showContent/6"&gt;aqui&lt;/a&gt; hay un articulo sobre el tema&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;public class HolaMundo{&lt;br/&gt;  public static void main(String[] args){&lt;br/&gt;     System.out.println("Hola Mundo");&lt;br/&gt;     }&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y ahora por supuesto, el mismo ejemplo pero en Groovy, que en su forma mas sencilla es esto:&lt;br/&gt;&lt;br/&gt;Abres la shell de groovy (groovysh) y escribes:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;println "Hola Mundo"&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Para un programador que recien se inicia en el mundo de los lenguajes de programacion, esto le puede parecer muy sencillo de comprender, pero para un desarrollador experimentado hay algo más... inmediatamente despues de haber visto el codigo (Groovy) estoy seguro de que tienen muchas preguntas.&lt;br/&gt;&lt;br/&gt;Por favor, ahora si vayamos al ejemplo anterior (HolaMundo.java). Pues en este ejemplo se consolida varios conceptos básicos de java, por ejemplo; todos sabemos que lo primero que debemos hacer en java es crear un archivo con el nombre de la clase, asi pues para el ejemplo seria: HolaMundo.java. Despues, este ejemplo no correria si es que no no se tiene el 'public static void main', el uso de los punto y comas al final de cada sentencia,  y asi podemos seguir repasando otros conceptos, y que despues de todas esas enseñanzas vengan de buenas a primeras y que me digan.... println "Hola Mundo"... pues lógico que tengo que levantar la mano y decir "que paso con lo anterior".&lt;br/&gt;&lt;br/&gt;Esto es groovy, muchos ya lo conocen y con este ejemplo trivial he querido demostrar lo que Groovy puede hacer por nosotros (los programadores), disminuye drámaticamente las lineas de codigo a escribir, tiene la ventaja de los lenguajes dinamicos, y ademas conserva una sintaxis parecida a la que estamos acostumbrados en java.&lt;br/&gt;&lt;br/&gt;Groovy es Java y Java es Groovy y no lo estoy diciendo en forma figurada, Para demostrarlo que mejor que un ejemplo:&lt;br/&gt;&lt;br/&gt;Tenemos una clase Alumno.java&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;public class Alumno{&lt;br/&gt;private String nombre;&lt;br/&gt;private Integer codigo;&lt;br/&gt;&lt;br/&gt;public String getNombre(){&lt;br/&gt;return nombre;&lt;br/&gt;}&lt;br/&gt;public void setNombre(String nombre){&lt;br/&gt;this.nombre= nombre;&lt;br/&gt;}&lt;br/&gt;public Integer getCodigo(){&lt;br/&gt;return codigo;&lt;br/&gt;}&lt;br/&gt;public void setCodigo(Integer codigo){&lt;br/&gt;this.codigo=codigo;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;y ahora lo vamos hacer en Groovy&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;class AlumnoGroovy{&lt;br/&gt;String nombre&lt;br/&gt;Integer codigo&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Hay que remarcar que en Groovy todas las clases son publicas (a menos que se especifique lo contrario) y todas las propiedades de la clases son privadas, y los metodos de las propiedades son publicos y el compilador groovy proporciona el conjunto de getter y setter de forma automatica.&lt;br/&gt;Compilamos nuestros archivos&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;$javac Alumno.java&lt;br/&gt;// y en el caso de groovy &lt;br/&gt;$groovyc AlumnoGroovy.groovy.&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Veremos los resultados utilizando el comando javap que se encargara de desensamblar un fichero class.&lt;br/&gt;&lt;br/&gt;$javap -p Alumno&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;Compiled from "Alumno.java"&lt;br/&gt;public class Alumno extends java.lang.Object{&lt;br/&gt;private java.lang.String nombre;&lt;br/&gt;private java.lang.Integer codigo;&lt;br/&gt;public Alumno();&lt;br/&gt;public java.lang.String getNombre();&lt;br/&gt;public void setNombre(java.lang.String);&lt;br/&gt;public java.lang.Integer getCodigo();&lt;br/&gt;public void setCodigo(java.lang.Integer);&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;$javap -p AlumnoGroovy&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;Compiled from "AlumnoGroovy.Groovy"&lt;br/&gt;public class AlumnoGroovy extends java.lang.Object implements groovy.lang.GroovyObject{&lt;br/&gt;public static final java.lang.Class $ownClass;&lt;br/&gt;private java.lang.String nombre;&lt;br/&gt;private java.lang.Integer codigo;&lt;br/&gt;private static org.codehaus.groovy.reflection.ClassInfo $staticClassInfo;&lt;br/&gt;private transient groovy.lang.MetaClass metaClass;&lt;br/&gt;public static java.lang.Long __timeStamp;&lt;br/&gt;public static java.lang.Long __timeStamp__239_neverHappen1246636547916;&lt;br/&gt;private static java.lang.Class $class$java$lang$Class;&lt;br/&gt;private static java.lang.Class $class$groovy$lang$MetaClass;&lt;br/&gt;private static java.lang.Class $class$AlumnoGroovy;&lt;br/&gt;private static java.lang.ref.SoftReference $callSiteArray;&lt;br/&gt;public AlumnoGroovy();&lt;br/&gt;protected groovy.lang.MetaClass $getStaticMetaClass();&lt;br/&gt;public groovy.lang.MetaClass getMetaClass();&lt;br/&gt;public void setMetaClass(groovy.lang.MetaClass);&lt;br/&gt;public java.lang.Object invokeMethod(java.lang.String, java.lang.Object);&lt;br/&gt;public java.lang.Object getProperty(java.lang.String);&lt;br/&gt;public void setProperty(java.lang.String, java.lang.Object);&lt;br/&gt;static {};&lt;br/&gt;public java.lang.String getNombre();&lt;br/&gt;public void setNombre(java.lang.String);&lt;br/&gt;public java.lang.Integer getCodigo();&lt;br/&gt;public void setCodigo(java.lang.Integer);&lt;br/&gt;public void super$1$wait();&lt;br/&gt;public java.lang.String super$1$toString();&lt;br/&gt;public void super$1$wait(long);&lt;br/&gt;public void super$1$wait(long, int);&lt;br/&gt;public void super$1$notify();&lt;br/&gt;public void super$1$notifyAll();&lt;br/&gt;public java.lang.Class super$1$getClass();&lt;br/&gt;public boolean super$1$equals(java.lang.Object);&lt;br/&gt;public java.lang.Object super$1$clone();&lt;br/&gt;public int super$1$hashCode();&lt;br/&gt;public void super$1$finalize();&lt;br/&gt;private static java.lang.Class $get$$class$java$lang$Class();&lt;br/&gt;private static java.lang.Class $get$$class$groovy$lang$MetaClass();&lt;br/&gt;private static java.lang.Class $get$$class$AlumnoGroovy();&lt;br/&gt;static java.lang.Class class$(java.lang.String);&lt;br/&gt;private static org.codehaus.groovy.runtime.callsite.CallSiteArray $createCallSiteArray();&lt;br/&gt;private static org.codehaus.groovy.runtime.callsite.CallSite[] $getCallSiteArray();&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Como ven el archivo groovy tiene todo lo que tiene la clase java, esto quiere decir que una vez que tienes compilada la clase groovy, otras clases java pueden utlizarlas como si hubiera sido escrito en codigo java. Pero no voy a quedar con una especulacion y a continuación probaremos que esto es cierto.&lt;br/&gt;&lt;br/&gt;Creamos una clase que servirá para probar lo dicho anteriormente:&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;public class CrearAlumnoJava{&lt;br/&gt;public static void main(String agrs[]){&lt;br/&gt;/**Con Java**/&lt;br/&gt;Alumno al= new Alumno();&lt;br/&gt;al.setNombre("Edwin Farfan");&lt;br/&gt;al.setCodigo(1234);&lt;br/&gt;System.out.println("Alumno Creado con Java: "+ al.getNombre());&lt;br/&gt;&lt;br/&gt;/**Con Groovy**/&lt;br/&gt;AlumnoGroovy ag=new AlumnoGroovy();&lt;br/&gt;ag.setNombre("Jose Diaz");&lt;br/&gt;ag.setCodigo(5678);&lt;br/&gt;// en el .groovy no hay definido un set pero sin embargo se puede llamarlo.&lt;br/&gt;System.out.println("Alumno Creado con Groovy: "+ ag.getNombre());&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Ejecutamos la clases CrearAlumnoJava con el sgte codigo:&lt;br/&gt;java -classpath $GROOVY_HOME/embeddable/groovy-all-1.6.3.jar:. CrearAlumnoJava&lt;br/&gt;&lt;br/&gt;y el resultado será el sgte:&lt;br/&gt;Alumno Creado con Java: Edwin Farfan&lt;br/&gt;Alumno Creado con Groovy: Jose Diaz&lt;br/&gt;&lt;br/&gt;Listo ya hemos probado que Groovy se puede ejecutar en una clase java comun y corriente.&lt;br/&gt;Ahora vamos hacer lo mismo pero con Groovy.&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;class CrearAlumnoGroovy{&lt;br/&gt;&lt;br/&gt;public static void main(String []agrs){&lt;br/&gt;/*con Java*/&lt;br/&gt;def al=new Alumno(nombre:"Edwin", codigo:1234)&lt;br/&gt;println "Nombre del Alumno Java: " + al.nombre&lt;br/&gt;&lt;br/&gt;/*con Groovy*/&lt;br/&gt;def ag=new AlumnoGroovy(nombre:"joedayz", codigo:5678)&lt;br/&gt;println "Nombre del Alumno Groovy: "+ag.nombre&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Fijense como llamo a la Clase Alumno en el propio archivo groovy, esto demuestra que se puede llamar un .java llama desde  un .groovy, tambien hay que resaltar  algo nuevo la variabe 'def', que no es más que una variable dinámica (la van a ver bastante), aqui en este ejemplo no hay necesidad del ";", si queremos podemos decir por ejemplo "ag.getNombre()" en lugar de "ag.nombre", esto no variaría en lo absoluto el resultado.&lt;br/&gt;&lt;br/&gt;Compilamos el archivo de groovy:&lt;br/&gt;$ groovyc CrearAlumnoGroovy.groovy&lt;br/&gt;&lt;br/&gt;y lo ejecuto:&lt;br/&gt;$ groovy CrearAlumnoGroovy&lt;br/&gt;&lt;br/&gt;mostrará el sgte resultado:&lt;br/&gt;Nombre del Alumno Java: Edwin&lt;br/&gt;Nombre del Alumno Groovy: joedayz&lt;br/&gt;&lt;br/&gt;Con esto hemos demostrado la integracion de Groovy con Java es perfecta, con pequeños ejemplos hemos rozado la superficie de Groovy, espero que esto les sirva para que se adentren mas sobre el tema.&lt;br/&gt;&lt;br/&gt;Espero que haya comentarios y preguntas sobre el tema.&lt;br/&gt;&lt;br/&gt;Saludos .&lt;br/&gt;Ahhh se me olvidaba aqui les dejo el &lt;a href='http://joedayz.org/efarfan/wp-content/uploads/2009/07/codigog.zip'&gt;Codigo Fuente&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-4885435593047807203?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/4885435593047807203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=4885435593047807203' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4885435593047807203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4885435593047807203'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/07/groovy-una-mirada-superficial.html' title='Groovy... una mirada superficial'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-8261039595595076496</id><published>2009-06-18T08:01:00.000-07:00</published><updated>2009-06-18T11:22:50.793-07:00</updated><title type='text'>Desarrollando con Grails</title><content type='html'>Despues de un buen tiempo le doy un poco de espacio a este blog en la web.&lt;br /&gt;&lt;br /&gt;El objetivo de este post publicar un poco mi experiencia que tengo sobre grails aqui en este post, y espero que sirva de ayuda.&lt;br /&gt;&lt;br /&gt;Descubri Groovy a finales del año 2006 tenia el libro "Groovy in Action", pero lo descuide por estar evocado a mi trabajo, todo el 2007 no pude ni siquiera verlo, en ese entonces llegaban noticias como &lt;a href="http://www.javahispano.org/contenidos.item.action?id=807849929&amp;amp;menuId=NEWS"&gt;Netbeans aposto por JRuby y no por Groovy&lt;/a&gt;  o cosas asi, que parecia que el norte estaba a Ruby.&lt;br /&gt;&lt;br /&gt;Despues en el 2008 estuve viendo un poco sobre phyton, lo cual me dejo muy satisfecho, es que era tan facil programar sobre todo los que recien empiezan en el mundo de la programacion, dicen que es bueno para juegos... por mi parte tengo que decir que no llegue a ese nivel, porque estaba metido en investigar otras herramientas (creo que en ese tiempo estuve viendo extjs e ibatis).&lt;br /&gt;&lt;br /&gt;Casi a finales de 2008 comence a ver &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;, framework para el desarrollo web basado en Groovy, en esa epoca ya estaba trabajando con Spring, Hibernate y JSF, lo cual me fue de gran ayuda para comprender más rapido Grails.&lt;br /&gt;&lt;br /&gt;Poco a poco comence hacer mis demos en grails, entendiendo conceptos  y/o DSL como Scafolding, GORM (dicho sea de paso es espectacular), utilizando plugin que hacen todavia mas facil la tarea de solucionar problemas comunes y/o complejos.&lt;br /&gt;&lt;br /&gt;Si quieres trabajar en Grails tienes que tener en cuenta que por ejemplo la version 1.1.* ya no soporta jdk 1.4, utiliza como minimo java5. Si es que quieres utlizar jdk 1.4 de todas maneras entonces tendrás que utilizar la version 1.0.&lt;br /&gt;&lt;br /&gt;Soporta la gran mayoria de Base de Datos, por defecto viene embebida la HSQL, dificilmente la usaras en ambiente de producción, tambien viene un Jetty embebido; asi que desde el primer momento no necesitas ni BD ni un servidor web para correr tus demos.&lt;br /&gt;&lt;br /&gt;Es altamente recomendable que hayas utilizado (o que sepas conceptos basicos de) Hibernate y Spring ya que grails se ha basado en estos dos frameworks y si es que no tienes conocimientos de estos framework, va hacer mas costosa la curva de aprendizaje.&lt;br /&gt;&lt;br /&gt;Un punto importante es &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; en el cual grails esta basado; este lenguaje te abrira la mente,te olvidaras de los ";" al final de cada sentencia, te introduciras en el mundo de los "closures", etc, etc. Groovy es un lenguaje dinamico para la JVM, por ende ya tiene solucionado problemas que Java ha solucionado, la Escalabilidad, Concurrencia, Garbage colector, Excepciones, Herencia, etc, etc; ya viene con todo eso y ademas con las bondades de un lenguaje dinamico que por ejemplo: ya no tendrás que parar tu servidor web para corregir un pedazo de codigo en tu controller.&lt;br /&gt;&lt;br /&gt;Finalmente recomendarte (no esta demas) que antes de que inicies un proyecto para grails (y para todos tus proyectos), es muy importante que cuentes con un analisis de diseño de la aplicación.&lt;br /&gt;&lt;br /&gt;Otra cosa que me olvidaba,es que utilizaras bastante la consola para ejecutar script Grails, porque todavia no hay un buen soporte de Grails en  IDEs tales como por ejemplo Eclipse, en Netbeans he oido que tiene un mejor soporte pero para ser francos no lo he probado; lo que si he probado es el Intellij IDEA, que es un excelente ide y tiene (creo yo) el mejor soporte para Grails pero es con licencia osea hay que comprarlo.&lt;br /&gt;&lt;br /&gt;Espero que haya sido de ayuda, si es que eres un fanatico de java por supuesto que te va ha interesar entrar en el nuevo mundo de lenguajes dinamicos que te va abrir la mente; desde luego tienes algunas otras alternativas a groovy, como por ejemplo Ruby, Phyton, Scala; pero eso ya seria otro tema.&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-8261039595595076496?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/8261039595595076496/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=8261039595595076496' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8261039595595076496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8261039595595076496'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/06/desarrollando-con-grails.html' title='Desarrollando con Grails'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-5274682714573533164</id><published>2009-06-01T17:47:00.000-07:00</published><updated>2010-02-17T14:08:36.179-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Acegi'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Haciendo un login en grails</title><content type='html'>En esta ocación vamos a ver como hacer un login para nuestra aplicación web, verán lo facil que es, esto se puede hacer en unos pocos minutos.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;Ya tenemos creada nuestra aplicacion llamanda BookStore, nos situamos en el directorio raiz de nuestra aplicación y instalaremos acegi, es un plugin que maneja la seguridad en una aplicacion grails. Si es que desean mas información &lt;a href="http://grails.org/AcegiSecurity+Plugin"&gt;aqui&lt;/a&gt; esta la pagina web del plugin acegi.&lt;br/&gt;&lt;br/&gt;Ponemos lo sgte por consola:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails install-plugin acegi&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Seguidamente vamos a crear nuestras clases dominio que vamos a necesitar para nuestro login.&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-auth-domains Usuario Rol Requestmap&lt;br/&gt;[/sourcecode]&lt;br/&gt; &lt;br/&gt;Entonces queremos  crear Usuarios y manejar roles por Usuario... ponemos en consola lo sgte:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails generate-manager&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Este comando proporciona al usuario la posibilidad de registrarse y crear su nombre de usuario y contraseña.&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;# grails generate-registration&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Bien ya esta... tenemos a nuestra aplicacion con login, roles y usuarios.&lt;br/&gt;Fijense que simple que es, solo con cuatro script tenemos todo esto y con el soporte que nos da acegi (de springframework).&lt;br/&gt;&lt;br/&gt;Pero no quiero quedarme alli, vamos a crear un controller para que prueben el login.&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-controller Seguridad&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Lo modificamos para que simplemente muestre un mensaje:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;class SecureController {&lt;br/&gt;   def index = {&lt;br/&gt;      render 'Bienvenido a un sitio restringido'&lt;br/&gt;   }&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Recuerden que todavia no hemos creado ningun usuario o rol asi es que corramos nuestra aplicacion y comprobamos que todo esta en orden&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails run-app&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;http://localhost:8080/Bookstore&lt;br/&gt;&lt;br/&gt;Para este post he optado por trabajar con anotaciones, asi es que le diremos a grails que queremos trabajar con anotaciones, y modificaremos el sgte archivo:&lt;br/&gt;BookStore/grails-app/conf/SecurityConfig.groovy:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;security {&lt;br/&gt;&lt;br/&gt;// see DefaultSecurityConfig.groovy for all settable/overridable properties&lt;br/&gt;  active = true&lt;br/&gt;  loginUserDomainClass = "Usuario" authorityDomainClass = "Rol"&lt;br/&gt;  useRequestMapDomainClass = false&lt;br/&gt;  useControllerAnnotations = true &lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;ya que estamos trabajando con anotaciones, borraremos las clases dominio, el controller y la vista de Requestmap:&lt;br/&gt;BookStore/grails-app/domain/Requestmap.groovy&lt;br/&gt;BookStore/grails-app/controllers/RequestmapController.groovy&lt;br/&gt;BookStore/grails-app/views/requestmap/*)&lt;br/&gt;&lt;br/&gt;Ahora vamos a crear un Rol, y luego creamos un usuario.&lt;br/&gt;&lt;br/&gt;supongamos que creamos un Rol "&lt;strong&gt;ROLE_ADMIN&lt;/strong&gt;"&lt;br/&gt;y un usuario "&lt;strong&gt;Administrador&lt;/strong&gt;"&lt;br/&gt;&lt;br/&gt;Ahora añadiremos nuestro controller Seguridad la anotacion para que solamente pueda el rol Administrador:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;import org.codehaus.groovy.grails.plugins.springsecurity.Secured&lt;br/&gt;class SecureController {&lt;br/&gt;   @Secured(['ROLE_ADMIN']) &lt;br/&gt;   def index = {&lt;br/&gt;         render 'Bienvenido a un sitio restringido'&lt;br/&gt;   }&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Bien ahora haremos que nuestro controller "Seguridad" sea la pagina de inicio, para ello vamos a modificar el sgte archivo: grails-app/conf/UrlMappings.groovy&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;class UrlMappings {&lt;br/&gt;    static mappings = {&lt;br/&gt;      "/$controller/$action?/$id?"{&lt;br/&gt;	      constraints {&lt;br/&gt;			 // apply constraints here&lt;br/&gt;		  }&lt;br/&gt;	  }&lt;br/&gt;      "/"(controller:"seguridad")&lt;br/&gt;	  "500"(view:'/error')&lt;br/&gt;	}&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Eso es todo...&lt;br/&gt;&lt;br/&gt;PD: Pongo a disposición el codigo fuente de este ejemplo&lt;br/&gt;&lt;a href="http://joedayz.org/efarfan/wp-content/uploads/2009/07/securityapp.zip"&gt;SecurityApp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-5274682714573533164?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/5274682714573533164/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=5274682714573533164' title='21 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/5274682714573533164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/5274682714573533164'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/06/haciendo-un-login-en-grails.html' title='Haciendo un login en grails'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-3504809779426559173</id><published>2009-05-22T16:03:00.000-07:00</published><updated>2010-02-17T14:08:36.092-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Conferencia'/><category scheme='http://www.blogger.com/atom/ns#' term='Add new tag'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><title type='text'>Conferencia de grails en SpringLive2009</title><content type='html'>El sabado 16 se celebró el SpringLive que organizó la empresa que actualmente estoy laborando (joedayz) y en la cual soy miembro del equipo de desarrolladores. El evento contó con la participación de destacados profesionales de nuestra carrera, y de distintas empresas, los cuales estuvieron a la altura del evento.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;En el grupo de google de &lt;a href="http://groups.google.com/group/itp_java"&gt;ITP_JAVA&lt;/a&gt; y en &lt;a href="http://springperu.com/peru/index.php"&gt;Springperu&lt;/a&gt; pueden encontrar mas detalles sobre este evento, los diferentes demos y codigo fuentes de las demos.&lt;br/&gt;&lt;br/&gt;Por mi parte, ya les dije que soy parte de joedayz y soy el encargado de la investigación e integración con nuestro framework en grails, hice una pequeña demo en grails, no fue la gran cosa pero el objetivo era dar a conocer las bondades que nos ofrece desarrollar con grails, ya que casi nadie sabia lo que es grails (al menos en la conferencia nadie sabia sobre este framework).&lt;br/&gt;&lt;br/&gt;La aplicacion que hice se trataba de un mantenimiento de libros con autor, incluyendo una busqueda para libros y exportacion a excel y a pdf... ahhh y ademas explicamos como configurar la Base de datos en nuestro proyecto. Todo esto en menos de 30 minutos, claro explicando cada punto que estaba dando y por supuesto, respondiendo preguntas del público presente.&lt;br/&gt;&lt;br/&gt;Les dejo con la explicacion del proyectito que hice:&lt;br/&gt;&lt;br/&gt;El primer paso logicamente es descargarme &lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt;,  configurar la variable de entorno para grails (Grails_Home) y tambien de java (Java_Home).&lt;br/&gt;&lt;br/&gt;Verificamos si es que todo esta conforme con el siguiente script: &lt;strong&gt;grails help&lt;/strong&gt;, si todo esta conforme, te deberia mostrar la version de grails que estas utilizando y una lista de scripts que puedes usar.&lt;br/&gt;&lt;br/&gt;Bueno procedamos a la creación de nuestro proyecto&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-app BookStore&lt;br/&gt;[/sourcecode]&lt;br/&gt;Con este Script creamos una estructura básica para nuestro proyecto.&lt;br/&gt;Entramos al directorio de nuestra aplicacion: &lt;strong&gt;cd Bookstore&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;Resumire las carpetas que se han creado:&lt;br/&gt;* grails-app: Carpeta donde tendremos que modificar para su funcionamiento(controllers, vistas, clases de dominio, taglibs, configuraciones,etc.)&lt;br/&gt;* lib: Librerías para nuestro proyecto&lt;br/&gt;* plugins: Plugins instalados&lt;br/&gt;* scripts: Scripts Gant&lt;br/&gt;* src: Clases java o groovy adicionales.&lt;br/&gt;* test: Para pruebas unitarias o de integracion para nuestro proyecto&lt;br/&gt;* web-app: css, imágenes, html, etc.&lt;br/&gt;&lt;br/&gt;Crearemos una clase dominio que se llamara Book&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-domain-class Book&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Una clase dominio vendría hacer el corazon de nuestra aplicación, una de las caracteristicas mas importantes que tienen las clases dominio es que automáticamente son mapeadas en un tabla fisica de nuestra Base de datos, y son persitentes (despues vamos a configurar la BD).&lt;br/&gt;&lt;br/&gt;Abrimos nuestra clase dominio, que se encuentra en BookStore/grails-app/domain/Book.groovy&lt;br/&gt;&lt;code&gt;&lt;br/&gt;Break: (explicar dos puntos)&lt;br/&gt;- Recordemos que grails esta basado en Groovy, es por ello que lleva una extension .groovy.&lt;br/&gt;- Podemos abrir nuestras clases groovy con cualquier editor de texto, o si prefieren pueden utilizar cualquiera de los &lt;a href="http://www.grails.org/IDE+Integration"&gt;Plugin &lt;/a&gt; que estan disponibles para los IDEs.&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;&lt;br/&gt;Modificamos nuestra clase dominio Book poniendo solamente esto:&lt;br/&gt;String titulo&lt;br/&gt;String autor&lt;br/&gt;&lt;br/&gt;Ahora Crearemos nuestro Controller para nuestra Clase domino Book.&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-controller Book&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;A continuacion veremos un concepto muy conocido en lenguajes dinamicos:&lt;br/&gt;Scaffolding, básicamente es la generación de código automático para una aplicación CRUD.&lt;br/&gt;&lt;br/&gt;Abrimos nuestro controller BookController (BookStore/grails-app/controller), y ponemos&lt;br/&gt;&lt;br/&gt;BookController.groovy&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;def scaffold = Book&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y eso es todo lo que tenemos que hacer para tener nuestra aplicacion CRUD para Book.&lt;br/&gt;&lt;br/&gt;Ahora escribimos en consola el sgte script, para correr nuestra aplicación:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails run-app&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;listo, lo podemos ver en http://localhost:8080/Bookstore&lt;br/&gt;&lt;br/&gt;Si es que tienen un tomcat instalado y esta utilizando el puerto 8080, les va a salir un error, esto se soluciona de la sgte manera:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails -Dserver.port=9090 run-app&lt;br/&gt;[/sourcecode]&lt;br/&gt;y nuestra aplicacion correra en el 9090.&lt;br/&gt;http://localhost:8090/Bookstore&lt;br/&gt;&lt;br/&gt;Bien, si todo va bien debereria mostrarte la aplicacion CRUD.&lt;br/&gt;&lt;img src="http://joedayz.org/efarfan/wp-content/uploads/2009/05/grails1.jpg" alt="Aplications CRUD" /&gt;&lt;br/&gt;&lt;br/&gt;&lt;code&gt;&lt;br/&gt;En Grails viene por defecto embebido un contenedor de servlet Jetty y una BD en memoria HSQL.&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;Ahora modificaremos los datos de nuestra BD, y eso lo vamos hacer en el archivo DataSource&lt;br/&gt;&lt;br/&gt;BookStore\grails-app\conf\&lt;strong&gt;DataSource.groovy&lt;/strong&gt;&lt;br/&gt;en nuestro caso vamos a cambiarla a Mysql:&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;dataSource {&lt;br/&gt;pooled = true&lt;br/&gt;driverClassName = "com.mysql.jdbc.Driver"&lt;br/&gt;dialect = org.hibernate.dialect.MySQLInnoDBDialect&lt;br/&gt;username = "root"&lt;br/&gt;password = "root"&lt;br/&gt;}&lt;br/&gt;// en la parte de environments modificamos la&lt;br/&gt;// parte development&lt;br/&gt;&lt;br/&gt;development {&lt;br/&gt;dataSource {&lt;br/&gt;dbCreate = "update"&lt;br/&gt;url = "jdbc:mysql//localhost:3306/MyDataBase"&lt;br/&gt;username = "root"&lt;br/&gt;password = "root"&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Modificamos nuestra clase domino Book&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;String titulo&lt;br/&gt;Date fecha&lt;br/&gt;String editorial&lt;br/&gt;Autor autor&lt;br/&gt;//constrainsts es para poner validaciones&lt;br/&gt;static constraints = {&lt;br/&gt;titulo(nullable:false, blank:false, size:1..80)&lt;br/&gt;fecha()&lt;br/&gt;editorial(nullable:false, blank:false, size:1..60)&lt;br/&gt;autor(nullable:false, blank:false, size:1..60)&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Creamos una clase dominio Autor:&lt;br/&gt;ponemos en consola&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails create-domain-class Autor&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y abrimos la clase y modificamos su contenido&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;String nombre&lt;br/&gt;String apellido&lt;br/&gt;static constraints = {&lt;br/&gt;nombre(nullable:false, blank:false, size:1..80)&lt;br/&gt;apellido(nullable:false, blank:false, size:1..80)&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Ok.. todo bien!!!&lt;br/&gt;Bien ahora nos toca aprender otro script &lt;strong&gt;generate-all&lt;/strong&gt;, este script nos va generar toda nuestra vista y controladores para una clase dominio especifica.&lt;br/&gt;Entonces escribimos en consola el sgte script&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails generate-all Book&lt;br/&gt;[/sourcecode]&lt;br/&gt;Nos preguntará si es que queremos sobreescribir el controller que ya anteriormente hemos creado... le decimos que si ('y').&lt;br/&gt;&lt;br/&gt;Igualmente hacemos lo mismo para la clase dominio Autor.&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails generate-all Autor&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y corremos nuestra aplicacion&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails run-app&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;ya esta.... tenemos dos CRUD con validaciones y persistentes.&lt;br/&gt;&lt;br/&gt;Ahora vamos hacer algo nuevo.&lt;br/&gt;instalaremos un plugin para dar una nueva funcionalidad a mi aplicación. En este caso sera un plugin para &lt;a href="http://www.grails.org/Searchable+Plugin"&gt;busquedas&lt;/a&gt;.&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails install-plugin searchable&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;añadiremso a nuestra clase de dominio Book, la sgte variable:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;String titulo.....&lt;br/&gt;//Variable para la busquedas.&lt;br/&gt;static searchable = true&lt;br/&gt;&lt;br/&gt;static constraints = {....&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y generamos la vista y controller para Book&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails generate-all Book&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;corremos nuestra aplicacion, y obtendremos este resultado.&lt;br/&gt;&lt;br/&gt;&lt;img src="http://joedayz.org/efarfan/wp-content/uploads/2009/05/search.jpg" alt="Controller de Busqueda para Book" /&gt;&lt;br/&gt;&lt;br/&gt;&lt;img src="http://joedayz.org/efarfan/wp-content/uploads/2009/05/pluginsearch.jpg" alt="App con Busqueda" /&gt;&lt;br/&gt;&lt;br/&gt;update 25-05-09&lt;br/&gt;&lt;br/&gt;Bueno, ahora lo que vamos hacer es exportar nuestra lista a un excel y a un pdf.&lt;br/&gt;Comenzaremos primero con la instalación del plugin &lt;strong&gt;export&lt;/strong&gt;:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails install-plugin export&lt;br/&gt;[/sourcecode]&lt;br/&gt;Despues de la instalación añadiremos a nuestro archivo Config.groovy&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;grails.mime.types = [ html: ['text/html','application/xhtml+xml'],&lt;br/&gt;xml: ['text/xml', 'application/xml'],&lt;br/&gt;text: 'text/plain',&lt;br/&gt;js: 'text/javascript',&lt;br/&gt;rss: 'application/rss+xml',&lt;br/&gt;atom: 'application/atom+xml',&lt;br/&gt;css: 'text/css',&lt;br/&gt;csv: 'text/csv',&lt;br/&gt;pdf: 'application/pdf',&lt;br/&gt;excel: 'application/vnd.ms-excel',&lt;br/&gt;all: '*/*',&lt;br/&gt;json: ['application/json','text/json'],&lt;br/&gt;form: 'application/x-www-form-urlencoded',&lt;br/&gt;multipartForm: 'multipart/form-data'&lt;br/&gt;]&lt;br/&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;En nuestro archivo list.gsp de nuestra clase dominio Book (BookStore\grails-app\views\book), ponemos lo sgte:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;&lt;head&gt;&lt;br/&gt;...&lt;br/&gt;&lt;export:resource /&gt;&lt;br/&gt;&lt;head&gt;&lt;br/&gt;...&lt;br/&gt;....&lt;br/&gt;&lt;!--Despues de la paginación--&gt;&lt;br/&gt;&lt;export:formats formats="['csv', 'excel', 'ods', 'pdf', 'xml']" /&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y en el controller modificamos lo sgte:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;import org.codehaus.groovy.grails.commons.ConfigurationHolder&lt;br/&gt;class BookController {&lt;br/&gt;def exportService&lt;br/&gt;....&lt;br/&gt;def list = {&lt;br/&gt;params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)&lt;br/&gt;if(!params.max) params.max = 10&lt;br/&gt;&lt;br/&gt;if(params?.format &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; params.format != "pdf"){&lt;br/&gt;response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]&lt;br/&gt;&lt;br/&gt;response.setHeader("Content-disposition", "attachment; filename=books.${params.format}")&lt;br/&gt;&lt;br/&gt;exportService.export("pdf", response.outputStream,Book.list(params), [:], [:]) }&lt;br/&gt;&lt;br/&gt;if(params?.format &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; params.format != "excel"){ response.contentType=ConfigurationHolder.config.grails.mime.types[params.format]&lt;br/&gt;response.setHeader("Content-disposition", "attachment; filename=books.${params.format}")&lt;br/&gt;&lt;br/&gt;exportService.export("excel", response.outputStream,Book.list(params), [:], [:]) }&lt;br/&gt;&lt;br/&gt;[ bookInstanceList: Book.list( params ), bookInstanceTotal: Book.count() ]&lt;br/&gt;}&lt;br/&gt;......&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;y ya esta.... tenemos la exportacion de excel y de pdf. El Plugin export soporta los sgtes formatos:&lt;br/&gt;* CSV&lt;br/&gt;* Excel&lt;br/&gt;* ODS&lt;br/&gt;* PDF&lt;br/&gt;* XML&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Conclusión:&lt;/strong&gt;&lt;br/&gt;Grails ha nacido para ser un framework con el que sea agradable trabajar, sin repetir código (autogeneracion de codigo),con una curva de aprendizaje relativamente baja, con instalacion de plugin que facilitan tareas, etc, un largo etc.&lt;br/&gt;&lt;br/&gt;Allli esta el codigo completo.&lt;br/&gt;&lt;a href="http://joedayz.org/efarfan/wp-content/uploads/2009/05/bookstore.zip"&gt;BookStore&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;RECURSOS&lt;br/&gt;www.grails.org&lt;br/&gt;www.groovy.org.es&lt;br/&gt;www.manual-de-grails.es  ---&amp;gt;libro en español&lt;br/&gt;http://www.ibm.com/developerworks/java/library/j-grails01158/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-3504809779426559173?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/3504809779426559173/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=3504809779426559173' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/3504809779426559173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/3504809779426559173'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/05/conferencia-de-grails-en-springlive2009.html' title='Conferencia de grails en SpringLive2009'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-1127141923442944820</id><published>2009-02-07T20:31:00.000-08:00</published><updated>2010-02-17T14:08:35.760-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jdbc'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>JBDC con Spring</title><content type='html'>Veran lo simple que es manejar el Jdbc con Spring.&lt;br/&gt;SpringFramework tiene un modulo Jdbc, el cual se encarga de aquellos detalles engorrosos de bajo nivel que pueden provocar que la API de JDBC sea muy tediosa (procesamiento de JDBC y el manejo de errores).&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;En el ejemplo que voy a darles utilizaré la clase JdbcTemplate la cual es la más utilizada para ejecutar queries (consultas, updates, stores procedures), esta clase se encarga de manejar la creación y liberación de recursos(lo cual es importante porque evita muchos errores comunes), dejando que el programador se ocupe de proveer el codigo SQL y de extraer los resultados.&lt;br/&gt;&lt;br/&gt;Manos a la obra:&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;import java.util.List;&lt;br/&gt;import javax.sql.DataSource;&lt;br/&gt;import org.springframework.jdbc.core.JdbcTemplate;&lt;br/&gt;&lt;br/&gt;public class SpringJDBCExampleImpl implements SpringJDBCExample{ &lt;br/&gt;//Declaremos una propiedadad JdbcTemplate  de esta Clase.&lt;br/&gt;JdbcTemplate jdbcTemplate;&lt;br/&gt;&lt;br/&gt;//En este metodo setearemos el DataSource &lt;br/&gt;    public void setDataSource(DataSource dataSource) {&lt;br/&gt;        this.jdbcTemplate = new JdbcTemplate(dataSource);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;//Metodo en el cual introduciremos el query&lt;br/&gt; public List BuscarEmpleado(){&lt;br/&gt;	StringBuffer sql=new StringBuffer();&lt;br/&gt;	sql.append(" select codigo, nombre, superior, departamento from Empleado ");&lt;br/&gt;	return jdbcTemplate.queryForList(sql.toString());&lt;br/&gt;	}&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;En tu clase es lo unico que tienes que hacer, pero por supuesto, para que funcione en una aplicacion web tenemos agregarles unos pequeños detalles.&lt;br/&gt;&lt;br/&gt;El DataSource debe ser configurado como un bean en el contexto de aplicación, el DataSource es parte de la especificación JDBC y puede verse como un pool de conexiones.&lt;br/&gt;&lt;br/&gt;[sourcecode language='xml']&lt;br/&gt;&lt;bean id="MyDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;&lt;br/&gt;	&lt;property name="driverClassName"&gt;&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;&lt;/property&gt;&lt;br/&gt;	&lt;property name="url"&gt;&lt;value&gt;jdbc:oracle:thin:localhost/SpingBD&lt;/value&gt;&lt;/property&gt;&lt;br/&gt;	&lt;property name="username"&gt; &lt;value&gt;myuser&lt;/value&gt;	&lt;/property&gt;&lt;br/&gt;	&lt;property name="password"&gt;&lt;value&gt;mypassword&lt;/value&gt;&lt;/property&gt;&lt;br/&gt;&lt;/bean&gt;&lt;br/&gt;&lt;br/&gt;&lt;bean id="SpringJDBCExample" class="myapplication.repository.SpringJDBCExampleImpl "&gt;&lt;br/&gt; &lt;property name="dataSource" ref="MyDataSource"/&gt;&lt;br/&gt;&lt;/bean&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;En este ultimo bean estoy relacionando mi interface con la clase que la implementa,  en este caso mi interface se llama SpringJDBCExample y la clase que la implementa se llama SpringJDBCExampleImpl, logicamente tengo que definir en mi interface todos los metodos que quiero implementar.&lt;br/&gt;&lt;br/&gt;Despues en este mismo bean tengo una propiedad llamada dataSource,&lt;br/&gt;esta propiedad hace referencia a MyDataSource, que biene hacer la conexion a la base de datos.&lt;br/&gt;&lt;br/&gt;Bueno, esto ha sido un pequeño vistazo a uno de los modulos que tiene SpringFramework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-1127141923442944820?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/1127141923442944820/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=1127141923442944820' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/1127141923442944820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/1127141923442944820'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/02/jbdc-con-spring.html' title='JBDC con Spring'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-4721924396046671007</id><published>2009-02-06T15:28:00.000-08:00</published><updated>2010-02-17T14:08:28.731-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Adf Faces'/><category scheme='http://www.blogger.com/atom/ns#' term='String'/><title type='text'>¿Overflow de un StringBuffer?</title><content type='html'>Los objetos de la clase String están diseñados para ser &lt;a href="http://www.lacaraoscura.com/2005/08/03/objetos-inmutables/"&gt;inmutables&lt;/a&gt;. en la documentacion de JDK verán que cada método en la clase que aparentemente modifica un String en realidad crea y retorna un objeto &lt;a href="http://joedayz.org/efarfan/wp-content/uploads/2009/02/string.jpg"&gt;String completamente nuevo&lt;/a&gt; que contiene la modificación. El String original no se toca para nada.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;Sabiendo esto tenemos como opcion la clase StringBuffer,la cual permite guardar cadenas que puedan cambiar en la ejecución del programa, ademas soporta gran cantidad de caracteres (al menos eso es lo que creía). Según lo que he averiguado, las cadenas de carácteres realmente no están limitadas, sin embargo al estar indexadas por 'int', tenemos el límite fijado en 2^32 carácteres, es decir, una cadena de mas de 4Gb en memoria.&lt;br/&gt;&lt;br/&gt;En java 5 hay una clase mas optimizada. StringBuilder, es idéntica a StringBuffer salvo que no es síncrona (StringBuilder is not thread safe), lo que significa que puede haber problemas si es una variable a la que accedan diferentes Hilos.&lt;br/&gt;&lt;br/&gt;Hace poco me tope con un error raro de StringBuffer, trataba de llenar un reporte de excel y ademas mostrarlo en un jsp... para ello utlize un StringBuffer para hacer la funcionalidad descrita&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;/**Este metodo es que que se encargaría&lt;br/&gt;*de imprimir la tabla en html y despues lo utilizaría para&lt;br/&gt;* exportar la tabla a Excel&lt;br/&gt;*/&lt;br/&gt;private String getHtmlTable() {&lt;br/&gt;StringBuffer tableEmpleados= new StringBuffer();&lt;br/&gt;tableEmpleados.append("  &lt;tr&gt; &lt;td&gt;Nro de empleado&lt;/td&gt;");&lt;br/&gt;tableEmpleados.append("   &lt;td&gt;Nombre de Empleado&lt;/td&gt; &lt;tr&gt;");&lt;br/&gt;&lt;br/&gt;List lista = new ArrayList();&lt;br/&gt;lista=getEmpleados(); //Metodo que captura la lista de empleados.&lt;br/&gt;for (Iterator it = lista.iterator(); it.hasNext();) {&lt;br/&gt;Object[] element = (Object[]) it.next();&lt;br/&gt;String coEmpleado = (String) element[0];&lt;br/&gt;String nombreEmpleado =(String) element[1];&lt;br/&gt;//supongamos que tengo dos campos codigo empleado y nombre de empleado.&lt;br/&gt;&lt;br/&gt;tableEmpleados.append("&lt;tr&gt;&lt;td&gt; " + coEmpleado + " &lt;/td&gt;");&lt;br/&gt;tableEmpleados.append("&lt;td&gt; " + nombreEmpleado + " &lt;/td&gt;");&lt;br/&gt;tableEmpleados.append("&lt;/tr&gt;");&lt;br/&gt;&lt;br/&gt;return  tableEmpleados;&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Con unos pocos registros, esto funcionaba de maravilla, pero la tabla tenia miles de registros, entonces sucedio el Overflow, el StringBuffer al parecer habia llegado hasta el limite. trate que &lt;a href="http://sites.google.com/site/intranetjoedayz/tips-de-programador"&gt;aumentar la memoria&lt;/a&gt; del VM pero no me funciono.&lt;br/&gt;&lt;br/&gt;Siempre me votaba este error "java.lang.OutOfMemoryError: Java heap space", relacionado al StringBuffer.&lt;br/&gt;&lt;br/&gt;Al final solucione (en parte) el problema dividiendolo en dos partes, el mostrarlo en un jsp (utlice una tabla faces), y la exportacion de excel en otro metodo(les dejo un &lt;a href="http://www.javamexico.com/blogs/jali/servlet_tuning"&gt;link&lt;/a&gt; que me sirvio para aumentar velocidad).&lt;br/&gt;&lt;br/&gt;Esta es mi tabla faces, en la que muestro los empleados:&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;&lt;af:table value="#{reportExcel.empleados}" var="item" rows="1000" &gt;&lt;br/&gt;//se acuerdan del metodo getEmpleados (), aqui solo hay que especificar el  metodo o variable que //contiene la lista de empleado y listo&lt;br/&gt;&lt;af:columneaderText="Codigo empleado"&gt;&lt;br/&gt;&lt;af:outputText value="#{item.empl_cd}" /&gt;&lt;br/&gt;//En este caso traigo el registro tal cual esta en la BD&lt;br/&gt;&lt;/af:column&gt;&lt;br/&gt;&lt;af:column columneaderText="Nombre Empleado"&gt;&lt;br/&gt;&lt;af:outputText value="#{item.empl_nm}" /&gt;&lt;br/&gt;&lt;/af:column&gt;&lt;br/&gt;&lt;/af:table&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Anteriormente habia dicho que el problema lo habia solucionado en parte, porque si bien tenia la tabla faces funcionando, cuando le decia que queria traer todos los datos, me mostraba el mismo error.&lt;br/&gt;&lt;br/&gt;[sourcecode language='java']&lt;br/&gt;// cuando pongo rows="0" no estoy utlilizando paginacion&lt;br/&gt;&lt;af:table value="#{reportExcel.empleados}" var="item" rows="0" &gt;&lt;br/&gt;//traigo todos los registros&lt;br/&gt;&lt;af:columneaderText="Codigo empleado"&gt;&lt;br/&gt;&lt;af:outputText value="#{item.empl_cd}" /&gt;&lt;br/&gt;&lt;/af:column&gt;&lt;br/&gt;&lt;af:column columneaderText="Nombre Empleado"&gt;&lt;br/&gt;&lt;af:outputText value="#{item.empl_nm}" /&gt;&lt;br/&gt;&lt;/af:column&gt;&lt;br/&gt;&lt;/af:table&gt;&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Asi es que todavia me quedó la duda, ¿habia un overflow de StringBuffer?.... se que derrepente estan pensando  que el error ("java.lang.OutOfMemoryError: Java heap space") fue por memoria, pues como explique anteriormente aumente la memoria; puede que tambien esten pensando que mi codigo esta mal codificado (derrepente tengan razon), pero tambien tendrian que decirme porque utilizando spring jdbc para traer los registros de la tabla y llamando directamente desde la tabla faces todos los registros, me sale el mismo error.&lt;br/&gt;&lt;br/&gt;Por ultimo quiero recalcar que este codigo esta hecho con jdk 1.4, no lo he intentado con jdk 5.&lt;br/&gt;&lt;br/&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-4721924396046671007?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/4721924396046671007/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=4721924396046671007' title='115 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4721924396046671007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/4721924396046671007'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/02/overflow-de-un-stringbuffer.html' title='¿Overflow de un StringBuffer?'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>115</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-8365194787476171342</id><published>2009-01-07T07:22:00.000-08:00</published><updated>2010-02-17T14:08:27.842-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Jdbc'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Store procedure en spring 2.0 (integrado con Hibernate)</title><content type='html'>Hay diferentes maneras en spring para hacer una llamada a un &lt;a href="http://www.joseselman.com/2008/07/procedimientos-almacenados-con-spring/"&gt;store procedure &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;El link que ven arriba, hace una llamada a un store procedure haciendo uso de StoredProcedure, clase de Spring que provee de soporte para los Stored Procedures.&lt;br/&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br/&gt;Hay un problema con usar este método, ya que por razones de adaptabilidad de la aplicación (y para hacerlo mas fácil dicho sea de paso), me incline por el método siguiente:&lt;br/&gt;&lt;blockquote&gt;public class CallProcedureHibernate extends HibernateDaoSupport implements CallProcedureDAO{&lt;br/&gt;JdbcTemplate jdbcTemplate;&lt;br/&gt;&lt;br/&gt;public void setDataSource(DataSource dataSource) {&lt;br/&gt;this.jdbcTemplate = new JdbcTemplate(dataSource);&lt;br/&gt;}&lt;br/&gt;public void ProcessBonus(){&lt;br/&gt;CallableStatementCallback cb = new CallableStatementCallback() {&lt;br/&gt;public Object doInCallableStatement(CallableStatement cs)&lt;br/&gt;throws SQLException, DataAccessException{&lt;br/&gt;cs.execute();&lt;br/&gt;return null;&lt;br/&gt;}&lt;br/&gt;};&lt;br/&gt;jdbcTemplate.execute("{ call SP_CALCULA() }", cb);&lt;br/&gt;}&lt;br/&gt;}&lt;/blockquote&gt;&lt;br/&gt;Eso es todo lo que tienen que hacer para llamar a un procedure sin valores de entrada ni salidas.&lt;br/&gt;&lt;br/&gt;Logicamente se tiene que tener su services, dao y sus implementaciones, en el archivo de configuracion de hibernate ponemos lo siguiente:&lt;br/&gt;&lt;blockquote&gt;&amp;lt;bean id="CallProcedureDAO" class="app.compensations.dao.hibernate.CallProcedureHibernate"&amp;gt;&lt;br/&gt;&amp;lt;property name="sessionFactory" ref="sessionFactory"/&amp;gt;&lt;br/&gt;&amp;lt;property name="dataSource" ref="DataSource"/&amp;gt;&lt;br/&gt;&amp;lt;/bean&amp;gt;&lt;/blockquote&gt;&lt;br/&gt;Aqui tenemos configurado nuestro DAO, que hace referencia a nuestra clase que llama al Store procedure, logicamente debemos de tener nuestro Beans sessionFactory y DataSource. El primero se encarga de decir al sistema donde se encuentran todos los ficheros de mapeo de Hibernate, el dialecto de Hibernate a utilizar y también va a ser la encargada de asociar los DAO dentro de las Fachadas; El segundo definiremos un datasource con los valores de conexion a la BD o con jndi, segun sea el caso.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-8365194787476171342?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/8365194787476171342/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=8365194787476171342' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8365194787476171342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8365194787476171342'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2009/01/store-procedure-en-spring-20-integrado.html' title='Store procedure en spring 2.0 (integrado con Hibernate)'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-8526571947544069521</id><published>2008-12-30T14:15:00.000-08:00</published><updated>2008-12-30T14:43:46.964-08:00</updated><title type='text'>Algo sobre mi</title><content type='html'>&lt;div style="text-align: justify;"&gt;Quiero compartir con ustedes una parte de mi vida profesional.&lt;br /&gt;&lt;br /&gt;Llevo desarrollando aplicaciones web con java un buen tiempo (un promedio de dos años), he estado utilizando diferentes(muchas) herramientas,plugin, frameworks, jars o como mejor lo llamen,para desarrollo y/o mantenimientos de aplicaciones Web.&lt;br /&gt;&lt;br /&gt;Desde la más basica jsp y servlet hasta struts,spring,adf,jsf,extjs,ibatis...etc,etc.&lt;br /&gt;y ni que hablar de las bases de datos, haciendo mis primeros pasos en Mysql siguiendo por DB2,&lt;br /&gt;Oracle y postgres, en donde mas aprendí fue en oracle, aunque DB2 no se queda atras (aqui creo que más).&lt;br /&gt;He estado en un continuo aprendizaje, y espero seguir asi hasta que la muerte nos separe, y este es un punto que es para reflexionar, ya que si bien suena interesante o emocionante estar en este continuo aprendizaje, es estresante hacerlo cuando existe un tiempo reducido, donde aparte de investigar tienes que desarrollar tu aplicacion perfectamente.&lt;br /&gt;&lt;br /&gt;Estos tres ultimos meses he estado con varias herramientas nuevas trabajando que han hecho sudar la gota gorda, sin embargo la presion y algunos ejemplos en internet (San Google), me hicieron que logre los objetivos trasados en el trabajo.&lt;br /&gt;&lt;br /&gt;Un gran tip que me ha servido mucho es ver codigo que ya esta hecho por otros desarrolladores,&lt;br /&gt;otras aplicaciones y consultar en foros y blogs que debes de tener en tus favoritos, tengo una lista de las&lt;a href="http://edwinfarfan.blogspot.com/2008/12/busqueda-de-codigo.html"&gt; paginas web&lt;/a&gt; que utilizo para ayudarme para desarrollar mis aplicaciones. Otro de los tip que me ha funcionado (de una manera mas efectiva) es preguntar a personas mas experimentadas sobre un tema puntual, ojo preguntas puntuales.&lt;br /&gt;&lt;br /&gt;Otro tema es el ingles que es muy necesario en esta carrera, por ejemplo me estoy preparando para  ser un SCJP, los libros que estan especializados en el tema estan disponibles  en ingles, además el examen esta en ingles (aunque hay versiones en español- según  dicen mal traducidas), con todo esto como escaparse del ingles.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Quiero lograr la certificacion de Java 5.0, para ello me he propuesto dar mi examen aproximadamente en marzo (fecha en la que aparecen el retake de sun), espero tener tiempo para postear algunos articulos sobre la certificacion.&lt;br /&gt;&lt;br /&gt;Nos vemos....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-8526571947544069521?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/8526571947544069521/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=8526571947544069521' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8526571947544069521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/8526571947544069521'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2008/12/algo-sobre-mi.html' title='Algo sobre mi'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-7421302680678715000</id><published>2008-12-18T12:40:00.000-08:00</published><updated>2008-12-18T12:58:19.588-08:00</updated><title type='text'>Busqueda de codigo</title><content type='html'>Quiero compartir esta es una pequeña lista de paginas web que utilizo que me permite buscar codigo open source, y asi poder ver ejemplos y reutilizarlos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/codesearch"&gt;Google &lt;/a&gt;&lt;br /&gt;Es el que mas utilizo, permite buscar por Regex (regular expresion), y otras sintaxis.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.merobase.com/"&gt;Merobase &lt;/a&gt;&lt;br /&gt;buscador de codigo a traves de muchos criterios como podreis ver en su pagina,&lt;br /&gt;incluso permite encontrar una clase que satisfaga un test unitario.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.debugmodeon.com/"&gt;debugOn &lt;/a&gt;&lt;br /&gt;Este portal mezcla la publicación de artículos técnicos con las redes sociales.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://snipplr.com/"&gt;snipplr&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.recortex.com/"&gt;recortex &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.siafoo.net/snippet"&gt;siafoo &lt;/a&gt;(en ingles)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.friendsnippets.com/"&gt;friendsnippets &lt;/a&gt;(en ingles)&lt;br /&gt;&lt;br /&gt;Supongo que deben de haber mas de estas paginas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-7421302680678715000?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/7421302680678715000/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=7421302680678715000' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/7421302680678715000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/7421302680678715000'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2008/12/busqueda-de-codigo.html' title='Busqueda de codigo'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5627012673659001624.post-1984536397796544834</id><published>2008-03-27T21:59:00.000-07:00</published><updated>2009-02-15T12:47:10.513-08:00</updated><title type='text'>Descubriendo ADF</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Chequeando&lt;/span&gt; los requerimientos de un nuevo desarrollo para la empresa que laboro, y investigando sobre como desarrollar la nueva &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;aplicación&lt;/span&gt;, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;encontré&lt;/span&gt; una &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;opción&lt;/span&gt; que me &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;pareció&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;fantástica&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ADF&lt;/span&gt;(&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Application&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Development&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Framework&lt;/span&gt;), ya &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_10"&gt;había&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_11"&gt;oído&lt;/span&gt; de él pero tenia muy poca (nada) experiencia &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_12"&gt;usándolo&lt;/span&gt;.&lt;br /&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;Habría&lt;/span&gt; entonces que sumergirse a fondo para el desarrollo, y &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;aquí&lt;/span&gt; les cuento sobre mi experiencia de este maravilloso &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;framework&lt;/span&gt;.&lt;br /&gt;Llevo algún tiempo desarrollando aplicación en lenguaje Java y este &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;Framework&lt;/span&gt; te hace sentir muy bien, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_18"&gt;&lt;/span&gt;frente a las herramientas que tienes a la mano, digo esto porque el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;JDK&lt;/span&gt; que está implementado en el servidor &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;web&lt;/span&gt; de la empresa es la &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_21"&gt;versión&lt;/span&gt; 1.4, (pienso que una gran &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_22"&gt;mayoría&lt;/span&gt; de empresas debe de estar con esta implementación) y en esta &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_23"&gt;versión&lt;/span&gt; no existen muchas posibilidades muy buenas &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_24"&gt;así&lt;/span&gt; como &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;ADF&lt;/span&gt;.&lt;br /&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_26"&gt;Aquí&lt;/span&gt; les dejo un &lt;a href="http://www.oracle.com/technology/obe/obe9051jdev/ide1012/adfworkshop/buildingadfapplicationsworkshop.htm"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;link&lt;/span&gt;&lt;/a&gt; de un &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;workshop&lt;/span&gt; esta muy bueno y se los recomiendo.&lt;br /&gt;Pero los inconvenientes (quizá por mi poca experiencia con este framework),que he podido encontrar son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Tienes que saber Struts(o algun framework orientado a MVC).&lt;/li&gt;&lt;li&gt;La experiencia cuenta mucho, hay veces que es casi imposible descubrir un pequeño error.&lt;/li&gt;&lt;li&gt;El tema visual es bastante pobre, aunque ahora en la versiones actuales han mejorado mucho.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Estaré ampliando mas esta información&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5627012673659001624-1984536397796544834?l=edwinfarfan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://edwinfarfan.blogspot.com/feeds/1984536397796544834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5627012673659001624&amp;postID=1984536397796544834' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/1984536397796544834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5627012673659001624/posts/default/1984536397796544834'/><link rel='alternate' type='text/html' href='http://edwinfarfan.blogspot.com/2008/03/descubriendo-adf.html' title='Descubriendo ADF'/><author><name>Edwin Farfan</name><uri>http://www.blogger.com/profile/02500498931606529298</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_eZXCgPKCk0k/S3xnNHTpFiI/AAAAAAAAB30/GQlwOAAKVzg/S220/Foto2008.jpg'/></author><thr:total>0</thr:total></entry></feed>
