17 de marzo de 2012

Numero 10001 primo (Coding Dojo) con Groovy



Hace algunos dias me tope con un codigo dojo de nuestros amigos mexicanos 
El problema era el sgte (tomado del project euler):By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.What is the 10001st prime number?

Lo resolví lo mejor que pude utilizando como herramienta Groovy, tengo que señalar que utilice algunos trucos de programación funcional pero en realidad es un poco lento (para este tipo de trabajos) seguramente lo explicare en otro articulo,pero si es que están anciosos y quieren saber mas sobre programación funcional este es un buen articulo.

Sin mas preambulo les dejo con mi solución (utilizando grooovy)

def numeroPrimo = { numIni,numFin ->
    Integer contPrim = 1
    while(contPrim < numFin){
        numIni++
        if (evaluarPrimo(numIni))
            contPrim++
    }        
    return numIni                
}
def evaluarPrimo = { num -> 
     (2..Math.sqrt(num)).every { num % it != 0 } 
}
println "numero: " + numeroPrimo.call(1,10001)

RPTA:104743
El tiempo que me toma es menor a 15 segundos

Si es que tienen alguna mejora por favor envíenla.

6 de marzo de 2012

Agregando UserToken Security con Grails


Hace ya mucho tiempo que no entraba a mi blog, y menos escribir en él.
He decidido hacerlo para compartir algo que a mi me sirvio en su momento, y espero que a alguien por alli tambien lo ayude.
El problema fue el sgte:
Teniamos unos WS que querian llamarlo por intermedio de una aplicacion web,
pero estos WS tenian una Seguridad UserToken .

Bien en este pequeño articulo veran lo facil que es trabajar con Grails(Groovy) y sus herramientas en este caso WSClient. la cual te permite conectarte a WS mediante GroovyWS.
Sin mas....Comencemos:
WebService webService
...
def proxy  = webService.getClient(wsdlURL)
En la primera linea inyectas la Clase WebService del plugin para usarlo para luego conectarte a un WS determinado, en este caso  wsdlURL vendria a ser la url del wsdl (Ejm: "http://localhost:9000/MyappAdminWeb/services/WSEjemplo?wsdl")
pero vamos al punto el UserToken Security:

List headers = new ArrayList();
headers.add(agregaCabecera(servicio))

Bueno alli esta ...esa es la solución, agregamos el código que setea las propiedades de la cabecera del WS y listo...Pero todavía falta la parte de la implementación del metodo agregaCabecera, y es precisamente esa parte por la que todavia seguimos leyendo este articulo:

SoapHeader agregaCabecera (Servicio servicio) {
Document doc = DOMUtils.createDocument();
Element el = doc.createElementNS(WSConstants.WSSE_NS, "wsse:Security");
SoapHeader soapHeader = new SoapHeader(new QName(WSConstants.WSSE_NS, "Security"), el);
soapHeader.setMustUnderstand(true);

Element elem = (Element)soapHeader.getObject();
WSSecUsernameToken userTokenBuilder = new WSSecUsernameToken();
userTokenBuilder.setUserInfo(servicio.usuario, servicio.password)
userTokenBuilder.setPasswordType(WSConstants.PASSWORD_TEXT);
userTokenBuilder.prepare(elem.getOwnerDocument());
elem.appendChild(userTokenBuilder.getUsernameTokenElement());
return soapHeader
}

Servicio no es mas que un bean donde encapsulo el usuario y password de neustro WS y lo paso como parameto al metodo agregaCabecera  en el cual vas a editar la cabecera SOAP para poner tu UserToken Security para luego lo agreguemos a request de nuestro WS.

 proxy.client.getRequestContext().put(Header.HEADER_LIST, headers);

TIP: una de las cosas que me sirvio bastante es ver lo que imprimia la cabecera, para ello
tienes este par de lineas que te impriran y te mostrarán lo que hay en la cabecera de tu WS

proxy.client.getOutInterceptors().add(new LoggingOutInterceptor());
proxy.client.getInInterceptors().add(new LoggingInInterceptor());

Por ultimo quisiera mostrarles las clases que se importaron:
 
import javax.xml.namespace.QName
import javax.xml.parsers.DocumentBuilder
import org.apache.cxf.binding.soap.SoapHeader
import org.apache.cxf.headers.Header
import org.apache.cxf.helpers.DOMUtils
import org.apache.cxf.interceptor.LoggingInInterceptor
import org.apache.cxf.interceptor.LoggingOutInterceptor
import org.apache.cxf.jaxb.*
import org.apache.ws.security.WSConstants
import org.apache.ws.security.message.WSSecUsernameToken
import org.grails.plugins.wsclient.service.WebService
import org.w3c.dom.Document
import org.w3c.dom.Element

No fue fácil hallar esta solución ya que nunca había trabajado con WS con User Token Security, pero fíjense lo simple que puede ser el código, he encontrado que implementan una solución parecida pero con muchísima mas lineas de código.

Hasta la proxima.

17 de febrero de 2010

Integración continua

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. (Martin Fowler)

La Integración Continua está asociado con las metodologías de programación extrema (XP) y desarrollo ágil.

Ventajas
- Reducción del tiempo de integración.
- Detección de errores lo más pronto posible.
- Pruebas inmediatas tras un cambio en el código.
- Disponibilidad del código para test, demos, etc.

Desventajas
- Sobrecarga por el mantenimiento del sistema.
- Necesidad potencial de un servidor dedicado a build.
- 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


QUE NECESITAMOS???

