Mar 11 2010

CAS2010

Categoría: EventosJuan @ 3:24 pm

Conferencia Agile Spain 2010La CAS2010, primera conferencia sobre métodos y prácticas ágiles en España, ya está en marcha

Será el 10 y 11 de junio en Madrid, exactamente en el Campus Sur de la U.P.M. en la E.U. Informática.

La gente de Agile Spain le estamos poniendo muchas ganas no sólo para que esto salga adelante, sino para que sea una conferencia de la que todo el mundo está orgulloso y con ganas de repetir en próximos años.

La conferencia contará con la presencia de Henrik Kniberg, autor de “Scrum y XP desde las trincheras” y de “Kanban vs. Scrum – Obteniendo lo mejor de ambos”, además miembro de la junta directiva de la Agile Alliance, y uno de los máximos divulgadores internacionales en la aplicación práctica de las metodologías ágiles.

Ahora estamos en fase de recepción de sesiones, talleres, charlas, etc., ¡anímate y participa!

Etiquetas: , ,


Mar 11 2010

Reflexiones sobre los problemas del desarrollo orientado a pruebas

Categoría: Test UnitariosJuan @ 2:45 pm

Hace tiempo llegó a mis manos un enlace sobre TDD (si no recuerdo mal, en un comentario a alguna anotación del blog de JMB), dónde el autor explicaba los problemas de TDD y por qué, en su opinión, hacer TDD no merece la pena. Hoy voy a escribir un poco sobre esto y a dar mi punto de vista sobre TDD y sobre lo que el autor comenta sobre TDD.

El autor comienza exponiendo que no está demostrado por la comunidad científica que TDD aporte mejoras significativas en el desarrollo del software. Como ejemplo cita a un par de párrafos de Maria Siniaalto en su artículo Test-Driven Development: empirical body of evidence. De esos dos, me quedo con el siguiente:

The empirical evidence on the practical use of TDD and its impacts on software development are still quite limited.

[La evidencia empírica en el uso práctico de TDD y su impacto en el desarrollo del software esta, todavía, muy limitada]

Con este soporte, pasa a dar su opinión que defenderá en el resto del texto:

I mention this first because I’ve concluded that not only is TDD not useful for me but I don’t think it’s a generally useful technique

[Menciono esto primero porque he concluido que no sólo TDD no es útil para mi, sino que no creo que sea una técnica útil en general]

No hace mucho, en la lista de correo de TDD en español (en la cual os invito a participar si estáis interesados en este tema) hablamos de lo mismo debido a otro articulo diferente. Mi punto sigue siendo el mismo que en aquel entonces (de hecho, he reutilizado algunas frases). Un estudio para ver si TDD mejora o no la calidad, rendimiento, etc., tiene que tener muchísimas variables en cuenta. Se me ocurren tres escenarios:

  • Proyectos distintos (con y sin TDD), gente distinta. La comparación no es posible porque la gente es distinta, los proyectos son distintos, los equipos son distintos, los comportamientos son distintos, etc.
  • Mismos proyectos (con y sin TDD), misma gente. Si ponemos primero a gente en un proyecto sin hacer TDD y se estudia, y luego se repite el estudio con la misma gente haciendo TDD, tampoco es posible hacer una buena comparación porque los individuos ya tienen conocimiento y experiencia en el proyecto.
  • Proyectos distintos (con y sin TDD), misma gente. Igualmente habría muchas variables dentro de los proyectos que podr�an influir en el resultado del mismo (complejidad, asuntos personales, ambiente…).

Según lo veo yo, para hacer un estudio de estas características se necesitan un número suficientemente grande de gente y proyectos para que sea estadísticamente significativo (y eso es mucho dinero y mucho tiempo). No creo que vaya a pasar y por tanto siempre habrá unos artículos dónde salga que TDD es mejor y otros en los que se diga que TDD es peor ya que, como se ha dicho, hay muchos otros factores influyen en el resultado.

Lo importante para mi no es que haya artículos de investigación que “demuestren” las maravillas o la perdida de tiempo que supone hacer TDD. Lo que a mi me importa es lo que yo veo y siento cuando hago TDD y lo que, por mi experiencia, veo en equipos e individuos cuando hacen TDD. Personalmente, a mi me sirve para hacer mejor código, más claro y más testeable. Mi código es mejor, mi actitud es mejor, me obligo a pensar más en las pruebas, tengo más confianza en que lo que he hecho funciona y, además, disfruto haciéndolo.

