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.

22 de mayo de 2009

Conferencia de grails en SpringLive2009

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.

7 de febrero de 2009

JBDC con Spring

Veran lo simple que es manejar el Jdbc con Spring.
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).

6 de febrero de 2009

¿Overflow de un StringBuffer?

Los objetos de la clase String están diseñados para ser inmutables. 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 String completamente nuevo que contiene la modificación. El String original no se toca para nada.

7 de enero de 2009

Store procedure en spring 2.0 (integrado con Hibernate)

Hay diferentes maneras en spring para hacer una llamada a un store procedure

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.

30 de diciembre de 2008

Algo sobre mi

Quiero compartir con ustedes una parte de mi vida profesional.

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.

Desde la más basica jsp y servlet hasta struts,spring,adf,jsf,extjs,ibatis...etc,etc.
y ni que hablar de las bases de datos, haciendo mis primeros pasos en Mysql siguiendo por DB2,
Oracle y postgres, en donde mas aprendí fue en oracle, aunque DB2 no se queda atras (aqui creo que más).
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.

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.

Un gran tip que me ha servido mucho es ver codigo que ya esta hecho por otros desarrolladores,
otras aplicaciones y consultar en foros y blogs que debes de tener en tus favoritos, tengo una lista de las paginas web 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.

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.

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.

Nos vemos....

18 de diciembre de 2008

Busqueda de codigo

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.


Google
Es el que mas utilizo, permite buscar por Regex (regular expresion), y otras sintaxis.


Merobase
buscador de codigo a traves de muchos criterios como podreis ver en su pagina,
incluso permite encontrar una clase que satisfaga un test unitario.

debugOn
Este portal mezcla la publicación de artículos técnicos con las redes sociales.

snipplr

recortex

siafoo (en ingles)

friendsnippets (en ingles)

Supongo que deben de haber mas de estas paginas.

27 de marzo de 2008

Descubriendo ADF

Chequeando los requerimientos de un nuevo desarrollo para la empresa que laboro, y investigando sobre como desarrollar la nueva aplicación, encontré una opción que me pareció fantástica, ADF(Application Development Framework), ya había oído de él pero tenia muy poca (nada) experiencia usándolo.
Habría entonces que sumergirse a fondo para el desarrollo, y aquí les cuento sobre mi experiencia de este maravilloso framework.
Llevo algún tiempo desarrollando aplicación en lenguaje Java y este Framework te hace sentir muy bien, frente a las herramientas que tienes a la mano, digo esto porque el JDK que está implementado en el servidor web de la empresa es la versión 1.4, (pienso que una gran mayoría de empresas debe de estar con esta implementación) y en esta versión no existen muchas posibilidades muy buenas así como ADF.
Aquí les dejo un link de un workshop esta muy bueno y se los recomiendo.
Pero los inconvenientes (quizá por mi poca experiencia con este framework),que he podido encontrar son:
  • Tienes que saber Struts(o algun framework orientado a MVC).
  • La experiencia cuenta mucho, hay veces que es casi imposible descubrir un pequeño error.
  • El tema visual es bastante pobre, aunque ahora en la versiones actuales han mejorado mucho.

Estaré ampliando mas esta información