Software
- Control de Versiones (SVN)
- Herramienta para generar Build y automizacion de tareas (Maven - Hudson)
- Repositorio local (Nexus)
- Estadisticas y/o reportes de Analisis de Codigo (Sonar)

Hardware
- Servidor dedicado a IC
- Espacio en el disco



SUBVERSION
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.

Caracteristicas:
- Actualiza ficheros modificados
- Historial de cambios.
- Registra cambios en la estructura de directorios (permite mover y renombrar sin perder el historial).
- Commits atómicos, se realizan todos o ninguno.


MAVEN
Es una herramienta de software para la gestión y construcción de proyectos Java.
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.


NEXUS
Nexus es un administrador visual de repositorios para Maven.
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).


HUDSON
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.
Se integra facilmente con Maven y tiene un sin numero de plugin que se pueden utilizar.


SONAR

Permite la verificacion de la calidad del codigo java, en otras palabras, calcula y muestra en formato web metricas de nuestros proyecto.
Herramientas como PMD, CheckStyle, FindBugs, Cobertura, etc, etc; ya vienen embebidas en Sonar.



Comenzamos con Nuestra Integracion Continua
En este caso esta instalado sobre un servidor linux (redhat)

Instalar java
$ chmod +x jdk-6xxx.bin (para rpms ... chmod a+x jdk-6xxx-rpm.bin)
$ ./jdk-6xxx.bin

Subversion
Lo primero que tenemos que hacer es instalar el Subversion nos bajamos los siguientes archivos rpm’s de la página oficial.
rpm -i CollabNetSubversion-client-1.6.6-1.i386.rpm
rpm -i CollabNetSubversion-server-1.6.6-1.i386.rpm

detenemos el subversion para configurarlo.
$ sudo /etc/rc.d/init.d/collabnet_subversion stop

agregar la variable de entorno para subversion
PATH=/opt/CollabNet_Subversion/bin:$PATH

ejecutar el siguiente script:
$ sudo Configure-CollabNet-Subversion

Este script te configura todo para Subversion, (usuarios, repositorios, usuarios. etc)

Es muy probable que tu servidor tenga Proxy, para solucionar esto podrias utilizar https, mediante el Openssl que ya viene instalado en el colabNet
Para que subversion acepte SSL

$ openssl genrsa -des3 -out server.key 1024
$ openssl req -new -key server.key -out server.csr

Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:PE
State or Province Name (full name) [Berkshire]:Lima
Locality Name (eg, city) [Newbury]:Lima
Organization Name (eg, company) [My Company Ltd]:Asociacion Privada
Organizational Unit Name (eg, section) []:Sistemas
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:yourmail@mail.com


$ openssl req -new -key server.key -x509 -out server.crt
$ cp server.key server.key.save
$ openssl rsa -in server.key.save -out server.key

En el archvo de configuración collabnet_subversion_httpd.conf:
<location repos="">
....
<ifdefine ssl="">
SSLRequireSSL
</ifdefine>
....
</location>

Maven
Se descomprime el archivo de instalación y se crea una variable de entorno:
export MAVEN_HOME=/directorio/donde/estadescompimido/maven
export PATH=$PATH:$MAVEN_HOME/bin
$mvn --version


Por ultimo, si todo esta bien, tenemos que copiar y pegar nuestro setting.xml en
$HOME/.m2/setting.xml

Configuracion del tomcat
Para instalar tomcat, simplemente se descomprime el archivo en una ruta valida.
unzip apache-tomcat-6.0.20.zip
configurar el puerto del tomcat:
<connector port="8082"></connector>

Despues de configurar el Tomcat, inscribimos unas variables de entorno en el $home/.bashrc.
MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=256m"

CATALINA_OPTS="-Xms1024m-Xmx1024m -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -XX:MaxPermSize=256m"


Cambiando la Base de datos para Sonar:
Debemos de tener instalado una base de datos, en este caso al Mysql
$mysql -u root -p
(aqui pones el password)
mysql$ CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql$ grant all privileges on sonar.* to 'sonar'@'localhost' identified by 'sonar';
mysql$ flush privileges



Instalación de Sonar
La instalación es bastante sencilla.Download y unzip en el directorio donde se va a guardar Sonar, lo descargamos de su pagina web, desempaquetar el zip:
$ unzip sonar-1.11.zip
Generamos el war:
InstalSonarDir/war$ ./build-war.sh ---> con esta sentencia generamos el war.
Solo basta colocar el war que generarmos en el webapp de tomcat y listo.
Http://localhost:8082/sonar

Instalación de Hudson
Descargar en esta dirección. Instalar Hudson, solamente basta con copiar y pegar en el webapp del tomcat.

Ahora solo falta levantar el tomcat.
$tomcat/bin/ ./startup.sh


y listo... ya tengo instalado nuestra integracion continua..

23 de julio de 2009

Repasando algunas caracteristicas de Groovy

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.

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.
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.

3 de julio de 2009

Groovy... una mirada superficial

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.
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.

18 de junio de 2009

Desarrollando con Grails

Despues de un buen tiempo le doy un poco de espacio a este blog en la web.

El objetivo de este post publicar un poco mi experiencia que tengo sobre grails aqui en este post, y espero que sirva de ayuda.

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 Netbeans aposto por JRuby y no por Groovy o cosas asi, que parecia que el norte estaba a Ruby.

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).

Casi a finales de 2008 comence a ver Grails, 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.

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.

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.

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.

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.

Un punto importante es Groovy 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.

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.

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.

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.

Saludos

1 de junio de 2009

Haciendo un login en grails

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.