En el artículo mencionado al principio, el autor dice que TDD no da confianza en que el código funcione. La explicación es que en TDD no se pueden añadir pruebas que no hagan fallar código:

TDD by itself cannot give you that confidence because it excludes the idea of adding tests which are expected to pass

[TDD por sí mismo no puede darte esa confianza porque excluye la idea de añadir pruebas que se espera que pasen]

Estoy completamente en desacuerdo. Es más, no estoy del todo seguro de que, incluso siendo purista, no se puedan añadir pruebas que no hagan fallar el código. Robert C. Martin (Uncle Bob) escribe en su artículo “Las tres reglas de TDD“, la siguiente regla número dos: “You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures“. Esta frase se puede interpretar como que una vez que has escrito una prueba que haga fallar el código, no esté permitido escribir ninguna otra prueba más, pero eso no tiene que significar que todas las pruebas que se escriban deban fallar en un principio. Es más, Kent Beck en su libro Test-Driven Development by example habla de sólo dos reglas fundamentales antes de presentar más:

  1. Write new code only if an automated test has failed [Escribe nuevo código sólo si una prueba automática ha fallado]
  2. Eliminate duplication [Elimina la duplicidad]

Ninguna de estas reglas supone una contradicción al escribir pruebas que pasen. Si lo miramos desde un punto de vista práctico, no hacemos más que asegurarnos de que ese caso pasa, ¿qué tienes esto de malo?, ¿por qué deberíamos borrarlo o no usarlo si pasa?, ¿por qué debería estar prohibido?. Cuando escribimos código para hacer pasar un test, escribimos el código más simple que podemos pensar para hacer pasar la prueba, sin embargo, esto no tiene por qué conllevar que ese “código mínimo” solamente hace pasar ese test específico. Algunas personas que hacen TDD dicen que lo que habría que hacer es “romper el código” artificialmente para ver cómo la prueba falla y después “arreglarlo” para verla pasar. En mi opinión esto es una pérdida de tiempo y ganas de hacer que una buena práctica parezca una religión. (Incluso el diagrama de flujo en la wikipedia, no ve contradicción en escribir una prueba que pase :-) )

El autor también habla de que TDD no considera el peor caso o casos límite. ¿Cómo?. Claro que no, esto es puramente dependiente del programador (igual que lo es si hacemos pruebas al final), de lo cuidadoso que sea con las pruebas y de cuanto piense en los casos que necesita. No obstante, hay una gran ventaja al hacer TDD y es que para que escribir el código tienes que escribir las pruebas antes y eso te garantiza, al menos, cierto número de casos (¿cuantos se garantizan al hacer pruebas al final?). Obviamente, hay que pensar y esforzarse, eso no viene gratis por el hecho de TDD. Sin embargo, en mi experiencia es más fácil olvidarse de un test cuando ya tienes el código escrito que cuando todavía está por escribir y tienes que pensar en casos y comportamientos. Habla también del rendimiento y de cómo TDD no se centra en ello. Estoy de acuerdo en que TDD no es la mejor aproximación a la programación de algoritmos pero eso no quita para que no se pueda hacer. Igual que se hacen otro tipos de pruebas, se pueden añadir pruebas de rendimiento y mejorarlo en la fase de refactorización sin cambiar el comportamiento. ¡Para eso tenemos las pruebas!

Hay algunas cosas más de las que habla el autor, pero estas eran para mi las más importantes y en las que me quería enfocar y rebatir. Hay una idea que sí que nunca había oído antes que me ha llamado mucho la atención y en la que creo que merece la pena reflexionar:

If I write the tests first, I also worry that I’ve overfit my code to the tests. This is a problem that happens in statistical modelling. Given any set of data points, I can fit them to a model. The next question is, is the model valid and useful? The way to check is to use them to make predictions, and see how well it matches reality. This in turn means testing the model with data which wasn’t used to make the model.

[Si escribo pruebas primero, también me preocupo de que he me he pasado dando forma al código con las pruebas. Este es un problema que ocurre en modelos estadísticos. Dado cualquier conjunto de puntos de datos, puedo encontrar un modelo que le corresponda. La siguiente pregunta es, ¿es el modelo válido y útil?. La manera de verificar esto es usar el modelo para hacer predicciones y ver cómo de bien refleja la realidad. Esto significar probar el modelo con datos que no han sido usado para crear el modelo]

