Compartelo con tus amigos
Lo que uno se encuentra por la red. Me hizo acordar obviamente a Jesus y de un hecho que paso con el papa Juan Pablo II.
En una entrevista un periodista no se si preocupado por su estado de salud o por buscarle que respondia: "Santo padre porque no renuncia". Juan Pablo II le contesto: "Porque tampoco Jesucristo se bajo de la Cruz".
Muchas veces los hombres nos bajamos de la cruz: Divorcio, adulterio, fornicacion, Droga, etc y mas ejemplos que seguro ud. lector pensara o citara mas que su amigo Joe. Pero, hoy a puertas del 2012, me pongo a pensar que alguien murio por mi y por ti. Y que encima es tan caballero que nos da la libertad de decidir si entra o no en nuestra vida.
Un post no tecnico para todos.
Joe
En una entrevista un periodista no se si preocupado por su estado de salud o por buscarle que respondia: "Santo padre porque no renuncia". Juan Pablo II le contesto: "Porque tampoco Jesucristo se bajo de la Cruz".
Muchas veces los hombres nos bajamos de la cruz: Divorcio, adulterio, fornicacion, Droga, etc y mas ejemplos que seguro ud. lector pensara o citara mas que su amigo Joe. Pero, hoy a puertas del 2012, me pongo a pensar que alguien murio por mi y por ti. Y que encima es tan caballero que nos da la libertad de decidir si entra o no en nuestra vida.
Un post no tecnico para todos.
Joe
Lo nuevo en Spring 3.1 - parte 1
Se nos viene Spring 3.1 y voy a citar los cambios que se vienen:
1.- La infraestructura MVC basada en namespaces ahora pasa a MVC Java Config
Ejemplo 1:
// Equivalent to
@EnableWebMvc
@Configuration
public class WebConfig {
// Aqui es donde hariamos nuestra configuracion
}
Ejemplo 2: Veamos un ejemplo de Web Config mas completo.
En este ejemplo se ha hecho una configuracion mas avanzada.
Se elimina:
- Remove @EnableWebMvc
- Extend WebMvcConfigurationSupport
2.- Si quiero declarar otros beans o importar algun archivo xml de beans (seguridad por ejemplo)
Java Config al maximo:
@ComponentScan(basePackages = "org.springframework.samples.mvc31")
3.- Luego la infraestructura MVC
Si bien @MVC fue introducido con Spring 2.5, soporte para REST en la version 3.0. Hay mas que eso, la infraestructura, compuesta por:
- DefaultAnnotaionHandlerMapping
- AnnotationMethodHandlerAdapter
- AnnotationMethodHandlerExceptionResolver
Lo bueno fue que reemplazo toda esa jerarquia de clases que habia en las versiones pasadas.
La nueva infraestructura ahora es:
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
- ExceptionHandlerExceptionResolver
Lo cual fue nombrado despues como:
- @RequestMapping HandlerMapping
- @RequestMapping HandlerAdapter
- @ExceptionHandler ExceptionResolver
Veamos este diagrama para ver como funciona todo:
Ahora tenemos nuevas abstracciones:
- HandlerMethod
- HandlerMethodArgumentResolver
- HandlerMethodReturnValueHandler
Que es posible ahora?
- Custom request conditions
- Build request mappings from any source
- Inspect controller method in interceptors
- Customize any argument or return value
- Design own method signature
De esto veremos en el siguiente post.
Joe
Bit2Bit.com.pe y Acropm.com
Hace 4 annos decidi formar JoeDayz para dedicarme al nicho de academias tecnologias y desarrollar proyectos para la plataforma JEE usando frameworks agiles. Pero, en estos ultimos annos veo como mucha gente talentosa, con certificaciones, maestrias, excelentes trabajos y utilidades imaginables están RENUNCIANDO, si lease bien y lo repito otra vez RENUNCIANDO a la dependencia.
Dejan de ser dependientes y entran como socios, colaboradores a consultoras pequeñas donde el entorno es mas agil, mas productivo y donde los proyectos si se hacen realidad.
Justo conversaba con mi amigo Manuel Borja (con el cual he estudiado en la PUCP y guardo gratos recuerdos de esa epoca y de su familia que me acogió en mis últimos ciclos en la universidad) que este fenomeno esta sucediendo cada vez mas y ya es casi notorio.
Voy a abusar de su amistad y citar su caso. Manuel ha trabajado durante annos en empresas como Yanacocha. Trabajo estable, y no decir de la remuneración + utilidades. Maestria en nada menos que Carnegie mellon. Y un dia decide renunciar y formar su empresa, hacer empresa en Peru (seguro su entorno le diria estas loco) y dejar la "seguridad" del sueldo mensual, CTS, utilidades y crear su start-up bit2bit.com.pe.
Manuel abuso de tu amistad para escribir de ti sin tu permiso. Pero, necesitaba un caso real para sustentar lo que decía en mi tweet. Manuel entonces me comenta sus experiencias, y disfruto mucho ver como la pasion lo embarga y se convierte en el combustible que necesita el emprendedor.
Las empresas grandes siguen buscando trabajar con empresas extranjeras y gastar millones de dólares. Yo les diria a sus Gerentes que pongan atención en las pymes de software, son cada vez mas productivas y en alianza pueden ser muy fuertes. Dejen de estar pagando a fabricas de software que les hacen perder cantidades de dinero y entregan trabajos de calidad cuestionables.
Otro caso para citar es mi amigo Kike Minnan creador de acropm.com que dicta cursos para interesados en el PMBOK®. (Pronto sacaremos cursos en conjunto para el 2012 - aprovecho el parrafo para el cherry) .
El caso de Kike es similar, trabajando annos en T-Gestiona, buenas condiciones económicas, utilidades y decide dejar su "comoda situación" y ser independiente. A la fecha ya viene dictando cursos a diferentes empresas, universidades y a grupos independientes. Ademas de la consultoria a empresas que necesitan una adecuada gestion de un PMO.
A la fecha hemos realizado una alianza para que la gestion y el desarrollo sea en conjunto.
2012 dicen que era el fin del mundo. Yo creo que es la fecha para que algunas start-ups despeguen. Felicito, y estaré muy contento que otras start-ups destaquen y del Peru nazca una empresa que de origen a otro Google a otro Facebook pero MUCHO MEJOR, cosa de lo que estoy completamente seguro porque tras visitar varias provincias, consultoras, y conocer diferentes personas en mis annos de consultor y docente. TENEMOS EL TALENTO, ESTA AHI, pero, se puede perder todo ese maravilloso talento en el sitio y lugar inadecuado.
Lo que si tambien en estos annos, así como se fue el TERRORISMO se vaya la envidia, las ganas de sobresalir tumbando el trabajo de otros. Cuidado que eso da CANCER. Y la falta de profesionalismo malgasta las relaciones personales y embarra de lodo el buen trabajo de los peruanos.
Seamos lideres y no seguidores. Hagamos las cosas simples pero que funcionan.
En fin quien quiera debatir o comentar, gracias por su feedback.
Su amigo Joe para colaborar en lo que se pueda.
Refactoring: Extract Method Object
Ultimo refactor del dia. Cuando vi por primera vez el refactor propuesto por Martin Fowler
Me dije que es esto? Así que para entender esto veamos el siguiente código:
Si aplicamos el refactoring extract method apareceran varios metodos, el problema es que comparten varias variables locales.
Por esa razón es mejor aplicar el Extract Method Object y segregar la lógica en otra clase.
Ver como queda el codigo luego del Refactoring Extract Method Object:
Otro ejemplo en el sitio web de jetbrains:
Joe
Refactoring: Extract Method
Esta semana me compre el intellij idea para mi mac.
Tenemos un fragmento de código que puede ser agrupado.
Llevamos el fragmento a un método cuyo nombre explica el proposito del método.
Y me gusto mucho los refactors que tiene. La tarea mia sera probarlos todo y de paso buscar su equivalente en Eclipse.
Para empezar Intellij IDEA soporta los refactorings propuestos en Refactoring: Improving the Design of Existing Code by Martin Fowler
1.- Extract Method
Si tenemos un código así:
Al aplicar este refactor el resultado es:
Para complementar ver el siguiente video:
Así poco a poco ire documentando cada refactor. Si te interesa comenta o sugiere algún refactor necesitado.
Joe
Mostrar y Ocultar archivos en mac lion
Esto me sirvió mucho para poder ver mi directorio .m2 de maven.
1.- Abre una terminal
2.- Escribe
defaults write com.apple.finder AppleShowAllFiles TRUE ---> FALSE si se quiere ocutar
3.- Finalmente
killall Finder
Y asi se muestran o se borran.
Joe
Primer Taller de Java para Android Developers
Hoy lanzamos el taller de Java. Este taller era necesario porque hay muchas personas interesadas en el tema de desarrollo Android, pero, no saben Java. He visto que muchos han gustado de las alternativas multi-plataforma en lugar de desarrollar nítidamente (con Java).
Así que te recomiendo si te interesa desarrollar aplicaciones nativas con Android metete a este taller.
Nos vemos el 03 de Diciembre.
Informes en:
Joe
R15
Este post nace como consecuencia de mi clase de android de hoy.
Si sale una versión nueva del plugin ADT que hoy 20 de noviembre es la 15.0.1 y no actualizas el Android SDK pues tendrás problemas para correr tus programas de android.
Así que para que no te pase algo similar a lo que te cuento, basta con correr un comando como el que ves en la figura justo en la terminal: android update sdk y eso es todo.
Crear variables de entorno en Mac Lion
Este post lo pongo de apoyo a mi para cuando necesite crear una nueva variable de entorno tenga a la mano los comandos y las variables que ya haya definido.
Espero le sirva a alguien interesado en configurar variables de entorno en mac lion.
Usando textmate por ejemplo:
$mate ~/.bash_profile
El contenido es:
http://pastie.org/2845369
Enjoy!
Espero le sirva a alguien interesado en configurar variables de entorno en mac lion.
Usando textmate por ejemplo:
$mate ~/.bash_profile
El contenido es:
http://pastie.org/2845369
Enjoy!
H2 engine
Una de las cosas que a veces puede complicar la clase de un instructor es no tener instalada la BD.
Imaginemos un aula de 15 alumnos y pediste instalar el IDE, JDK, pero, uy la BD.
Bueno en mi caso para no sufrir mas decidí usar H2.
Donde lo obtengo
http://www.h2database.com/html/main.html
Hay una versión para windows y .zip para otras plataformas.
En mi caso para instalarlo en mi mac me baje el .zip
Quickstart
La instalación es tan sencilla que te recomiendo seguir este URL
http://www.h2database.com/html/quickstart.html
En resumen lo bajas donde quieras, yo en particular uso una carpeta tools donde guardo todo lo que descargo en java y luego voy a usar y bueno ahí lo tengo.
Luego buscas el h2.sh para lanzar la consola web de configuración y creación de tu primera BD H2.
Imaginemos un aula de 15 alumnos y pediste instalar el IDE, JDK, pero, uy la BD.
Bueno en mi caso para no sufrir mas decidí usar H2.
Donde lo obtengo
http://www.h2database.com/html/main.html
Hay una versión para windows y .zip para otras plataformas.
En mi caso para instalarlo en mi mac me baje el .zip
Quickstart
La instalación es tan sencilla que te recomiendo seguir este URL
http://www.h2database.com/html/quickstart.html
En resumen lo bajas donde quieras, yo en particular uso una carpeta tools donde guardo todo lo que descargo en java y luego voy a usar y bueno ahí lo tengo.
Luego buscas el h2.sh para lanzar la consola web de configuración y creación de tu primera BD H2.
Si sigues el url anterior te aparecera una pagina web usando el puerto 8082. No copio las pantallas porque ahí están, solo cambie la BD test por una mia y luego corri este script para probar.
http://pastie.org/2840282
¿Como lo uso?
Luego de crear tus tablas y tener una BD H2 con un nombre digamos (el que puse) roo_crm estas listo para usarlo en tu dataSource. Yo recomiendo tener un database.properties y como ven le digo que use mi H2 engine local apuntando a mi bd roo_crm.
#Updated at Thu Nov 10 00:37:03 PET 2011
#Thu Nov 10 00:37:03 PET 2011
database.password=
database.url=jdbc:h2:tcp://localhost/~/roo_crm
database.username=sa
database.driverClassName=org.h2.Driver
Disfrutalo. No mas problemas para ejecutar en una BD persistente y trabajar comodo.
Cursos Online JoeDayz
Estamos muy contentos de que nuestros cursos ya sean tomados en cuenta fuera del Páis.
En Panama ya nos siguen. Gracias Erwin por tu mail, esto nos compremete a seguir dando lo mejor de nosotros.
Joe
En Panama ya nos siguen. Gracias Erwin por tu mail, esto nos compremete a seguir dando lo mejor de nosotros.
Joe
Hamcrest
Un post técnico que me ha resultado genial probar y me gustaría compartir.
Hamcrest
Cuando trabajas haciendo test, se te pide tener en cuenta lo siguiente:
- Los tests deben ser clarisimos para el lector y transmitir lo que estamos tratando de testear de la forma mas simple posible
- Nuestros tests que fallan deben ser claros acerca del problema presente, no tenemos porque gastar mucho tiempo averiguando cual es la causa del problema
- Nosotros debemos en lo posible seguir la regla TDD "Un Assert por Test" - o lo mas cercano a ese punto.
- Implementar el metodo equals() solamente para que podamos hacer comparaciones en esting es demasiado engorroso para la practica.
Ademas hay que ser sinceros, a veces usamos librerías de terceros y la realidad que encontramos es que no implementan equals(), hashCode() o toString(). Entonces, no podemos usar assertEquals directamente y si lo hicieramos la salida obtenida sería completamente inutil.
Bueno, vamos a probar el ejemplo del tutorial (http://code.google.com/p/hamcrest):
http://pastie.org/2725256
(código fuente)
Nota: Si van a probarlo primero añadan la librería de hamcrest luego la de junit. Me salio un error cuando hice un proyecto java simple y añadir primero junit y luego hamcrest. En fin, segui este tip y lo solucione con http://danmalec.blogspot.com/2010/08/solving-javalangsecurityexception-when.html
Como bien dice la documentación este assertThat es un método estilizado para hacer un test assertion. El sujeto de el assertion es el objeto biscuit que el primer argumento del metodo. El segundo argumento del metodo es un matcher para objetos Biscuit, aqui el matcher chequea que un objeto es igual a otro usando el metodo equals. El test pasa puesto que la clase Biscuit define un metodo equals.
Pero que pasa si no se implementa equals
Fuente: http://blogs.atlassian.com/developer/2009/06/how_hamcrest_can_save_your_sou.html
¿Que pasa si queremos comparar dos objetos que no implementan ni equals, ni hashCode?
assertEquals(thisLightsaber.isSingleBladed(), thatLightsaber.isSingleBladed()); assertEquals(thisLightsaber.getColor(), thatLightsaber.getColor()); assertEquals(thisLightsaber.getHilt(), thatLightsaber.getHilt());
Usando el simple assertEquals de JUnit sería de la forma mostrada.
El tema es que si se cae en una linea, nos resultaría dificil saber donde.
Si aplicamos hamcrest podemos ubicar el error de una manera mas especifica.
http://pastie.org/964394 (código fuente)
Si ejecutamos esto nos saldría un error como este:
java.lang.AssertionError:
Expected: is {singleBladed is
but: {color was
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:8)
at pe.joedayz.samples.LightsaberTest.assertThatAnakinsLightsaberIsLukesFirstLightsaber(LightsaberTest.java:21)
El ejemplo también nos muestra como crear nuestro Matcher personalizado.
Otra cosa interesante que nos muestra tambien hamcrest desde su versión 1.2 es que tenemos un:
static void reportMismatch(String name, Matcher matcher, Object item, Description mismatchDescription, boolean firstMismatch) { if (!firstMismatch) { mismatchDescription.appendText(", "); } mismatchDescription.appendText(name).appendText(" "); matcher.describeMismatch(item, mismatchDescription); }
Donde podemos personalizar mas la salida y ver en donde tenemos la falla.
Trabajandolo con otros Test frameworks
Lo bueno de Hamcrest es que ha sido diseñado para integrarse con Junit, TestNG.
También se puede usar con mock objects frameworks usando adaptadores. Hay para JMock y EasyMock.
Sugar
assertThat(theBiscuit, equalTo(myBiscuit)); assertThat(theBiscuit, is(equalTo(myBiscuit))); assertThat(theBiscuit, is(myBiscuit));
Todos estos son equivalentes.
Creando Matchers personalizados
Código fuente: http://pastie.org/2725591
¿Porque crear un matcher personalizado? pues para eliminar duplicación de código y hacer nuestros tests mas leíbles.
Al copiar el código y ejecutar el test verás que assertThat recibe un argumento de tipo Matcher. Y en este caso se necesita un Matcher
fails with the message
java.lang.AssertionError: Expected: is not a number got : <1.0>
Conclusiones
Nos podemos expresar mejor con Hamcrest. En lugar de usar:
@Test
public void deberiaObtenerIgv(){
double total = 119;
CalculadoraFinanciera calculadoraFinanciera = new CalculadoraFinanciera();
double impuesto = calculadoraFinanciera.obtenerIgv(total);
assertEquals(impuesto, 19, 0);
}
Podemos usar:
@Test
public void deberiaObtenerIgvConHamcrest(){
double total = 119.0;
CalculadoraFinanciera calculadoraFinanciera = new CalculadoraFinanciera();
double impuesto = calculadoraFinanciera.obtenerIgv(total);
assertThat(impuesto, is(19.0));
}
En caso falle nos muestra un error mas entendible:
java.lang.AssertionError:
Expected: is <19.0>
but: was <44.705882352941174>
Si trabajas con colecciones:
@Test
public void deberiaTrabajarConArreglos(){
String[] colors = new String[]{"red", "green", "blue"};
String color = "yellow";
assertThat(color, not(isIn(colors)));
}
Continuará.
Frameworks Ágiles para la Plataforma JEE
Frameworks Ágiles en la Plataforma JEE
Por: Ing. José Amadeo Martin Díaz Díaz
E-mail: [email protected]
Twitter: @jamdiazdiaz
Web: www.joedayz.pe
No soy mucho de escribir
artículos, así que espero realmente que pueda transmitir adecuadamente el
mensaje sobre los Frameworks Ágiles para la plataforma JEE.
En mis 12 años de experiencia
profesional he sido analista programador, arquitecto, coordinador y Gerente en
diversos proyectos para la plataforma JEE.
Utilizo el lenguaje Java desde que salí de la universidad la PUCP (1).
Si bien Java no se caracteriza por
ser un lenguaje dinámico, sino más bien verboso y lleno de clases e interfaces
que aprender, es hoy por hoy el lenguaje escogido por muchas organizaciones
gubernamentales y privadas. “Al cesar lo que es del cesar”.
Sumado a esto tenemos diversos
IDEs o entornos de desarrollo (NetBeans (2), Eclipse (3), Intellij Idea (4)),
Contenedores de Servlets (Ahí tenemos al popular Tomcat (5)), Servidores de
Aplicaciones para escoger (JBoss (6), WebSphere (7), GlassFish (8), WebLogic
(9), tc-server (10), etc), APIs,
Middlewares, Enterprise Server Bus (Mule (11), Apache Service Mix (12)),
Messaging como Rabbit MQ (13), Frameworks de persistencia (Hibernate (14),
Mybatis (15), JPA (16)), Frameworks Web (Spring MVC (17), Tapestry (18),
wickets (19), struts 2 (20), JSF 2.0 (21)), y podemos seguir nombrando más
categorías ubicadas en el segmento open source y/o comercial.
En definitiva hay muchos caminos
que seguir, y supuestamente las empresas que deberían apoyarnos Oracle (22),
IBM (23), RedHat (24) y ahora VMWare (25) en su mayor parte no se destacan por
innovar, casi la mayoría de estándares que tenemos hoy vienen de iniciativas
open source. Gracias a Hibernate y Spring podemos para “muestra un botón” dar
como resultado el estándar compuesto por EJB 3 (26) y JPA.
El camino que esperamos no es
difícil de pensar o desear. Ellos deberían seguir las actividades más
productivas y eso volverlo estándar. No sacar un estándar que finalmente solo una
muestra de la comunidad Java utiliza.
“Otro botón” el muy conocido Java Server Faces. Que hoy por hoy aún no es adoptado en todas
las organizaciones y se utiliza más en ambiente intranet y por evitar la
complejidad del modelo request – response.
Los años pasan y no solo las
metodologías están pidiendo cambios. Por muchos años hemos llevado proyectos siguiendo
los lineamientos de RUP (27), PMI (28) y hemos seguido el esquema Análisis,
Diseño, Construcción, Implantación, Soporte Post Implantación. Este modelo que
suena a “Cascada” (29) funciona muy bien para proyectos predecibles, similares,
pero, para crear nuevos productos o para proyectos de mucho tiempo puede
convertirse en una relación en el que ni el cliente ni el proveedor al final se
quieren ver. Creo que esto es entendible. ¿Quiénes fueron nuestros primeros
profesores de software?, pues Ingenieros Civiles e Industriales. Ellos pues
siguen dicho proceso. Nosotros necesitamos algo diferente.
Las metodologías ágiles entonces
como Scrum (30), Kanban (31), XP (32) ya están causando muchos cambios e
impacto en las organizaciones de a pocos. Lamentablemente y como pasa siempre
en nuestro País, nos enteramos o adoptamos algo cuando ya en nuestros vecinos
Argentina, Chile, Colombia, Brasil, por mencionar algunos ya vienen tras cuatro
años practicando y aplicando.
Hoy por hoy también invito al
lector a revisar sobre Lean Software (33) pues esto les permitirá ver que no
siempre hay que estar pegado al estándar si es que este no nos permite marcar
la diferencia. "Piensa
en grande, actúa en pequeño, equivócate rápido; aprende con rapidez".
Estas metodologías tienen un común denominador y
que es parte del manifiesto ágil (34) que dio lugar a todo: Dar importancia al
equipo, las personas, sus interacciones; al software como nuestro objetivo
final, el cual debe funcionar y no depositar nuestra confianza en sólo
herramientas, o documentación exhaustiva, a dar valor en resumen a lo que es
estrictamente necesario; trabajar en un esquema basado en iteraciones o ciclos
cortos para obtener un mejor feedback del cliente, lo cual implica no tener un
contrato en el cual el cliente y el proveedor no tengan una relación
win-to-win. El punto es tener a las dos partes como ganadoras. Entonces tenemos
que poder responder al cambio, por lo cual los cronogramas Gantt se van a la
basura. Cronogramas que nunca han reflejado la verdad y solo dan
aproximaciones. Entiéndase bien: No se puede predecir el futuro.
Ante todo esta parte metodológica mencionada
anteriormente. Las exigencias de hoy entonces te piden desarrollar cosas “para
ayer”. Durante los últimos años muchas empresas sobre la base de estándares
java desarrollaban su Framework de Trabajo, lo que originaba tener un
Arquitecto que daba mantenimiento a ese framework y llenarlo de todo lo que se
necesitaba por proyecto creándose unos “Transformers” de arquitecturas para dar
soporte a todas las necesidades.
Por suerte estos últimos años, toda esta onda
ágil ha traído innovación e iniciativas open source para crear aplicaciones más
rápidamente sin sacrificar buenas prácticas y performance. Iniciativas como
Spring Roo (35), Grails (36), Play (37), Vaadin (38), Lift (39) han salido al
mercado. Todas ellas open source, y dando soporte a nuevos lenguajes para la
plataforma java como Groovy (40).
En particular he probado Spring Roo, que para
entenderlo bien hay que conocer muchos de los proyectos de SpringSource.com,
JPA. Grails me pareció una muy buena
idea como respuesta a Ruby (41) & Rails (42) que es otro mundo y no solo
optar por JRuby (43), sino convertirse en un framework MVC para desarrollar con
java y Groovy.
Play es como dice su traducción para desarrollar
como jugando. Es muy sencillo de usar y basado en Scala (44) un lenguaje del
cual también debes enterarte y que merece un artículo aparte. Está basado en
Scala en su parte interna, pero puedes desarrollar con java. Permite recargar
tus clases java sin bajar el contenedor.
Los otros no los he probado pero, puedes visitar los
links que adjunto para enterarte por ti mismo estimado lector. Aunque se puede criticar que solo sirve para
hacer mantenimientos simples, para alguien que los ha usado y personalizado,
les puedo asegurar que es una buena iniciativa y que no deberíamos desestimar.
Hay buenos casos de éxito en países vecinos y en el extranjero. ¿Que esperamos?
¿Queremos sorprender al jefe? ¿Queremos destacarnos frente a la competencia con
nuestra capacidad de delivery? Entonces te invito a leer más sobre ellos.
Espero les sea de utilidad y si se ha compartido
mis datos personales, gustosamente podré colaborar con ustedes. Su colaborador
José Díaz.
Elaborado para una revista en la universidad de Abancay.