En principio, esa es una de las grandes ventajas de TDD, el modelado del código mediante las pruebas, pero, ¿es posible que debido a las pruebas estemos haciendo un modelo que se ajuste a las pruebas pero no al comportamiento general? Es posible y realmente merece la pena mirar los modelos estadísticos para entenderlo un poco mejor (lo tengo pendiente ya que la estadística la tengo muy olvidada) (supongo que este es el problema de hacer modelos de dominios infinitos con un número finito de datos). Sin embargo, creo que es obvio que TDD no es la panacea y que si usamos TDD todavía necesitamos usar otras prácticas. El código, después de todo, debe ser sujeto a pruebas de sistema, de estrés, de rendimiento, de exploración que, por otro lado, están fuera del modelo bajo el cual se ha escrito el código.

Como resumen, decir que creo que es estúpido el tratar a TDD como una religión. Pero es igualmente estúpido el tratar de ser “anti-TDD” como religión. No creo que es lógico decir que TDD es la solución a todos mis problemas, al igual que no es lógico decir “TDD es una práctica que no sirve para nada si usas otras prácticas”. Esto no llega a ningún lado y el contexto influye en las prácticas que hay que tomar y cuando utilizar una u otra. En mi experiencia, he visto gente y equipos que han mejorado mucho (sobre todo en número de errores bugs) al empezar a hacer TDD mientras que otros han hecho el mismo código malo con el añadido de que un montón de pruebas horribles. También he visto equipos con gente muy metida en tests (haciéndolos después del código) que al tomar TDD en práctica no han notado mejoría en número de bugs o en rendimiento. Al final, lo más importante es tener buena gente en el equipo que tengan actitud profesional, buenas aptitudes y ganas de mejorar.

P.D.: Dejo algunos enlaces muy interesantes que he estado leyendo últimamente sobre TDD y algoritmos.

http://www.infoq.com/news/2007/05/tdd-sudoku

http://www.reddit.com/r/programming/comments/9sdcm/tdd_sudoku_i_took_a_stab_at_it_see_inside_part_1/

http://norvig.com/sudoku.html

Etiquetas:


Feb 02 2010

Kanban vs. Scrum - Obteniendo lo mejor de ambos

Categoría: ManualesJuan @ 3:34 pm

Una nueva traducción de Agile Spain coordinada por Ángel Medinilla quién ya tradujo el libro anterior de Kniberg y Skarin, “Scrum y XP desde las trincheras“.

Ángel resume muy bien en su anotación el libro y el por qué de esta y anteriores traducciones así que no voy a añadir ni una palabra más.

Nada más que felicitar a todos los que han tomado parte en este proyecto: Rodrigo Corral, Teo Sánchez, Gregorio Mena, Laura Morillo Velarde, Ángel Agueda (Legnita), Jorge Uriarte, Agustín Yague, Juan Palacio, Xavier Quesada, Javier Sánchez, Jorge Jiménez y Juan Carlos Quijano. Felicitaciones también, cómo no, a Ángel Medinilla.

Aquí tenéis el enlace directo al libro en español.

Lo añado también a la página de Más Información.

Etiquetas: , ,


Feb 01 2010

Juego del Valor de Negocio

Categoría: Manuales, OtrosJuan @ 4:43 pm

Uno de las objetivos que tenemos en Agile Spain es crear y traducir contenido sobre las metodologías ágiles en Español.

Por este motivo, he traducido el Juego del Valor de Negocio creado por Veera Peeters y Pascal Van Cauwenberghe, el cual es un juego de simulación sobre prioridades de funcionalidades e historias de usuario así cómo su valor de negocio. Este juego se ha jugado varias veces en diferentes conferencias como la XP o Scan Agile con muy buenos comentarios sobre él.

Podéis encontrar el juego en aquí (pagina en inglés) o bajarlo directamente desde éste enlace directo. Espero que lo encontréis de utilidad y también, cómo no, que os divirtáis y aprendáis jugando.

Muchísimas gracias a Leo Antolí (también de Agile Spain) y Thomas Wallet (de Pragma Consultores) por la revisión de la traducción y todas sus correcciones y comentarios.

Etiquetas: , ,


Ene 13 2010

Manifiesto de Usuario

Categoría: PrincipiosJuan @ 4:18 pm

Hoy me he encontrado con una página del señor Alistair Cockburn (autor de “Crystal Clear” o “Writing Effective Use Cases” entre otros) dónde se discute una extensión del “Manifiesto Ágil” para mostrar la visión del usuario, lo cual me parece una gran idea.

El manifesto que está ahora mismo bajo discusión (puedes dar tu verisión u opinión en la página -en inglés-) dice más o menos lo siguiente (hay cuatro versiónes que se diferencian en cómo están escritas, no en las ideas, así que traduzco, malamente, sólo la primera):

Queremos equipos de producto que entreguen productos
… que no sólo “funcionen” o concuerden con una lista, sino que resuelvan mis problemas,
… que no sólo encajen con mis necesidades de momento, sino que evolucionen con mis necesidades,
… que no funcionen de la forma que los diseñadores piensan que deberían funcionar, sino que funcionen de la manera que yo trabajo,
… que no sólo los vea como herramientas, sino que lleven a cabo el trabajo que hago,
… que no sólo los use, sino que disfrute usándolos.

Bastante razonables aunque no veo la última del todo. No creo que en muchos casos un usuario quiera “disfrutar” con el producto. Estaría muy bien, claro que sí, pero dudo que sea la palabra correcta para alguien que usa una aplicación durante todo el día para calcular lo que sea, por ejemplo. Yo me decantaría por algo como “sino que sean fáciles de usar”, “sino que hagan mi vida más fácil”, “sino que hagan mi trabajo más placentero”… algo así.

¿Qué pensáis vosotros que debería contener el manifesto?

Nota: No tengo muy claro cual es la traducción correcta de “see through to the work I’m getting done”. Lo he traducido como “llevar a cabo el trabajo que hago” pero quizá debería ser “ayudarme con el trabajo que hago” o alguna otra cosa.

Etiquetas:


Ene 11 2010

Diseño Ágil con TDD

Categoría: Desarrollo de software, Libros, Test UnitariosJuan @ 4:17 pm

diseno_agil_con_tdd_libro.jpgÚltimamente va de libros, pero este tiene un sabor muy, muy especial.

Carlos Blé ha escrito este libro sobre “Diseño Orientado por Pruebas” o TDD (Test Driven Development en inglés) principalmente, aunque en general trata de desarrollo de software ágil. El libro empieza por una introducción a las metodologías ágiles y a lo que es TDD para ir, poco a poco, metiéndose más de lleno con las pruebas en sus distintos niveles (unitarias, integración, aceptación, etc.), dobles de prueba, frameworks para test unitarios y de aceptación, etc. Termina, además, con una breve introducción a la integración continua.

Sin embargo, lo mejor del libro reside en el aspecto práctico ya que su mayor parte se enfoca en enseñar cómo diseñar software usando TDD de una manera totalmente práctica. Para esto usa distintos ejemplos, en un principio, para moverse después a un desarrollo completo de una aplicación (una calculadora) usando el desarrollo orientado por pruebas. Los ejemplos, por cierto, vienen dados en C# (mayoritariamente) y Python.

No os cuento más, ¡tenéis que leerlo!

En el portal www.dirigidoportests.com podéis encontrar más información sobre el libro, descargar una versión gratuita en PDF, dejar comentarios, ayudar con la “fé de erratas”, leer más sobre TDD e, incluso, comprarlo en Lulu si os ha gustado y creéis que merece la pena (espero que así sea).

Como decía al principio de esta anotación, este libro tiene un sabor muy especial para mí ya que Carlos me brindó la oportunidad de colaborar escribiendo un capítulo del mismo. Ha sido todo un honor y un placer ayudar a Carlos con este pedazo de libro que, si no me equivoco, es el primero (o al menos de los primeros) de esta temática en español.

He de añadir que he pasado un tiempo excepcional escribiendo, revisando y, sobre todo, discutiendo con Carlos. He aprendido muchísimo con él y de él. Muchísimas gracias, Carlos, ¡eres un fenómeno!

Etiquetas:


Ene 08 2010

Jefes y libros

Categoría: Equipos, LibrosJuan @ 4:05 pm

Leyendo “The Pragmatic Programmer” me vino a la cabeza que este es un libro que daría a todo nuevo programador (especialmente a los que tengan poca experiencia) que fueran contratados por mi empresa. Esto, a continuación, me trajo recuerdos de uno de los mejores jefes que he tenido.

¿Qué hace de un jefe un buen jefe?. Una pregunta complicada que, seguramente, tendrá distintas respuestas dependiendo del carácter de la persona a quién preguntes. No creo que todos tengamos la misma idea de lo que es ser un buen jefe aunque, estoy seguro, habría muchas cosas en común.

En mi caso particular, esta persona era más otro miembro del equipo que un jefe típico que ve las cosas desde una perspectiva más alejada del trabajo diario del resto del equipo. Esto no quiere decir que no tuviera tareas distintas a las nuestras, que las tenía y muchas, pero siempre que podía, intentaba sacar tiempo y ayudarnos con nuestras tareas. Esta ayuda podía venir de muchas maneras: hablando sobre el tema, abriendo debate entre todos para ver cómo hacer las cosas mejor, cómo mejorar, haciendo preguntas incómodas (eso sí, dejando claro que quería saber por qué hacíamos esto y no lo otro y que no nos estaba desafiando. Decía: “I’m not challenging you, I only want to know why”), compartiendo su experiencia en temas parecidos, escuchando, mostrando apoyo, etc. Una persona que siempre estaba ahí para ayudar y sacar las cosas adelante cuando hacía falta y que marcaba cómo quería que fuese el equipo con ejemplo y hechos (no sólo con palabras).

Como os podéis imaginar, su relación con el equipo era más la de un colega (con el que salíamos a tomar cañas -por otro lado, debo mencionar que esto, en Finlandia, es bastante normal-) que la de un jefe, gerente o como lo quieras llamar y esto marca la diferencia. Algunos pensaréis que esto podría haber causado que perdiésemos nuestro respeto hacia él. Nada más lejos de la realidad. Lo que consiguió con esto fue un equipo muy cohesionado, que trabajaba muy bien junto y con un ambiente de trabajo excepcional.

También tenía las cosas muy claras y el carácter fuerte (lo que hacía que tuviese sus detractores en la empresa también, claro) pero esto, al menos para mi, no era impedimento para tener una buena discusión con él sobre cualquier tema aunque estuviese totalmente en desacuerdo conmigo. Nunca dijo, “esto se hace así porque lo digo yo” sino que intentaba convencer con razones y hechos y no con poder.

Cuando entramos en el equipo, lo primero que hizo fue regalarnos (de su bolsillo, por cierto), dos libros. Nunca he tenido una experiencia similar en ningún equipo o compañía en la que he trabajado. Fue un pequeño gesto (y esto, que quede claro, no le hace un buen jefe de por sí) pero, al menos para mi, marcó la diferencia y me causó una muy buena impresión.

P.D.: En caso de que os estéis preguntando, los libros fueron: “The fifth discipline” de Senge y “The Toyota Way” de Liker.


Ene 08 2010

The Pragmatic Programmer

Categoría: LibrosJuan @ 9:42 am

The Pragmatic ProgrammerThe Pragmatic Programmer: from journeyman to master” (El Programador Pragmático: de oficial a maestro) es el último libro que he leído después de que varios de mis compañeros no dejaran de incordiarme para que lo hiciera. Había oído mucho y muy bien de él ya que es un libro del 2000, pero nunca lo había tomado muy en serio.

Craso error.

Es un libro fantástico que todo buen profesional en el mundo de la programación debería leer y seguir. Habla de cómo un buen programador debería trabajar para estar orgulloso de su trabajo. Habla de las herramientas necesarias, de la actitud, de los conocimientos, de las formas, de la filosofía… que todo buen desarrollador debería usar en su día a día. Muchas de ellas son claras y obvias para la gran mayoría, pero, ¡ay!, ¡prácticamente nadie las usa!

Habla de comunicación, de ortogonalidad, de prototipos, de estimación, de documentación, de repositorios, de automatización, de pruebas y más pruebas, de depuración, de cuando usar excepciones, de diseño por contrato, de refactorizar, de requerimientos… y de muchas cosas más.

Es cierto, sin embargo, que no entra muy en profundidad en los temas y se queda más en el nivel de introducción. No obstante la grandeza de este libro reside en cómo explica y en las razones que muestran el  porqué estas cosas deben formar parte del día a día del programador. Y en cómo ponerlas todas juntas como parte del trabajo de un buen profesional. Para indagar más en estos temas que no se tocan en profundidad, hay muchos otros libros que tratan exclusivamente de los mismos.

Aunque el libro tiene realmente frases muy buenas que hacen pensar y que merecen seer leídas más de una vez, me quedo con la siguiente:

No matter how well thought out it is, and regardless of which “best practices” it includes, no method can replace thinking.

O en una mala traducción al español:

No importa lo bien que esté elaborado y a pesar de qué “mejor práctica” incluya, no existe ningún método que puede reemplazar el pensar.

Si no lo habéis leído ya, ¡no lo dejéis pasar más!


Ene 07 2010

Informática Profesional

Categoría: LibrosJuan @ 2:35 pm

Libro “Informática Profesional”Tenía pendiente esta entrada desde hace tiempo, una anotación sobre el libro “Informática Profesional: Las reglas no escritas para triunfar en la empresa” de Roberto Canales Mora (editorial Starbook). Allá va.

El libro me ha causado una muy buena impresión. Es muy ameno de leer, con un estilo coloquial y directo. Su punto más diferenciador son los cómics que transmiten la idea general en discusión de una forma visual y, normalmente, cargada de humor.

El libro explica las reglas y situaciones que se dan en la industria informática en el día a día contadas desde la voz de la experiencia (y ese es su mejor punto a favor) y todo aquello que se necesita para tener éxito en una empresa. Se nota que Roberto ha lidiado en plazas muy malas y ha aprendido, unas veces a las buenas y otras a las malas, todo lo que nos cuenta en su libro. Da buenos consejos y, en muchos casos, puntualiza que no hay blancos ni negros sino tonos de grises dependiendo de la situación de cada uno.

Quizá se enfoca demasiado en la visión empresarial dejando un poco de lado la visión del “currito”. Estaría bien haber visto algunas situaciones desde otro punto de vista. Sin embargo, esto no quita para que el libro diga verdades como puños y que sea, en mi opinión, muy recomendable para todos aquellos que empiecen, principalmente, en el mundo de la informática. Les vendrá muy bien para ver qué les espera en un futuro.

En cuanto a mi, personalmente, me han hecho gracia (la mayoría, otras me han producido algo de tristeza) algunas situaciones contadas en el libro ya que llevo viviendo fuera de España más de 7 años. Este libro me ha ayudado a ver (bueno, más bien a recordar que también trabajé en España durante un tiempo) la gran diferencia que hay en muchos aspectos entre cómo se hacen las cosas en España y cómo se hacen fuera (en concreto en Finlandia). Cosas que se dan por hecho, que llegan a ser incluso “reglas” son totalmente distintas 3000 km hacia el noreste de Europa. Por nombrar unos cuantos ejemplos: horarios, vestimenta, fiestas con los jefes, jerarquías, etc.

En resumen, un buen libro que da una visión bastante clara de como son las cosas, hoy por hoy, en el mundo de la informática. A la vez, da buenos consejos de una manera clara y amena. Un buen libro.


Nov 11 2009

Hudson, Sventon y conexiones SSH con llaves (bajo Tomcat y Windows)

Categoría: Integración ContinuaJuan @ 1:59 pm

¡Demonios!, esto debe ser una tontería y seguramente que soy el único pardillo que no sabía como configurar Hudson y Sventon juntos (un navegador de repositorios para el que no lo conozca) bajo Tomcat y en Windows para que funcionen usando svn+ssh con llaves. Si no es así, y ya que me ha costado sangre, sudor y lágrimas, ahí os dejo la solución (que aunque simple, me ha costado mucho encontrar).

Basta con añadir los siguientes parámetros al final del archivo catalina.properties que normalmente se encuentra en C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf:

svnkit.ssh2.key=_llave_
(por ejemplo: “D:/ssh_keys/userkeys/llave”)
svnkit.ssh2.username=_nombre_de_usuario_

Seguro que esta ni es la mejor solución, ni la más elegante pero al menos funciona (que con el tiempo que me ha llevado es, al menos por ahora, más que suficiente).

Si alguien conoce una manera mejor o más apropiada, le estaría muy agradecido si la compartiese.

Etiquetas: , , , ,


Página siguiente »